我的编程空间,编程开发者的网络收藏夹
学习永远不晚

聊聊数据库闪回技术

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

聊聊数据库闪回技术

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

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


一、闪回数据库

  闪回数据库是把数据库整体状态恢复到过去某一时间点或者某一系统更改号(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 recovery
NAME                      TYPE     VALUE
----------------------------------- ----------- ------------------------------
db_recovery_file_dest          string    /u01/app/oracle/flash_recovery_area
db_recovery_file_dest_size       big integer  3882M
recovery_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 Mode
Automatic archival       Enabled
Archive destination       USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     10
Next log sequence to archive   12
Current 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 bytes
Fixed Size    2217384 bytes
Variable Size  511707736 bytes
Database Buffers  260046848 bytes
Redo Buffers    2674688 bytes
Database 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  NO
2      ONLINE          /u01/app/oracle/oradata/orcl/redo02.log  NO
1      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 altered
SQL> 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 NO
2      ONLINE           /u01/app/oracle/oradata/orcl/redo02.log NO
1      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:37
BIN$RgTFmsLOhcHgUKjAyX44MA==$0 TEST_1114_1               2017-01-14:09:21:58
BIN$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:37
BIN$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 <table_name>  as of  timestamp to_timestamp(timestamp,'yyyy-mm-dd hh34:mi:ss');
select * from <table_name>  as of  scn scn_number;


2) 闪回版本查询

SELECT versions_startscn, versions_starttime, versions_endscn, versions_endtime, versions_xid, versions_operation, t.*
FROM <table_name> t
VERSIONS BETWEEN TIMESTAMP BeginTimestamp and EndTimestamp;
SELECT versions_startscn, versions_starttime, versions_endscn, versions_endtime, versions_xid, versions_operation, t.*
FROM <table_name> t
VERSIONS 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  NO
2       ONLINE          /u01/app/oracle/oradata/orcl/redo02.log  NO
1       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  NO
2       ONLINE          /u01/app/oracle/oradata/orcl/redo02.log  NO
1       ONLINE          /u01/app/oracle/oradata/orcl/redo01.log  NO
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  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    NO
1032882          14-1月 -17 09.50.06 上午                       030001002F030000 I             3       ONLINE         /u01/app/oracle/oradata/orcl/redo03.log    NO
1032882          14-1月 -17 09.50.06 上午                       030001002F030000 I             2       ONLINE         /u01/app/oracle/oradata/orcl/redo02.log    NO
1032882          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》.


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

聊聊数据库闪回技术

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

实战学习:聊聊Node.js怎么操作数据库

本篇文章分享Node.js服务端实战,介绍一下Node.js操作数据库的方法,希望对大家有所帮助!
2023-05-14

聊聊node怎么操作MySQL数据库(增删改查)

node怎么操作MySQL数据库?下面本篇文章带大家了解一下node项目中MySQL数据库增删改查的方法,希望对大家有所帮助!
2023-05-14

Oracle 闪回技术在数据恢复中的高级应用

Oracle闪回技术是一种强大的数据库恢复和数据审计工具,它允许用户在不恢复整个数据库的情况下,快速回滚数据库中的数据到之前的某个时间点或者某个特定的事务状态。以下是Oracle闪回技术在数据恢复中的高级应用:高级应用误操作恢复:当用户意
Oracle 闪回技术在数据恢复中的高级应用
2024-10-09

聊聊数据库的未来,写在 PingCAP 成立五周年前夕

五年前创业的出发点其实很朴素:做一个更好的分布式数据库。从学术的角度上看起来,并不是提出了什么惊天地泣鬼神的神奇算法,我们选择的 Shared-nothing 的架构其实在当时的业界也不是什么新鲜的事情了,但真正令我激动的是:我们要造的是一个真正能作为整个系统
聊聊数据库的未来,写在 PingCAP 成立五周年前夕
2020-07-02

聊一聊mycat数据库集群系列之双主双重实现

最近在梳理数据库集群的相关操作,现在花点时间整理一下关于mysql数据库集群的操作总结,恰好你又在看这一块,供一份参考。本次系列终结大概包括以下内容:多数据库安装、mycat部署安装、数据库之读写分离主从复制、数据库之双主多重、数据库分库分表。每一个点,有可能
聊一聊mycat数据库集群系列之双主双重实现
2017-03-04

【MySQL】数据库闪回工具之binlo

[root@wallet01 ~]# tar zxvf Python-3.6.1.tgz[root@wallet01 ~]# cd Python-3.6.1[root@wallet01 Python-3.6.1]# ./configure 
2023-01-31

记录一下无聊的数据库作业

题目如下:1.查询sC表中的全部数据。2. 查询计算机系学生的姓名和年龄3.查询成绩在70~80分的学生的学号、课程号和成绩4.查询计算机系年龄在18~20岁的男生姓名和年龄s.查询C001课程的最高分6.查询计算机系学生的最大年龄和最小年龄7.统计每个系的学
记录一下无聊的数据库作业
2017-02-11

oracle数据库闪回功能怎么使用

oracle 数据库的闪回功能通过以下步骤恢复过去时间点的数据库状态:启用闪回功能;确定恢复时间点;执行闪回操作,使用 scn 号或时间戳指定时间点;验证恢复到所需时间点。Oracle 数据库闪回功能的使用Oracle 数据库的闪回功能是
oracle数据库闪回功能怎么使用
2024-04-18

ChatGPT PHP技术解析:构建智能聊天机器人的问题回答能力

ChatGPT是OpenAI推出的一款强大的自然语言处理模型,可以实现智能对话,并具备强大的问题回答能力。在本文中,我们将重点介绍如何使用PHP语言结合ChatGPT构建智能聊天机器人,并给出具体的代码示例。首先,我们需要在OpenAI申请
2023-10-24

编程热搜

目录