Oracle学习(十三):闪回
1.知识点:能够对比以下的录屏进行阅读
SQL> --1. 错误地删除了记录
SQL> --2. 错误地删除了表
SQL> --3. 查询历史记录
SQL> --4. 怎样撤销一个已经提交的事务
SQL>
SQL> --闪回的类型
SQL> --1. 闪回表:将表回退到过去的一个时间上
SQL> --2. 闪回删除:Oracle回收站
SQL> --3. 闪回版本号查询:全部历史记录
SQL> --4. 闪回事务查询:通过select语句得到一个 undo_sql SQL> --5. 闪回数据库
SQL> --6. 闪回归档日志
--------------------------------------------------------------------------
须要考虑的事情
FLASHBACK TABLE命令作为单一的事务运行。会得到一个单一的DML锁
表的统计数据不会被闪回
当前的索引和从属的对象会被维持
闪回表操作:1、系统表不能被闪回2、不能跨越DDL操作3、会被写入警告日志4、产生撤销和重做的数据 --------------------------------------------------------------------------
语法:
FLASHBACK TABLE[achema.]<table_name>
TO
{[BEFORE DROP[RENAME TO table]]
[SCN|TIMESTAMP]expr
[ENABLE|DISABLE]TRIGGERS}
schema:模式名,一般为username
TO TIMESTAMP:系统邮戳,包括年月日时分秒
TO SCN:系统更改号
ENABLE TRIGGERS:表示触发器恢复以后为enable状态。而默觉得disable状态
TO BEFORE DROP:表示恢复到删除前
RENAME TO table:表示更换表名
--------------------------------------------------------------------------
--SCN:系统改变号(时间)
SQL> select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss*ff') time,
2 timestamp_to_scn(systimestamp) SCN
3 from dual; --scope的取值: momery spfile both
--momery:仅仅改当前内存(即数据库),不改參数文件;重新启动数据库后恢复原样
--spfile:仅仅改參数文件,不改数据库。重新启动数据库后变为改动后的
--both:数据库。參数都改 --授予闪回权限:grant flashback any table to scott;
--授予事务查询权限:grant select any transaction to scott; SQL> -- 1.闪回表:将表回退到过去的一个时间上
SQL> flashback table flashback_table to scn 3784220; SQL> --开启表的行移动
SQL> alter table flashback_table enable row movement; SQL> --2.闪回删除
SQL> flashback table testseq to before drop;
SQL> --闪回重名的表
SQL> flashback table testseq to before drop rename to testseq_old; SQL> --查看回收站,管理员没有回收站
SQL> show recyclebin
SQL> --清空回收站
SQL> purge recyclebin;
SQL> --通过回收站的名字查看表要加双引號
SQL> select * from "BIN$UhseqyX1Reyl5iurpupyEg==$0"; SQL> /*
SQL> 小结:
SQL> 基本概念: 1. SCN 2. 900秒 3. 权限 flashback any tables
SQL> 闪回表:将表回退到过去的一个时间
SQL> 1. 行移动
SQL> 2. 运行闪回表
SQL> 注意: 系统表不能闪回;不能跨越DDL
SQL> 问题: 怎样得到离该操作近期的一个时间? ? SQL> 闪回删除: Oracle的回收站
SQL> 1. 运行闪回删除
SQL> 2. 通过回收站中的名字闪回(双引號)
SQL> 3. 重名的表
SQL> 4. 触发器(disable)
SQL> */ SQL> --3.闪回版本号查询
SQL> --运行闪回版本号查询
SQL> select tid,tname,versions_operation 操作,versions_starttime 起始时间,
2 versions_endtime 结束时间,versions_xid 事务号
3 from versions_table
4 versions between TIMESTAMP MINVALUE and MAXVALUE
5 order by 1,4; SQL> --4.闪回事务查询
SQL> --视图flashback_transaction_query
SQL> desc flashback_transaction_query SQL> --得到XID
SQL> select tid,tname,versions_operation 操作,versions_starttime 起始时间,
2 versions_endtime 结束时间,versions_xid 事务号
3 from transaction_table
4 versions between TIMESTAMP MINVALUE and MAXVALUE
5 order by 事务号; SQL> --通过XID查询事务信息,再利用undo_sql撤销事务操作
SQL> select operation,undo_sql
2 from flashback_transaction_query
3 where xid='080029005C050000';
2.在Sqlplus下实际运行的结果录屏
SQL> host cls SQL> /*
SQL> 1. 错误地删除了记录
SQL> 2. 错误地删除了表
SQL> 3. 查询历史记录
SQL> 4. 怎样撤销一个已经提交的事务
SQL>
SQL> 闪回的类型
SQL> 1. 闪回表:将表回退到过去的一个时间上
SQL> 2. 闪回删除:Oracle回收站
SQL> 3. 闪回版本号查询:全部历史记录
SQL> 4. 闪回事务查询: 通过select语句得到一个 undo_sql
SQL>
SQL> 5. 闪回数据库
SQL> 6. 闪回归档日志
SQL> */
SQL> --SCN系统改变号(时间)
SQL> select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss*ff') 时间,
2 timestamp_to_scn(systimestamp) SCN
3 from dual; 时间 SCN
----------------------------- ----------
2012-10-25 10:31:02*000000 3783972 SQL> /*
SQL> SQL> show parameter undo
SQL>
SQL> NAME TYPE VALUE
SQL> ------------------------------------ ----------- --------------------
SQL> undo_management string AUTO
SQL> undo_retention integer 1200
SQL> undo_tablespace string UNDOTBS1
SQL> SQL> --scope的取值: momery spfile both
SQL> SQL> alter system set undo_retention=900 scope=both;
SQL> */
SQL> --权限 grant flashback any table to scott;
SQL> create table flashback_table
2 (fid number,fname varchar2(20)); 表已创建。 SQL> insert into flashback_table values(1,'Tom'); 已创建 1 行。 SQL> insert into flashback_table values(2,'Mary'); 已创建 1 行。 SQL> insert into flashback_table values(3,'Mike'); 已创建 1 行。 SQL> commit; 提交完毕。 SQL> --当前时间
SQL> select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss*ff') 时间,
2 timestamp_to_scn(systimestamp) SCN
3 from dual; 时间 SCN
----------------------------- ----------
2012-10-25 10:36:22*046000 3784220 SQL> select * from flashback_table; FID FNAME
---------- --------------------
1 Tom
2 Mary
3 Mike SQL> --删除mary
SQL> delete from flashback_table where fid =2; 已删除 1 行。 SQL> commit; 提交完毕。 SQL> select * from flashback_table; FID FNAME
---------- --------------------
1 Tom
3 Mike SQL> --运行闪回表
SQL> flashback table flashback_table to scn 3784220;
flashback table flashback_table to scn 3784220
*
第 1 行出现错误:
ORA-08189: 由于未启用行移动功能, 不能闪回表 SQL> --开启表的行移动
SQL> alter table flashback_table enable row movement; 表已更改。 SQL> flashback table flashback_table to scn 3784220; 闪回完毕。 SQL> select * from flashback_table; FID FNAME
---------- --------------------
1 Tom
2 Mary
3 Mike SQL> --问题:怎样获取近期的一个时间?
SQL> host cls SQL> --闪回删除
SQL> select * from tab; TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
EMP20 TABLE
TESTSAVEPOINT TABLE
TEST2 TABLE
MYPERSON TABLE
EMP10 TABLE
EMPINCOME TABLE
VIEW1 VIEW TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
VIEW2 VIEW
TESTSEQ TABLE
HREMP SYNONYM
MSG1 TABLE
TEST1 TABLE
PM_CI TABLE
PM_STU TABLE
FLASHBACK_TABLE TABLE
SYS_TEMP_FBT TABLE 已选择20行。 SQL> drop table test1; 表已删除。 SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST1 BIN$Rn2qG7V+SO2k+aNrG/oYww==$0 TABLE 2012-10-25:10:45:11
SQL> purge recyclebin; 回收站已清空。 SQL> --管理员没有回收站
SQL> select * from TESTSEQ; TID TNAME
---------- --------------------
3 aaa
4 aaa
5 aaa
8 aaa SQL> drop table TESTSEQ; 表已删除。 SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TESTSEQ BIN$UhseqyX1Reyl5iurpupyEg==$0 TABLE 2012-10-25:10:47:38
SQL> select * from TESTSEQ;
select * from TESTSEQ
*
第 1 行出现错误:
ORA-00942: 表或视图不存在 SQL> select * from tab; TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
EMP20 TABLE
TESTSAVEPOINT TABLE
TEST2 TABLE
MYPERSON TABLE
EMP10 TABLE
EMPINCOME TABLE
VIEW1 VIEW TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
VIEW2 VIEW
HREMP SYNONYM
MSG1 TABLE
BIN$UhseqyX1Reyl5iurpupyEg==$0 TABLE
PM_CI TABLE
PM_STU TABLE
FLASHBACK_TABLE TABLE
SYS_TEMP_FBT TABLE 已选择19行。 SQL> select * from BIN$UhseqyX1Reyl5iurpupyEg==$0;
select * from BIN$UhseqyX1Reyl5iurpupyEg==$0
*
第 1 行出现错误:
ORA-00933: SQL 命令未正确结束 SQL> select * from "BIN$UhseqyX1Reyl5iurpupyEg==$0"; TID TNAME
---------- --------------------
3 aaa
4 aaa
5 aaa
8 aaa SQL> host cls SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TESTSEQ BIN$UhseqyX1Reyl5iurpupyEg==$0 TABLE 2012-10-25:10:47:38
SQL> --运行闪回删除
SQL> flashback table testseq to before drop; 闪回完毕。 SQL> show recyclebin
SQL> select * from testseq; TID TNAME
---------- --------------------
3 aaa
4 aaa
5 aaa
8 aaa SQL> host cls SQL> drop table testseq; 表已删除。 SQL> create table testseq(tid number); 表已创建。 SQL> drop table testseq; 表已删除。 SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TESTSEQ BIN$ZsXHtmHLTLu40DAC6jiKqg==$0 TABLE 2012-10-25:10:51:22
TESTSEQ BIN$hBllsvl5Tum9hHaSvtQhag==$0 TABLE 2012-10-25:10:51:01
SQL> flashback table testseq to before drop; 闪回完毕。 SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TESTSEQ BIN$hBllsvl5Tum9hHaSvtQhag==$0 TABLE 2012-10-25:10:51:01
SQL> select * from testseq; 未选定行 SQL> flashback table testseq to before drop;
flashback table testseq to before drop
*
第 1 行出现错误:
ORA-38312: 原始名称已被现有对象使用 SQL> --闪回重名的表
SQL> flashback table testseq to before drop rename to testseq_old; 闪回完毕。 SQL> select * from testseq_old; TID TNAME
---------- --------------------
3 aaa
4 aaa
5 aaa
8 aaa SQL> host cls SQL> /*
SQL> 小结:
SQL> 基本概念: 1. SCN 2. 900秒 3. 权限 flashback any tables
SQL> 闪回表:将表回退到过去的一个时间
SQL> 1. 行移动
SQL> 2. 运行闪回表
SQL> 注意: 系统表不能闪回。不能跨越DDL
SQL> 问题: 怎样得到离该操作近期的一个时间??
SQL> 闪回删除: Oracle的回收站
SQL> 1. 运行闪回删除
SQL> 2. 通过回收站中的名字闪回(双引號)
SQL> 3. 重名的表
SQL> 4. 触发器(disable)
SQL> */
SQL> host cls SQL> --闪回版本号查询
SQL> create table versions_table
2 (tid number,tname varchar2(20)); 表已创建。 SQL> insert into versions_table values(1.'Tom');
insert into versions_table values(1.'Tom')
*
第 1 行出现错误:
ORA-00917: 缺失逗号 SQL> insert into versions_table values(1,'Tom'); 已创建 1 行。 SQL> commit; 提交完毕。 SQL> insert into versions_table values(2,'Mary'); 已创建 1 行。 SQL> commit; 提交完毕。 SQL> insert into versions_table values(3,'Mike'); 已创建 1 行。 SQL> commit; 提交完毕。 SQL> update versions_table set tname='MaryNew' where tid=2; 已更新 1 行。 SQL> commit; 提交完毕。 SQL> select * from versions_table; TID TNAME
---------- --------------------
1 Tom
2 MaryNew
3 Mike SQL> --怎样查询Mary?
SQL> --运行闪回版本号查询
SQL> select tid,tname
2 from versions_table
3 versions between TIMESTAMP MINVALUE and MAXVALUE
4 order by 1; TID TNAME
---------- --------------------
1 Tom
2 MaryNew
2 Mary
3 Mike SQL> select tid,tname,versions_operation 操作,versions_starttime 起始时间,
2 versions_endtime 结束时间,versions_xid 事务号
3 from versions_table
4 versions between TIMESTAMP MINVALUE and MAXVALUE
5 order by 1,4; TID TNAME
---------- -------------------- -
起始时间
---------------------------------------------------------------------------
结束时间
---------------------------------------------------------------------------
事务号
----------------
1 Tom I
25-10月-12 11.17.28 上午 03002E005A050000 TID TNAME
---------- -------------------- -
起始时间
---------------------------------------------------------------------------
结束时间
---------------------------------------------------------------------------
事务号
----------------
2 Mary I
25-10月-12 11.17.37 上午
25-10月-12 11.18.16 上午
02000D0064050000 TID TNAME
---------- -------------------- -
起始时间
---------------------------------------------------------------------------
结束时间
---------------------------------------------------------------------------
事务号
----------------
2 MaryNew U
25-10月-12 11.18.16 上午 0600030065050000 TID TNAME
---------- -------------------- -
起始时间
---------------------------------------------------------------------------
结束时间
---------------------------------------------------------------------------
事务号
----------------
3 Mike I
25-10月-12 11.17.46 上午 0400130061050000 SQL> set linesize 150
SQL> col tid for 99
SQL> col tname for a10
SQL> col 操作 for a8
SQL> col 起始时间 for a40
SQL> col 结束时间 for a40
SQL> select tid,tname,versions_operation 操作,versions_starttime 起始时间,
2 versions_endtime 结束时间,versions_xid 事务号
3 from versions_table
4 versions between TIMESTAMP MINVALUE and MAXVALUE
5 order by 1,4; TID TNAME 操作 起始时间 结束时间 事务号
--- ---------- -------- ---------------------------------------- ---------------------------------------- ----------------
1 Tom I 25-10月-12 11.17.28 上午 03002E005A050000
2 Mary I 25-10月-12 11.17.37 上午 25-10月-12 11.18.16 上午 02000D0064050000
2 MaryNew U 25-10月-12 11.18.16 上午 0600030065050000
3 Mike I 25-10月-12 11.17.46 上午 0400130061050000 SQL> col 起始时间 for a30
SQL> col 结束时间 for a30
SQL> col 操作 for a4
SQL> select tid,tname,versions_operation 操作,versions_starttime 起始时间,
2 versions_endtime 结束时间,versions_xid 事务号
3 from versions_table
4 versions between TIMESTAMP MINVALUE and MAXVALUE
5 order by 1,4; TID TNAME 操作 起始时间 结束时间 事务号
--- ---------- ---- ------------------------------ ------------------------------ ----------------
1 Tom I 25-10月-12 11.17.28 上午 03002E005A050000
2 Mary I 25-10月-12 11.17.37 上午 25-10月-12 11.18.16 上午 02000D0064050000
2 MaryNew U 25-10月-12 11.18.16 上午 0600030065050000
3 Mike I 25-10月-12 11.17.46 上午 0400130061050000 SQL> host cls SQL> --闪回事务查询
SQL> create table transaction_table
2 (tid number,tname varchar2(20)); 表已创建。 SQL> --第一个事务
SQL> insert into transaction_table values(1,'Tom'); 已创建 1 行。 SQL> insert into transaction_table values(2,'Mary'); 已创建 1 行。 SQL> insert into transaction_table values(3,'Mike'); 已创建 1 行。 SQL> commit; 提交完毕。 SQL> --第二个事务
SQL> update transaction_table set tname='MaryNew' where tid=2; 已更新 1 行。 SQL> delete from transaction_table where tid =3; 已删除 1 行。 SQL> commit; 提交完毕。 SQL> --怎样撤销第二个事务??
SQL> --视图flashback_transaction_query
SQL> desc flashback_transaction_query
名称 是否为空? 类型
----------------------------------------------------------------------------------- -------- --------------------------------------------------------
XID RAW(8)
START_SCN NUMBER
START_TIMESTAMP DATE
COMMIT_SCN NUMBER
COMMIT_TIMESTAMP DATE
LOGON_USER VARCHAR2(30)
UNDO_CHANGE# NUMBER
OPERATION VARCHAR2(32)
TABLE_NAME VARCHAR2(256)
TABLE_OWNER VARCHAR2(32)
ROW_ID VARCHAR2(19)
UNDO_SQL VARCHAR2(4000) SQL> --得到XID
SQL> select tid,tname,versions_operation 操作,versions_starttime 起始时间,
2 versions_endtime 结束时间,versions_xid 事务号
3 from transaction_table
4 versions between TIMESTAMP MINVALUE and MAXVALUE
5 order by 事务号; TID TNAME 操作 起始时间 结束时间 事务号
--- ---------- ---- ------------------------------ ------------------------------ ----------------
3 Mike I 25-10月-12 11.29.38 上午 25-10月-12 11.30.23 上午 0100100060050000
2 Mary I 25-10月-12 11.29.38 上午 25-10月-12 11.30.23 上午 0100100060050000
1 Tom I 25-10月-12 11.29.38 上午 0100100060050000
2 MaryNew U 25-10月-12 11.30.23 上午 080029005C050000
3 Mike D 25-10月-12 11.30.23 上午 080029005C050000 SQL> select operation,undo_sql
2 from flashback_transaction_query
3 where xid='080029005C050000'; OPERATION
--------------------------------
UNDO_SQL
------------------------------------------------------------------------------------------------------------------------------------------------------
DELETE
insert into "SCOTT"."TRANSACTION_TABLE"("TID","TNAME") values ('3','Mike'); UPDATE
update "SCOTT"."TRANSACTION_TABLE" set "TNAME" = 'Mary' where ROWID = 'AAANpoAAEAAAAJvAAB'; BEGIN SQL> insert into "SCOTT"."TRANSACTION_TABLE"("TID","TNAME") values ('3','Mike')
2 ; 已创建 1 行。 SQL> update "SCOTT"."TRANSACTION_TABLE" set "TNAME" = 'Mary' where ROWID = 'AAANpoAAEAAAAJvAAB'; 已更新 1 行。 SQL> commit; 提交完毕。 SQL> select * from transaction_table; TID TNAME
--- ----------
1 Tom
2 Mary
3 Mike SQL> spool off
Oracle学习(十三):闪回的更多相关文章
- Oracle Flashback Technologies - 闪回查询
Oracle Flashback Technologies - 闪回查询 查看表中,某行数据的修改记录 #创建一个表,并插入和修改数据 SQL> create table y3(id )); T ...
- Oracle Flashback Technologies - 闪回被drop的表
Oracle Flashback Technologies - 闪回被drop的表 在oracle10g中,drop一个表后,表没有真正被删除,支持被rename后放在recyclebin中. #新建 ...
- Oracle Flashback Technologies - 闪回数据库
Oracle Flashback Technologies - 闪回数据库 根据指定的SCN,使用rman闪回数据库 #查看可以闪回到多久前 SQL> select * from v$flash ...
- Oracle 中利用闪回查询确定某表在某时间点之后的修改内容,并恢复至该时间点
Oracle 中利用闪回查询确定某表在某时间点之后的修改内容: 1.查看 DELETE 及 UPDATE 操作修改的数据: SQL> SELECT * FROM tab AS OF TIMEST ...
- oracle中的闪回
项目中运用: 首先说明:闪回方法有一个前提,就是需要尽早的发现问题,果断的采取行动.若误操作的记录已经在UNDO表空间中被清除,则此方法就不可行了,需要另寻他法. 例如: SELECT * FROM ...
- 吴裕雄--天生自然ORACLE数据库学习笔记:Oracle 11g的闪回技术
alter system set db_recovery_file_dest_size=4g scope=both; connect system/1qaz2wsx as sysdba; archiv ...
- 【Oracle】Oracle 10g利用闪回挽救误删的数据
我们在开发和运维过程中,经常遇到数据被误删除的情况.无论是在应用开发中的Bug,还是修改数据的时候,如果提交了错误数据修改结果,会带来很多问题.一般来说,一旦提交commit事务,我们是不能获取到之前 ...
- Oracle数据库中闪回恢复的详细分析
Oracle9i开始提供闪回查询,以便能在需要的时候查到过去某个时刻的一致性数据,这是通过Undo实现的.这个功能有很大的限制,就是相关事务的undo不能被覆盖,否则就无力回天了.oracle10g大 ...
- oracle 基础(一)--闪回技术
一,闪回表初探 闪回须知: 1 使用闪回表注意如下事项: 2 3 (1)被闪回的表必须启用行移动功能 4 5 SQL> alter table dept enable row movement; ...
随机推荐
- 阿里面试题:说说HashMap的扩容过程?
这是一道阿里的面试题,考察你对HashMap源码的了解情况,废话不多说,咱们就直接上源码吧! jdk 1.7 源码 void resize(int newCapacity) { Entry[] old ...
- xsy 1790 - 不回头的旅行
from NOIP2016模拟题28 Description 一辆车,开始没油,可以选择一个点(加油站)出发 经过一个点i可加g[i]的油,走一条边减少len的油 没油的时候车就跪了 特别的,跪在加油 ...
- UVA 10131 Is Bigger Smarter?(DP最长上升子序列)
Description Question 1: Is Bigger Smarter? The Problem Some people think that the bigger an elepha ...
- The Luckiest number(hdu 2462)
给定一个数,判断是否存在一个全由8组成的数为这个数的倍数 若存在则输出这个数的长度,否则输出0 /* 个人感觉很神的一道题目. 如果有解的话,会有一个p满足:(10^x-1)/9*8=L*p => ...
- [LeetCode] Edit Distance 字符串变换为另一字符串动态规划
Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2 ...
- ThinkPHP 条件是一个表里面的两个字段比较
ThinkPHP 条件是一个表里面的两个字段比较 今天群里有人问,thinkphp框架,条件是一个表里的两个字段,怎么查询. 然后就做了下测试: 比如查询出 手机号就是微信号 的用户: (1)首先,正 ...
- LeetCode OJ-- Spiral Matrix
https://oj.leetcode.com/problems/spiral-matrix/ 螺旋矩阵,逆着转,输出矩阵中的元素. 在纸上模仿,然后记左上角(l1,l2)右上角(l1,r2),左下角 ...
- AC日记——爱改名的小融2 codevs 3149
3149 爱改名的小融 2 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description Wikioi上有个人叫小融,他喜 ...
- Android内存泄漏总结
内存泄漏问题老生常谈,很常见也很难根治,今天我在这里总结一下内存泄漏的原因和解决方法: 所谓内存泄漏,就是本该被回收的对象,由于某些原因不能被回收,继续占用堆内存的这种状态,导致的结果也是显而易见的, ...
- Win10下 tensorflow gpu版安装
准备: 系统环境: windows10 + Anaconda3 + Pycharm (1)环境配置: 打开Anaconda Prompt,输入清华仓库镜像,这样更新会快一些: 输入: conda co ...