1 应用场景
Oracle 闪回时间旅行简介
在数据库运维的时候偶尔会遇到数据被意外删除或者是更改的情况,比如,某一天,开发突然找过来,说业务系统的数据出问题了,不知道是谁更改了数据,什么时候也不知道。现在需要做的是至少将正确的数据找回来,进一步的要求是能找出数据在什么时间改的,是谁改的。
幸运的是,对Oracle DBA来说,有几个技术在这个场合可能有用,比如闪回查询,表闪回,日志挖掘什么的。如果运气差一点,等发现的时候数据已经被删除一两个周了,这个时候undo没了,归档日志可能也找不到了,只能从非技术的角度来考虑问题了。
Oracle 闪回时间旅行(Flashback Time Travel)是针对以上场景的高效的解决方案,前提是需要提前做好配置。这是Oracle闪回技术的一种,它和其它闪回技术不同的是它追踪和存储数据库里一张表的生命周期里的事务变化,它通过闪回归档实现。闪回时间旅行是针对每一张表分别激活的,因此它的保留时间可以很长,对重要表可以覆盖表的整个生命周期。Oracle的闪回归档的安全性也比较高,可以使用Oracle 区块链表存储表的历史归档信息。
通过配置,闪回时间旅行也可以追踪和存储针对表的每一次操作的会话的背景信息,如用户、主机名和ip地址,这使这种技术在审计方面也可以发挥重要的作用。
对DDL的支持
Oracle 闪回时间旅行对DML操作是没有问题的,但是如果是表上发生了DDL操作,就需要另做考虑了。闪回归档支持下面的DDL操作:
- 执行下列操作的ALTER TABLE命令:
- 增加、删除、重新明明或者调整一个列
- 增加、删除或者重命名一个约束
- 删除或者阶段表的一个分区或者子分区
- 截断表操作
- 表的重新命名
不支持 移动, 分割, 合并分区或者子分区, 移动表, 或者转换列的类型从 LONG 到LOB,下面是一些会报错的例子
- ALTER TABLE 带有 UPGRADE TABLE clause, 无论这个子语句是否带有 INCLUDING DATA 语句
- 移动或者交换分区、子分区
- 删除表
2 配置闪回时间旅行
2.1 创建闪回归档
CREATE FLASHBACK ARCHIVE DEFAULT flashoneyear TABLESPACE users
QUOTA 2G RETENTION 1 YEAR;
Flashback archive created.
闪回归档创建以后,如果想调整闪回归档的参数,可以使用ALTER FLASHBACK ARCHIVE更改,可以对闪回归档的三个参数进行调整支持:
- 更改保留时间
- 清楚部分或者全部数据
- 增加、调整、删除第二个表空间
每个数据库都可以设置一个缺省的闪回归档,激活表的闪回归档时,如果不指定闪回归档,表就会使用这个缺省的闪回归档。默认情况下,数据库里没有缺省的闪回归档,可以在创建闪回归档时指定创建的闪回归档,如上面的命令,或者用ALTER FLASHBACK ARCHIVE设置闪回归档为数据库的默认闪回归档。
2.2 激活闪回归档
默认情况下,表的闪回归档都是非激活的,要激活一个表的闪回归档,使用create table 或者是alter table 命令,下面的命令激活表的闪回归档,使用数据库缺省的闪回归档。
ALTER TABLE sh.PRODUCTS FLASHBACK ARCHIVE;
2.3 取消表的闪回归档
ALTER TABLE sh.PRODUCTS NO FLASHBACK ARCHIVE;
取消一个表的闪回归档后,这个表的归档表会从数据库里删除,有需要查询或者恢复的数据需要在表的闪回归档之前操作。
3 查询闪回归档的相关信息
3.1 查询闪回归档信息
select * from dba_FLASHBACK_ARCHIVE
----------+----------------------+------------------+-----------------+-----------------------+-----------------------+-------+
OWNER_NAME|FLASHBACK_ARCHIVE_NAME|FLASHBACK_ARCHIVE#|RETENTION_IN_DAYS|CREATE_TIME |LAST_PURGE_TIME |STATUS |
----------+----------------------+------------------+-----------------+-----------------------+-----------------------+-------+
SYS |FLASHONEYEAR | 1| 365|2025-04-18 06:25:58.000|2025-04-18 06:25:58.000|DEFAULT|
----------+----------------------+------------------+-----------------+-----------------------+-----------------------+-------+
3.2 查询闪回归档表空间信息
select * from dba_FLASHBACK_ARCHIVE_TS;
----------------------+------------------+---------------+-----------+
FLASHBACK_ARCHIVE_NAME|FLASHBACK_ARCHIVE#|TABLESPACE_NAME|QUOTA_IN_MB|
----------------------+------------------+---------------+-----------+
FLASHONEYEAR | 1|USERS |2048 |
----------------------+------------------+---------------+-----------+
3.3 查询激活闪回归档的表
这个视图可以查询激活闪回归档表的信息及表的归档表
select * from dba_FLASHBACK_ARCHIVE_TABLES;
------------+----------+----------------------+------------------+-------+
TABLE_NAME |OWNER_NAME|FLASHBACK_ARCHIVE_NAME|ARCHIVE_TABLE_NAME|STATUS |
------------+----------+----------------------+------------------+-------+
PRODUCTS_NEW|SH |FLASHONEYEAR |SYS_FBA_HIST_79848|ENABLED|
------------+----------+----------------------+------------------+-------+
可以看到闪回已经激活闪回归档的表和它的归档表,这里要注意的是归档表和原表属于一个用户,而不是属于执行激活操作的用户。
4 使用闪回时间查询和恢复数据
4.1 查询恢复的数据
更新一条数据
UPDATE PRODUCTS_NEW SET PROD_VALID='N' WHERE PROD_ID =14;;--更新表的一条数据
--,在查询表的归档表,查询结果如下
SELECT * FROM sh.SYS_FBA_HIST_79848;
------------------+--------+--------+---+---------+-------+---------------------------------------+---------------------------------------+---------------------------+-------------------+---------------------------+-------------+----------------+------------------+-----------------+--------------------+--------------+-----------+-----------+---------------+--------------+----------+-------------+-----------+-----------------------+-----------+----------+
RID |STARTSCN|ENDSCN |XID|OPERATION|PROD_ID|PROD_NAME |PROD_DESC |PROD_SUBCATEGORY |PROD_SUBCATEGORY_ID|PROD_SUBCATEGORY_DESC |PROD_CATEGORY|PROD_CATEGORY_ID|PROD_CATEGORY_DESC|PROD_WEIGHT_CLASS|PROD_UNIT_OF_MEASURE|PROD_PACK_SIZE|SUPPLIER_ID|PROD_STATUS|PROD_LIST_PRICE|PROD_MIN_PRICE|PROD_TOTAL|PROD_TOTAL_ID|PROD_SRC_ID|PROD_EFF_FROM |PROD_EFF_TO|PROD_VALID|
------------------+--------+--------+---+---------+-------+---------------------------------------+---------------------------------------+---------------------------+-------------------+---------------------------+-------------+----------------+------------------+-----------------+--------------------+--------------+-----------+-----------+---------------+--------------+----------+-------------+-----------+-----------------------+-----------+----------+
AAATfoAAPAAAa6LAAA| |33129257| | | 14|Pitching Machine and Batting Cage Combo|Pitching Machine and Batting Cage Combo|Training Aids and Equipment| 2035|Training Aids and Equipment|Baseball | 203|Baseball | 1|U |P | 1|STATUS | 999.99| 999.99|TOTAL | 1| |2019-01-01 00:00:00.000| |A |
------------------+--------+--------+---+---------+-------+---------------------------------------+---------------------------------------+---------------------------+-------------------+---------------------------+-------------+----------------+------------------+-----------------+--------------------+--------------+-----------+-----------+---------------+--------------+----------+-------------+-----------+-----------------------+-----------+----------+
更新表的归档表里存的表更新之前的完整记录,这条记录的操作列为空,startscn也为空,还有附加的关于这次操作的信息,可以看出,表的时间旅行耗费的空间还是比较大的,如果不考虑存储优化压缩,占用的空间可能比操作的记录还要大。
delete操作
DELETE FROM PRODUCTS_NEW WHERE PROD_ID =14;
--查看归档表
RID |STARTSCN|ENDSCN |XID |OPERATION|PROD_ID|PROD_NAME |PROD_DESC |PROD_SUBCATEGORY |PROD_SUBCATEGORY_ID|PROD_SUBCATEGORY_DESC |PROD_CATEGORY|PROD_CATEGORY_ID|PROD_CATEGORY_DESC|PROD_WEIGHT_CLASS|PROD_UNIT_OF_MEASURE|PROD_PACK_SIZE|SUPPLIER_ID|PROD_STATUS|PROD_LIST_PRICE|PROD_MIN_PRICE|PROD_TOTAL|PROD_TOTAL_ID|PROD_SRC_ID|PROD_EFF_FROM |PROD_EFF_TO|PROD_VALID|
------------------+--------+--------+--------+---------+-------+---------------------------------------+---------------------------------------+---------------------------+-------------------+---------------------------+-------------+----------------+------------------+-----------------+--------------------+--------------+-----------+-----------+---------------+--------------+----------+-------------+-----------+-----------------------+-----------+----------+
RID |STARTSCN|ENDSCN |XID |OPERATION|PROD_ID|PROD_NAME |PROD_DESC |PROD_SUBCATEGORY |PROD_SUBCATEGORY_ID|PROD_SUBCATEGORY_DESC |PROD_CATEGORY|PROD_CATEGORY_ID|PROD_CATEGORY_DESC|PROD_WEIGHT_CLASS|PROD_UNIT_OF_MEASURE|PROD_PACK_SIZE|SUPPLIER_ID|PROD_STATUS|PROD_LIST_PRICE|PROD_MIN_PRICE|PROD_TOTAL|PROD_TOTAL_ID|PROD_SRC_ID|PROD_EFF_FROM |PROD_EFF_TO|PROD_VALID|
------------------+--------+--------+--------+---------+-------+---------------------------------------+---------------------------------------+---------------------------+-------------------+---------------------------+-------------+----------------+------------------+-----------------+--------------------+--------------+-----------+-----------+---------------+--------------+----------+-------------+-----------+-----------------------+-----------+----------+
AAATfoAAPAAAa6LAAA|33131375|33131375| u |D | 14|Pitching Machine and Batting Cage Combo|Pitching Machine and Batting Cage Combo|Training Aids and Equipment| 2035|Training Aids and Equipment|Baseball | 203|Baseball | 1|U |P | 1|STATUS | 999.99| 999.99|TOTAL | 1| |2019-01-01 00:00:00.000| |N |
AAATfoAAPAAAa6LAAA|33129257|33131375| 9 |U | 14|Pitching Machine and Batting Cage Combo|Pitching Machine and Batting Cage Combo|Training Aids and Equipment| 2035|Training Aids and Equipment|Baseball | 203|Baseball | 1|U |P | 1|STATUS | 999.99| 999.99|TOTAL | 1| |2019-01-01 00:00:00.000| |N |
------------------+--------+--------+--------+---------+-------+---------------------------------------+---------------------------------------+---------------------------+-------------------+---------------------------+-------------+----------------+------------------+-----------------+--------------------+--------------+-----------+-----------+---------------+--------------+----------+-------------+-----------+-----------------------+-----------+----------+
归档表里多了两条记录,一条是删除之前这个记录的操作,并记录了这个操作的执行时的scn和结束(另一个操作开始)的scn,另一个是这次删除操作。从这里可以推断出,在运行上一个表删除语句时,归档表里记载的是上一个操作的信息,由于数据库无法获取上一个操作的名称和起始scn,所以相应的列为空。
insert 操作
INSERT INTO PRODUCTS_NEW SELECT * FROM to_del;
归档表里没有任何记录,这是因为insert操作没有undo信息,在删除方才insert的数据,归档表里多了两条记录
------------------+--------+--------+--------+---------+-------+---------------------------------------+---------------------------------------+---------------------------+-------------------+---------------------------+-------------+----------------+------------------+-----------------+--------------------+--------------+-----------+-----------+---------------+--------------+----------+-------------+-----------+-----------------------+-----------+----------+
RID |STARTSCN|ENDSCN |XID |OPERATION|PROD_ID|PROD_NAME |PROD_DESC |PROD_SUBCATEGORY |PROD_SUBCATEGORY_ID|PROD_SUBCATEGORY_DESC |PROD_CATEGORY|PROD_CATEGORY_ID|PROD_CATEGORY_DESC|PROD_WEIGHT_CLASS|PROD_UNIT_OF_MEASURE|PROD_PACK_SIZE|SUPPLIER_ID|PROD_STATUS|PROD_LIST_PRICE|PROD_MIN_PRICE|PROD_TOTAL|PROD_TOTAL_ID|PROD_SRC_ID|PROD_EFF_FROM |PROD_EFF_TO|PROD_VALID|
------------------+--------+--------+--------+---------+-------+---------------------------------------+---------------------------------------+---------------------------+-------------------+---------------------------+-------------+----------------+------------------+-----------------+--------------------+--------------+-----------+-----------+---------------+--------------+----------+-------------+-----------+-----------------------+-----------+----------+
AAATfoAAPAAAa6NAAA|33170046|33170046| 3 |D | 14|Pitching Machine and Batting Cage Combo|Pitching Machine and Batting Cage Combo|Training Aids and Equipment| 2035|Training Aids and Equipment|Baseball | 203|Baseball | 1|U |P | 1|STATUS | 999.99| 999.99|TOTAL | 1| |2019-01-01 00:00:00.000| |N |
AAATfoAAPAAAa6NAAA|33133126|33170046| ? |I | 14|Pitching Machine and Batting Cage Combo|Pitching Machine and Batting Cage Combo|Training Aids and Equipment| 2035|Training Aids and Equipment|Baseball | 203|Baseball | 1|U |P | 1|STATUS | 999.99| 999.99|TOTAL | 1| |2019-01-01 00:00:00.000| |N |
------------------+--------+--------+--------+---------+-------+---------------------------------------+---------------------------------------+---------------------------+-------------------+---------------------------+-------------+----------------+------------------+-----------------+--------------------+--------------+-----------+-----------+---------------+--------------+----------+-------------+-----------+-----------------------+-----------+----------+
这里的两条记录,一条是之前的insert记录,另一条是当前的delete记录。从上面可以看出,对于更新和删除操作,归档表里会产生两条记录,一条是数据之前的操作记录,一条是当前的操作记录。
上面查询结果里的scn值可以转成时间(使用Oracle SCN_TO_TIMESTAMP内置函数)
SELECT SCN_TO_TIMESTAMP(33129257) FROM dual;
SCN_TO_TIMESTAMP(33129257)|
--------------------------+
2025-04-21 02:07:46.000|
4.2 查询过去某一时刻的表里的数据
查询的语法同闪回查询的语法相同,上面查到数据删除的时间是2025-04-18 07:14:06,查询前一秒里表的数据,检查数据是否可以查到
SELECT * FROM sh.PRODUCTS_NEW AS of timestamp to_timestamp('2025-04-21 02:07:45','yyyy-mm-dd hh24:mi:ss');
-------+------------------------------------------+------------------------------------------+---------------------------+-------------------+---------------------------+-----------------+----------------+------------------+-----------------+--------------------+--------------+-----------+-----------+---------------+--------------+----------+-------------+-----------+-----------------------+-----------+----------+
PROD_ID|PROD_NAME |PROD_DESC |PROD_SUBCATEGORY |PROD_SUBCATEGORY_ID|PROD_SUBCATEGORY_DESC |PROD_CATEGORY |PROD_CATEGORY_ID|PROD_CATEGORY_DESC|PROD_WEIGHT_CLASS|PROD_UNIT_OF_MEASURE|PROD_PACK_SIZE|SUPPLIER_ID|PROD_STATUS|PROD_LIST_PRICE|PROD_MIN_PRICE|PROD_TOTAL|PROD_TOTAL_ID|PROD_SRC_ID|PROD_EFF_FROM |PROD_EFF_TO|PROD_VALID|
-------+------------------------------------------+------------------------------------------+---------------------------+-------------------+---------------------------+-----------------+----------------+------------------+-----------------+--------------------+--------------+-----------+-----------+---------------+--------------+----------+-------------+-----------+-----------------------+-----------+----------+
14|Pitching Machine and Batting Cage Combo |Pitching Machine and Batting Cage Combo |Training Aids and Equipment| 2035|Training Aids and Equipment|Baseball | 203|Baseball | 1|U |P | 1|STATUS | 999.99| 999.99|TOTAL | 1| |2019-01-01 00:00:00.000| |A |
47|6 Gallon Empty Ball Bucket |6 Gallon Empty Ball Bucket |Baseballs | 2031|Baseballs |Baseball | 203|Baseball | 1|U |P | 1|STATUS | 28.99| 28.99|TOTAL | 1| |2019-01-01 00:00:00.000| |A |
128|Slugger Youth Series Maple Bat |Slugger Youth Series Maple Bat |Bats | 2036|Bats |Baseball | 203|Baseball | 1|U |P | 1|STATUS | 27.99| 27.99|TOTAL | 1| |2019-01-01 00:00:00.000| |A |
--下面省略多行
-------+------------------------------------------+------------------------------------------+---------------------------+-------------------+---------------------------+-----------------+----------------+------------------+-----------------+--------------------+--------------+-----------+-----------+---------------+--------------+----------+-------------+-----------+-----------------------+-----------+----------+
可以查到这个表这一时刻的数据
4.3 表闪回归档占用的存储空间
SELECT * FROM DBA_SEGMENTS WHERE SEGMENT_NAME LIKE '%FBA_HIST%';
-----+-----------------------+--------------+---------------+---------------+---------------+-----------+------------+-------+------+-------+--------------+-----------+-----------+-----------+----------+---------+------------+------------+---------+---------------+------------+-----------+-----------+----------------+--------+-----------------+-------------------+------------------+--------------------+----------+
OWNER|SEGMENT_NAME |PARTITION_NAME|SEGMENT_TYPE |SEGMENT_SUBTYPE|TABLESPACE_NAME|HEADER_FILE|HEADER_BLOCK|BYTES |BLOCKS|EXTENTS|INITIAL_EXTENT|NEXT_EXTENT|MIN_EXTENTS|MAX_EXTENTS|MAX_SIZE |RETENTION|MINRETENTION|PCT_INCREASE|FREELISTS|FREELIST_GROUPS|RELATIVE_FNO|BUFFER_POOL|FLASH_CACHE|CELL_FLASH_CACHE|INMEMORY|INMEMORY_PRIORITY|INMEMORY_DISTRIBUTE|INMEMORY_DUPLICATE|INMEMORY_COMPRESSION|CELLMEMORY|
-----+-----------------------+--------------+---------------+---------------+---------------+-----------+------------+-------+------+-------+--------------+-----------+-----------+-----------+----------+---------+------------+------------+---------+---------------+------------+-----------+-----------+----------------+--------+-----------------+-------------------+------------------+--------------------+----------+
SH |SYS_FBA_HIST_79848 |HIGH_PART |TABLE PARTITION|ASSM |USERS | 15| 176145|8388608| 1024| 1| 8388608| 1048576| 1| 2147483645|2147483645| | | | | | 15|DEFAULT |DEFAULT |DEFAULT |DISABLED| | | | | |
SH |SYS_FBA_HIST_IDX1_79848|HIGH_PART |INDEX PARTITION|ASSM |USERS | 15| 85930| 65536| 8| 1| 65536| 1048576| 1| 2147483645|2147483645| | | | | | 15|DEFAULT |DEFAULT |DEFAULT |DISABLED| | | | | |
-----+-----------------------+--------------+---------------+---------------+---------------+-----------+------------+-------+------+-------+--------------+-----------+-----------+-----------+----------+---------+------------+------------+---------+---------------+------------+-----------+-----------+----------------+--------+-----------------+-------------------+------------------+--------------------+----------+
查询dba_segment视图,可以看到Oracle为开启了闪回归档表创建一个归档表(这个表是分区表)外,还在此归档表上创建了一个索引,这个索引的定义如下
SELECT dbms_metadata.GET_DDL('INDEX', 'SYS_FBA_HIST_IDX1_79848','SH') FROM dual;
DBMS_METADATA.GET_DDL('INDEX','SYS_FBA_HIST_IDX1_79848','SH')
--------------------------------------------------------------------------------
CREATE INDEX "SH"."SYS_FBA_HIST_IDX1_79848" ON "SH"."SYS_FBA_HIST_79848" ("END
SCN", "STARTSCN", "RID")
可以看到,这是一个联合索引,再比较一下归档表和原表的信息
SELECT OWNER,TABLE_NAME,AVG_ROW_LEN,NUM_ROWS FROM dba_tables WHERE table_name LIKE '%FBA_HIST%' OR TABLE_NAME ='PRODUCTS_NEW';
-----+------------------+-----------+--------+
OWNER|TABLE_NAME |AVG_ROW_LEN|NUM_ROWS|
-----+------------------+-----------+--------+
SH |SYS_FBA_HIST_79848| 249| 3|
SH |PRODUCTS_NEW | 151| 72|
-----+------------------+-----------+--------+
可以看到,归档表的平均行长度比原表的平均行长度还要大一点,可以表的历史归档对存储空间的消耗还是相当大的,对每个操作,要记录两个操作,在高并发的情况下,对性能的消耗也不容忽视。
5 会话信息跟踪
在使用闪回时间旅行进行数据审计时,需要获得执行某个操作的用户名、主机名或者IP地址等信息。可以使用相关存储过程激活会话信息跟踪及存储。
5.1 激活会话信息跟踪
默认状态下,Oracle不会跟踪和存储开启闪回归档的表上执行语句的会话信息,可以使用
DBMS_FLASHBACK_ARCHIVE.SET_CONTEXT_LEVEL (level VARCHAR2)存储过程激活或者关闭会话信息跟踪,这个存储过程共有只有一个参数,这个参数有三个值,解释如下:
- ALL - 全部SYS_CONTEXT信息
- TYPICAL - 用户 ID, 全局用户 ID 和主机名
- NONE - 不跟踪
以sysdba身份登录数据库,执行下面命令激活会话信息跟踪
exec DBMS_FLASHBACK_ARCHIVE.SET_CONTEXT_LEVEL(‘ALL’);
PL/SQL procedure successfully completed.
跟踪的信息存储在视图SYS_FBA_CONTEXT_AUD,这个表位于system表空间下,查询一下存储的信息
```sql
SELECT * FROM SYS_FBA_CONTEXT_AUD;
--------+------+----------------------+-----------------+-----------+--------------------+--------------+------------+-------------+--------+----------+---------------+-------------------+-------------+------------+------------------------------------------+---------+-----------+------------+--------------------+------------+--------------+---------+--------+-----+
XID |ACTION|AUTHENTICATED_IDENTITY|CLIENT_IDENTIFIER|CLIENT_INFO|CURRENT_EDITION_NAME|CURRENT_SCHEMA|CURRENT_USER|DATABASE_ROLE|DB_NAME |GLOBAL_UID|HOST |IDENTIFICATION_TYPE|INSTANCE_NAME|IP_ADDRESS |MODULE |OS_USER |SERVER_HOST|SERVICE_NAME|SESSION_EDITION_NAME|SESSION_USER|SESSION_USERID|SESSIONID|TERMINAL|SPARE|
--------+------+----------------------+-----------------+-----------+--------------------+--------------+------------+-------------+--------+----------+---------------+-------------------+-------------+------------+------------------------------------------+---------+-----------+------------+--------------------+------------+--------------+---------+--------+-----+
â | |SH | | |ORA$BASE |SYS |SYS |PRIMARY |FREEPDB1| |DESKTOP-FVJ8TG1|LOCAL |FREE |192.168.56.1|DBeaver 24?1?0 ? SQLEditor ?sh?oracle?sql?|lichengxu|orcldb |freepdb1 |ORA$BASE |SH |138 |1496505 |unknown | |
--------+------+----------------------+-----------------+-----------+--------------------+--------------+------------+-------------+--------+----------+---------------+-------------------+-------------+------------+------------------------------------------+---------+-----------+------------+--------------------+------------+--------------+---------+--------+-----+
可以看到执行语句的会话的用户名,ip地址。模块等信息。
5.2 查看每个操作的背景信息
如果要知道每条语句的执行会话的相关信息,关联上面的表和要查询表的归档表即可
SELECT a.AUTHENTICATED_IDENTITY,a.HOST,a.IP_ADDRESS ,h.* FROM sh.SYS_FBA_HIST_77193 h INNER JOIN SYS_FBA_CONTEXT_AUD A ON a.XID=h.XID ;
----------------------+---------------+------------+------------------+--------+--------+--------+---------+-------+-------+-----------------------+----------+--------+-------------+-----------+
AUTHENTICATED_IDENTITY|HOST |IP_ADDRESS |RID |STARTSCN|ENDSCN |XID |OPERATION|PROD_ID|CUST_ID|TIME_ID |CHANNEL_ID|PROMO_ID|QUANTITY_SOLD|AMOUNT_SOLD|
----------------------+---------------+------------+------------------+--------+--------+--------+---------+-------+-------+-----------------------+----------+--------+-------------+-----------+
SH |DESKTOP-FVJ8TG1|192.168.56.1|AAAS2JAAPAAAaF0ADK|33042352|33042352| â |D | 23| 3|2020-06-25 00:00:00.000| 2| 999| 1| 22.34|
SH |DESKTOP-FVJ8TG1|192.168.56.1|AAAS2JAAPAAAaF5ADM|33042352|33042352| â |D | 27| 3|2020-06-25 00:00:00.000| 2| 999| 1| 45.71|
SH |DESKTOP-FVJ8TG1|192.168.56.1|AAAS2JAAPAAAaFCABv|33042352|33042352| â |D | 24| 3|2020-06-25 00:00:00.000| 3| 999| 1| 50.8|
SH |DESKTOP-FVJ8TG1|192.168.56.1|AAAS2JAAPAAAaFKACH|33042352|33042352| â |D | 27| 3|2020-06-25 00:00:00.000| 3| 999| 1| 50.55|
SH |DESKTOP-FVJ8TG1|192.168.56.1|AAAS2JAAPAAAaFVABm|33042352|33042352| â |D | 148| 3|2020-06-27 00:00:00.000| 3| 999| 1| 26.67|
SH |DESKTOP-FVJ8TG1|192.168.56.1|AAAS2JAAPAAAaFXACq|33042352|33042352| â |D | 140| 3|2020-06-27 00:00:00.000| 2| 999| 1| 28.95|
SH |DESKTOP-FVJ8TG1|192.168.56.1|AAAS2JAAPAAAaFjABd|33042352|33042352| â |D | 130| 3|2020-06-27 00:00:00.000| 2| 999| 1| 91.42|
SH |DESKTOP-FVJ8TG1|192.168.56.1|AAAS2JAAPAAAaFlACZ|33042352|33042352| â |D | 31| 3|2020-05-28 00:00:00.000| 3| 999| 1| 10.1|
----------------------+---------------+------------+------------------+--------+--------+--------+---------+-------+-------+-----------------------+----------+--------+-------------+-----------+
6 注意事项
闪回时间旅行有选择性的在少量对安全性有要求的表上实施,开启后对表的恢复和审计都有帮助,但是开始表的闪回归档对大量操作而言消耗的存储空间不容忽视,而对高并发操作而言,其性能方面的影响也需要注意。
限于篇幅,闪回时间有些重要特性(如数据库加固)这里没有涉及,对于表的闪回时间旅行的限制也需要参看一下官方文档




