|
Oracle 12c RMAN全攻略
1. RMAN命令
12cRMAN可以执行大部分SQL命令,不需要SQL关键字。
- RMAN> select open_mode from v$database;
- using target database control file instead of recovery catalog
- OPEN_MODE
- --------------------
- READ WRITE
复制代码
- 可以使用spool log to [destination]/spool log off来记录rman命令输出以及报错。
- 使用替代变量,可以使用下面,也可以使用using语法
- 1) 编写脚本
- # name: full_db.rman
- BACKUP TAG &1 COPIES &2 DATABASE;
- EXIT;
- 2)调用
- RMAN> @/rman/full_db.rman Q106 2
复制代码
2. RMAN备份
在容器数据库CDB中,只有连接到根才能建立或修改配置信息,即连接到插接式数据库PDB时不能修改配置信息。
对于磁盘,可以备份磁盘镜像以及备份集两种类型,对于磁带的默认备份类型只能是备份集。
2.1 控制RMAN备份
- # 1. 分配通道控制备份片大小
- rman> configure channel device type disk maxpiecesize 2g;
- # 2. 分配通道时控制备份到不同磁盘
- RMAN> run {
- allocate channel c1 device type disk format 'd:\orabak\%u.bak';
- allocate channel c2 device type disk format 'e:\orabak\%u.bak';
- b
- }
- # 3. RMAN通道数与通道文件限制
- 在RMAN中最多可以分配255个通道,每个通道可并行读写64个文件
- # 4.查看通道分配策略
- RMAN> show channel;
复制代码
2.2 备份保留策略
- 1.备份保留策略
- 备份保留策略仅适用于数据文件的完全备份(或0级备份)和控制文件备份。
- 对于数据文件镜像副本和代理副本,如果RMAN确定不需要副本或代理副本,那么可以手工删除它们。
- 对于数据文件备份集,只有备份集内的所有数据文件备份都已过时,RMAN才会允许删除这些备份集。
- # 禁用保留策略
- RMAN> configure retention policy to none;
- # 恢复默认值
- RMAN> configure retention policy clear;
- 2.归档保留策略
- 禁用归档日志删除策略设置为NONE时,RMAN会考虑同时满足下面条件的归档重做日志文件是可以删除的:一是已被转移到LOG_ARCHIVE_DEST_n参数指定的远程目的地,无论是在快速恢复区域还是在外部;二是快速恢复区中的归档重做日志文件至少备份一次到磁盘或SBT,或者根据备份保留策略而过时的日志。
- 只有当保证恢复点和Oracle闪回数据库都不再需要的日志,备份保留策略才将其视为过时日志。如果归档日志是在SYSDATE-'DB_FLASHBACK_RETENTION_TARGET'之后创建,闪回数据库会需要这些归档重做日志。
- # 配置归档删除策略
- RMAN> configure archivelog deletion policy to backed up 2 times to disk;
复制代码
2.3 快速恢复区(Fast Recovery Area)
- 1. 启用快速恢复区
- 设置db_recovery_file_dest_size与db_recovery_file_dest两个参数启用,可以在线。
- 2.禁用快速恢复区
- 删除保证还原点,V$RESTORE_POINT,关闭flashback database,设置db_recovery_file_dest为空来禁用快速恢复区。
- 如果使用快速恢复区归档,则将log_archive_dest_n参数设置为非快速恢复区。
- 3.自动删除原则
- 当文件可以从快速恢复区删除时,要遵守以下删除规则:
- ①永久文件是永远不能删除。
- ②按保留策略已过时的文件均可删除。
- ③已复制到磁带上的临时文件可以删除。
- ④归档重做日志只有在所有的日志消费者都满足了要求后才可以删除。
- 控制从所快速恢复区删除的最安全和可靠的方式是配置保留策略和归档日志删除策略。如果想将移动到磁带的文件尽可能保留在磁盘上,就要增加快速恢复区的磁盘配额。
- 4.查看快速恢复区情况‘
- v$recovery_file_dest :当前位置、磁盘配额,正在使用的空间,删除文件回收的空间。
- v$recovery_area_usage
复制代码
2.4 backup…plus archivelog
- ①执行ALTER SYSTEM ARCHIVELOG CURRENT语句对当前的联机重做日志进行归档。
- ②执行BACKUP ARCHIVELOG ALL命令备份所有归档重做日志文件。
- ③执行BACKUP命令对指定的数据文件等进行备份。
- ④再次执行ALTER SYSTEM ARCHIVE LOG CURRENT语句对当前的联机重做日志进行归档。
- ⑤对备份期间新生成的尚未备份的归档重做日志文件进行备份。
复制代码
2.5 双工备份
- # 概念
- 双工备份:RMAN创建备份集时,同时生成备份集的多个完全相同副本,提高可靠性。
- # 限制
- - RMAN最多可以建立四个副本
- - 双工备份集不能到快速恢复区
- - 每个副本有唯一副本编号backupset_1_1/backupset_1_2
- - 双工备份仅适用于备份集,不适用于镜像副本
- - rman备份双工时,可以手工指定多个名字例如:format 'backupset_01','backupset_02',如果只指定一个format需要有格式%c,当然也可以不指定format,备份到configure配置的路径跟名称或备份到fra使用自动命名。
- # 配置
- backup...copies
- configure...backup copies
- # 样例
- - 配置样例
- configure channel device type disk format '/rman/%U','/test/%U';
- configure archivelog backup copies for device type disk to 2;
- configure datafile backup copies for device type disk to 2;
- - 备份样例
- backup as compressed backupset device type disk copies 3 incremental level 0 database;
- backup copies 3 datafile 3;
- - run模块set backup copies双工备份
- run{
- set backup copies 3;
- backup tablespace users copies 2 format '/rman/01.bak','/rman/02.bak';
- backup archivelog all;
- }
复制代码
2.6 镜像副本
- # 配置
- backup as copy
- configure device type...backup type to copy
- # 样例
- backup as copy tablespace system,users;
- backup as copy section size 150m datafile '/oradata/users.dbf';
复制代码
2.7 增量备份
- # 增量类型
- - 差异增量备份
- 只备份自最新的同级或更低级别之后更改过的所有块,当兼容性为10g以后,如果没有同级别或更低级别备份,则会生成0级备份。
- - 累计增量备份
- 只备份自最新的更低级别的备份之后更改过的所有块。
- # 增量备份策略
- 一般情况下,管理员根据可接受的平均恢复时间(Mean Time To Recover,MTTR)选择备份策略。例如,可以实现三级备份方案:每月进行一次0级增量备份,每周进行一次1级累积增量备份,每天进行1次差异增量备份。按照这个备份策略,完成恢复所需的重做日志不会超过一天。
- # 增量更新备份
- 使用rman创建数据文件的镜像副本,然后再使用rman创建增量备份(仅创建上次备份后已更改的数据块的备份),并将该增量备份应用于镜像副本(而不用创建新的镜像副本)。如果有足够磁盘空间为整个数据库创建镜像副本,并需要灵活的直接处理镜像备份,就可以使用这种策略,缺陷是只能恢复到最后一次更新镜像副本的时间点,无法任意时间点恢复。
- # 增量更新备份步骤
- ①用指定的标签创建数据文件的完整镜像副本备份。
- ②按照指定时间(如每天),使用与基本数据文件副本相同的标签建立数据文件的1级差别增量备份。
- ③把②中建立的增量备份应用到具有相同标签的最新备份。
- - 创建
- backup...for recover of copy with tag;
- # database级别增量更新
- - 第一次level 1,如果没有level 0,则会自动创建for recover的copy。
- - 会自动创建copy到fra区域,注意磁盘空间。
- - 可以自定义可恢复区间,sysdate-n,这样可以控制任意时间点可恢复区间,sysdate-7即可利用copy+archivelog恢复到七天内的任意时刻。
- run{
- recover copy of database with tag 'incr_update' [ until time 'sysdate-7'];
- backup incremental level 1 for recover of copy with tag 'incr_update' database;
- }
- # datafile级别增量更新
- run{
- recover copy of datafile 4 with tag 'incr_update' ;
- backup incremental level 1 for recover of copy with tag 'incr_update' datafile 4;
- }
- # 可以利用增量更新迁移数据库到不同存储,高效替换存储
复制代码
2.8 备份CDB与PDB
2.8.1 备份整个CDB与ROOT
- # 备份整个CDB
- 与备份非CDB相同,backup命令备份。
- # 只备份根cdb$root
- backup database root;
复制代码
2.8.2 RMAN备份PDB
- 1. 连接到root备份PDB
- rman> backup pluggable database sales,hr;
- 2.连接到指定pdb备份pdb
- export ORACLE_PDB_SID
- rman> backup database;
复制代码
2.8.3 备份CDB中的归档重做日志
- # 在CDB中,只有具有sysdba或sysbackup权限的公共用户连接到根目录才可以备份归档重做日志。
- # 具有sysdba以及sysbackup的本地用户连接到PDB,不能备份、删除、切换归档重做日志文件。
- # 连接到根root备份归档方法与非CDB数据库相同。
复制代码
2.8.4 备份备份集、镜像副本
- backup backupset all delete input;
- backup backupset 1,2 delete input;
- backup datafilecopy from tab monDBCopy;
- backup device type sbt tag 'quartcrly_backup' copy of database delete input;
复制代码
2.8.5 备份recovery area
- 恢复文件(Recovery Files)指的是在快速恢复区中的完全备份集、增量备份集、控制文件自动备份、数据文件副本和归档重做日志。
- 如果归档重做日志文件丢失或损坏,那么RMAN从恢复区外查找可用于备份的归档日志的副本。
- 在恢复区的闪回日志、当前控件文件和联机重做日志文件不备份。
- # 及时configure backup optimization off也会启用备份优化功能,除非指定force选项。
- rman> backup recovery area to destination '/bak/';
复制代码
2.9 精确控制备份
2.9.1 限制备份集中的文件数
filesperset: 对filesperset与备份对象总数除以分配的通道数,较小值作为实际产生作用的值。默认值为单个通道最大文件数64.
2.9.2 限制备份集和备份片大小
- 1. 限制备份集大小
- # backup...maxsetsize
- rman> backup device type sbt maxsetsize 100m archivelog all;
- # configure
- RMAN> configure default device type to disk;
- RMAN> configure maxsetsize to 10g;
- 2. 限制备份片大小
- RMAN> configure channel device type disk maxpiecesize 2g;
- 3. 多段备份
- 多段备份目的使RMAN通道能够并行备份一个大文件,比如超大bigfile表空间数据文件。
- - 如果指定section size导致产生超过256个文件区域,RMAN会增加区域大小以使正好有256个区域。
- - 不能backup命令中同时指定maxpieces和section size
- RMAN> backup section size 300m tablespace users;
复制代码
2.9.3 加密备份
- CONFIGURE ENCRYPTION
- SET ENCRYPTION
- v$rman_encryption_algorithms查看RMAN支持的加密算法。
- # 1. 透明数据加密
- - 建立Oracle密钥对。
- - RMAN> configure encryption for database on;
- - RMAN> set encryption on;
- - RAMN> configure encryption for database off;
- # 2. 密码加密
- set encryption identified by password only on for all tablespaces;
- # 可以单独使用透明加密或密码加密,也可以复合使用。
复制代码
2.9.4 备份集压缩
- v$rman_compression_algorithm:压缩算法视图
- # 压缩数据
- configure compression algorithm '压缩算法级别名称'; # medium、basic
- # 备份集压缩
- backup as compressed backupset database;
- configure device type disk backup type to compressed backupset;
复制代码
2.9.5 管理备份窗口
- # duration限制备份持续时长,超过时间,备份将终止,并报告错误。
- backup duration 4:00 tablespace users;
- # 允许备份窗口部分备份。
- 如果在BACKUP命令中指定PARTIAL参数,那么一个备份因为备份窗口结束而中断时RMAN不报告错误。相反,RMAN显示没有备份的文件的信息。如果BACKUP命令在RUN块中,那么在RUN块中的剩余命令将继续执行。
- - filesperset 1将每个备份集限制只有一个文件,这样配合partial可以最大限度减少备份失败影响。
- backup duration 4:00 partial tablespace users filesperset 1;
- # 最大限度减少备份负载与持续时间
- 对于磁盘备份,可以用MINIMIZE TIME选项使备份最快运行(默认),也可使用MINIMIZE LOAD选项降低备份速率以减少系统负载。指定MINIMIZE LOAD选项时备份将用完指定的持续时间。如果指定TIME选项,那么最近备份的文件将给予最低优先备份。
- backup duration 4:00 partial minimize time database filesperset 1;
- backup duration 4:00 partial minimize load database filesperset 1;
复制代码
2.10 管理RMAN备份
2.10.1 显示备份信息
- # 1.显示备份信息
- - list,report
- - 动态性能视图
- - catalog的RC_视图
- - restore...preview/restore...validate header命令
- # restore preview只读取元数据,不读取备份文件、restore...validate header读取元数据与检查磁盘、其他介质文件是否与元数据一致。
复制代码
2.10.2 显示数据库化身
- # database incarnations,resetlogs所做操作
- 当使用RESETLOGS选项打开数据库时,数据库将执行以下操作:
- (1)如果当前联机重做日志可以访问,那么将它们进行归档,然后删除联机重做日志的内容,并将日志序列号重置为1。
- (3)将控制文件中的重做线程记录和联机重做日志记录初始化为新数据库化身开始位置。
- (4)用新的RESETLOGS SCN和时间戳更新所有当前数据文件、联机重做日志以及所有后续归档重做日志。
- # 除非RESETLOGS SCN和时间戳匹配,否则数据库不会将归档重做日志应用于数据文件,因此用RESETLOGS时要预防不是来自当前化身的直接父化身的归档日志破坏数据文件。
- # 在Oracle 12c以前的版本中,Oracle建议在OPEN RESETLOGS后立即备份数据库。
- # 在Oracle 12c以后的版本中,因为可以像任何其他备份一样轻松恢复在RESETLOGS打开前的备份,所以此时建立新的数据库备份不是必需的。要想利用RESETLOGS进行恢复,必须要有最近备份之后生成的所有归档日志,并且至少有一个控制文件可用(当前控制文件、备份控制文件或已建立的新的控制文件)。
- # 关于resetlogs后的恢复
- 用RESET DATABASE TO INCARNATION命令可以指定SCN是在特定数据库化身的引用框架中的SCN。
- 当用FLASHBACK、RESTORE或RECOVER返回到非当前数据库化身的SCN时,需要执行RESET DATABASE TO INCARNATION命令。
- 但是,在使用闪回技术时,RMAN隐含地执行RESET DATABASE TO INCARNATION命令。
- # 关于PDB的化身
- 可插拔数据库(PDB)的化身是多租户容器数据库(CDB)的子化身,并表示为(DATABASE_INCARNATION, PDB_INCARNATION)。例如,如果CDB是化身5,并且PDB是化身3,那么PDB化身的完整描述是(5,3)。PDB的初始化身为0,后续化身是唯一的,但不总是连续的序号。
- V$PDB_INCARNATION:可以查询PDB化身的信息。
- # 孤立备份
- 指数据库经过备份恢复多个库之后,不在resetlogs直接路径中进行的备份,比如在第一次resetlogs SCN之后祖先库进行的备份即为孤立备份。
- # 孤立的PDB备份
- 不完全恢复recover与resetlogs之间的备份为pdb的孤立备份。
- # list incarnation
复制代码
2.10.3 report备份信息与schema
- # 报告需要备份文件
- report need backup;
- report needbackup [DAYS n | INCREMENTAL n | RECOVERY WINDOW OF n DAYS | REDUNDANCY n] reportObject
- # 报告nologging非日志操作影响而需要备份数据文件,列出不可恢复数据文件
- report unrecoverable;
- # report obsolete;
- # 报告数据库schema
- # 指显示指定时间目标数据库中所有数据文件(永久和临时)和表空间名称等信息。
- report schema;
- report schema at time 'sysdate-14';
- report schema at scn 1000;
- report schema at sequence 100 thread 1;
复制代码
2.10.4 change更改备份状态
- # change更改备份等信息
- change backupset 231 nokeep;
- change backupset 12 available;
- change datafile copy 'd:\system01.dbf' keep until time 'sysdate+180';
- # 更改被删除的PDB的备份状态
- # 必须使用GUID,不能使用PDB名称来识别被删除的PDB。
- 1. 查询DBA_PDB_HISTORY视图确定从CDB中删除的PDB的GUID
- 2. change
- RMAN> change backuppiece GUID 'xxx' uncatalog;
- RMAN> change copy GUID 'xxx' uncatalog;
复制代码
2.10.5 catalog注册备份记录到RMAN资料库
- catalog datafilecopy 'xxx';
- catalog backuppiece 'xxx';
- catalog start with '';
- catalog recovery area;
复制代码
2.10.6 RMAN通道
- # 手工分配通道
- Channel Control Options for Manual and Automatic Channels
- Control the operating system resources RMAN uses when performing RMAN operations
- Affect the degree of parallelism for a backup or restore command
- Set limits on I/O bandwidth consumption in kilobytes, megabytes, or gigabytes (ALLOCATE CHANNEL ... RATE, CONFIGURE CHANNEL ... RATE)
- Set limits on the size of backup pieces (the MAXPIECESIZE parameter specified on the CONFIGURE CHANNEL and ALLOCATE CHANNEL commands)
- Set limits on the size of backup sets (the MAXSETSIZE parameter specified on the BACKUP and CONFIGURE commands)
- Send vendor-specific commands to the media manager (SEND)
- Specify vendor-specific parameters for the media manager (ALLOCATE CHANNEL ... PARMS, CONFIGURE CHANNEL ... PARMS)
- Specify which instance performs the operation (ALLOCATE CHANNEL ... CONNECT, CONFIGURE CHANNEL ... CONNECT)
- # 自动分配通道
- RMAN allocates automatic channels according to the settings in these commands:
- CONFIGURE DEVICE TYPE ... PARALLELISM
- CONFIGURE DEFAULT DEVICE TYPE
- CONFIGURE CHANNEL
- # maintenance通道
- 如果使用DELETE要删除的文件所在设备未配置为自动通道设备,那么必须先用ALLOCATE CHANNEL FOR MAINTENANCE维护命令。例如,如果用SBT通道进行备份,但只有一个磁盘通道配置,那么必须手动为DELETE命令分配SBT通道。当对只在磁盘文件执行DELETE命令时需要自动或手动分配通道。
复制代码
2.10.7 删除备份
- # 删除
- delete ..
- # 删除已从CDB拔出的PDB的备份
- # 已经从CDB拔出的PDB,pdb名称就不存在,需要使用GUID删除,DBA_PDB_HISTORY可以查询到。
- RMAN> select pdb_name,pdb_guid from dba_pdb_history where db_name='xx';
- RMAN> delete backup GUID 'xxx';
- RMAN> delete copy GUID 'xxx';
复制代码
2.10.8 RMAN删除数据库
- # 需要数据库mount而不是open状态,有恢复目录可以指定include copies and backups一起删除并在恢复目录注销数据库。
- RMAN> STARTUP FORCE MOUNT;
- RMAN> ALTER SYSTEM ENABLE RESTRICTED SESSION;
- RMAN> DELETE BACKUPSET;
- RMAN> DELETE COPY;
- RMAN> DROP DATABASE [INCLUDING BACKUPS NOPROMPT];
复制代码
2.10.9 恢复目录catalog
- # 创建catalog,同步
- create catalog;
- create virtual catalog; # 可以用来控制权限。
- # resetlogs之后的处理
- 当用RESETLOGS选项打开数据库时将创建数据库新的化身,此时会在恢复目录中自动创建新数据库化身的记录。可以访问视图V$DATABASE_INCARNATION来查询新化身的记录。数据库隐含地自动调用RESET DATABASE命令指定新数据库化身为当前的化身,对目标数据库进行的后续备份和日志归档都对应着新数据库化身。
- 如果要将数据库返回到当前RESETLOGS SCN之前的SCN,无论是用RESTORE或RECOVER或FLASHBACK DATABASE完成该任务,都需要用RESET DATABASE TO INCARNATION命令。但是,在下列两种情况下不需要显式执行RESET DATABASE TO INCARNATION,因为在闪回操作中RMAN隐含运行该命令:一种情况是用FLASHBACK DATABASE将数据库倒回到在直接祖先路径的一个SCN;另一种情况是用FLASHBACK DATABASE将数据库倒回到一个恢复点。
- import catalog user/passwd@tns [dbid=xxx | db_name=xxx];
复制代码
2.10.10 存储脚本
- 任何RUN模块中合法的命令都可以运行在存储脚本中。
- # 创建存储脚本
- create script
- create global script
- # 更新存储脚本
- replace script
- replace script
- # 执行存储脚本
- 1.脚本中没有替换变量静态脚本
- run {
- EXECUTE [GLOBAL] SCRIPT {SCRIPT_NAME};
- }
- 2.动态脚本
- # 创建动态脚本使用&
- CREATE SCRIPT quarterly
- {
- ALLOCATE CHANNEL c1 DEVICE TYPE SBT
- PARMS 'ENV=(OB_MEDIA_FAMILY=&1)';
- BACKUP TAB &2 FORMAT 'D:\back/&1%U.bak'
- KEEP FOREVER RESTORE POINT &3
- DATABASE;
- }
- # 运行动态脚本
- -- 1. rman命令代入变量
- rman target user/pass@tns catalog user/pass@tns USING arc_backup bak0906 FY06Q3
- RMAN> @scriptname
- -- 2.run模块代入变量
- run{
- execute script quarterly USING arc_backup bak1206 FY06Q4;
- }
- -- 3. 启动RMAN时执行脚本
- rman target user/pass@tns CATALOG user/pass@tns SCRIPT 'd:\tmp\test.cmd';
- -- 4.显示脚本内容以及名称
- RMAN> print [GLOBAL] script {script_name} [TO FILE 'd:\myscript.txt'];
- RMAN> list [GLOBAL] script names;
- RMAN> list all script names;
- -- 5.删除存储脚本
- RMAN> delete [GLOBAL] script 'script_names';
复制代码
3. RMAN数据库恢复
3.1 还原优化
- # 还原优化只检查数据文件头部,不扫描数据文件主体是否有损坏的块。
- -- 可以使用restore命令force选项覆盖还原优化(Restore Optimization),当还原操作被中断,再次运行相同restore命令,RMAN只还原前一操作中没有被还原的单个数据文件。
- -- duplicate命令还原优化也很有用,一个之前正确位置的数据文件具有正确文件头,奖杯跳过,duplicate不支持force操作,如果想无条件还原所有数据文件,删除duplicate之前复制过的数据文件。
复制代码
3.2 RMAN验证
3.2.1 坏块以及检测坏块
- # 坏块
- 1.物理与逻辑坏块
- -- 物理坏块指由于checksum无效或块包含全0或块头与块尾不匹配导致数据库根本无法识别的块,运行RMAN时指定NOCHECKSUM选项,创建备份是将不计算块checksum
- -- 逻辑损坏指块checksum有效,并且块头与块尾匹配,但块内容在逻辑上不一致,如行块或索引条目的损坏就是逻辑损坏,如果RMAN监测到逻辑坏块,就会将该块记录在alert以及会话trace日志中。
- -- 默认RMAN不检测逻辑损坏,运行BACKUP命令指定CHECK LOGICAL选项,那么RMAN将检测数据并对逻辑损坏块进行索引。
- 2.RMAN备份中坏块限制
- -- 可以使用SET MAXCORRUPT命令设置RMAN备份中允许一个文件中未标记坏块的数量,默认为0,不允许任何种类未标记坏块。
- -- 设置SET MAXCORRUPT时,RMAN允许备份存在标记的坏块,restore数据文件中可能有多个标记为已损坏的块,如果此时对restore的有坏块的数据文件备份,即使没有设置MAXCORRUPT值,备份也会成功,这是因为先前标记的坏块不会阻止RMAN完成备份。
- 3.检测坏块
- # ORA-1578
- # 块间损坏(Interblock Corruption)
- -- 指损坏发生在块之间,这种类型只能是逻辑损坏。
- # 块内损坏(Intrablock Corruption)
- -- 指发生在块本身内部,这种可以是物理可以是逻辑损坏。
- # v$database_block_corruption视图记录着块内损坏的信息,而自动诊断库(ADR)跟踪所有类型块损坏信息。
- -- 所有数据库实用程序都检测块内损坏,包括RMAN和DBVERIFY实用程序。
- -- 只有DBVERIFY和ANALYZE实用程序才会监测块间损坏。
复制代码
3.2.2 VALIDATE
- validate期间遇到问题,RMAN将显示并就到ADR中,可以用list failure查看故障信息。
- validate验证时会跳过从不使用的块,COMPATIBLE大于10.2,对于本地管理表空间,未使用块也将跳过。
- # 并行验证大数据文件
- run{
- ALLOCATE CHANNEL c1 DEVICE TYPE DISK;
- ALLOCATE CHANNEL c2 DEVICE TYPE DISK;
- VALIDATE DATAFILE 1 SECTION SIZE 100M;
- }
- # BACKUP VALIDATE
- -- 物理sunhuai
- RMAN> BACKUP VALIDATE DATABASE ARCHIVELOG ALL;
- -- 物理、逻辑损坏
- RMAN> BACKUP VALIDATE CHECK LOGICAL DATABASE ARCHIVELOG ALL;
- # RESTORE VALIDATE
- RESTORE DATABASE VALIDATE;
- RESTORE ARCHIVELOG ALL VALIDATE;
- # 试验修复(Trial Recovery)
- RMAN或SQLPLUS中使用RECOVER...TEST进行试验修复,只在内存中,不会将更改写入磁盘。
复制代码
3.2.3 验证CDB和PDB
- # 验证整个CDB
- VALIDATE DATABASE;
- # 验证根root
- validate database root;
- # 验证pdb
- validate pluggable database {pdb1,pdb2...};
复制代码
3.3 恢复
3.3.1 恢复准备
- # 确定DBID
- 恢复参数文件与从自动备份中恢复控制文件时,需要知道数据库DBID
- -- 可以从自动控制文件备份文件名中看到DBID
- # 预览还原用到的备份
- RESTORE...PREVIEW [SUMMARY]/RESTORE...VALIDATE HEADER以确保用到备份状态或避免特定备份使用。
- --restore...preview [summary]可以在restore操作中显示要使用的每个备份的详细信息列表,以及restore操作完成后进行修复的目标SCN。
- --restore...validate header,除了列出还原和修复所需的文件,还验证备份备份文件头部已确定磁盘或介质管理目录中文件是否与RMAN资料库元数据一致。
- --eg.
- restore database preview;
- restore archivelog from time 'sysdate-7' preview;
- restore database preview summary;
- # 召回离线备份
- # 离线备份(offsite backups)是指一种在RMAN还原之前需要介质管理软件才能检索的SBT备份。有些介质管理软件可以向RMAN提供有关备份是否离线的状态信息。离线备份在RMAN资料库中标记为AVAILABLE,但是restore之前必须从介质存储器中检索出来,否则restore会失败。
- restore...preview显示:List of remote backup files则备份为离线备份,需要执行restore...preview recall;命令,有多个离线备份,可以重复运行多次。
- # restore所需的归档重做日志
- 1.控制应用归档
- RMAN在recover时,可以使用UNTIL AVAILABLE REDO子句,来自动将数据库recover到最后一个可用归档重做日志,在下面场景不能使用:
- - recover datafile
- - recover tablespace
- - pluggable database,需要使用until scn恢复到指定点。
- 2.restore归档重做日志时控制恢复目的地
- SET ARCHIVELOG DESTINATION TO控制restore归档到指定位置,可以指定多个控制每部分归档restore的位置。
- # 提供加密备份密码
- -- 基于软件密钥库
- RMAN> SET DECRYPTION WALLET OPEN IDENTIFIED BY my_wallet_pass;
- -- 基于密码
- RMAN> SET DECRYPTION IDENTIFIED BY mypasswd;
复制代码
3.3.2 CDB的完全恢复
- # 整个CDB完全恢复,与非CDB一样
- restore database;
- recover database;
- # 对CDB根的完全恢复,Oracle建议恢复ROOT后恢复所有PDB,防止ROOT与PDB之间元数据不一致。
- SHUTDOWN IMMEDIATE;
- STARTUP MOUNT;
- RESTORE DATABASE ROOT;
- RECOVER DATABASE ROOT;
- RESOTRE PLUGGABLE DATABASE 'PDB$SEED',pdb1,pdb2...;
- RECOVER PLUGGABLE DATABASE 'PDB$SEED',pdb1,pdb2...;
- ALTER DATABASE OPEN;
- ALTER PLUGGABLE DATABASE ALL OPEN;
- # 对PDB的完全恢复
- --连接到ROOT恢复PDB
- ALTER PLUGGABLE DATABASE pdb1,pdb2... CLOSE;
- -- 如果有数据文件丢失,则OFFLINE对应datafile
- ALTER PLUGGABLE DATABASE DATAFILE {integer} OFFLINE;
- RESTORE PLUGGABLE DATABASE {pdb_name_list};
- RECOVER PLUGGABLE DATABASE {pdb_name_list};
- -- online之前offline数据文件
- ALTER DATABASE DATAFILE {integer} ONLINE;
- ALTER PLUGGABLE DATABASE {pdb_name_list} OPEN;
- -- 连接到指定PDB恢复,命令与非CDB相同。
- # 切换到镜像副本后执行CDB、PDB完全恢复
- -- 要切换CDB中的数据文件与非CDB数据库切换相同。
- -- 切换PDB中数据文件,连接到ROOT
- SWITCH...PLUGGABLE DATABASE / SWITCH DATAFILE命令
复制代码
3.3.3 块介质恢复
- # 当主库有real-time apply dataguard备库时
- -- 主库查询时遇到坏块,数据库自动尝试执行块介质恢复。
- -- 当VALIDATE命令验证期间检测到坏块,不会自动执行恢复功能。
- # 手工修复
- RECOVER...BLOCK;
- -- 搜索顺序:real-time apply dataguard - flashback log - 完全备份或0级备份。
- # 坏块如果丢失重做日志下面情况依然可以恢复
- -- 当丢失坏块的重做日志之后重做日志流显示该块被重新分配给了其他数据之后,数据库会新建一个数据块,继续应用后续未丢失重做日志,依然可以完成恢复。
- # 修复单个块
- recover datafile {integer} block {integer} datafile .... block ...;
- -- 只从指定备份中搜索可用块
- recover ... block ... from tag my_backup;
- # 修复V$DATABASE_BLOCK_CORRUPTION视图所有块
- recover corruption list;
复制代码
3.3.4 RMAN高级恢复技术
- # 非归档利用增量有限恢复,增量备份需要在mount下进行备份必须为一致性备份。
- sartup mount;
- restore database from tag 'tag';
- recover database noredo;
- alter database open resetlogs;
- # 控制搜搜自动备份天数或归档sequence号
- restore spfile/controlfile [to 'path'] from autobackup ... [maxseq N] [maxdays N];
- # 如果自动控制文件备份不是默认格式,设置
- SET CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO 'd:\autobackup_%F';
- SET DBID XXX;
- # rman建立pfile
- -- 需要有spfile备份才能使用下面子句
- RESTORE SPFILE TO PFILE 'path';
- # resetlogs
- 在用备份控制文件修复数据库后不管日志是否可用,始终需要用OPEN RESETLOGS选项打开数据库。
- # 12c新特性通过网络restore/recover
- # restore
- -- 可以利用physical dataguard对应文件restore主库丢失的数据文件,也可以利用主库来还原备用数据库的文件。
- -- 下面语句使用压缩备份方式
- RMAN> RESTORE DATAFILE 'd:\oradata\test.dbf' FROM SERVICE standby_tns
- SECTION SIZE 120M USING COMPRESSED BACKUPSET;
- -- 下面为各个文件restore方式
- 数据库级别:restore database from service <服务别名>
- 表空间: restore tablespace from service <服务别名>
- 控制文件:restore controlfile to '指定的位置' from service <服务别名>
- SPFILE: restore spfile from service <服务别名>
- # recover
- recover ... from service ...
- # from service 示例恢复物理备库
- -- 示例恢复physical dataguard
- # 1.连接physical standby database
- RMAN> CONNECT TARGET "user@standby_tns as sysbackup";
- RMAN> CONNECT CATALOG rman@catdb;
- RMAN> report schema;
- RMAN> SELECT type,group#,member FROM v$logfile;
- RMAN> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
- # 2.确定物理备库当前SCN,后续确认是否在此之后主库有新数据文件增加
- RMAN> SELECT current_scn from v$database;
- RMAN> SHUTDOWN IMMEDIATE;
- RMAN> STARTUP NOMOUNT;
- # 3.从主库恢复最新的控制文件
- RMAN> RESTORE STANDBY CONTROLFILE FROM SERVICE primary_db;
- RMAN> ALTER DATABASE MOUNT;
- # 4.更新备库控制文件数据名称
- -- 连接到catalog数据库的话使用下面完成switch database to copy
- RMAN> RECOVER DATABASE NOREDO;
- -- 未使用catalog数据库physical standby switch to copy
- RMAN> report schema;
- RMAN> CATALOG START WITH 'd:\datafiles';
- RMAN> SWITCH DATABASE TO COPY;
- -- 下面命令在主库创建多片增量备份用于recover备用数据文件,noredo子句指定recover不apply归档重做日志,可选择使用传输使用压缩备份集,减少网络压力
- RMAN> RECOVER DATABASE FROM SERVICE primary_db NOREDO SECTION SIZE 120M [USING COMPRESSED BACKUPSET];
- # 5.使用第二步查询到的scn确认是否有需要restore的数据文件
- RMAN> SELECT file# FROM V$DATABASE WHERE creation_change# >= xxx;
- -- xxx为第二步查询到的scn号。
- -- 如果上述查询返回有一个或多个数据文件,则进行restore
- -- set newname for database后面名字需要指定至少%b,%f,%U一个,避免名字冲突
- RMAN> RUN{
- SET NEWNAME FOR DATABASE TO 'd:\oracle\database';
- RESTORE DATAFILE n1,n2,N FROM SERVICE primary_tns;
- }
- -- 如果连接到catalog数据库,则直接执行
- RMAN> RESTORE DATAFILE n1,n2,N FROM SERVICE primary_tns;
- # 6.更新控制文件在线连接日志名称
- -- 1. ALTER DATABASE CLEAR
- RMAN> ALTER DATABASE CLEAR LOGFILE GROUP N;
- -- 2. ALTER DATABASE RENAME FILE重命名
- 需要STANDBY_FILE_MANAGEMENT设置为MANUAL
- -- 3. 如果不进行,在open read only的过程中,也会自动clear redo log
- # 7.主库切换归档,查看备库接收
- RMAN> ALTER SYSTEM ARCHIVELOG CURRENT;
- # 8.备库开启应用
- RMAN> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION [ USING CURRENT LOGFILE];
复制代码
3.3.5 表空间时间点恢复(TSPITR)
- # TSPITR限制,19c版本
- 1. 非归档模式
- 2. 表空间rename过,无法TSPITR到rename之前。
- 3. 不是自包含,TSPITR需要同时recover自包含的所有表空间。
- 4. 默认default tablespace无法使用TSPITR,PDB的default tablespace也不可以。
- 5. 物化视图等一些有底层对象,但是底层对象不自包含在TSPITR集里。
复制代码
3.3.5.1.表空间定点恢复准备
- DBMS_TTS.TRANPORT_SET_CHECK需要有EXECUTE_CATALOG_ROLE角色
- TRANSPORT_SET_VIOLATIONS视图查询
- TS_PITR_OBJECTS_TO_BE_DROPPED
- #1. 将要执行TSPITR的表空间一起写入下面列表进行校验
- EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('tbs1,tbs2',TRUE);
- #2. 查询是否有违反自包含约束的对象
- SELECT * FROM transport_set_violations;
- #3. 查找TSPITR可能丢失的对象
- SELECT owner,name,tablespace_name,to_char(creation_time,'YYYY-MM-DD:HH24:MI:SS')
- FROM ts_pitr_objects_to_be_dropped
- WHERE tablespace_name IN ('USERS','TOOLS')
- AND creation_time > TO_DATE('xx','YYYY-MM-DD:HH24:MI:SS')
- ORDER BY tablespace_name,creation_time;
- # 或使用函数SCN_TO_TIMESTAMP(SCN)使用SCN来获取具体定点恢复时间,该函数受限于自动undo管理下undo retention时间,但不会少于120小时。
- # 如果是pdb中表空间,则语法如下:
- RMAN> RECOVER TABLESPACE {pdb_name}:{tbs_name}
- UNTIL LOGSEQ 1300 THREAD 1
- AUXILIARY DESTINATION 'd';
- # 需要有控制文件备份以及需要的归档备份
- # 确实归档以及控制文件都会报错如下:
- RMAN-03002: failure of recover command at 10/19/2021 16:52:04
- RMAN-03015: error occurred in stored script Memory Script
- RMAN-06026: some targets not found - aborting restore
- RMAN-06024: no backup or copy of the control file found to restore
- RMAN-03015: error occurred in stored script Memory Script
- RMAN-03009: failure of sql command on default channel at 10/21/2021 11:17:21
- RMAN-11003: failure during parse/execution of SQL statement: drop tablespace CZHTBS including contents keep datafiles cascade constraints
- ORA-12919: Can not drop the default permanent tablespace
复制代码
3.3.5.2.全自动TSPITR
- # 全自动TSPITR
- # 默认全自动模式下,RMAN尽可能使用目标数据库上的TSPITR设置。
- # 可以连接catalog数据库,不要连接Auxiliary数据库,否侧,会试图用辅助数据库进行TSPITR
- # 在目标实例上配置TSPITR所需的通道,执行TSPITR时会使用与目标库相同配置。
- # 运行UNTIL和AUXILIARY DESTINATION的recover tablespace命令
- RMAN> RECOVER TABLESPACE USERS,TOOLS
- UNTIL LOGSEQ 1300 THREAD 1
- AUXILIARY DESTINATION 'd';
- # 如果是pdb中表空间,则语法如下:
- RMAN> RECOVER TABLESPACE {pdb_name}:{tbs_name}
- UNTIL LOGSEQ 1300 THREAD 1
- AUXILIARY DESTINATION 'd';
- # 当TSPITR完成,在表空间online之前,备份recover的表空间。
- # 表空间执行过TSPITR之后,之前表空间备份就不能使用了。
- RMAN> backup tablespace users,tools;
- # online表空间
- RMAN> alter tablespace users,tools ONLINE;
复制代码
3.3.5.3.用户定制的TSPITR
//可以通过set newname/CONFIGURE AUXNAME/DB_FILE_NAME_CONVERT/RECOVER
- # 可以通过SET NEWNAME FOR DATAFILE子句控制TSPITR之后,数据文件恢复的路径,更换路径后,原数据文件不会被物理删除,还存在原磁盘以datafilecopy存在。
- # 可以通过cofigure auxname或recover ... auxiliary destination子句指定辅助文件路径。
- # 可以使用CONFIGURE AUXNAME FOR DATAFILE n TO auxname_n为每个文件指定辅助集文件名
- # 可以通过DB_FILE_NAME_CONVERT/SET NEWNAME FOR TEMPFILE来重命名临时文件
- RUN{
- ALLOCATE AUXILIARY CHANNEL aux_c1 type disk;
- SET NEWNAME FOR DATAFILE '+DATADG/ORCL/A0A88C7A23743EE4E0530BCCA8C0B3CC/DATAFILE/czhtbs.277.1034887279' TO '+FRADG';
- SET NEWNAME FOR DATAFILE '+DATADG/ORCL/A0A88C7A23743EE4E0530BCCA8C0B3CC/DATAFILE/czhtbs.286.1036327129' TO '+FRADG';
- SET NEWNAME FOR DATAFILE '+DATADG/ORCL/A0A88C7A23743EE4E0530BCCA8C0B3CC/DATAFILE/czhtbs.275.1038830241' TO '+FRADG';
- SET NEWNAME FOR DATAFILE '+DATADG/ORCL/A0A88C7A23743EE4E0530BCCA8C0B3CC/DATAFILE/czhtbs.288.1038830267' TO '+FRADG';
- recover tablespace czhpdb:czhtbs until [scn | sequence | time] [ thread n] auxiliary destination '+fradg';
- }
- # 如果辅助位置为ASM,则最后完成时会报如下错误,无法删除dmp文件,需要手工删除,19.8版本测试如此。
- Could not delete auxiliary instance file tspitr_CFDC_46133.dmp
- Oracle error from target database:
- ORA-65250: invalid path specified for file - +FRADG/tspitr_cfdc_46133.dmp
复制代码
3.3.5.4.使用镜像副本执行TSPITR
- # 使用SET NEWNAME/CONFIGURE AUXNAME指定的辅助集数据文件新位置,在该位置如果有TSPITR中目标SCN对应的镜像副本,或早于改SCN的副本,那么RMAN将使用改镜像副本。
- BACKUP AS COPY DATABASE DB_FILE_NAME_CONVERT (maindisk,auxdisk);
复制代码
3.3.5.5.使用auxiliary数据库执行TSPITR
- # 执行TSPITR时,目标数据库与辅助数据库必须在相同主机上。
- 1. 创建实例nomount
- 2. rman target / auxiliary user/passwd@tns as sysbackup
- 3. recover tablespace .. until time 'time';
复制代码
3.3.6 RECOVER TABLE / TABLE PARTITION
3.3.6.1.recover table and table partition概念与限制
- 1. 需要有rman备份
- 2. 可以使用下面子句
- - AUXILIARY DESTINATION
- - UNTIL TIME/SCN/SEQUENCE
- - DUMP FILE/DATAPUMP DESTINATION指定数据泵文件位置
- - NOTABLEIMPORT,不导入expdp文件,可以手工导入
- - REMAP TABLE,重命名表名
- - REMAP TABLESPACE,恢复到不同原始表空间
- 3.限制
- - Tables and table partitions belonging to SYS schema cannot be recovered.
- - Tables and table partitions from SYSTEM and SYSAUX tablespaces cannot be recovered.
- - Tables and table partitions on standby databases cannot be recovered.
- - Tables with named NOT NULL constraints cannot be recovered with the REMAP option.
复制代码
3.3.6.2.示例语句
- RECOVER TABLE czh.test_flash5 OF PLUGGABLE DATABASE czhpdb
- UNTIL SCN 33160804 AUXILIARY DESTINATION '+FRADG'
- REMAP TABLE 'CZH'.'TEST_FLASH5':'TEST_FLASH5_RECOVER';
- # 可以将表分区recover之后作为单独表导入数据库
- RECOVER TABLE schema:table_name:partition_name
- UNTIL [ SCN | SEQUENCE | TIME ]
- AUXILIARY DESTINATION 'aux_path'
- REMAP TABLE 'SCHEMA'.'TABLE_NAME':'PATTITION_NAME':'RECOVER_TABLE_NAME'
- REMAP TABLESPACE 'source_tbs':'target_tbs';
- # 辅助位置如果未ASM磁盘组,则最后会报无法删除下面dmp文件,19.8版本
- Could not delete auxiliary instance file tspitr_eFpC_12568.dmp
- Oracle error from target database:
- ORA-65250: invalid path specified for file - +FRADG/tspitr_efpc_12568.dmp
复制代码
3.3.7 闪回数据库
- # 1.前提
- 配置闪回区,打开闪回数据库
- alter database flashback on;
- # 可以选择关闭部分表空间闪回, 在flashback database on之前offline数据文件,然后才能关闭表空间闪回数据库功能。
- # 2.执行闪回数据库操作
- -- 1. 确认闪回最早SCN
- SELECT oldest_flashback_scn,oldest_flashback_time FROM v$flashback_database_log;
- 或gurantee的restore point
- SELECT * FROM v$restore_point where gurantee_flashback_database='YES';
- -- 2. mount
- shutdown immediate;
- startup mount;
- -- 3. 再次查询,关闭会生成闪回日志,以及有可能闪回区空间限制导致部分闪回日志被清除,所以需要再次确认,如果目标SCN在窗口外,报错ORA-38729,数据库不会变化。
- -- 4. 配置通道
- -- 5. 闪回
- FLASHBACK DATABASE TO SCN XXX;
- FLASHBACK DATABASE TO RESTORE POINT XXX;
- FLASHBACK DATABASE TO TIME "TO_DATE('XX/XX/XX','MM/DD/YY')";
- -- 6. open read only验证闪回是否正确
- ALTER DATABASE OPEN READ ONLY;
- -- 7. 如果结果不满意,则可以重新mount数据库,再次闪回
- STARTUP MOUNT;
- FLASHBACK DATABASE TO SCN XXX;
- -- 8. 如果想完全取消闪回,则可以直接mount情况下,recover database
- RECOVER DATABASE; # 无需任何子句
- -- 9. 如果结果可以接受,则open resetlogs
- ALTER DATABASE OPEN RESETLOGS;
- # 3. 闪回整个CDB
- 使用sysdba、sysbackup使用common user连接到CDB,步骤与非插拔数据库步骤相同。
- FLASHBACK DATABASE TO SCN XXX;
- FLASHBACK DATABASE TO RESTORE POINT XXX;
- # 4. 闪回PDB
- -- 1.CDB需要打开状态
- CDB:SELECT open_mode FROM v$database;
- -- 2.确定闪回pdb所需scn、恢复点或时间点
- v$restore_point
- v$flashback_database_log
- -- 3.关闭要闪回的pdb
- SQL> ALTER PLUGGABLE DATABASE xxx CLOSE;
- -- 4. 闪回示例
- # 使用LOCAL UNDO
- RMAN> select PROPERTY_NAME,PROPERTY_VALUE,DESCRIPTION from database_properties where property_name='LOCAL_UNDO_ENABLED';
- RMAN> FLASHBACK PLUGGABLE DATABASE xxx TO SCn xxx;
- RMAN> FLASHBACK PLUGGABLE DATABASE xxx TO RESTORE POINT xxx;
- # 使用共享UNDO,使用共享undo,rman将还原根的UNDO、SYSTEM、SYSAUX到Auxiliary数据库,然后使用UNDO信息修复pdb
- RMAN> FLASHBACK PLUGGABLE DATABASE xxx TO SCN xxx AUXILIARY DESTINATION 'xxx';
- RMAN> FLASHBACK PLUGGABLE DATABASE xxx TO RESTORE POINT xxx AUXILIARY DESTINATION 'xx';
- -- 5.打开pdb
- RMAN> ALTER PLUGGABLE DATABASE xxx OPEN RESETLOGS;
复制代码
3.3.8 数据库时间点恢复
如果可能,Oracle建议执行闪回数据库而不是数据库时间点恢复。只有闪回技术无法用于撤销最近的变化时,用备份进行介质恢复才是最后的选择。
为了避免在执行DBPITR时出错,可以使用SET UNTIL命令在过程开始时设置目标时间,而不是单独在RESTORE和RECOVER命令中指定UNTIL子句,这样也确保了还原数据文件的时间足够早从而可用于RECOVER操作中。
如果使用目标时间表达式而不是目标SCN,那么确保在调用RMAN之前,时间格式环境变量是适当的NLS_LANG / NLS_DATE_FORMAT。
数据库时间点恢复之后,可以先open read only,查看是否结果满意,如果不满意,则执行recover database/pluggable database不带任何until子句即可完全恢复。
- # 1. CDB整个指定时间点恢复
- run{
- set until [scn | time | sequence | restore point] xxx;
- restore database;
- recover database;
- }
- # 2. PDB指定时间点恢复
- -- 在Linux 19.8/19.13测试,指定set until sequence时,会报错Segmentation fault (core dumped)
- RMAN> ALTER PLUGGABLE DATABASE xx CLOSE;
- RMAN> RUN
- {
- SET UNTIL SCN xxx;
- RESTORE PLUGGABLE DATABASE xxx;
- RECOVER PLUGGABLE DATABASE xxx;
- }
- # alter pluggable database xxx open如果没有resetlogs,会提示某个表空间需要media recovery,此时不用单独处理,可以open read only查看是否结果正确,结果正确即可open resetlogs
- RMAN> ALTER PLUGGABLE DATABASE xxx OPEN RESETLOGS;
- RMAN> SELECT * FROM v$pdb_incarnation;
- # 3. PDB执行DBPITR后闪回CDB数据库
- ## 单个PDB执行DBPITR之后,CDB重启到mount状态,DBPITR直接执行即可,会重新restore所有datafile,所以下面不再单独讨论CDB整库的DBPITR,只讨论CDB如何FLASHBACK
- -- 1.RMAN连接CDB,SYSBACKUP、SYSDBA权限
- -- 2.确定recover time
- -- 3.ALTER PLUGGABLE DATABASE xxx DATAFILE ALL OFFLINE; # 执行过DBPITR的pdb置为offline
- SQL> alter session set container=czhpdb;
- SQL> alter pluggable database czhpdb datafile all offline;
- -- 4.FLASHBACK DATABASE将CDB倒回目标时间。
- -- 5.用RESTORE PLUGGABLE DATABASE和RECOVER PLUGGABLE DATABASE恢复执行DBPITR的PDB。
- RMAN> RESTORE PLUGGABLE DATABASE XXX;
- SQL> alter pluggable database czhpdb datafile all offline;
- RMAN> RECOVER PLUGGABLE DATABASE XXX;
- RMAN> ALTER PLUGGABLE DATABASE XXX OPEN;
复制代码 为了在Oracle Database 12c保持向后兼容性,如果已经在其任何PDB上执行时间点恢复,那么就不允许对多租户容器数据库(CDB)执行闪回数据库。当在PDB上执行时间点恢复后,不能直接把CDB倒回到早于执行PDB的DBPITR的时间点,否则将显示错误信息。
3.3.9 FLASHBACK TO BEFORE RESETLOGS
- # 查询
- SQL> SELECT resetlogs_change# FROM v$database;
- SQL> SELECT oldest_flashback_scn FROM v$flashback_database_log;
- # 如果视图V$FLASHBACK_DATABASE_LOG中的oldest_flashback_scn列的值不小于视图V$DATABASE的resetlogs_change#列的值,那么就可以使用闪回数据库来撤销OPEN RESETLOGS操作。
- # RMAN
- RMAN> FLASHBACK DATABASE TO BEFORE RESETLOGS;
复制代码
3.3.10 RESET DATABASE TO INCARNATION n
- # 经过多次resetlogs之后,如果最新一次resetlogs再次比上次resetlogs不完全恢复的更早,那么前一次resetlogs将变成orphan incarnation,下面步骤将倒回到orphan化身
- SELECT oldest_flashback_scn FROM v$flashback_database_log;
- SELECT prior_incarnation# FROM v$database_incarnation WHERE status='CURRENT';
- shutdonw immediate;
- startup mount;
- RESET DATABASE TO INCARNATION 1;
- FLASHBACK DATABASE TO SCN 1500;
- ALTER DATABASE OPEN READ ONLY;
- ALTER DATABASE OPEN RESETLOGS;
- # 下面步骤将倒回到orphan之前的parent incarnation,即祖先化身
- RMAN> list incarnation of database xxx;
- RMAN> startup mount;
- RMAN> reset database to incarnation x;
- RMAN> run{
- set until time 'xxx';
- restore controlfile;
- alter database mount;
- restore database;
- recover database;
- }
- alter database open resetlogs;
复制代码
4. 迁移数据
4.1 复制数据库Duplicate
使用DUPLICATE… BACKUP LOCATION子句,可以在不连接目标数据库下复制数据库,不适用于存储在磁带设备上备份的情况。
按照使用优先级顺序生成复制数据库文件的主要方法,下面排序按照优先级,如果有文件未使用优先级高的,则由优先级低设置决定文件名命名:
SET NEWNAME命令
CONFIGURE AUXNAME命令
DUPLICAT命令的SPFILE子句
DUPLICAT命令的LOGFILE子句(仅对联机重做日志文件)
DB_FILE_NAME_CONVERT / LOG_FILE_NAME_CONVERT
如果上述可能生成与复制的目标数据库相同的文件名,则需要搭配参数NOFILENAMECHECK避免RMAN报错。
通道配置
- -- 根据不同复制技术,RMAN可以使用辅助通道或目标通道
- -- 可以使用CONFIGURE或ALLOCATE手工分配通道。
- 1.基于备份的复制数据库通道配置
- 主要由辅助通道完成,所以通常可以通过分配辅助通道来提高速度。
- RUN{
- ALLOCATE AUXILIARY CHANNEL c1 DEVICE TYPE DISK;
- ...
- DUPLICATE DATABASE ...;
- }
- 2.ACTIVE DATABASE通道配置
- 建议分配其他辅助通道,辅助通道数必须大于或等于目标通道数。
复制代码
复制情景举例
- 1.基于活动数据库
- RMAN
- RMAN> CONNECT TARGET sys@srcdb as SYSDBA
- RMAN> CONNECT AUXILIARY sys@dupdb as SYSBACKUP
- RMAN> DUPLICATE DATABASE TO dupdb FROM ACTIVE DATABASE
- PASSWORD FILE
- SPFILE PARAMETER_VALUE_CONVERT='SRC','DST'
- SET db_file_name_convert='SRC','DST'
- SET log_file_name_convert='SRC','DST';
- 2. 无目标数据库和恢复目录连接基于备份的数据库复制
- # 没有目标数据库连接,所以需要指定正在复制的目标数据库名称
- RMAN> CONNECT AUXILIARY sys@dup AS SYSBACKUP;
- RUN{
- SET NEWNAME FOR DATABASE TO 'dst';
- DUPLICATE DATABASE 'srcdb' TO 'dup'
- UNTIL [SCN/SEQUENCE/TIME] 'xxx'
- SPFILE
- SET control_files='xx'
- SET db_file_name_convert='SRC','DST'
- SET log_file_name_convert='SRC','DST'
- BACKUP LOCATION 'bak_path';
- }
- 3. 复制部分表空间
- SKIP READONLY
- SKIP TABLESPACE 'TBS_01',... --跳过表空间不能包含SYS或物化视图
- TABLESPACE 'TBS_01',... --指定的表空间需要自包含
- RMAN> DUPLICATE TARGET DATABASE TO dupdb FROM ACTIVE DATABASE
- SKIP TABLESPACE tools NOFILENAMECHECK;
- 4. 复制整个CDB
- --辅助实例创建需要指定下面参数
- enable_pluggable_database=true
- --修改DB_NAME以及各种位置参数
- --执行DUPLICATE命令复制源CDB,与非CDB类似。
- 5.复制PDB
- --当复制一个活多个PDB时,RMAN也复制根(CDB$ROOT)和种子数据库(PDB$SEED)。
- -- 1.复制PDB到已经存在的CDB,具体限制参考Backup and Recovery User's Guide
- DUPLICATE PLUGGABLE DATABASE mypdb TO cdb_sales
- DB_FILE_NAME_CONVERT('cdb1','pdb1')
- FROM ACTIVE DATABASE
- SECTION SIZE 400M;
- --2. 复制PDB到不存在CDB
- RMAN> DUPLICATE DATABASE TO cdb1 PLUGGABLE DATABASE pdb1;
- RMAN> DUPLICATE DATABASE TO cdb1 PLUGGABLE DATABASE pdb1,pdb2,pdb3;
- RMAN> DUPLICATE DATABASE TO cdb1 SKIP PLUGGABLE DATABASE pdb3;
- --3. 复制PDB特定表空间
- RMAN> DUPLICATE DATABASE to cdb1 TABLESPACE pdb1:users;
- RMAN> DUPLICATE DATABASE to cdb1 PLUGGABLE DATABASE pdb1 TABLESPACE pdb2:users;
- 6.重新运行失败的DUPLICATE
- -- 1. 重新以最初pfile或spfile启动辅助实例到nomount,如果最初未使用,则再次运行也省略。
- -- 2. RMAN重新运行DUPLICATE
- -- 3. 如果不希望RMAN自动从失败的DUPLICATE中恢复,则可以指定NORESUME子句禁用。
复制代码
4.2 传输表空间
- 1. 手工传输表空间
- # 手工传输表空间,需要使用exp/expdp、rman、手工将表空间置为read only搭配使用
- 2. 使用RMAN传输表空间
- -- 需要有system/sysaux/UNDO以及需要tts的表空间的备份集,否则无法完成定点恢复。
- -- 本质上是进行了DBITR
- RUN{
- SET AUXILIARY INSTANCE PARAMETER FILE TO 'pfile_location';
- TRANPORT TABLESPACE tbs_2
- TABLESPACE DESTINATION 'path'
- AUXILIARY DESTINATION 'path';
- }
- -- 其他可选项
- DATAPUMP DIRECTORY 'dir_name'
- DUMP FILE 'file_name'
- EXPORT LOG 'file_name'
- IMPORT SCRIPT 'file_name'
- UNTIL [SCN | SEQUENCE | TIME] xx
- TO RESTORE POINT 'before_upgrade'
复制代码
5.RMAN 视图
- V$BACKUP_DEVICE:视图可查看当前数据库所支持的备份设备类型
- v$rman_backup_job_details
- --input_bytes_per_sec:度量备份速度的列。
- --compression_ratio:读写之间的比率。
- --in_sec:数据输入每秒
- --out_sec:数据输出每秒
- v$rman_backup_subjob_details
- v$backup_piece
- v$backup_set
- v$backup_files :可以列出备份的文件类型等信息,例如datafilecopy
- #
- v$rman_backup_type
- v$rman_compression_algorithm
- v$rman_configuration
- v$rman_output:内存视图,未记录在控制文件中,可容纳32768行数据。
- v$rman_status:显示完成和正在进行的rman作业信息,显示完成和正在进行的RMAN作业
- # 需要recover相关视图
- v$datafile_header # 确定数据文件状态
- v$recover_file # 列出数据文件编号,状态,错误信息列出需要修复的数据文件
复制代码
|