第一部分 概述

备份与恢复概念

  • 数据库在使用时遇到各种故障,需要利用备份进行恢复,解决故障造成的影响
  • 备份就是把数据库复制到转储设备的过程
  • 恢复就是发生故障后,利用已备份的数据文件或控制文件,重新建立一个完整的数据库

    故障类型

    image-20201228101553286.png

    备份分类

    image-20201228101734667.png

    恢复分类

    image-20201228101756906.png

    第二部分 使用RMAN工具

    概念

  • RMAN(Recovery Manager),即恢复管理器

    • 是 DBA 的一个重要工具,用于备份、还原和恢复 Oracle 数据库
    • 完成对目标数据库的控制文件、数据文件及归档日志文件以及SPFILE的联机备份
    • 能够实现对数据库的完全或不完全的恢复操作

      备份的对象是数据库的硬盘文件 一般在数据库重大故障或硬盘文件损坏时的修复手段 备份的速度慢

RMAN组件

image-20201228102028403.png

RMAN-恢复目录

  • 恢复目录用于存放RMAN元数据,它是存放RMAN元数据的一个可选设置

image-20201228103529876.png

创建恢复目录

1、创建表空间
CREATE TABLESPACE rmants DATAFILE 'c:\rmants.dbf' SIZE 20M;
2、创建用户并授权

  1. CREATE USER rman IDENTIFIED BY rmanpwd DEFAULT TABLESPACE rmants;
  2. GRANT connect,resource,RECOVERY_CATALOG_OWNER TO rman;

说明:RECOVERY_CATALOG_OWNER 是恢复目录所有者

3、创建恢复目录
1) 命令提示符中 连接恢复目录:
C:\users\administrator>rman catalog rman/rmanpwd

说明:rman是用户名,rmanpwd是密码

2) 创建恢复目录:
RMAN>CREATE CATALOG;
3)退出
RMAN>exit;

注册目标数据库到恢复目录

1)连接到目标数据库(即要备份的数据库)
C:\Users\Administrator>rman target sys/12345_coM

sys/12345_coM是目标数据库的用户名和密码

2)连接到恢复目录数据库
RMAN> connect catalog rman/rmanpwd;

rman/rmanpwd是 恢复目录数据库的用户名和密码

3)注册数据库

RMAN>register database;

RMAN-通道

  • 当使用RMAN在存储设备(磁盘或磁带)上执行备份、转储等操作时,RMAN需要在存储设备和目标数据库之建立连接,该连接被称为通道
  • 如果不配置通道则使用默认通道

image-20201228103717137.png

自动通道配置

  1. --指定自动通道并行个数。
  2. CONFIGURE DEVICE TYPE sbt/disk PARALLELISM n;
  3. --指定自动通道的默认设备
  4. CONFIGURE DEFAULT DEVICE TYPE TO sbt/disk;

sbt/disk 磁带/磁盘 n :设置自动通道的个数

示例:指定RMAN可以打开5个磁盘通道

  1. RMAN>CONFIGURE DEVICE TYPE disk PARALLELISM 5;
  2. RMAN>CONFIGURE DEFAULT DEVICE TYPE TO disk;

手动通道配置

  1. RUN{
  2. ALLOCATE CHANNEL 通道名称 DEVICE TYPE 设备类型;
  3. ……}

示例:指定3个磁盘通道

  1. RMAN>RUN
  2. {
  3. ALLOCATE CHANNEL ch1 DEVICE TYPE disk;
  4. ALLOCATE CHANNEL ch2 DEVICE TYPE disk;
  5. ALLOCATE CHANNEL ch3 DEVICE TYPE disk;
  6. }

显示通道配置参数

RMAN>SHOW ALL;

RMAN-备份集与备份片

image-20201228104526944.png

RMAN-Format字符串替代变量说明

%c:备份片的拷贝数(从1开始编号);
%d:数据库名称;
%D:位于该月中的天数 (DD);
%M:位于该年中的月份 (MM);
%F:一个基于DBID 唯一的名称,这个格式的形式为c-IIIIIIIIII-YYYYMMDD-QQ,其中IIIIIIIIII 为该数据库的DBID,YYYYMMDD 为日期,QQ 是一个1-256 的序列;
%n:数据库名称,并且会在右侧用x字符进行填充,使其保持长度为8;
%u:是一个由备份集编号和建立时间压缩后组成的8字符名称。利用%u可以为每个备份集生成一个唯一的名称;
%p:该备份集中备份片的编号,从1 开始编号;
%U:是%u%p%c的简写形式,利用它可以为每一个备份片生成一个唯一名称,这是最常用的命名方式;
%s:备份集的号;
%t:备份集时间戳;
%T:年月日格式(YYYYMMDD);

注:如果在BACKUP命令中没有指定FORMAT选项,则RMAN默认使用%U为备份片段命名

RMAN-备份命令

BACKUP命令

  • 用于备份数据库文件,可以将多个文件、表空间、整个数据库以备份集形式备份到磁盘或磁带上

image-20201228104921532.png

在归档方式下备份数据库步骤:

  • 在SQLPlus环境下
    • 以SYSDBA身份登录
    • 查看数据库归档方式
    • 如果处于非归档方式,则将数据库处于归档方式下
    • 打开数据库
  • 在RMAN环境下

    • 连接目标数据库和恢复目录数据库
    • 备份数据库和归档日志

      RMAN-恢复命令

  • 使用RMAN备份的数据库页只能使用RMAN提供的恢复命令进行恢复。

  • RMAN恢复数据库用到了两个命令:

    • RESTORE 命令:从备份中还原数据库文件
    • RECOVER 命令:通过应用归档日志文件中记录的更改来恢复已还原文件

      恢复数据库步骤:

  • 保证数据库在MOUNT模式下启动: startup mount

  • 在RMAN环境下
    • 连接目标数据库:rman target sys/123
    • 执行RESTORE命令:restore database;
    • 执行RECOVE命令:recover database;
    • 在打开数据库:alter database open resetlogs;

      resetlogs 重置重做日志

1.备份和恢复整个数据库

  1. //自动分配通道,FORMAT默认使用%U,备份集存储在数据库快闪恢复区内
  2. //备份文件包括数据文件、控制文件、重做日志文件和参数文件
  3. RMAN>backup database;
  4. //如果还要包含归档日志文件,则要加上plus archivelog关键字,delete input的意思是在备份完成后,删除archivelog文件
  5. RMAN>backup database plus archivelog delete input;
  6. //自动备份通道,通过FORMAT指定具体的路径和格式
  7. RMAN>backup database format 'd:/rmacback/%U';
  8. //手动分配通道,备份数据库
  9. RMAN>run{
  10. ALLOCATE CHANNEL ch1 DEVICE TYPE disk;
  11. backup database format 'd:/rmacback/%U';
  12. release channel ch1;
  13. }
  14. //全库备份的恢复,数据库要在mount状态下执行
  15. C:\Users\Administrator>sqlplus sys/12345_coM as sysdba
  16. RMAN>startup mount
  17. RMAN>restore database;
  18. RMAN>recover database;
  19. RMAN>alter database open resetlogs;

2.备份和恢复表空间

  1. //表空间备份
  2. RMAN>backup tablespace users;
  3. //多个表空间备份
  4. RMAN>backup filesperset=3 tablespace users,system,sysaux;
  5. //在run命令中备份表空间
  6. RMAN>run
  7. {
  8. ALLOCATE CHANNEL ch1 DEVICE TYPE disk;
  9. backup format 'd:/rmacback/%U' (tablespace users,system,sysaux);
  10. release channel ch1;
  11. }
  12. //表空间的恢复
  13. //如果只丢失了特定的表空间的数据文件,那么可以选择只恢复这个表空间,而不是恢复整个数据库,表空间恢复可以在不关闭数据库的情况下进行,只需要将需要恢复的表空间offline
  14. RMAN>run
  15. {
  16. sql 'alter tablespace users offline immediate';
  17. restore tablespace users;
  18. recover tablespace users;
  19. sql 'alter tablespace users online';
  20. }

3.数据文件的备份和恢复

  1. //数据文件恢复与表空间恢复类似,假设数据文件为4的文件丢失,文件名是'd:/app/user01.dbf',那么恢复的时候可以指定文件号,也可以指定文件名
  2. RMAN>backup datafile 4;
  3. RMAN>backup datafile 'd:/app/user01.dbf';
  4. //恢复命令
  5. RMAN>run
  6. {
  7. ALLOCATE CHANNEL ch1 DEVICE TYPE disk;
  8. sql 'alter tablespace users offline immediate';
  9. restore datafile 4; -- 或者restore datafile 'd:/app/user01.dbf';
  10. recover datafile 4;
  11. sql 'alter tablespace users online';
  12. release channel ch1;
  13. }

完整案例

使用rman对数据库进行热备份。
备份完成后,关闭数据库再删除文C:\app\Administrator\oradata\orcl\USERS01.DBF。发现数据库无法启动。使用备份进行恢复,发现数据库可以正常打开,说明恢复正常

1.启用归档日志。

  1. SQL> shutdown immediate;
  2. SQL> startup mount;
  3. SQL> archive log list; 查看是否启用了归档日志
  4. SQL> alter database archivelog; 启用归档日志
  5. SQL> alter database open; 打开数据库

2.创建恢复目录数据库并注册目标数据库到恢复目录

2.1.在恢复目录数据库中 创建表空间
SQL> create tablespace rmants datafile 'c:\backup\rmants.dbf' size 500m;

大小为500M,名称为rmants的表空间 注意:backup需事先手工创建,rmants.dbf会自动创建

2.2.创建用户,用户名rman,密码rman,rmants是上一步建立的表空间
SQL> create user rman identified by rman default tablespace rmants;
授权(rman是用户名):
SQL> grant connect,resource,recovery_catalog_owner to rman;
退出:
SQL>exit;
2.3.rman连接到恢复目录数据库(rman/rman是用户名/密码)
C:\Users\Administrator>rman catalog rman/rman
建立恢复目录
RMAN> create catalog ;
退出:
RMAN>exit;
2.4.连接到目标数据库(即要备份的数据库,sys/123是用户名/密码)
C:\Users\Administrator>rman target sys/123

sys可以换成目标数据库的其他用户

连接到恢复目录数据库(rman/rman是用户名/密码)
RMAN> connect catalog rman/rman;
注册数据库
RMAN> register database;

3.配置通道

指定设备的类型是磁盘(disk),通道的个数是5个
RMAN> configure device type disk parallelism 5;

4.开始备份

  1. RMAN> backup database format 'c:\backup\%U';
  2. RMAN> exit;

format指定了文件名,backup 目录需要提前建立, 如果没有指定文件名,默认备份到快闪恢复区(C:\app\Administrator\flash_recovery_area)

5.关闭数据库并删除文件

  1. C:\Users\Administrator>sqlplus sys/123 as sysdba
  2. SQL> shutdown immediate;

把C:\app\Administrator\oradata\orcl\USERS01.DBF删除到回收站

6.启动数据库并恢复文件

  1. SQL> startup mount;
  2. SQL> exit;
  3. C:\Users\Administrator>rman target sys/123;
  4. RMAN> restore database;
  5. RMAN> recover database;
  6. RMAN> alter database open;
  7. RMAN> exit;

如果数据库启动成功表示恢复成功

RMAN> restore database;

简单rman案例

没有启动归档
1.连接目标数据库
C:\Users\Administrator>rman target system/123

system换成其他用户也可以完成此案例

2.关闭数据库
RMAN> shutdown immediate;
3.进入mount状态
RMAN> startup mount;
4.备份
RMAN> backup database;
5.删除一个dbf文件
6.恢复

  1. RMAN> restore database;
  2. RMAN> recover database;
  3. RMAN> alter database open;

第三部分 数据泵

概述

  • 导出即数据库的逻辑备份,实质是读取一个数据库记录集,并将这个记录集写入一个扩展名位dmp的文件。这些记录的导出与其物理位置无关。
  • 导入即数据库的逻辑恢复,实质是读取被导出的二进制转储文件并将其恢复到数据库

    备份的是数据。在多个数据库之间或多个用户之间互相交换数据时使用 可以在数据库不停机的状态下进行备份

四种模式

image-20201228110049750.png

案例

使用数据泵技术对scott用户的部分表进行备份,
然后删除该表,再次恢复进行验证

  1. --解锁语法
  2. alter user 用户名 account unlock ;
  3. -- 解锁示例
  4. alter user scott account unlock ; --解锁scott账户
  5. -- 设置密码语法
  6. alter user 用户名 identified by 密码;
  7. -- 设置密码示例
  8. alter user scott identified by 123;

scott自带四个表:
dept :部门表
emp:员工表
bonus:工资表
salgrade:工资等级表

1.创建一个操作目录

sys登录
c:\users\administrator>sqlplus sys/123_com as sysdba
首先创建一个磁盘目录c:\opt\backup
创建一个名为dump_dir的对象(名字是随便起的),类型是directory,该对象和c:\opt\backup关联起来

  1. -- 语法:
  2. create directory 目录名 as '路径';
  3. -- 示例:
  4. SQL> create directory dump_dir as 'c:\opt\backup';

2.对scott用户授权

授权scott可以读、写dump_dir,dump_dir是一个随意称呼的名字
SQL> grant read,write on directory dump_dir to scott;
退出登录
SQL>exit;

3.进行备份

以scott的账号连接数据库,备份emp表和dept表,生成备份文件scotttab.dmp,放到

  1. -- 语法:
  2. expdp 用户名/密码 directory=目录名 dumpfile=文件名.dmp tables=表1,表2...
  3. -- 示例:
  4. c:\users\administrator>expdp scott/123 directory=dump_dir dumpfile=scotttab.dmp tables=dept,emp

重要:在cmd中执行命令,命令最后不可以使用分号

4.删除emp表

  1. c:\users\administrator> sqlplus scott/123
  2. SQL> drop table emp;

注意:不要删除dept表,因为它有外键

5.进行恢复并测试

以scott的账号连接数据库,恢复emp,备份文件名为scotttab.dmp,放在c:\opt\backup目录中

  1. -- 语法
  2. impdp 用户名/密码 directory=目录名 dumpfile=文件名.dmp tables=表名
  3. -- 示例
  4. C:\Users\Administrator>impdp scott/123 directory=dump_dir dumpfile=scotttab.dmp tables=emp

以scott身份执行此命令,看到14条记录表示恢复成功
SQL> select count(*) from emp;

扩展

导出导入命令

  1. -- 导出用户system下的表emp,dep
  2. C\users\administrator>expdp system/123 directory=dump_dir dumpfile=daochu.dmp tables=emp,dep
  3. -- 导入用户system下的表
  4. C\users\administrator>impdp system/123 directory=dump_dir dumpfile=daochu.dmp tables=emp,dep table_exists_action=replace
  5. 注意:table_exists_action=replace 命令为检测到表存在,则替换表,skip跳过,append追加,replace替换
  6. -- 将导出的SCOTT 用户下的deptemp表导入user1用户下
  7. C\users\administrator>impdp system/123 directory=dump_dir dumpfile=daochu.dmp tables=scott.emp,scott.dept REMAP_SCHEMA=SCOTT:USER1
  8. -- 导出用户Scott
  9. C\users\administrator>expdp system/123 directory=dump_dir dumpfile=Scott.dmp schemas=Scott
  10. -- 导入用户Scott
  11. C\users\administrator>impdp system/123 directory=dump_dir dumpfile=scott.dmp schemas=Scott
  12. -- SCOTT中所有对象导入user1
  13. C\users\administrator>impdp system/123 directory=dump_dir dumpfile=scott.dmp schemas=Scott
  14. REMAP_SCHEMA=SCOTT:USER1
  15. -- 导出表空间
  16. C\users\administrator>expdp system/123 directory=dump_dir dumpfile=tablespace.dmp tablespaces=user01
  17. --导入表空间
  18. C\users\administrator>impdp system/123 directory=dump_dir dumpfile=tablespace.dmp tablespaces=user01
  19. 注意:前提要有user01这个表空间
  20. -- 导出数据库
  21. C\users\administrator>expdp system/123 directory=dump_dir dumpfile=full.dmp full=y
  22. -- 导入数据库
  23. C\users\administrator>impdp system/123 directory=dump_dir dumpfile=full.dmp full=y

expdp help=y 用来查询参数的相关说明

闪回

一、Oracle闪回概述

闪回级别 闪回场景 闪回技术 对象依赖 影响数据
数据库 表截断、逻辑错误、其他多表意外事件 闪回DATABASE 闪回日志、undo
DROP 删除表 闪回DROP 回收站(recyclebin)
更新、删除、插入记录 闪回TABLE 还原数据,undo
查询 当前数据和历史数据对比 闪回QUERY 还原数据,undo
版本查询 比较行版本 闪回Version Query 还原数据,undo
事务查询 比较 闪回Transaction Query 还原数据,undo
归档 DDL、DML 闪回Archive 归档日志

二、Oracle闪回使用详解

1、闪回开启

(1)开启闪回必要条件
a.开启归档日志

  1. SQL> archive log list;
  2. Database log mode Archive Mode
  3. Automatic archival Enabled
  4. Archive destination /home/U01/app/oracle/oradata/testdb/arch
  5. Oldest online log sequence 844
  6. Next log sequence to archive 846
  7. Current log sequence 846
  8. ##如未开启,在mount状态执行alter database archivelog;

b.设置合理的闪回区
db_recovery_file_dest:指定闪回恢复区的位置
db_recovery_file_dest_size:指定闪回恢复区的可用空间大小
db_flashback_retention_target:指定数据库可以回退的时间,单位为分钟,默认1440分钟(1天),实际取决于闪回区大小
(2)检查是否开启闪回

  1. SQL> select flashback_on from v$database;
  2. FLASHBACK_ON
  3. ------------------
  4. NO

(3)开启闪回
a.开启归档
mount状态:alter database archivelog;
b.设置闪回区

  1. SQL> alter system set db_recovery_file_dest='/home/U01/app/oracle/fast_recovery_area' scope=both;
  2. SQL> alter system set db_recovery_file_dest_size=60G scope=both;
  3. SQL> alter system set db_flashback_retention_target=4320 scope=both;

c.开启flashback (10g在mount开启)
SQL> alter database flashback on;
(4)确定闪回开启

  1. SQL> select flashback_on from v$database;
  2. FLASHBACK_ON
  3. ------------------
  4. YES

(5)关闭闪回
SQL> alter database flashback off;

2、闪回使用

(1)闪回查询

闪回查询主要是根据Undo表空间数据进行多版本查询,针对v$和x$动态性能视图无效,但对DBA、ALL、USER_是有效的
a.闪回查询
允许用户查询过去某个时间点的数据,用以重构由于意外删除或更改的数据,数据不会变化

  1. SQL> select * from scott.dept;
  2. DEPTNO DNAME LOC
  3. ---------- -------------- -------------
  4. ACCOUNTING NEW YORK
  5. RESEARCH DALLAS
  6. SALES CHICAGO
  7. OPERATIONS BOSTON
  8. SQL> delete from scott.dept where deptno=40;
  9. row deleted.
  10. SQL> commit;
  11. Commit complete.
  12. SQL> select * from scott.dept as of timestamp sysdate-10/1440;
  13. DEPTNO DNAME LOC
  14. ---------- -------------- -------------
  15. ACCOUNTING NEW YORK
  16. RESEARCH DALLAS
  17. SALES CHICAGO
  18. OPERATIONS BOSTON
  19. SQL> select * from scott.dept as of timestamp to_timestamp('2017-12-14 16:20:00','yyyy-mm-dd hh24:mi:ss');
  20. DEPTNO DNAME LOC
  21. ---------- -------------- -------------
  22. ACCOUNTING NEW YORK
  23. RESEARCH DALLAS
  24. SALES CHICAGO
  25. OPERATIONS BOSTON
  26. SQL> select * from scott.dept as of scn 16801523;
  27. DEPTNO DNAME LOC
  28. ---------- -------------- -------------
  29. ACCOUNTING NEW YORK
  30. RESEARCH DALLAS
  31. SALES CHICAGO
  32. OPERATIONS BOSTON

b.闪回版本查询
用于查询行级数据库随时间变化的方法
c.闪回事务查询
用于提供查看事务级别数据库变化的方法

(2)闪回表(update/insert/delete)

闪回表就是对表的数据做回退,回退到之前的某个时间点,其利用的是undo的历史数据,与undo_retention设置有关,默认是14400分钟(1天)
同样,sys用户表空间不支持闪回表,要想表闪回,需要允许表启动行迁移(row movement)
闪回表示例:

  1. SQL> flashback table scott.dept to timestamp to_timestamp('2017-12-14 16:20:00','yyyy-mm-dd hh24:mi:ss');
  2. flashback table scott.dept to timestamp to_timestamp('2017-12-14 16:20:00','yyyy-mm-dd hh24:mi:ss')
  3. ERROR at line 1:
  4. ORA-08189: cannot flashback the table because row movement is not enabled
  5. SQL> select row_movement from dba_tables where table_name='DEPT' and owner='SCOTT';
  6. ROW_MOVE
  7. --------
  8. DISABLED
  9. SQL> alter table scott.dept enable row movement;
  10. Table altered.
  11. SQL> flashback table scott.dept to timestamp to_timestamp('2017-12-14 16:20:00','yyyy-mm-dd hh24:mi:ss');
  12. Flashback complete.
  13. SQL> select * from scott.dept;
  14. DEPTNO DNAME LOC
  15. ---------- -------------- -------------
  16. ACCOUNTING NEW YORK
  17. RESEARCH DALLAS
  18. SALES CHICAGO
  19. OPERATIONS BOSTON
  20. SQL> alter table scott.dept disable row movement;
  21. Table altered.

(3)闪回DROP(drop table)

当一个表被drop掉,表会被放入recyclebin回收站,可通过回收站做表的闪回。表上的索引、约束等同样会被恢复
不支持sys/system用户表空间对象,可通过alter system set recyclebin=off;关闭回收站功能
闪回DROP示例:
注意:哪个用户删除的表,用哪个用户闪回

  1. SQL> select * from t ;
  2. ID NAME
  3. ---------- ---------------------------------------
  4. 2
  5. 4
  6. SQL> drop table t;
  7. Table dropped.
  8. SQL> show recyclebin;
  9. ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
  10. ---------------- ------------------------------ ------------ -------------------
  11. T BIN$YEh2QcvZdJLgUxyAgQpnVQ==$0 TABLE 2017-12-14:15:02:06
  12. SQL> flashback table t to before drop;
  13. Flashback complete.
  14. SQL> select * from t;
  15. ID NAME
  16. ---------- -------------------------------------
  17. 2
  18. 4

备注:即使不开始flashback,只要开启了recyclebin,那么就可以闪回DROP表

但如果连续覆盖,就需要指定恢复的表名,如果已经存在表,则需要恢复重命名

  1. SQL> show recyclebin;
  2. ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
  3. ---------------- ------------------------------ ------------ -------------------
  4. T BIN$YEh2QcvddJLgUxyAgQpnVQ==$0 TABLE 2017-12-14:15:07:54
  5. T BIN$YEh2QcvcdJLgUxyAgQpnVQ==$0 TABLE 2017-12-14:15:07:27
  6. SQL> flashback table "BIN$YEh2QcvcdJLgUxyAgQpnVQ==$0" to before drop ;
  7. Flashback complete.
  8. SQL> show recyclebin;
  9. ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
  10. ---------------- ------------------------------ ------------ -------------------
  11. T BIN$YEh2QcvddJLgUxyAgQpnVQ==$0 TABLE 2017-12-14:15:07:54
  12. SQL> flashback table t to before drop rename to tt;
  13. Flashback complete.

(4)闪回数据库(truncate/多表数据变更)

数据库闪回必须在mounted状态下进行,基于快照的可以再open下进行闪回库
闪回数据库主要是将数据库还原值过去的某个时间点或SCN,用于数据库出现逻辑错误时,需要open database resetlogs
a.全库闪回
数据库闪回示例

  1. SQL> select * from scott.EMP;
  2. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
  3. ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
  4. SMITH CLERK 7902 1980-12-17 00:00:00 800 20
  5. ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30
  6. WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30
  7. JONES MANAGER 7839 1981-04-02 00:00:00 2975 20
  8. MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30
  9. BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30
  10. CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10
  11. SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20
  12. KING PRESIDENT 1981-11-17 00:00:00 5000 10
  13. TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30
  14. ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20
  15. JAMES CLERK 7698 1981-12-03 00:00:00 950 30
  16. FORD ANALYST 7566 1981-12-03 00:00:00 3000 20
  17. MILLER CLERK 7782 1982-01-23 00:00:00 1300 10
  18. rows selected.
  19. SQL> truncate table scott.EMP;
  20. Table truncated.
  21. SQL> shutdown immediate;
  22. Database closed.
  23. Database dismounted.
  24. ORACLE instance shut down.
  25. SQL> startup mount;
  26. ORACLE instance started.
  27. Total System Global Area 9.4067E+10 bytes
  28. Fixed Size 2263936 bytes
  29. Variable Size 9395242112 bytes
  30. Database Buffers 8.4557E+10 bytes
  31. Redo Buffers 112766976 bytes
  32. Database mounted.
  33. SQL> flashback database to timestamp to_timestamp('2017-12-14 14:12:46','yyyy-mm-dd HH24:MI:SS');
  34. Flashback complete.
  35. SQL> alter database open resetlogs;
  36. Database altered.
  37. SQL> select * from scott.emp;
  38. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
  39. ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
  40. SMITH CLERK 7902 1980-12-17 00:00:00 800 20
  41. ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30
  42. WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30
  43. JONES MANAGER 7839 1981-04-02 00:00:00 2975 20
  44. MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30
  45. BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30
  46. CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10
  47. SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20
  48. KING PRESIDENT 1981-11-17 00:00:00 5000 10
  49. TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30
  50. ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20
  51. JAMES CLERK 7698 1981-12-03 00:00:00 950 30
  52. FORD ANALYST 7566 1981-12-03 00:00:00 3000 20
  53. MILLER CLERK 7782 1982-01-23 00:00:00 1300 10
  54. rows selected.

b.快照闪回
针对主库和备库都可以创建闪回快照点,然后恢复到指定的快照点,但主库一旦恢复到快照点,备库的同步则需要重新同步

  1. SQL> select * from scott.dept;
  2. DEPTNO DNAME LOC ADDR
  3. ---------- -------------- ------------- ------------------------------
  4. ACCOUNTING NEW YORK
  5. RESEARCH DALLAS
  6. SALES CHICAGO
  7. SQL> create restore point before_201712151111 guarantee flashback database;
  8. Restore point created.
  9. SQL> create table scott.t as select * from scott.dept;
  10. Table created.
  11. SQL> truncate table scott.t;
  12. Table truncated.
  13. SQL> shutdown immediate;
  14. Database closed.
  15. Database dismounted.
  16. ORACLE instance shut down.
  17. SQL> startup mount;
  18. ORACLE instance started.
  19. Total System Global Area 9.4067E+10 bytes
  20. Fixed Size 2263936 bytes
  21. Variable Size 9663677568 bytes
  22. Database Buffers 8.4289E+10 bytes
  23. Redo Buffers 112766976 bytes
  24. Database mounted.
  25. SQL> flashback database to restore point before_201712151111;
  26. Flashback complete.
  27. SQL> alter database open resetlogs;
  28. Database altered.
  29. 此时主库scott.t已不存在:
  30. SQL> select * from scott.t;
  31. select * from scott.t
  32. *
  33. ERROR at line 1:
  34. ORA-00942: table or view does not exist
  35. 此时从库的scott.依旧存在,主备同步终止
  36. 解决方案:在主库创建快照时间点,从库自动停止应用日志,等主库闪回后,重新应用日志即可。
  37. 如果已经做了上述操作,从库可以选择重建
  38. ALTER DATABASE REGISTER LOGFILE '/xx/xx/archive.dbf';

c.闪回snapshot standby
此功能在11GR2非常实用,可自动创建闪回点、开启闪回日志,可完成线上数据测试后,然后做数据库闪回恢复主备关系

  1. select scn, STORAGE_SIZE ,to_char(time,'yyyy-mm-dd hh24:mi:ss') time,NAME from v$restore_point;
  2. select database_role,open_mode,db_unique_name,flashback_on from v$database;
  3. SQL> set line 200;
  4. SQL> set pagesize 2000;
  5. SQL> select database_role,open_mode,db_unique_name,flashback_on from v$database;
  6. DATABASE_ROLE OPEN_MODE DB_UNIQUE_NAME FLASHBACK_ON
  7. ---------------- -------------------- ------------------------------ ------------------
  8. PHYSICAL STANDBY READ ONLY testdbms NO
  9. SQL> ALTER DATABASE CONVERT TO SNAPSHOT STANDBY;
  10. Database altered.
  11. SQL> select database_role,open_mode,db_unique_name,flashback_on from v$database;
  12. DATABASE_ROLE OPEN_MODE DB_UNIQUE_NAME FLASHBACK_ON
  13. ---------------- -------------------- ------------------------------ ------------------
  14. SNAPSHOT STANDBY MOUNTED testdbms RESTORE POINT ONLY
  15. SQL> alter database open;
  16. Database altered.
  17. SQL> select open_mode from v$database;
  18. OPEN_MODE
  19. --------------------
  20. READ WRITE
  21. 此时备库操作:
  22. SQL> select * from scott.emp;
  23. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
  24. ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
  25. SMITH CLERK 7902 1980-12-17 00:00:00 800 20
  26. ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30
  27. WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30
  28. JONES MANAGER 7839 1981-04-02 00:00:00 2975 20
  29. MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30
  30. BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30
  31. CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10
  32. SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20
  33. KING PRESIDENT 1981-11-17 00:00:00 5000 10
  34. TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30
  35. ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20
  36. JAMES CLERK 7698 1981-12-03 00:00:00 950 30
  37. FORD ANALYST 7566 1981-12-03 00:00:00 3000 20
  38. MILLER CLERK 7782 1982-01-23 00:00:00 1300 10
  39. rows selected.
  40. SQL> truncate table scott.emp;
  41. Table truncated.
  42. 主库操作:
  43. SQL> create table scott.t as select * from scott.dept;
  44. Table created.
  45. SQL> select * from scott.t;
  46. DEPTNO DNAME LOC ADDR
  47. ---------- -------------- ------------- ------------------------------
  48. ACCOUNTING NEW YORK
  49. RESEARCH DALLAS
  50. SALES CHICAGO
  51. 备库恢复到物理standby
  52. SQL> shutdown immediate;
  53. Database closed.
  54. Database dismounted.
  55. ORACLE instance shut down.
  56. SQL> startup mount;
  57. ORACLE instance started.
  58. Total System Global Area 9.4067E+10 bytes
  59. Fixed Size 2263936 bytes
  60. Variable Size 9663677568 bytes
  61. Database Buffers 8.4289E+10 bytes
  62. Redo Buffers 112766976 bytes
  63. Database mounted.
  64. SQL> ALTER DATABASE CONVERT TO PHYSICAL STANDBY;
  65. Database altered.
  66. SQL> shutdown immediate;
  67. ORA-01507: database not mounted
  68. ORACLE instance shut down.
  69. SQL> startup ;
  70. ORACLE instance started.
  71. Total System Global Area 9.4067E+10 bytes
  72. Fixed Size 2263936 bytes
  73. Variable Size 9663677568 bytes
  74. Database Buffers 8.4289E+10 bytes
  75. Redo Buffers 112766976 bytes
  76. Database mounted.
  77. Database opened.
  78. ##此时备库的数据已经恢复到转变snapshot standby时间点
  79. SQL> select database_role,open_mode,db_unique_name,flashback_on from v$database;
  80. DATABASE_ROLE OPEN_MODE DB_UNIQUE_NAME FLASHBACK_ON
  81. ---------------- -------------------- ------------------------------ ------------------
  82. PHYSICAL STANDBY READ ONLY testdbms NO
  83. SQL> select * from scott.emp;
  84. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
  85. ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
  86. SMITH CLERK 7902 1980-12-17 00:00:00 800 20
  87. ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30
  88. WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30
  89. JONES MANAGER 7839 1981-04-02 00:00:00 2975 20
  90. MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30
  91. BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30
  92. CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10
  93. SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20
  94. KING PRESIDENT 1981-11-17 00:00:00 5000 10
  95. TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30
  96. ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20
  97. JAMES CLERK 7698 1981-12-03 00:00:00 950 30
  98. FORD ANALYST 7566 1981-12-03 00:00:00 3000 20
  99. MILLER CLERK 7782 1982-01-23 00:00:00 1300 10
  100. rows selected.
  101. SQL> alter database recover managed standby database using current logfile disconnect;
  102. Database altered.
  103. SQL> select * from scott.t;
  104. DEPTNO DNAME LOC ADDR
  105. ---------- -------------- ------------- ------------------------------
  106. ACCOUNTING NEW YORK
  107. RESEARCH DALLAS
  108. SALES CHICAGO
  109. SQL> select database_role,open_mode,db_unique_name,flashback_on from v$database;
  110. DATABASE_ROLE OPEN_MODE DB_UNIQUE_NAME FLASHBACK_ON
  111. ---------------- -------------------- ------------------------------ ------------------
  112. PHYSICAL STANDBY READ ONLY WITH APPLY testdbms NO

(5)闪回归档(增加、修改、重命名、删除表的列、truncate表、修改表的约束、以及修改分区表的分区规范)
3、闪回注意事项
(1)数据库闪回需要在mounted下进行,并且open时需要使用resetlogs
(2)闪回DROP只能用于非系统表空间和本地管理的表空间,外键约束无法恢复,对方覆盖、重命名需注意
(3)表DROP,对应的物化视图会被彻底删除,物化视图不会存放在recyclebin里
(4)闪回表,如果在做过dml,然后进行了表结构修改、truncate等DDL操作,新增/删除结构无法做闪回
(5)闪回归档,必须在assm管理tablespace和undo auto管理下进行
(6)注意闪回区管理,防止磁盘爆满,闪回区空间不足等
(7)主库做库的闪回,会影响备库,需要重新同步
(8)snapshot standby 不支持最高保护模式

三、备注

1、相关数据字典
V$FLASHBACK_DATABASE_LOG ##查看数据库可闪回的时间点/SCN等信息 V$flashback_database_stat ##查看闪回日志空间记录信息
2、常用查询语句
(1)查看数据库状态

  1. SQL> select NAME,OPEN_MODE ,DATABASE_ROLE,CURRENT_SCN,FLASHBACK_ON from v$database;
  2. NAME OPEN_MODE DATABASE_ROLE CURRENT_SCN FLASHBACK_ON
  3. ------------- -------------------- ---------------- ----------- ------------------
  4. TESTDB READ WRITE PRIMARY 16812246 YES

(2)获取当前数据库的系统时间和SCN

  1. SQL> select to_char(systimestamp,'yyyy-mm-dd HH24:MI:SS') as sysdt , dbms_flashback.get_system_change_number scn from dual;
  2. SYSDT SCN
  3. ------------------- ----------
  4. 2017-12-14 14:28:33 16813234

(3)查看数据库可恢复的时间点

  1. SQL> select * from V$FLASHBACK_DATABASE_LOG;
  2. OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI RETENTION_TARGET FLASHBACK_SIZE ESTIMATED_FLASHBACK_SIZE
  3. -------------------- ------------------- ---------------- -------------- ------------------------
  4. 16801523 2017-12-14 11:35:05 4320 104857600 244113408

(4)查看闪回日志空间情况

  1. SQL> select * from V$flashback_database_stat;
  2. BEGIN_TIME END_TIME FLASHBACK_DATA DB_DATA REDO_DATA ESTIMATED_FLASHBACK_SIZE
  3. ------------------- ------------------- -------------- ---------- ---------- ------------------------
  4. 2017-12-14 14:34:53 2017-12-14 14:56:43 1703936 9977856 1487872 0

(5)SCN和timestamp装换关系查询
select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss')from sys.smon_scn_time;
(6)查看闪回restore_point
select scn, STORAGE_SIZE ,to_char(time,'yyyy-mm-dd hh24:mi:ss') time,NAME from v$restore_point;
(7)闪回语句
a.闪回数据库
FLASHBACK DATABASE TO TIMESTAMP to_timestamp('2017-12-14 14:28:33','yyyy-mm-dd HH24:MI:SS');;``flashback database to scn 16813234;
b.闪回DROP
其中table_name可以是删除表名称,也可以是别名
flashback table table_name to before drop;``flashback table table_name to before drop rename to table_name_new;
c.闪回表
flashback table table_name to scn scn_number;``flashback table table_name to timestamp to_timestamp('2017-12-14 14:28:33','yyyy-mm-dd hh24:mi:ss');
d.闪回查询
select * from table_name as of timestamp to_timestamp('2017-12-14 14:28:33','yyyy-mm-dd hh24:mi:ss');``select * from scott.dept as of scn 16801523;
e.闪回快照
create restore point before_201712151111 guarantee flashback database; flashback database to restore point before_201712151111;

三种恢复技术的区别

  • rman备份还原:用在数据库的大面积故障恢复,数据库打不开,恢复
  • 数据泵(导入导出)备份还原:用在小范围的恢复,恢复某个表的数据
  • 闪回功能:用于恢复数据,恢复速度快,实时留存旧数据(在硬盘上划分一个分区当做闪回区,类似回收站)

    总结

    1.Oracle数据库恢复分类有哪些?【重要】

  • 实例恢复:当Oracle 实例出现失败后,Oracle 自动进行的恢复

  • 介质恢复:

    • 完全恢复:将数据库恢复到数据库失败时的状态
    • 不完全恢复:恢复到数据库失败前的某一时刻的状态

      2.备份策略分类有哪些?

  • 完全备份,增量备份,差异备份