DBLOG
» WTF
Toggle navigation
DBLOG
主页
HCCDE
About Me
归档
标签
4、RMAN恢复-2
无
2025-07-18 16:27:21
46
0
0
admin
[TOC] #1、Oracle坏块产生原因与检查 ``` 在Oracle数据库中,坏块指的是一个或多个数据块内出现内容混乱的现象,导致数据库进程无法正常解析数据块的内容,进而使数据库进程报错、甚至挂起,最终导致整个数据库实例出现异常。坏块可以分为物理坏块和逻辑坏块两种类型。 物理坏块**(也称为介质坏块)指的是块格式本身是坏的,块内的数据没有任何意义。 物理坏块通常是由于内存问题、操作系统问题、I/O子系统问题或硬件问题引起的。 逻辑坏块**指的是块内的数据在逻辑上存在问题,例如索引块的索引值没有按照从小到大的顺序排列。 逻辑坏块通常是由于Oracle Bug等原因引起的。 物理坏块,在没有备份的情况下,物理坏块基本无救 ``` ##1.1、物理检查参数 ``` 通过设置初始化参数`db_block_checksum`为`typical`、`full`或`false`来启用、关闭物理一致性检查。启用该参数会增加1%~2%的负载,Oracle推荐启用该参数。在Oracle 9i、10g中,默认是启用的。在11g及更高版本中,`typical`是默认设置。 注意,`TRUE`与`typical`等价。当该参数设置为`typical`和`full`时,读取块时会重新计算校验和,与写入时的校验和进行比较,如果不同则认为是块损坏。如果设置为`full`模式,则会在应用更新或删除语句后重新计算并写入校验值。对于日志块,写入之前也会生成并写入校验值。 该参数主要用于防止IO硬件和IO子系统错误。如果设置为`OFF`,则只对系统表空间有效。 ``` ##1.2、逻辑检查参数 ``` 通过设置参数db block checking=true可以启用数据块的逻辑一致性检查。 启用该参数这会 增加1%~10%的负载,尤其DML操作越密集性能影响越大。 在Oracle10g中这个参数 默认值是false,这将意味这数据库只对System表空间做逻辑一致性检查。 ``` ##1.3、环境模拟 ``` create tablespace fgedu01 datafile '/oradata/R719CDB/fgedu001.dbf' size 50m; create user fgedu identified by fgedu default tablespace fgedu01; grant dba to fgedu; -- 创建表fgblock,并插入部分数据 CREATE TABLE fgedu.fgblock AS SELECT * FROM dba_objects WHERE rownum < 5000 AND object_id IS NOT NULL; -- 手动触发checkpoint ALTER SYSTEM CHECKPOINT; -- 使用RMAN备份数据库 RMAN backup tag fgzcdb_fullbak01 database format '/backup/fgzcdb_fullbak01_%s_%p_%t' current controlfile format '/backup/fgzcdb_ctl_%s_%p_%t'; -- 查询表的块号和文件号 CONN / AS SYSDBA; select distinct dbms_rowid.rowid_block_number(rowid) b_no, dbms_rowid.rowid_relative_fno(rowid) f_no from fgedu.fgblock order by 1; --5号文件 131-216 -- 查询表所在的文件、块信息 SELECT a.file_id, a.block_id, a.blocks, b.name FROM dba_extents a, v$datafile b WHERE a.file_id = b.file# AND a.owner = 'FGEDU' AND a.segment_name = 'FGBLOCK' ORDER BY a.block_id; -- 物理坏快通过dd即可,逻辑坏块需要通过bbed这些非oracle官方支持的工具模拟 -- 模拟坏块 dd if=/dev/zero of=/oradata/R719CDB/fgedu001.dbf bs=8192 conv=notrunc seek=150 count=1 dd if=/dev/zero of=/oradata/R719CDB/fgedu001.dbf bs=8192 conv=notrunc seek=170 count=1 -- 刷新缓冲区 ALTER SYSTEM FLUSH BUFFER_CACHE; ``` ##1.4、判断坏块 ``` -- 查询表记录数,验证是否受坏块影响无法全表扫描 SELECT COUNT(*) FROM fgblock; 报错 ERROR at line 1: ORA-01578: ORACLE data block corrupted (file # 5, block # 150) ORA-01110: data file 5: '/oradata/R719CDB/fgedu001.dbf' alter日志 less /oracle/app/oracle/diag/rdbms/r719cdb/r719cdb/trace Corrupt错误关键字 rman BACKUP CHECK LOGICAL VALIDATE DATAFILE 5; 做完rman后 select * from v$database_block_corruption where file#=5; dbv dbv file=/oradata/R719CDB/fgedu001.dbf blocksize=8192 确定坏块对象信息(根据文件号和块号查对象) select tablespace_name, segment_type, owner, segment_name from dba_extents where file_id = 5 and 150 between block_id and block_id + blocks - 1 所以在日常检测,考虑到效率和可靠性等,建议用rman+validatestructure来完成 ``` #2、Oracle无备份的情况下修复坏块 ``` 无备份情况跳过坏块进行逻辑导出(跳过坏块,坏块上面的数据只能丢失) 如果是索引可以重建,如果是表,则有可能会丢数据, 导出数据后 重建表空间,表 ``` ##2.1、通过内部事件10231跳过坏块并修复数据 ``` 不添加10231事件 ,直接exp会报错 alter system set events='10231 trace name context forever,level 10'; -- 使用 EXP 导出没有坏块的数据 exp fgedu/fgedu tables=fgblock file=fgblock.dmp log=fgblock.log -- 注意: 导出后别忘记关闭事件 alter system set events='10231 trace name context off'; -- 注意: 原有的表空间里面对应的数据文件还是坏块,此时可以将导出的表空间的数据, -- 然后把原来的表空间和表全部删除,重新导入 drop table fgedu.fgblock; imp system/Lc_jcgx0 file=fgblock.dmp fromuser=fgedu touser=fgedu ``` ##2.2、利用dbms_repair来标记和跳过坏块并修复数据 ``` select distinct dbms_rowid.rowid_block_number(rowid) b_no, dbms_rowid.rowid_relative_fno(rowid) f_no from fgedu.fgblock order by 1; dd if=/dev/zero of=/oradata/R719CDB/fgedu001.dbf bs=8192 conv=notrunc seek=233 count=1 dd if=/dev/zero of=/oradata/R719CDB/fgedu001.dbf bs=8192 conv=notrunc seek=270 count=1 -- 刷新缓冲区 ALTER SYSTEM FLUSH BUFFER_CACHE; select table_name, skip_corrupt from dba_tables where table_name= 'FGBLOCK' AND OWner='FGEDU'; conn / as sysdba; -- 使用dbms_repair -- 创建管理表 SET SERVEROUTPUT ON; BEGIN DBMS_REPAIR.ADMIN_TABLES( table_name => 'REPAIR_TABLE', table_type => dbms_repair.repair_table, action => dbms_repair.create_action, tablespace => 'FGEDU01' ); END; -- 检查坏块 SET SERVEROUTPUT ON; DECLARE rpr_count INT; BEGIN rpr_count := 0; DBMS_REPAIR.CHECK_OBJECT( schema_name => 'FGEDU', object_name => 'FGBLOCK', repair_table_name => 'REPAIR_TABLE', corrupt_count => rpr_count ); DBMS_OUTPUT.PUT_LINE('repair count: ' || TO_CHAR(rpr_count)); END; / --查看坏块信息 COL object_name FOR a20 COL corrupt_description FOR a50 COL repair_description FOR a40 COL corrupt_type FOR a20 SELECT object_name, block_id, corrupt_type, marked_corrupt, corrupt_description, repair_description FROM repair_table; -- 定位坏块:只有将坏块信息写入定义的REPAIR TABLE后,才能处理坏块。 set serveroutput on DECLARE fix_count INT; BEGIN fix_count := 0; --坏块条数 DBMS_REPAIR.FIX_CORRUPT_BLOCKS( schema_name => 'FGEDU', object_name => 'FGBLOCK', object_type => DBMS_REPAIR.TABLE_OBJECT, repair_table_name => 'REPAIR_TABLE', fix_count => fix_count ); DBMS_OUTPUT.PUT_LINE('fix count: ' || TO_CHAR(fix_count)); END; / --跳过坏块:我们前面虽然定位了坏块,但是,如果我们访问这个表还是会得到错误信息,所以需要skip处理。 BEGIN DBMS_REPAIR.SKIP_CORRUPT_BLOCKS( schema_name => 'FGEDU', object_name => 'FGBLOCK', object_type => DBMS_REPAIR.TABLE_OBJECT, flags => DBMS_REPAIR.SKIP_FLAG ); END; / SELECT table_name, skip_corrupt FROM dba_tables WHERE table_name = 'FGBLOCK' AND owner = 'FGEDU'; 此时查询不再报错,但是数据不全 select count(1) from FGBLOCK; 数据导出重建 ``` #3、Oracle有备份的情况下RMAN修复坏块 ``` 有备份情况的恢复(采用rman blockrecover修复) rman中有blockrecover来恢复坏块,但是如果没有备份无法实现, rman target / backup check logical validate datafile 5; set line 300 select * from V$database_block_corruption; --查询文件号对应的数据文件 select file_id, file_name, tablespace_name, bytes / 1024 / 1024, status, autoextensible, online_status from dba_data_files where file_id = 5; --查具体对象 select tablespace_name, segment_type, owner, segment_name from dba_extents where file_id = 5 and 233 between block_id and block_id + blocks - 1; 在Oracle 11g中新增了特性`recover corruption list` 该特性简化了数据坏块的修复流程。在11g中,修复数据坏块时不再需要指定数据文件的名字, 只要坏块记录在`v$database_block_corruption`视图中 使用`recover corruption list`语法即可尝试修复这些坏块。 两种修复坏块的方法如下: A: BLOCKRECOVER DATAFILE 5 BLOCK 233 CLEAR; BLOCKRECOVER DATAFILE 5 BLOCK 270 CLEAR; 如果不行↓ or BLOCKRECOVER DATAFILE 5 BLOCK 233 FROM BACKUPSET; BLOCKRECOVER DATAFILE 5 BLOCK 270 FROM BACKUPSET; VALIDATE DATAFILE 5 BLOCK 233; VALIDATE DATAFILE 5 BLOCK 270; B:11g(+)之后 1. 查询坏块信息: SELECT * FROM v$database_block_corruption; 2. 使用RMAN修复坏块: RMAN> RECOVER CORRUPTION LIST; 3. 验证数据文件的坏块: RMAN> VALIDATE DATAFILE 5 BLOCK 215; VALIDATE DATAFILE 5 BLOCK 191; 或者直接验证整个数据文件: RMAN> VALIDATE DATAFILE 5; 4. 再次查询坏块信息以确保修复完成: SELECT * FROM v$database_block_corruption; 使用dbv验证 dbv file=/oradata/R719CDB/fgedu01.dbf blocksize=8192 在有备份的情况下可以通过blockrecovery在线修复部分逻辑坏块 但是如果该逻辑坏块确实是由OracleBug引起的话,那么很有可能blockrecover也无能为力。 ``` #4、Oracle丢失归档后通过BBED强制恢复数据库 ``` 在RMAN数据库恢复过程中,可能会遇到部分归档文件丢失的情况,导致增量恢复失败,数据库无法打开。处理这种情况的常见方法包括: 1. 只恢复到最近的全备份,放弃丢失的归档文件和后续的增量备份。 2. 进行不完全恢复,恢复到丢失归档之前的状态,丢弃后续所有的增量备份。但由于 SCN 不一致,数据库很可能无法打开。 3. 实现不完全恢复,同样是恢复到丢失归档之前的状态,然后通过日志挖掘的方式找回丢失的数据,并导入到数据库中。同样,由于 SCN 不一致,数据库可能无法打开。 如果数据库无法打开,需要采用非常规处理方法,例如从丢失的归档文件开始跳过,修改数据文件头块中的 SCN,以实现所有文件的 SCN 一致性,然后强制打开数据库。 在数据文件头块中,常见的数据结构及其位置和作用包括: - 文件头块中存储了关于数据文件的元数据信息,如文件大小、创建时间、SCN 等。 - SCN(System Change Number)是 Oracle 中用于标识数据库状态的唯一递增的序号。它记录了数据库中最近一次的更改。 - 数据文件的头部还包含了一些校验和信息,用于确保数据文件的完整性和一致性。 - 数据文件的头部也包含了一些重要的标志和指针,用于在数据库恢复过程中确定文件的状态和位置。 ``` ##4.1、环境准备 ```shell #开归档 conn fgedu/fgedu create table fgtest01 as select * from v$datafile; create table fgtest02 as select * from v$datafile; create table fgtest03 as select * from v$datafile; alter system switch logfile; shutdown immediate cp fgedu001.dbf fgedu001.dbf.bak startup conn fgedu/fgedu create table fgtest04 as select * from dba_object where rownum <2000; delete from fgtest02; commit; alter system switch logfile; create table fgtest05 as select * from dba_objects where rownum <1000; delete from fgtest03; commit; alter system switch logfile; rm 删除中间的归档 模拟丢失 cd /oradata/R719CDB rm fgedu001.dbf mv fgedu001.dbf.bak fgedu001.dbf shutdown abort startup 提示recover recover datafile 5; 提示要归档,但归档没了 #当前SCN SELECT RTCKP_SCN,RTCKP_TIM,RTCKP_RBA_SEQ,RTCKP_RBA_BNO,RTSEQ FROM x$kccrt; #数据文件的SCN --不一致 select file#, to_char(checkpoint_change#, '999999999999999'), to_char(RESETLOGS_CHANGE#, '999999999999999') from v$datafile_header; #5号文件scn与别的不一致 1 1088311 1 2 1088311 1 3 1088311 1 4 1088311 1 5 1086299 1 select file#,name,bytes from v$datafile; 查看需要的归档日志 select * from v$recovery_log; ``` ##4.2、bbed修改SCN ``` vi file.txt 4 /oradata/R719CDB/users01.dbf 5242880 5 /oradata/R719CDB/fgedu001.dbf 52428800 fgedu-bbed-login set file 5 map /v --找kp(lc resetlogs count ls resetlogs scn) p kcvfhckp -- kscnbas --SCN 0x0010935b -1086299 -- kcrbaseq --日志序列号16进制 0x00000018 24 -- datafile -- kscnbas 最后一次检查点的SCN -- kcvcptim 最后一次检查点的时间 -- kcvfhcpc 检查点计数 -- kcvfhccc --1088311 16进制 109B37 set file 4 map /v p kcvfhckp 4号文件的scn seq 拿出来,将5号文件修改一致 109B37与4号文件scn一直 set file 5 -- 在5号文件里修改 前四后四修改倒换 0x00109b37: 9b37>379b modify /x 379b offset 484 0010> 1000 modify /x 1000 offset 486 0x00000020 0x00000020 =02000000 modify /x 02000000 offset 500 sum apply verify recover datafile 5; alter database open; select count(1) from FGTEST04;开始 后面查询报错 如果要继续使用 一致性参数关闭 删掉表 ``` #Oracle RMAN Recovery Advisor技术 ``` Oracle 11g+推出的Data Recovery Advisor,就是提供给我们一个自动诊断、修复数据库的选择 Data Recovery Advisor(以下简称DRA)是Oracle的一个内置工具,用于进行数据错误、损坏的报告和修复建议 -3.1 准备环境 我们首先在实验前,进行一个完整备份,选择Oracle 19c进行实验,开启归档模式 使用RMAN进行一个全备份 (前面已经备份) ``` #5、Oracle RMAN Recovery Advisor技术 ``` User Oracle 11g+推出的Data RecoveryAdvisor,就是提供给我们一个自动诊断、修复数据库的选择。 Data RecoveryAdvisor(以下简称DRA)是Oracle的一个内置工具,用于进行数据错误、损坏的报告和修复建议。 目前不支持集群 ``` ##5.1、环境 ``` 进行一个完整备份,选择Oracle 19c进行实验,开启归档模式。 ``` ##5.2、控制文件丢失 ``` select * from v$controlfile; shutdown abort rm /oradata/R719CDB/control02.ctl startup 列出所有错误 list failure all; 根据错误号列出具体错误 list failure 102 detail; 给出恢复方案 advise failure; 1 Use a multiplexed copy to restore control file /oradata/R719CDB/control02.ctl Strategy: The repair includes complete media recovery with no data loss Repair script: /oracle/app/oracle/diag/rdbms/r719cdb/r719cdb/hm/reco_3601273568.hm 用1号控制文件复制一个 将脚本内容在rman中执行 alter atabase open; ``` ##5.2、数据文件丢失 ``` 在数据库开启的时候 rm /oradata/R719CDB/undotbs01.dbf alter system checkpoint; --数据库直接挂,启动只能到mount startup list falure all; list failure 185 detail; 查看脚本内容 repair failure preview; 执行脚本 repair failure; ``` #6、Oracle RMAN备份压缩 ``` 压缩时间长、占资源多,占用空间小 不压缩反之 ``` ##6.1、Oracle RMAN备份压缩方法 ###6.1.1、通过调整RMAN参数启用/取消压缩备份功能: ``` 通过调整RMAN参数启用压缩备份功能: CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COMPRESSED BACKUPSET; 使用关键字COMPRESSED启用RMAN压缩备份方法: BACKUP AS COMPRESSED BACKUPSET DATABASE PLUS ARCHIVELOG; 取消RMAN压缩备份方法,去掉COMPRESSED关键字: CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO BACKUPSET; ``` ###6.1.2、直接使用RMAN命令启用备份压缩功能 ``` 以下两条命令实现对整个数据库及归档日志进行压缩备份,以及对1、2和4号数据文件进行压缩备份: BACKUP AS COMPRESSED BACKUPSET DATABASE PLUS ARCHIVELOG; BACKUP AS COMPRESSED BACKUPSET DATAFILE 1,2,4; ``` ##6.2、测试脚本 ``` 1. 具有压缩功能的测试脚本: #!/bin/bash date rman target / <<EOF backup as compressed backupset full database format '/backup/full_bk1_%u%p%s.rmn'; exit; EOF date 2. 不含压缩功能的测试脚本: #!/bin/bash date rman target / <<EOF CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO BACKUPSET; backup full database format '/backup/full_bk1_%u%p%s.rmn'; exit; EOF date ``` #7、Oracle RMAN增量备份与恢复 ``` 想要增量备份快,启用块跟踪 #启用 block change tracking: ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE '/oracle/changetrace/rman_change_track.f'; #查看当前数据库是否启用了 change tracking: SELECT bytes/1024/1024 m, status, filename FROM V$BLOCK_CHANGE_TRACKING; #禁用 change tracking: ALTER DATABASE DISABLE BLOCK CHANGE TRACKING; #重用已存在的 change tracking 文件: ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE '/oracle/changetrace/rman_change_track.f' REUSE; ``` ##7.1、全量备份脚本 ``` run { allocate channel t1 type disk; allocate channel t2 type disk; BACKUP INCREMENTAL LEVEL 0 FILESPERSET 10 FORMAT 'full Orc! %T %S %P' DATABASE; sql 'alter system archive log current'; BACKUP FILESPERSET 10 MAXSETSIZE 10G FORMAT "full orc! %Y%M%D %S %' SKIP INACCESSIBLE ARCHIVELOG ALL DELETE INPUT"; backup format 'full spfile orcl %T %t' spfile; backup format 'full controlfile orcl %T %t' current controlfile; release channel t1; release channel t2; } ``` ##7.2、增量备份脚本 ``` run { allocate channel t1 type disk; allocate channel t2 type disk; BACKUP INCREMENTAL LEVEL 1 FILESPERSET 10 FORMAT 'inc orcl %T %S %P' DATABASE; sql 'alter system archive log current'; BACKUP FILESPERSET 10 MAXSETSIZE 10G FORMAT 'inc orcl %Y%M%D %S %' SKIP INACCESSIBLE ARCHIVELOG ALL DELETE INPUT; backup format 'inc spfile orcl %T %t' spfile; backup format 'inc controlfile orcl %T %t' current controlfile; release channel t1; release channel t2; } ``` ##7.3、根据时间恢复脚本 ``` run { allocate channel t1 type disk; allocate channel t2 type disk; sql 'alter session set NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS"'; sql 'alter session set NLS_LANGUAGE=American'; set until time '2009-11-26 08:42:30'; restore database; recover database; sql 'alter database open resetlogs'; release channel t1; release channel t2; } ``` #8、Oracle RMAN备份的加密 ``` Oracle 的加密方式有三种:透明加密、密码加密、双模式加密。默认情况下,Oracle 会关闭加密功能 RMAN> SHOW ALL; CONFIGURE ENCRYPTION FOR DATABASE OFF; -- default CONFIGURE ENCRYPTION ALGORITHM 'AES128'; -- default 查看加密算法: SELECT ALGORITHM_ID, ALGORITHM_NAME FROM V$RMAN_ENCRYPTION_ALGORITHMS; ``` ##8.1、 透明加密(恢复表空间 FGEDU01) ``` 如果要配置透明加密,可以在 RMAN 下使用 `CONFIGURE` 命令。透明加密也叫钱包加密,它是 RMAN 的默认加密方法。这种方法不需要设置密码,非常适合在本地进行备份和恢复。如果备份不需要传输到其他机器上,建议采用这种加密方法,因为不需要密码,只需要配置加密/解密信任书,也就是 Oracle Encryption Wallet。 1、设置透明加密,确保 Wallet 是打开的: RMAN CONFIGURE ENCRYPTION FOR DATABASE ON; 2、启用加密: RMAN> SET ENCRYPTION ON; 3. 创建一个新目录,并指定为 Wallet 目录: cd $ORACLE_HOME/wallet mkdir -p /oracle/app/oracle/admin/r719cdb/wallet 4. 配置 `sqlnet.ora`(可以不设置): 修改 $ORACLE_HOME/network/admin/sqlnet.ora 文件,在其中添加以下行: WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = /oracle/app/oracle/product/19c/db_1/network/admin) ) ) ENCRYPTION_WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = /oracle/app/oracle/admin/r719cdb/wallet) ) ) 添加完之后,重启 Listener,使参数生效: lsnrctl reload 5. 打开钱包并创建 Wallet: 进入 SQL*Plus 程序,打开钱包并创建 Wallet,包括设置密码、生成信任文件,并启动Wallet。 首先查看`V$ENCRYPTION_WALLET` 确认钱包是否已打开: - Oracle 10g: ALTER SYSTEM SET WALLET OPEN IDENTIFIED BY "FGEDU01"; - Oracle 11g+: ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY "FGEDU01"; 关闭 Wallet: ALTER SYSTEM SET ENCRYPTION WALLET CLOSE IDENTIFIED BY "FGEDU01"; 6. 简单测试: BACKUP AS COMPRESSED BACKUPSET TABLESPACE FGEDU01; 7. 恢复测试: SQL> SHUTDOWN IMMEDIATE; STARTUP MOUNT; RMAN> ALTER SYSTEM SET WALLET OPEN IDENTIFIED BY "FGEDU01"; RESTORE TABLESPACE FGEDU01; RECOVER TABLESPACE FGEDU01; SQL> ALTER DATABASE OPEN; ``` ##8.2、密码加密 ```sql --关闭透明加密 CONFIGURE ENCRYPTION FOR DATABASE ON ALTER SYSTEM SET ENCRYPTION WALLET CLOSE IDENTIFIED BY "FGEDU01"; -- 关闭数据库 SHUTDOWN IMMEDIATE; -- 启动并挂载数据库 STARTUP MOUNT; -- 设置密码加密,并备份指定表空间 RMAN> SET ENCRYPTION ON IDENTIFIED BY "itpux123" ONLY; BACKUP AS COMPRESSED BACKUPSET TABLESPACE fgedu01; -- 打开数据库 RMAN> ALTER DATABASE OPEN; -- 解密 SET DECRYPTION IDENTIFIED BY "itpux123"; -- 恢复指定表空间 RESTORE TABLESPACE fgedu01; RECOVER TABLESPACE fgedu01; ALTER DATABASE OPEN; ``` ##8.3、双模式加密 ``` -- 启用双模式加密 RMAN> CONFIGURE ENCRYPTION FOR DATABASE ON; -- 使用透明加密 RMAN> SET ENCRYPTION ON; -- 使用密码加密 RMAN> SET ENCRYPTION IDENTIFIED BY "itpux12345"; #-- 只使用密码加密 #RMAN> SET ENCRYPTION IDENTIFIED BY "itpux12345" ONLY; -- 执行备份操作 RMAN> BACKUP AS COMPRESSED BACKUPSET DATABASE; -- 恢复数据库 RMAN> SHUTDOWN IMMEDIATE; RMAN> STARTUP MOUNT; RMAN> SET DECRYPTION IDENTIFIED BY "itpux12345"; RMAN> RESTORE DATABASE; RMAN> RECOVER DATABASE; RMAN> ALTER DATABASE OPEN; RMAN> SHUTDOWN IMMEDIATE; ``` #9、Oracle RMAN克隆数据库实战 ``` 通过使用数据库备份,DBA可以在同一服务器或其它服务器上建立副本数据库。 这个副本数据库可以和主数据库有相同的名称(拷贝)或与主数据库名称不同(克隆)。 ORACLE 在数据库拷贝和数据库克隆之间唯一不同的是拷贝的数据库不能更改名称。 RMAN 术语和命令: A.辅助数据库(Auxiliary database): RMAN 将目标数据库复制到该数据库实例。 B.复制(Duplicate): 从其它数据库的RMAN备份创建一个新的数据库。 C.设置新名称(Set newname): 在一个RMAN运行块内为数据文件设置新的名称 D.设置辅助名称(Set auxname): 为数据文件设置辅助名称,这个辅助名称将在RMAN会话之间存在。 E.日志文件(log file): 可以在Duplicate 命令中作为这个关键词,以指定副本数据库创建的联机重做日志文件。 F.不检查文件名(Nocheckfilename): 默认情况下,RMAN将检查在副本主机上被恢复到主目标数据文件路径下的数据文件,以确保不会被错误地覆盖。 使用该选项可以覆盖这个默认的操作。这样就需要手工确保RMAN没有覆盖任何已存在的数据文件。 应当谨慎使用这个命令,以防止覆盖数据文件。 在Duplicate 命令执行的过程中,RMAN执行了一系列工作。当连接到目标、辅助和或 选的目录数据库后,RMAN将进行以下操作: 1)根据最近发生的或者是提供的恢复停止点来决定复制操作将使用哪个基本的备份。 2)根据辅助数据库参数或RMAN设置的命令和选项来决定将数据文件保存在辅助数据库实例的什么位置。 3)为辅助数据库读出备份片或映像拷贝并恢复数据文件 4)根据恢复停止点将任何增量备份应用于还原数据文件。 5)根据恢复停止点从磁盘或备份将所有归档日志文件应用于还原数据文件。 6)为辅助数据库创建新的控制文件。 7)当重新设置联机重做日志文件时,打开副本数据库。新的联机重做日志文件将根据RMAN复制数据库命令中指定的或者根据转换的辅助参数文件进行创建。 Oracle 11g/12c/19c 的 RMAN duplicate 可以通过 Active database duplicate 和 Backup-based duplicate 两种方法实现 RMAN> duplicate database to r719cp from active database nofilenamecheck; ``` ##9.1、copy库 ``` mkdir -p /oradata/r719cp chown -R oracle:dba /oradata/r719cp chmod -R 775 /oradata create pfile from spfile; cd $ORACLE_HOME/dbs cp orapwr719cdb orapwr719cp mv initr719cdb.ora initr719cp.ora --替换库名字及目录 sed -i 's/r719cdb/r719cp/g' initr719cp.ora sed -i 's/R719CDB/r719cp/g' initr719cp.ora --修改sga_target .sga_target=1800m --添加修改数据文件目录 *.db_file_name_convert=('/oradata/R719CDB/,/oradata/r719cp/') --修改日志文件目录 *.log_file_name_convert=('/oradata/R719CDB/','/oradata/r719cp/') --复制口令文件 cp orapwr719cdb orapwr719cp export ORACLE_SID=r719cp sqlplus / as sysdba startup nomount --配置监听 vi $ORACLE_HOME/network/admin/listener.ora SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = r719cp) (ORACLE_HOME = /oracle/app/oracle/product/19c/db_1) ) ) vi $ORACLE_HOME/network/admin/tnsnames.ora r719cp = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.82)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = r719cp) ) ) lsnrctl reload duplicate database to r719cp from active database nofilenamecheck; 验证 ps -ef|grep smon select instance_name,status from v$instance; select NAME from v$datafile; ``` #10、Oracle RMAN异机恢复生产 ``` 生产环境: 192.168.2.82 r719cdb 异机环境: 192.168.2.183 r719cdb 生产库的用户下面itpux表不见了,怀疑人为被删除了,现在需要用备份去恢复下,找出原来的表,再恢复到生产里面去 RMAN 备份异机恢复几点说明: (1)RMAN 异机恢复的时候,db_name必须相同。 (2)如果恢复的路径和源库不一致,就需要在restore时用set命令指定新位置 ``` ##10.1、准备数据 ``` conn fgedu/fgedu; create table fgedu001 (id number(10),name varchar2(10)); insert into fgedu001 values(1,'fgedu01'); insert into fgedu001 values(2,'fgedu02'); insert into fgedu001 values(3,'fgedu03'); insert into fgedu001 values(4,'fgedu04'); insert into fgedu001 values(5,'fgedu05'); commit; alter system switch logfile; alter system checkpoint; rman target / backup tag r719cdbfull format '/backup/full/r719cdb_full_fgzcdb_%s_%p_%t' (database); backup tag r719cdbctl format '/backup/full/r719cdb_ctl_fgzcdb_%s_%p_%t' (current controlfile); backup tag itpux7pfile format '/backup/full/r719cdb_pfile_fgzcdb_%s_%p_%t' (spfile); --查询数据库名称和DBID select name,dbid from v$database; --查询数据 select * from fgedu001 --删除表 drop TABLE fgedu001; --查询当前时间 select sysdate from dual; #2024-03-28 16:29:00 alter system switch logfile; alter system checkpoint; --将备份发送到另一台服务器 scp -r full/ oracle@192.168.2.182:/backup ``` ##10.2、异库 ``` 创建目录,与原库一致 mkdir -p /oradata/R719CDB chown -R oracle:dba /oradata/R719CDB chmod -R 775 /oradata su- oracle mkdir -p /oracle/app/oracle/admin/R719CDB/adump mkdir -p /oracle/app/oracle/admin/R719CDB/dpdump mkdir -p /oracle/app/oracle/admin/R719CDB/pfile mkdir -p /oracle/app/oracle/admin/R719CDB/scripts mkdir -p /backup/full chown -R oracle:dba /oracle/app/oracle/admin/R719CDB chmod 775 /oracle/app/oracle/admin/R719CDB export $ORACLE_SID='R719CDB' rman target / set dbid=3634254220 startup nomount RESTORE spfile from '/backup/full/r719cdb_pfile_fgzcdb_7_1_1164817387'; shutdown immediate startup nomount --检查控制文件是否存在了 show parameter control; --恢复控制文件 restore controlfile from '/backup/full/r719cdb_ctl_fgzcdb_5_1_1164817381'; sql 'alter database mount'; --恢复数据库 restore database; --恢复数据 run { allocate channel t1 type disk; allocate channel t2 type disk; sql 'alter session set NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS"'; sql 'alter session set NLS_LANGUAGE=American'; set until time '2024-03-28 16:29:00'; recover database; sql 'alter database open resetlogs'; release channel t1; release channel t2; } --将提示归档日志copy过来,在执行恢复数据 alter database resetlogs; exp导出 cp源库 imp导入恢复 ``` #11、Oracle RMAN同机迁移数据库从ASM至文件系统 ``` --查询spfile show parameter spfile +DGSYSTEM/O719CDB/PARAMETERFILE/spfile.261.1155562545 --查询数据文件 select file_name from dba_data_files; +DGSYSTEM/O719CDB/DATAFILE/system.256.1155560709 +DGSYSTEM/O719CDB/DATAFILE/sysaux.257.1155560711 +DGSYSTEM/O719CDB/DATAFILE/undotbs1.258.1155560719 +DGSYSTEM/O719CDB/DATAFILE/users.260.1155560733 +DGDATA02/O719CDB/DATAFILE/fgdata02.256.1159531895 --查询日志文件 select MEMBER from v$logfile; +DGDATA01/O719CDB/ONLINELOG/group_1.257.1155560707 +DGDATA01/O719CDB/ONLINELOG/group_2.258.1155560707 +DGDATA01/O719CDB/ONLINELOG/group_3.259.1155560707 --查询控制文件 select name from v$controlfile; +DGDATA01/O719CDB/CONTROLFILE/current.256.1155560707 +DGDATA01/O719CDB/CONTROLFILE/current.260.1159831519 --查询临时文件 select file_name from dba_temp_files; +DGSYSTEM/O719CDB/TEMPFILE/temp.259.1155560725 --查询恢复文件 show parameter recover db_recovery_file_dest string +DGRECOVERY --切换日志文件 alter system SWITCH LOGFILE; --查询spfile show parameter spfile spfile string +DGSYSTEM/O719CDB/PARAMETERFILE/spfile.261.1155562545 --切换日志文件 alter system SWITCH LOGFILE; --备份 backup database format '/backup/o719cdb_%s_%p_%t'; --备份控制文件 alter database backup controlfile to '/backup/o719cdb_control.ctl'; --备份控制文件 alter database backup controlfile to trace as '/backup/o719cdb_control.trc'; mkdir -p /oracle/oradata/o719cp mkdir -p /oracle/arch --创建pfile create pfile='/backup/pfile.ora' from spfile; create SPFILE='$ORACLE_HOME/dbs/spfileo719cdb.ora' from PFIL='/backup/pfile.ora'; SHUTDOWN IMMEDIATE startup MOUNT --修改控制文件参数 show PARAMETER control_files; alter system set control_files='/oracle/oradata/o719cp/control01.ctl','/oracle/oradata/o719cp/control02.ctl' scope=SPFILE; --修改创建位置参数 show parameter db_create ALTER SYSTEM SET db_create_file_dest='/oracle/oradata/o719cp/' SCOPE=BOTH; ALTER SYSTEM SET db_create_online_log_dest_1='/oracle/oradata/o719cp/' SCOPE=BOTH; --修改归档日志位置参数 show parameter RECOVER; alter system set db_recovery_file_dest='/oracle/arch'; SHUTDOWN IMMEDIATE startup NOMOUNT --恢复控制文件 restore CONTROLFILE from '+DGRECOVERY/O719CDB/AUTOBACKUP/2024_03_29/s_1164891001.257.1164891003'; --mount alter database mount; --将备份当到目录下 BACKUP AS COPY DATABASE FORMAT '/oracle/oradata/o719cp/%U'; --将数据库切换到备份的副本 switch database to copy; --恢复数据库 RECOVER database USING backup CONTROLFILE until cancel; 提示sequence #90 --找到日志组 select * from v$log; --找到具体日日志 select * from v$logfile; --输入恢复 +DGDATA01/O719CDB/ONLINELOG/group_3.259.1155560707 --打开数据库 alter database open resetlogs; --临时文件重建在本地 select file_name from dba_temp_files; --删除临时文件 alter database tempfile '+DGSYSTEM/O719CDB/TEMPFILE/temp.259.1155560725' drop INCLUDING datafiles; --添加临时文件 alter database temp add TEMPFILE '/oracle/oradata/o719cp/temp01.dbf' size 200M AUTOEXTEND off; --确认当前重做日志在哪组(1组) select * from v$log; --重做非当前重做日志 alter database drop LOGFILE group 2; alter database add LOGFILE group 2 ('/oracle/oradata/o719cp/redo02.log') size 200m; alter database drop LOGFILE group 3; alter database add LOGFILE group 3 ('/oracle/oradata/o719cp/redo03.log') size 200m; --切换重做日志,重做第一组 alter system switch logfile; alter system CHECKPOINT; alter database drop LOGFILE group 1; alter database add LOGFILE group 1 ('/oracle/oradata/o719cp/redo01.log') size 200m; shutdown IMMEDIATE --关闭asm crsctl stop has; startup ``` #12、Oracle RMAN异机迁移数据库从文件系统至ASM ``` ``` ##12.1、备份原库 ``` --备份参数文件 create pfile='/backup/r719cdb.pfile' from spfile; --准备备份脚本,数据文件大 执行特别慢 nohop挂上脚本查看日志即可 vi r719cdb_rman_full.sh --脚本 rman target / msglog '/backup/r719cdb_rman_full_backup.log' << EOF run { allocate channel d1 type disk; allocate channel d2 type disk; set limit channel d1 kbytes 204800000 maxopenfiles 32 rate 200; set limit channel d2 kbytes 204800000 maxopenfiles 32 rate 200; backup incremental level 0 skip inaccessible tag itpux_level0 filesperset 8 format '/backup/r719cdb_full_%s_%p_%t' (database); release channel d1; release channel d2; allocate channel d3 type disk; backup format '/backup/r719cdb_ctl_%s_%p_%t' current controlfile; release channel d3; allocate channel d4 type disk; copy current controlfile to '/backup/control_r719cdb.ctl'; release channel d4; } exit EOF 执行备份脚本 chmod u+x r719cdb_rman_full.sh nohup ./r719cdb_rman_full.sh & tail -f /backup/o719cdb_rman_full_backup.log scp -r /backup/* 192.168.2.83:/backup scp $ORACLE_HOME/orapwr719cdb 192.168.2.83:$PWD scp /backup/r719cdb.pfile 192.168.2.83:/backup/ ``` ##12.2、新服务器准备 ``` mkdir $ORACLE_BASE/admin/r719cdb/adump 修改参数文件 *.control_files='+DGSYSTEM/R719CDB/control01.ctl','+DGSYSTEM/R719CDB/control02.ctl' *.db_recovery_file_dest='+DGRECOVERY' ``` ##12.3、新库执行 ``` export ORACLE_SID=R719CDB create spfile from pfile='/backup/r719cdb.pfile'; startup nomount; restore controlfile from '/backup/r719cdb_ctl_9_1_1164905417'; alter database mount; --迁移恢复 run { set newname for datafile 1 to '+DGSYSTEM'; set newname for datafile 2 to '+DGSYSTEM'; set newname for datafile 3 to '+DGSYSTEM'; set newname for datafile 4 to '+DGSYSTEM'; set newname for datafile 5 to '+DGSYSTEM'; set newname for tempfile 1 to '+DGSYSTEM'; restore database; switch datafile all; recover database; } 提示 sequence 19,在原库中 v$log 找文件在几号文件 scp redo01.log 192.168.2.83:/backup recover database using backup controlfile until cancel; /backup/redo01.log --修改重做日志 alter database rename file '/oradata/R719CDB/redo01.log' to '+DGSYSTEM'; alter database rename file '/oradata/R719CDB/redo02.log' to '+DGSYSTEM'; alter database rename file '/oradata/R719CDB/redo03.log' to '+DGSYSTEM'; alter database open resetlogs; --重做非当前重做日志(修改路径) select * from v$logfile; alter database drop LOGFILE group 2; alter database add LOGFILE group 2 ('+DGSYSTEM') size 200m; alter database drop LOGFILE group 3; alter database add LOGFILE group 3 ('+DGSYSTEM') size 200m; --切换重做日志,重做当前组 alter system switch logfile; alter system CHECKPOINT; alter database drop LOGFILE group 1; alter database add LOGFILE group 1 ('+DGSYSTEM') size 200m; 临时空间处理 alter tablespace temp add tempfile '+DGSYSTEM' size 200m; alter tablespace temp drop tempfile '/oradata/R719CDB/temp01.dbf'; --参数文件 create pfile from spfile; create spfile='+DGSYSTEM' from pfile='initR719CDB.ora'; shutdown immediate cd $ORACLE_HOME/dbs echo "spfile='+DGSYSTEM/R719CDB/PARAMETERFILE/spfile.273.1164913233'" > initR719CDB.ora startup --加入ASM管理 srvctl add database -db R719CDB -oraclehome /oracle/app/oracle/product/19c/db_1 srvctl MODIFY database -db R719CDB -spfile 'DGSYSTEM/R719CDB/PARAMETERFILE/spfile.273.1164913233' srvctl config database -db r719cDB shutdown immediate srvctl start database -d R719CDB 将原库tnsnames.ora配置到新服务器上 ```
上一篇:
3、静默安装
下一篇:
判断题
0
赞
46 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网