第一部分 概述
备份与恢复概念
- 数据库在使用时遇到各种故障,需要利用备份进行恢复,解决故障造成的影响
- 备份就是把数据库复制到转储设备的过程
恢复就是发生故障后,利用已备份的数据文件或控制文件,重新建立一个完整的数据库
故障类型
备份分类
恢复分类
第二部分 使用RMAN工具
概念
RMAN(Recovery Manager),即恢复管理器
- 是 DBA 的一个重要工具,用于备份、还原和恢复 Oracle 数据库
- 完成对目标数据库的控制文件、数据文件及归档日志文件以及SPFILE的联机备份
- 能够实现对数据库的完全或不完全的恢复操作
备份的对象是数据库的硬盘文件 一般在数据库重大故障或硬盘文件损坏时的修复手段 备份的速度慢
RMAN组件
RMAN-恢复目录
- 恢复目录用于存放RMAN元数据,它是存放RMAN元数据的一个可选设置
创建恢复目录
1、创建表空间CREATE TABLESPACE rmants DATAFILE 'c:\rmants.dbf' SIZE 20M;
2、创建用户并授权
CREATE USER rman IDENTIFIED BY rmanpwd DEFAULT TABLESPACE rmants;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需要在存储设备和目标数据库之建立连接,该连接被称为通道
- 如果不配置通道则使用默认通道
自动通道配置
--指定自动通道并行个数。CONFIGURE DEVICE TYPE sbt/disk PARALLELISM n;--指定自动通道的默认设备CONFIGURE DEFAULT DEVICE TYPE TO sbt/disk;
sbt/disk 磁带/磁盘 n :设置自动通道的个数
示例:指定RMAN可以打开5个磁盘通道
RMAN>CONFIGURE DEVICE TYPE disk PARALLELISM 5;RMAN>CONFIGURE DEFAULT DEVICE TYPE TO disk;
手动通道配置
RUN{ALLOCATE CHANNEL 通道名称 DEVICE TYPE 设备类型;……}
示例:指定3个磁盘通道
RMAN>RUN{ALLOCATE CHANNEL ch1 DEVICE TYPE disk;ALLOCATE CHANNEL ch2 DEVICE TYPE disk;ALLOCATE CHANNEL ch3 DEVICE TYPE disk;}
显示通道配置参数
RMAN-备份集与备份片
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命令
- 用于备份数据库文件,可以将多个文件、表空间、整个数据库以备份集形式备份到磁盘或磁带上
在归档方式下备份数据库步骤:
- 在SQLPlus环境下
- 以SYSDBA身份登录
- 查看数据库归档方式
- 如果处于非归档方式,则将数据库处于归档方式下
- 打开数据库
在RMAN环境下
使用RMAN备份的数据库页只能使用RMAN提供的恢复命令进行恢复。
RMAN恢复数据库用到了两个命令:
保证数据库在MOUNT模式下启动: startup mount
- 在RMAN环境下
- 连接目标数据库:rman target sys/123
- 执行RESTORE命令:restore database;
- 执行RECOVE命令:recover database;
- 在打开数据库:alter database open resetlogs;
resetlogs 重置重做日志
1.备份和恢复整个数据库
//自动分配通道,FORMAT默认使用%U,备份集存储在数据库快闪恢复区内//备份文件包括数据文件、控制文件、重做日志文件和参数文件RMAN>backup database;//如果还要包含归档日志文件,则要加上plus archivelog关键字,delete input的意思是在备份完成后,删除archivelog文件RMAN>backup database plus archivelog delete input;//自动备份通道,通过FORMAT指定具体的路径和格式RMAN>backup database format 'd:/rmacback/%U';//手动分配通道,备份数据库RMAN>run{ALLOCATE CHANNEL ch1 DEVICE TYPE disk;backup database format 'd:/rmacback/%U';release channel ch1;}//全库备份的恢复,数据库要在mount状态下执行C:\Users\Administrator>sqlplus sys/12345_coM as sysdbaRMAN>startup mountRMAN>restore database;RMAN>recover database;RMAN>alter database open resetlogs;
2.备份和恢复表空间
//表空间备份RMAN>backup tablespace users;//多个表空间备份RMAN>backup filesperset=3 tablespace users,system,sysaux;//在run命令中备份表空间RMAN>run{ALLOCATE CHANNEL ch1 DEVICE TYPE disk;backup format 'd:/rmacback/%U' (tablespace users,system,sysaux);release channel ch1;}//表空间的恢复//如果只丢失了特定的表空间的数据文件,那么可以选择只恢复这个表空间,而不是恢复整个数据库,表空间恢复可以在不关闭数据库的情况下进行,只需要将需要恢复的表空间offlineRMAN>run{sql 'alter tablespace users offline immediate';restore tablespace users;recover tablespace users;sql 'alter tablespace users online';}
3.数据文件的备份和恢复
//数据文件恢复与表空间恢复类似,假设数据文件为4的文件丢失,文件名是'd:/app/user01.dbf',那么恢复的时候可以指定文件号,也可以指定文件名RMAN>backup datafile 4;RMAN>backup datafile 'd:/app/user01.dbf';//恢复命令RMAN>run{ALLOCATE CHANNEL ch1 DEVICE TYPE disk;sql 'alter tablespace users offline immediate';restore datafile 4; -- 或者restore datafile 'd:/app/user01.dbf';recover datafile 4;sql 'alter tablespace users online';release channel ch1;}
完整案例
使用rman对数据库进行热备份。
备份完成后,关闭数据库再删除文C:\app\Administrator\oradata\orcl\USERS01.DBF。发现数据库无法启动。使用备份进行恢复,发现数据库可以正常打开,说明恢复正常
1.启用归档日志。
SQL> shutdown immediate;SQL> startup mount;SQL> archive log list; 查看是否启用了归档日志SQL> alter database archivelog; 启用归档日志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.开始备份
RMAN> backup database format 'c:\backup\%U';RMAN> exit;
format指定了文件名,backup 目录需要提前建立, 如果没有指定文件名,默认备份到快闪恢复区(C:\app\Administrator\flash_recovery_area)
5.关闭数据库并删除文件
C:\Users\Administrator>sqlplus sys/123 as sysdbaSQL> shutdown immediate;
把C:\app\Administrator\oradata\orcl\USERS01.DBF删除到回收站
6.启动数据库并恢复文件
SQL> startup mount;SQL> exit;C:\Users\Administrator>rman target sys/123;RMAN> restore database;RMAN> recover database;RMAN> alter database open;RMAN> exit;
如果数据库启动成功表示恢复成功
简单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.恢复
RMAN> restore database;RMAN> recover database;RMAN> alter database open;
第三部分 数据泵
概述
- 导出即数据库的逻辑备份,实质是读取一个数据库记录集,并将这个记录集写入一个扩展名位dmp的文件。这些记录的导出与其物理位置无关。
- 导入即数据库的逻辑恢复,实质是读取被导出的二进制转储文件并将其恢复到数据库
备份的是数据。在多个数据库之间或多个用户之间互相交换数据时使用 可以在数据库不停机的状态下进行备份
四种模式
案例
使用数据泵技术对scott用户的部分表进行备份,
然后删除该表,再次恢复进行验证
--解锁语法alter user 用户名 account unlock ;-- 解锁示例alter user scott account unlock ; --解锁scott账户-- 设置密码语法alter user 用户名 identified by 密码;-- 设置密码示例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关联起来
-- 语法:create directory 目录名 as '路径';-- 示例: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,放到
-- 语法:expdp 用户名/密码 directory=目录名 dumpfile=文件名.dmp tables=表1,表2...-- 示例:c:\users\administrator>expdp scott/123 directory=dump_dir dumpfile=scotttab.dmp tables=dept,emp
重要:在cmd中执行命令,命令最后不可以使用分号
4.删除emp表
c:\users\administrator> sqlplus scott/123SQL> drop table emp;
5.进行恢复并测试
以scott的账号连接数据库,恢复emp,备份文件名为scotttab.dmp,放在c:\opt\backup目录中
-- 语法impdp 用户名/密码 directory=目录名 dumpfile=文件名.dmp tables=表名-- 示例C:\Users\Administrator>impdp scott/123 directory=dump_dir dumpfile=scotttab.dmp tables=emp
以scott身份执行此命令,看到14条记录表示恢复成功SQL> select count(*) from emp;
扩展
导出导入命令
-- 导出用户system下的表emp,depC:\users\administrator>expdp system/123 directory=dump_dir dumpfile=daochu.dmp tables=emp,dep-- 导入用户system下的表C:\users\administrator>impdp system/123 directory=dump_dir dumpfile=daochu.dmp tables=emp,dep table_exists_action=replace注意:table_exists_action=replace 命令为检测到表存在,则替换表,skip跳过,append追加,replace替换-- 将导出的SCOTT 用户下的dept和emp表导入user1用户下C:\users\administrator>impdp system/123 directory=dump_dir dumpfile=daochu.dmp tables=scott.emp,scott.dept REMAP_SCHEMA=SCOTT:USER1-- 导出用户ScottC:\users\administrator>expdp system/123 directory=dump_dir dumpfile=Scott.dmp schemas=Scott-- 导入用户ScottC:\users\administrator>impdp system/123 directory=dump_dir dumpfile=scott.dmp schemas=Scott-- 将SCOTT中所有对象导入user1中C:\users\administrator>impdp system/123 directory=dump_dir dumpfile=scott.dmp schemas=ScottREMAP_SCHEMA=SCOTT:USER1-- 导出表空间C:\users\administrator>expdp system/123 directory=dump_dir dumpfile=tablespace.dmp tablespaces=user01--导入表空间C:\users\administrator>impdp system/123 directory=dump_dir dumpfile=tablespace.dmp tablespaces=user01注意:前提要有user01这个表空间-- 导出数据库C:\users\administrator>expdp system/123 directory=dump_dir dumpfile=full.dmp full=y-- 导入数据库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.开启归档日志
SQL> archive log list;Database log mode Archive ModeAutomatic archival EnabledArchive destination /home/U01/app/oracle/oradata/testdb/archOldest online log sequence 844Next log sequence to archive 846Current log sequence 846##如未开启,在mount状态执行alter database archivelog;
b.设置合理的闪回区
db_recovery_file_dest:指定闪回恢复区的位置
db_recovery_file_dest_size:指定闪回恢复区的可用空间大小
db_flashback_retention_target:指定数据库可以回退的时间,单位为分钟,默认1440分钟(1天),实际取决于闪回区大小
(2)检查是否开启闪回
SQL> select flashback_on from v$database;FLASHBACK_ON------------------NO
(3)开启闪回
a.开启归档mount状态:alter database archivelog;
b.设置闪回区
SQL> alter system set db_recovery_file_dest='/home/U01/app/oracle/fast_recovery_area' scope=both;SQL> alter system set db_recovery_file_dest_size=60G scope=both;SQL> alter system set db_flashback_retention_target=4320 scope=both;
c.开启flashback (10g在mount开启)SQL> alter database flashback on;
(4)确定闪回开启
SQL> select flashback_on from v$database;FLASHBACK_ON------------------YES
(5)关闭闪回SQL> alter database flashback off;
2、闪回使用
(1)闪回查询
闪回查询主要是根据Undo表空间数据进行多版本查询,针对v$和x$动态性能视图无效,但对DBA、ALL、USER_是有效的
a.闪回查询
允许用户查询过去某个时间点的数据,用以重构由于意外删除或更改的数据,数据不会变化
SQL> select * from scott.dept;DEPTNO DNAME LOC---------- -------------- -------------ACCOUNTING NEW YORKRESEARCH DALLASSALES CHICAGOOPERATIONS BOSTONSQL> delete from scott.dept where deptno=40;row deleted.SQL> commit;Commit complete.SQL> select * from scott.dept as of timestamp sysdate-10/1440;DEPTNO DNAME LOC---------- -------------- -------------ACCOUNTING NEW YORKRESEARCH DALLASSALES CHICAGOOPERATIONS BOSTONSQL> select * from scott.dept as of timestamp to_timestamp('2017-12-14 16:20:00','yyyy-mm-dd hh24:mi:ss');DEPTNO DNAME LOC---------- -------------- -------------ACCOUNTING NEW YORKRESEARCH DALLASSALES CHICAGOOPERATIONS BOSTONSQL> select * from scott.dept as of scn 16801523;DEPTNO DNAME LOC---------- -------------- -------------ACCOUNTING NEW YORKRESEARCH DALLASSALES CHICAGOOPERATIONS BOSTON
b.闪回版本查询
用于查询行级数据库随时间变化的方法
c.闪回事务查询
用于提供查看事务级别数据库变化的方法
(2)闪回表(update/insert/delete)
闪回表就是对表的数据做回退,回退到之前的某个时间点,其利用的是undo的历史数据,与undo_retention设置有关,默认是14400分钟(1天)
同样,sys用户表空间不支持闪回表,要想表闪回,需要允许表启动行迁移(row movement)
闪回表示例:
SQL> flashback table scott.dept to timestamp to_timestamp('2017-12-14 16:20:00','yyyy-mm-dd hh24:mi:ss');flashback table scott.dept to timestamp to_timestamp('2017-12-14 16:20:00','yyyy-mm-dd hh24:mi:ss')ERROR at line 1:ORA-08189: cannot flashback the table because row movement is not enabledSQL> select row_movement from dba_tables where table_name='DEPT' and owner='SCOTT';ROW_MOVE--------DISABLEDSQL> alter table scott.dept enable row movement;Table altered.SQL> flashback table scott.dept to timestamp to_timestamp('2017-12-14 16:20:00','yyyy-mm-dd hh24:mi:ss');Flashback complete.SQL> select * from scott.dept;DEPTNO DNAME LOC---------- -------------- -------------ACCOUNTING NEW YORKRESEARCH DALLASSALES CHICAGOOPERATIONS BOSTONSQL> alter table scott.dept disable row movement;Table altered.
(3)闪回DROP(drop table)
当一个表被drop掉,表会被放入recyclebin回收站,可通过回收站做表的闪回。表上的索引、约束等同样会被恢复
不支持sys/system用户表空间对象,可通过alter system set recyclebin=off;关闭回收站功能
闪回DROP示例:
注意:哪个用户删除的表,用哪个用户闪回
SQL> select * from t ;ID NAME---------- ---------------------------------------24SQL> drop table t;Table dropped.SQL> show recyclebin;ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME---------------- ------------------------------ ------------ -------------------T BIN$YEh2QcvZdJLgUxyAgQpnVQ==$0 TABLE 2017-12-14:15:02:06SQL> flashback table t to before drop;Flashback complete.SQL> select * from t;ID NAME---------- -------------------------------------24
备注:即使不开始flashback,只要开启了recyclebin,那么就可以闪回DROP表
但如果连续覆盖,就需要指定恢复的表名,如果已经存在表,则需要恢复重命名
SQL> show recyclebin;ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME---------------- ------------------------------ ------------ -------------------T BIN$YEh2QcvddJLgUxyAgQpnVQ==$0 TABLE 2017-12-14:15:07:54T BIN$YEh2QcvcdJLgUxyAgQpnVQ==$0 TABLE 2017-12-14:15:07:27SQL> flashback table "BIN$YEh2QcvcdJLgUxyAgQpnVQ==$0" to before drop ;Flashback complete.SQL> show recyclebin;ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME---------------- ------------------------------ ------------ -------------------T BIN$YEh2QcvddJLgUxyAgQpnVQ==$0 TABLE 2017-12-14:15:07:54SQL> flashback table t to before drop rename to tt;Flashback complete.
(4)闪回数据库(truncate/多表数据变更)
数据库闪回必须在mounted状态下进行,基于快照的可以再open下进行闪回库
闪回数据库主要是将数据库还原值过去的某个时间点或SCN,用于数据库出现逻辑错误时,需要open database resetlogs
a.全库闪回
数据库闪回示例
SQL> select * from scott.EMP;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------SMITH CLERK 7902 1980-12-17 00:00:00 800 20ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30JONES MANAGER 7839 1981-04-02 00:00:00 2975 20MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20KING PRESIDENT 1981-11-17 00:00:00 5000 10TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20JAMES CLERK 7698 1981-12-03 00:00:00 950 30FORD ANALYST 7566 1981-12-03 00:00:00 3000 20MILLER CLERK 7782 1982-01-23 00:00:00 1300 10rows selected.SQL> truncate table scott.EMP;Table truncated.SQL> shutdown immediate;Database closed.Database dismounted.ORACLE instance shut down.SQL> startup mount;ORACLE instance started.Total System Global Area 9.4067E+10 bytesFixed Size 2263936 bytesVariable Size 9395242112 bytesDatabase Buffers 8.4557E+10 bytesRedo Buffers 112766976 bytesDatabase mounted.SQL> flashback database to timestamp to_timestamp('2017-12-14 14:12:46','yyyy-mm-dd HH24:MI:SS');Flashback complete.SQL> alter database open resetlogs;Database altered.SQL> select * from scott.emp;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------SMITH CLERK 7902 1980-12-17 00:00:00 800 20ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30JONES MANAGER 7839 1981-04-02 00:00:00 2975 20MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20KING PRESIDENT 1981-11-17 00:00:00 5000 10TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20JAMES CLERK 7698 1981-12-03 00:00:00 950 30FORD ANALYST 7566 1981-12-03 00:00:00 3000 20MILLER CLERK 7782 1982-01-23 00:00:00 1300 10rows selected.
b.快照闪回
针对主库和备库都可以创建闪回快照点,然后恢复到指定的快照点,但主库一旦恢复到快照点,备库的同步则需要重新同步
SQL> select * from scott.dept;DEPTNO DNAME LOC ADDR---------- -------------- ------------- ------------------------------ACCOUNTING NEW YORKRESEARCH DALLASSALES CHICAGOSQL> create restore point before_201712151111 guarantee flashback database;Restore point created.SQL> create table scott.t as select * from scott.dept;Table created.SQL> truncate table scott.t;Table truncated.SQL> shutdown immediate;Database closed.Database dismounted.ORACLE instance shut down.SQL> startup mount;ORACLE instance started.Total System Global Area 9.4067E+10 bytesFixed Size 2263936 bytesVariable Size 9663677568 bytesDatabase Buffers 8.4289E+10 bytesRedo Buffers 112766976 bytesDatabase mounted.SQL> flashback database to restore point before_201712151111;Flashback complete.SQL> alter database open resetlogs;Database altered.此时主库scott.t已不存在:SQL> select * from scott.t;select * from scott.t*ERROR at line 1:ORA-00942: table or view does not exist此时从库的scott.依旧存在,主备同步终止解决方案:在主库创建快照时间点,从库自动停止应用日志,等主库闪回后,重新应用日志即可。如果已经做了上述操作,从库可以选择重建ALTER DATABASE REGISTER LOGFILE '/xx/xx/archive.dbf';
c.闪回snapshot standby
此功能在11GR2非常实用,可自动创建闪回点、开启闪回日志,可完成线上数据测试后,然后做数据库闪回恢复主备关系
select scn, STORAGE_SIZE ,to_char(time,'yyyy-mm-dd hh24:mi:ss') time,NAME from v$restore_point;select database_role,open_mode,db_unique_name,flashback_on from v$database;SQL> set line 200;SQL> set pagesize 2000;SQL> select database_role,open_mode,db_unique_name,flashback_on from v$database;DATABASE_ROLE OPEN_MODE DB_UNIQUE_NAME FLASHBACK_ON---------------- -------------------- ------------------------------ ------------------PHYSICAL STANDBY READ ONLY testdbms NOSQL> ALTER DATABASE CONVERT TO SNAPSHOT STANDBY;Database altered.SQL> select database_role,open_mode,db_unique_name,flashback_on from v$database;DATABASE_ROLE OPEN_MODE DB_UNIQUE_NAME FLASHBACK_ON---------------- -------------------- ------------------------------ ------------------SNAPSHOT STANDBY MOUNTED testdbms RESTORE POINT ONLYSQL> alter database open;Database altered.SQL> select open_mode from v$database;OPEN_MODE--------------------READ WRITE此时备库操作:SQL> select * from scott.emp;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------SMITH CLERK 7902 1980-12-17 00:00:00 800 20ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30JONES MANAGER 7839 1981-04-02 00:00:00 2975 20MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20KING PRESIDENT 1981-11-17 00:00:00 5000 10TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20JAMES CLERK 7698 1981-12-03 00:00:00 950 30FORD ANALYST 7566 1981-12-03 00:00:00 3000 20MILLER CLERK 7782 1982-01-23 00:00:00 1300 10rows selected.SQL> truncate table scott.emp;Table truncated.主库操作:SQL> create table scott.t as select * from scott.dept;Table created.SQL> select * from scott.t;DEPTNO DNAME LOC ADDR---------- -------------- ------------- ------------------------------ACCOUNTING NEW YORKRESEARCH DALLASSALES CHICAGO备库恢复到物理standbySQL> shutdown immediate;Database closed.Database dismounted.ORACLE instance shut down.SQL> startup mount;ORACLE instance started.Total System Global Area 9.4067E+10 bytesFixed Size 2263936 bytesVariable Size 9663677568 bytesDatabase Buffers 8.4289E+10 bytesRedo Buffers 112766976 bytesDatabase mounted.SQL> ALTER DATABASE CONVERT TO PHYSICAL STANDBY;Database altered.SQL> shutdown immediate;ORA-01507: database not mountedORACLE instance shut down.SQL> startup ;ORACLE instance started.Total System Global Area 9.4067E+10 bytesFixed Size 2263936 bytesVariable Size 9663677568 bytesDatabase Buffers 8.4289E+10 bytesRedo Buffers 112766976 bytesDatabase mounted.Database opened.##此时备库的数据已经恢复到转变snapshot standby时间点SQL> select database_role,open_mode,db_unique_name,flashback_on from v$database;DATABASE_ROLE OPEN_MODE DB_UNIQUE_NAME FLASHBACK_ON---------------- -------------------- ------------------------------ ------------------PHYSICAL STANDBY READ ONLY testdbms NOSQL> select * from scott.emp;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------SMITH CLERK 7902 1980-12-17 00:00:00 800 20ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30JONES MANAGER 7839 1981-04-02 00:00:00 2975 20MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20KING PRESIDENT 1981-11-17 00:00:00 5000 10TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20JAMES CLERK 7698 1981-12-03 00:00:00 950 30FORD ANALYST 7566 1981-12-03 00:00:00 3000 20MILLER CLERK 7782 1982-01-23 00:00:00 1300 10rows selected.SQL> alter database recover managed standby database using current logfile disconnect;Database altered.SQL> select * from scott.t;DEPTNO DNAME LOC ADDR---------- -------------- ------------- ------------------------------ACCOUNTING NEW YORKRESEARCH DALLASSALES CHICAGOSQL> select database_role,open_mode,db_unique_name,flashback_on from v$database;DATABASE_ROLE OPEN_MODE DB_UNIQUE_NAME FLASHBACK_ON---------------- -------------------- ------------------------------ ------------------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)查看数据库状态
SQL> select NAME,OPEN_MODE ,DATABASE_ROLE,CURRENT_SCN,FLASHBACK_ON from v$database;NAME OPEN_MODE DATABASE_ROLE CURRENT_SCN FLASHBACK_ON------------- -------------------- ---------------- ----------- ------------------TESTDB READ WRITE PRIMARY 16812246 YES
(2)获取当前数据库的系统时间和SCN
SQL> select to_char(systimestamp,'yyyy-mm-dd HH24:MI:SS') as sysdt , dbms_flashback.get_system_change_number scn from dual;SYSDT SCN------------------- ----------2017-12-14 14:28:33 16813234
(3)查看数据库可恢复的时间点
SQL> select * from V$FLASHBACK_DATABASE_LOG;OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI RETENTION_TARGET FLASHBACK_SIZE ESTIMATED_FLASHBACK_SIZE-------------------- ------------------- ---------------- -------------- ------------------------16801523 2017-12-14 11:35:05 4320 104857600 244113408
(4)查看闪回日志空间情况
SQL> select * from V$flashback_database_stat;BEGIN_TIME END_TIME FLASHBACK_DATA DB_DATA REDO_DATA ESTIMATED_FLASHBACK_SIZE------------------- ------------------- -------------- ---------- ---------- ------------------------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_pointselect 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;
