千家信息网

聊聊数据库闪回技术

发表于:2024-11-26 作者:千家信息网编辑
千家信息网最后更新 2024年11月26日,提到闪回技术,工作这么久了我也很少用到, 以至于我都快忘记闪回技术都有哪些东西了。今天得空,就来复习一下数据库中的闪回技术。即使不看书,我印象中的闪回技术分这么几种,闪回数据库、闪回删除、闪回查询。闪
千家信息网最后更新 2024年11月26日聊聊数据库闪回技术

提到闪回技术,工作这么久了我也很少用到, 以至于我都快忘记闪回技术都有哪些东西了。今天得空,就来复习一下数据库中的闪回技术。

即使不看书,我印象中的闪回技术分这么几种,闪回数据库、闪回删除、闪回查询。闪回技术相比于数据库不完全恢复,其特点里速度快,影响层面小。


一、闪回数据库

闪回数据库是把数据库整体状态恢复到过去某一时间点或者某一系统更改号(SCN),是实施数据库不完全恢复的一种快速方式。

1.1使用要求:

1)必须有SYSDBA的权限

2)启用了recovery area

3)数据库处于FLASHBACK模式

4)数据库处于mount状态


此外,

5)数据库必须处理归档模式;

6)控制文件不能是备份的控制文件或者重建的控制文件;

7)数据库不包含处于FLASHBACK OFF的表空间。


1.2 语法


说明:

FLASHBACK DATABASE:当使用flashback database命令时,数据库验证所要求的归档日志和联机重做日志是否可用。如果它们可用,那么它将数据库中的所有当前联机数据文件恢复为SCN或此语句中指定的时间。

数据库中保留的闪回数据量由DB_FLASHBACK_RETENTION_TARGET初始化参数和快速恢复区的大小控制。可以通过查询V$FLASHBACK_DATABASE_LOG视图来确定多长时间后可以闪回数据库。


STANDBY:指定STANDBY以将备用数据库还原到较早的SCN或时间。如果数据库不是备用数据库,则数据库返回错误。如果省略此子句,则数据库可以是主数据库或备用数据库。

TO SCN语句:

TO SCN将数据库恢复为其在指定SCN的状态。

TO BEFORE SCN将数据库恢复到紧靠指定SCN之前的系统更改号的状态。


TO TIMESTAMP语句:

TO TIMESTAMP:将数据库恢复为其在指定时间戳的状态。

TO BEFORE TIMESTAMP:将数据库恢复到指定时间戳之前一秒的状态。


TO RESTORE POINT语句:指定此子句以将数据库闪回到指定的还原点。 是未启用闪回数据库唯一可以使用的语句。

RESETLOGS

将数据库闪回到刚好在最后一次resetlogs操作(ALTER DATABASE OPEN RESETLOGS)之前。


知道了闪回数据库的要求以及语法之后,就可以操作数据库的闪回模式了。(测试环境:ORACLE 11GR2)

1)使用数据库管理员登录数据库

SQL> conn /as sysdba


2)查看数据库是否启用闪回模式

SQL>  select flashback_on from v$database; FLASHBACK_ON------------------NO


数据库未启用,则使用如下命令:

ALTER DATABASE FLASHBACK ON; #实际测试过程中,执行该命令时没有重启数据库。



3) 查看是否启用数据库闪回区

SQL> show parameter recoveryNAME                      TYPE     VALUE----------------------------------- ----------- ------------------------------db_recovery_file_dest          string    /u01/app/oracle/flash_recovery_areadb_recovery_file_dest_size       big integer  3882Mrecovery_parallelism           integer     0

#修改方式:

#调整闪回区的大小及位置

#SQL> alter system set db_recovery_file_dest_size=5g scope=spfile;

#设置闪回区位置:

#SQL> alter system set db_recovery_file_dest='/app/flash_recovery_area' scope=spfile;


4) 查看 DB_FLASHBACK_RETENTION_TARGET参数(单位:分钟)

SQL> show parameter db_flashback_retention_target NAME                      TYPE      VALUE------------------------------------ ----------- ------------------------------db_flashback_retention_target      integer    1440

修改方式:

#SQL> alter system set db_flashback_retention_target=7200 scope=spfile;

5)查看是否处于归档模式

SQL> archive log list;Database log mode       Archive ModeAutomatic archival       EnabledArchive destination       USE_DB_RECOVERY_FILE_DESTOldest online log sequence     10Next log sequence to archive   12Current log sequence       12


已启用归档模式



3)和4)中的参数可以根据实际需要修改

6) 查看V$FLASHBACK_DATABASE_LOG,查看是否有数据生成

SQL> select * from V$FLASHBACK_DATABASE_LOG; OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TIME RETENTION_TARGET FLASHBACK_SIZE ESTIMATED_FLASHBACK_SIZE-------------------- --------------------- ---------------- -------------- ------------------------1025623              2017/1/13 11:11:05    1440        8192000     0

7)闪回数据库

创建测试表:

SQL> create table scott.test_1113_1 as select * from v$logfile; Table created SQL> create table scott.test_1113_2 as select * from v$logfile; Table created SQL> select dbms_flashback.get_system_change_number,SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number)  from dual;   GET_SYSTEM_CHANGE_NUMBER SCN_TO_TIMESTAMP(DBMS_FLASHBAC------------------------ --------------------------------------------------------------------------------1026334                  13-1月 -17 11.21.50.000000000 上午

此时的系统更改点是1026334,之后数据库会恢复到这个点。表scott.test_1113_1和scott.test_1113_2都应该存在。

SQL> drop table scott.test_1113_1; Table dropped SQL> drop table scott.test_1113_2; Table dropped SQL> shutdown abort;ORACLE instance shut down.SQL> startup mount;ORACLE instance started.Total System Global Area  776646656 bytesFixed Size    2217384 bytesVariable Size  511707736 bytesDatabase Buffers  260046848 bytesRedo Buffers    2674688 bytesDatabase mounted.SQL> flashback database to scn 1026334;Flashback complete.SQL> alter database open resetlogs;Database altered.SQL> select count(1) from scott.test_1113_1;   COUNT(1)----------   3 SQL> select count(1) from scott.test_1113_2;   COUNT(1)----------   3

闪回数据库后,scott.test_1113_1和scott.test_1113_2都存在。


二、闪回表

使用flashback table 命令,可以将数据库的表恢复到之前某一个时刻的状态,至于能恢复到什么时间点,则依赖于回滚段的数据量。flashback table 操作不可回滚。

2.1 使用要求

具有该表的FLASHBACK权限或者有 FLASHBACK ANY TABLE的权限,此外,还必须有SELECT, INSERT, DELETE, and ALTER的权限。

使用flashback table的表必须开启row movement(从回收站闪回的表例外)。

要将表闪回到还原点,必须具有SELECT ANY DICTIONARY或FLASHBACK ANY TABLE的系统特权或SELECT_CATALOG_ROLE角色。

2.2 语法


在Oracle闪回表操作期间,Oracle数据库会在闪回列表中指定的所有表上获取独占DML锁。当这些表恢复到其早期状态时,这些锁阻止对表的任何操作。

闪回表操作在单个事务中执行,而与闪回列表中指定的表数无关。 所有表都恢复到早期状态,或者它们都不恢复。如果闪回表操作在任何表上失败,则整个语句将失败。

在完成闪回表操作时,表中的数据与早期的表一致。 但是,FLASHBACK TABLE TO SCN或TIMESTAMP不保留rowid,而FLASHBACK TABLE TO BEFORE DROP不会恢复之前引用的约束。

Oracle数据库不会将与表关联的统计信息还原到之前的表单。当前存在的表上的索引将被还原,并反映闪回点处的表的状态。 如果索引现在存在,但在闪回点尚不存在,则数据库更新索引以反映闪回点处的表的状态。 但是,在闪回点和当前时间之间的间隔期间丢弃的索引不会恢复。

schema:表的拥有者

table:指定包含要还原到早期版本的数据的一个或多个表的名称。

限制:

1)闪回表操作对以下类型对象无效:作为集群一部分的表,物化视图,高级排队(AQ)表,静态数据字典表,系统表,远程表,对象表,嵌套表或单个表 分区或子分区。

2)以下DDL操作更改表的结构,以便以后无法使用TO SCN或TO TIMESTAMP子句将表闪回到操作之前的某个时间:升级,移动或截断表; 向表添加约束,向集群添加表; 修改或丢弃柱; 改变列加密密钥; 添加,删除,合并,拆分,合并或截断分区或子分区(除了添加范围分区)。(upgrading, moving, or truncating a table; adding a constraint to a table, adding a table to a cluster; modifying or dropping a column; changing a column encryption key; adding, dropping, merging, splitting, coalescing, or truncating a partition or subpartition (with the exception of adding a range partition).

TO RESTORE POINT:指定要将表闪回的恢复点。 还原点必须已创建。

ENABLE | DISABLE TRIGGERS:默认关闭触发器

TO BEFORE DROP:从回收站中还原表。

可以指定表的原始名称或分配给该对象的系统名称;

如果存在多个同名表,将还原最晚删除的表,即后进先出。

RENAME TO:重命名。


2.3 例子

1)创建新的测试表

SQL> create table scott.test_1114_1 as select * from v$logfile;SQL> select * from scott.test_1114_1; GROUP#     STATUS  TYPE  MEMBER                     IS_RECOVERY_DEST_FILE---------- ------- ------- ------------------------------------------------- ---------------------3      ONLINE          /u01/app/oracle/oradata/orcl/redo03.log  NO2      ONLINE          /u01/app/oracle/oradata/orcl/redo02.log  NO1      ONLINE          /u01/app/oracle/oradata/orcl/redo01.log  NO

2)获取当前SCN和时间戳,最后该表数据会恢复到当前的时间点。

SQL> select dbms_flashback.get_system_change_number,SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number) timestamp  from dual; GET_SYSTEM_CHANGE_NUMBER TIMESTAMP------------------------ --------------------------------------------------------------------------------1031289                  14-1月 -17 09.13.59.000000000 上午

3)删除该表中的记录

SQL> delete from scott.test_1114_1; SQL> select count(1) from scott.test_1114_1;   COUNT(1)----------   0

4)闪回表

SQL> alter table scott.test_1114_1 enable row movement; Table alteredSQL> flashback table scott.test_1114_1 to scn 1031289; Done SQL> select * from scott.test_1114_1; GROUP#   STATUS  TYPE  MEMBER                              IS_RECOVERY_DEST_FILE---------- ------- ------- --------------------------------------- --------------------3       ONLINE       /u01/app/oracle/oradata/orcl/redo03.log NO2      ONLINE           /u01/app/oracle/oradata/orcl/redo02.log NO1      ONLINE           /u01/app/oracle/oradata/orcl/redo01.log NO

表已恢复

5)多次删除与创建该表

SQL> drop table  scott.test_1114_1; Table dropped SQL> create table scott.test_1114_1 as select * from v$logfile; Table created SQL> drop table  scott.test_1114_1; Table dropped SQL> create table scott.test_1114_1 as select * from v$logfile; Table created SQL> drop table  scott.test_1114_1; Table dropped

6)查看回收站

SQL> select object_name,original_name,droptime from dba_recyclebin; OBJECT_NAME             ORIGINAL_NAME              DROPTIME------------------------------ -------------------------------- -------------------BIN$RgTFmsLNhcHgUKjAyX44MA==$0 TEST_1114_1               2017-01-14:09:21:37BIN$RgTFmsLOhcHgUKjAyX44MA==$0 TEST_1114_1               2017-01-14:09:21:58BIN$RgTFmsLPhcHgUKjAyX44MA==$0 TEST_1114_1               2017-01-14:09:22:01


7)恢复表

SQL> flashback table scott.test_1114_1 to before drop; Done SQL> select object_name,original_name,droptime from dba_recyclebin; OBJECT_NAME              ORIGINAL_NAME              DROPTIME------------------------------ -------------------------------- -------------------BIN$RgTFmsLNhcHgUKjAyX44MA==$0 TEST_1114_1               2017-01-14:09:21:37BIN$RgTFmsLOhcHgUKjAyX44MA==$0 TEST_1114_1               2017-01-14:09:21:58


最晚被删除的表被还原。

SQL> flashback table scott.test_1114_1 to before drop rename to test_1114_2; Done SQL> select object_name,original_name,droptime from dba_recyclebin; OBJECT_NAME             ORIGINAL_NAME              DROPTIME------------------------------ -------------------------------- -------------------BIN$RgTFmsLNhcHgUKjAyX44MA==$0 TEST_1114_1               2017-01-14:09:21:37

三、闪回查询

要使用闪回查询,必须要有表的查询权限,以及该表的FLASHBACK 权限或FLASHBACK ANY TABLE的系统权限。

闪回查询有两种,一种是查询某一时间点的的数据(as of),另一种查询某一时间段内数据的操作(versions between)。闪回查询并不会影响到当前表中的数据。

1)闪回时间点查询

select * from   as of  timestamp to_timestamp(timestamp,'yyyy-mm-dd hh34:mi:ss');select * from   as of  scn scn_number;


2) 闪回版本查询

SELECT versions_startscn, versions_starttime, versions_endscn, versions_endtime, versions_xid, versions_operation, t.*FROM  tVERSIONS BETWEEN TIMESTAMP BeginTimestamp and EndTimestamp;SELECT versions_startscn, versions_starttime, versions_endscn, versions_endtime, versions_xid, versions_operation, t.*FROM  tVERSIONS BETWEEN scn begin_scn and end_scn;



例子:

1)获取当前的SCN

SQL> select dbms_flashback.get_system_change_number,SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number) timestamp  from dual; GET_SYSTEM_CHANGE_NUMBER TIMESTAMP------------------------ --------------------------------------------------------------------------------1032595                  14-1月 -17 09.47.57.000000000 上午

2)增加test_1114_1表中的数据

SQL> insert into scott.test_1114_1 select * from scott.test_1114_1;3 rows inserted

3)闪回时间点查询

SQL> select * from scott.test_1114_1 as of scn 1032595; GROUP#     STATUS  TYPE    MEMBER                      IS_RECOVERY_DEST_FILE---------- ------- ------- ----------------------------------------- ---------------------3       ONLINE          /u01/app/oracle/oradata/orcl/redo03.log  NO2       ONLINE          /u01/app/oracle/oradata/orcl/redo02.log  NO1       ONLINE          /u01/app/oracle/oradata/orcl/redo01.log  NO SQL> select * from scott.test_1114_1; GROUP#     STATUS  TYPE    MEMBER                      IS_RECOVERY_DEST_FILE---------- ------- ------- ----------------------------------------- ---------------------3       ONLINE          /u01/app/oracle/oradata/orcl/redo03.log  NO2       ONLINE          /u01/app/oracle/oradata/orcl/redo02.log  NO1       ONLINE          /u01/app/oracle/oradata/orcl/redo01.log  NO3       ONLINE          /u01/app/oracle/oradata/orcl/redo03.log  NO2       ONLINE          /u01/app/oracle/oradata/orcl/redo02.log  NO1       ONLINE          /u01/app/oracle/oradata/orcl/redo01.log  NO 6 rows selected

4)闪回版本查询

SQL> select dbms_flashback.get_system_change_number,SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number) timestamp  from dual; GET_SYSTEM_CHANGE_NUMBER  TIMESTAMP------------------------  -------------------------------------------------------------------------------1032939                   14-1月 -17 09.52.42.000000000 上午SQL> SELECT versions_startscn, versions_starttime, versions_endscn, versions_endtime, versions_xid, versions_operation, group#,status,type,member ,is_recovery_dest_file  2  FROM scott.test_1114_1  3  VERSIONS BETWEEN scn 1032595 and  1032939; VERSIONS_STARTSCN VERSIONS_STARTTIME      VERSIONS_ENDSCN VERSIONS_ENDTIME  VERSIONS_XID   VERSIONS_OPERATION  GROUP#     STATUS  TYPE   MEMBER                     IS_RECOVERY_DEST_FILE----------------- ----------------------- --------------- ----------------- ---------------- ------------------ ---------- ------- ------- ------------------------------------- ---------------------                                                                           3       ONLINE         /u01/app/oracle/oradata/orcl/redo03.log    NO                                                                           2       ONLINE         /u01/app/oracle/oradata/orcl/redo02.log    NO                                                                           1       ONLINE         /u01/app/oracle/oradata/orcl/redo01.log    NO1032882          14-1月 -17 09.50.06 上午                       030001002F030000 I             3       ONLINE         /u01/app/oracle/oradata/orcl/redo03.log    NO1032882          14-1月 -17 09.50.06 上午                       030001002F030000 I             2       ONLINE         /u01/app/oracle/oradata/orcl/redo02.log    NO1032882          14-1月 -17 09.50.06 上午                       030001002F030000 I             1       ONLINE         /u01/app/oracle/oradata/orcl/redo01.log    NO 6 rows selected

闪回版本查询查到了SCN为1032595表的数据状态,又查到了3条insert的记录。


四、总结

到目前为止,所接触到的关于闪回的技术就是这些。分别是闪回数据库[1种],闪回表[2种方式],闪回查询[2种方式]。

参考资料:

1.《Database SQL Language Reference》.


数据 数据库 查询 时间 状态 权限 系统 技术 模式 语句 方式 命令 文件 版本 索引 控制 测试 中指 参数 名称 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广东省软件开发服务招投标 证券公司的服务器一般要多少钱 关系数据库删除数据库 管理软件开发选择臻动传媒 云南定制软件开发商 数据库对数字自动生成排名 山西统一软件开发服务以客为尊 web服务器的管理与维护 软件开发过程中有哪些小组 网络安全脆弱性体现 北京常规软件开发代理品牌 福州中旭网络技术公司怎么样 织梦数据库字段替换 文件服务器系统除了群晖还有什么 高新技术企业的数据库 服务器远程开关机 黎明杀机查看当前服务器 gdc rd-200服务器 虹口区正规软件开发欢迎咨询 网络技术专业主要方向 不用数据库 存放文件里 软件开发师职业资格 中华人民共和国宪法网络安全法 学软件开发需要哪些英语词汇 苹果充抖币提示连接服务器失败 杭州系统软件开发价格表 怀宁网络安全排名 合肥泰格网络技术公司 创业 数据库 长春青少年网络安全
0