上一篇【第39篇】Oracle数据库恢复技术详解下一篇【第41篇】Oracle OMF——自动文件管理详解摘要随着Oracle数据库规模的增长DBA需要掌握超越基础备份恢复的高级技术RMAN的块介质恢复Block Media Recovery用于修复单个损坏的数据块而无需恢复整个数据文件可传输表空间Transportable Tablespace实现跨平台、跨版本的高效数据移植以及RMAN Catalog恢复目录为大型多数据库环境提供集中式备份管理。本文结合实战场景讲解这些高级特性的配置与使用。一、块介质恢复Block Media Recovery1.1 概述传统的数据文件恢复需要将整个数据文件下线还原整个文件再应用归档日志。当数据文件很大数百GB而只有少数几个块损坏时这种方式效率极低。**块介质恢复BMR**直接修复损坏的数据块数据文件保持在线其他用户不受影响。前提数据库运行在归档模式有包含损坏前数据的 RMAN 备份1.2 检测坏块-- 方法1通过查询/DML 发现坏块报错-- ORA-01578: ORACLE data block corrupted (file # 4, block # 1234)-- 方法2使用 RMAN 主动验证rman target /EOF -- 验证整个数据库检测坏块 VALIDATE DATABASE; -- 验证特定数据文件 VALIDATE DATAFILE /u01/oradata/testdb/users01.dbf; -- 验证特定表空间 VALIDATE TABLESPACE users_data; -- 查看坏块列表 SELECT * FROM v$database_block_corruption; EXIT; EOF-- 查看坏块信息SELECTfile#, block#, blocks, corruption_type, corruption_change#FROMv$database_block_corruption;1.3 块介质恢复操作# 方法1自动修复 V$DATABASE_BLOCK_CORRUPTION 中所有坏块rman target /EOF BLOCKRECOVER CORRUPTION LIST; EXIT; EOF# 方法2修复指定的块file# 4 的 block# 1234 和 1235rman target /EOF BLOCKRECOVER DATAFILE 4 BLOCK 1234, 1235; EXIT; EOF# 方法3通过文件路径指定rman target /EOF BLOCKRECOVER DATAFILE /u01/oradata/testdb/users01.dbf BLOCK 1234; EXIT; EOF1.4 验证块已修复-- 修复后V$DATABASE_BLOCK_CORRUPTION 应该为空SELECTCOUNT(*)FROMv$database_block_corruption;-- 再次验证相关数据文件rman target /EOF VALIDATE DATAFILE 4; EXIT; EOF二、RMAN 恢复目录Recovery Catalog2.1 恢复目录的作用默认情况下RMAN 将备份信息存储在目标数据库的控制文件中。控制文件大小有限备份历史受限。恢复目录将备份元数据存储在独立的数据库中提供集中管理多个数据库的备份记录更长的备份历史存储 RMAN 脚本Script即使目标数据库完全损毁元数据仍安全保存2.2 创建恢复目录-- 在专用的 catalog 数据库中执行-- 步骤1创建 catalog 用户CREATEUSERrman_cat IDENTIFIEDBYRmanCatalog2024DEFAULTTABLESPACEcatalog_tsTEMPORARYTABLESPACEtempQUOTA UNLIMITEDONcatalog_ts;-- 步骤2授予恢复目录所需权限GRANTCREATESESSION,RECOVERY_CATALOG_OWNERTOrman_cat;# 步骤3连接到 catalog 数据库创建目录rman catalog rman_cat/RmanCatalog2024catalog_dbEOF CREATE CATALOG TABLESPACE catalog_ts; EXIT; EOF# 步骤4注册目标数据库rman target / catalog rman_cat/RmanCatalog2024catalog_dbEOF REGISTER DATABASE; EXIT; EOF2.3 使用 RMAN 脚本恢复目录允许存储和复用 RMAN 脚本rman target / catalog rman_cat/RmanCatalog2024catalog_dbEOF -- 创建并存储 RMAN 脚本 CREATE SCRIPT full_backup { ALLOCATE CHANNEL c1 DEVICE TYPE DISK FORMAT /backup/rman/%U; ALLOCATE CHANNEL c2 DEVICE TYPE DISK FORMAT /backup/rman/%U; BACKUP AS COMPRESSED BACKUPSET DATABASE PLUS ARCHIVELOG DELETE INPUT; DELETE NOPROMPT OBSOLETE; } -- 执行存储的脚本 EXECUTE SCRIPT full_backup; -- 列出所有脚本 LIST SCRIPT NAMES; -- 查看脚本内容 PRINT SCRIPT full_backup; -- 删除脚本 DELETE SCRIPT full_backup; EXIT; EOF三、可传输表空间Transportable Tablespace3.1 概述可传输表空间TTS将一个或多个表空间的数据文件连同元数据一起从源数据库迁移到目标数据库是Oracle最快的大数据量迁移方式复制文件 导入元数据无需 INSERT/SELECT。适用场景跨数据库迁移大型表空间将数仓的历史分区迁移到归档库跨平台数据移植需同字节序平台或使用 RMAN Convert3.2 可传输表空间操作流程源数据库操作 1. 检查表空间是否自包含 2. 将表空间设为只读 3. EXPDP 导出元数据 4. 复制数据文件到目标 5. 将表空间改回读写 目标数据库操作 6. IMPDP 导入元数据附加数据文件步骤1检查自包含性-- 在源数据库执行EXECUTEDBMS_TTS.TRANSPORT_SET_CHECK(ts_listUSERS_DATA, USERS_INDEX,-- 要迁移的表空间列表incl_constraintsTRUE);-- 查看违规无输出表示自包含SELECT*FROMtransport_set_violations;步骤2设置只读-- 源数据库ALTERTABLESPACEusers_dataREADONLY;ALTERTABLESPACEusers_indexREADONLY;步骤3导出元数据# 只导出元数据不导出数据数据在数据文件中expdp system/password\TRANSPORT_TABLESPACESusers_data,users_index\DIRECTORYdp_dir\DUMPFILEts_meta.dmp\LOGFILEts_exp.log步骤4复制数据文件# 复制数据文件到目标服务器scp/u01/oradata/testdb/users01.dbf targethost:/u01/oradata/newdb/scp/u01/oradata/testdb/users_idx01.dbf targethost:/u01/oradata/newdb/# 同时复制 dump 文件scp/backup/datapump/ts_meta.dmp targethost:/backup/datapump/步骤5恢复源数据库表空间读写-- 源数据库ALTERTABLESPACEusers_dataREADWRITE;ALTERTABLESPACEusers_indexREADWRITE;步骤6目标数据库导入# 在目标数据库导入元数据指定数据文件新路径impdp system/password\DIRECTORYdp_dir\DUMPFILEts_meta.dmp\LOGFILEts_imp.log\TRANSPORT_DATAFILES/u01/oradata/newdb/users01.dbf,/u01/oradata/newdb/users_idx01.dbf四、跨平台可传输表空间使用RMAN转换当源和目标平台的字节序Endian不同时如从 Solaris SPARC 迁移到 Linux x86需要使用 RMAN 进行数据文件的字节序转换。# 查看平台字节序信息rman target /EOF SELECT platform_id, platform_name, endian_format FROM v$transportable_platform ORDER BY platform_name; EXIT; EOF# 在源库上转换数据文件格式rman target /EOF CONVERT TABLESPACE users_data TO PLATFORM Linux x86 64-bit FORMAT /backup/converted/%N_%f.dbf; EXIT; EOF五、数据库克隆DUPLICATERMAN 的 DUPLICATE 命令可以从备份中快速克隆一个新数据库常用于搭建测试/开发环境从生产备份恢复到另一台服务器# 连接到辅助数据库目标库rman target sys/passwordprimary_db auxiliary sys/passwordauxiliary_dbEOF DUPLICATE TARGET DATABASE TO aux_db FROM ACTIVE DATABASE -- 直接从活跃数据库克隆不需要备份 SPFILE PARAMETER_VALUE_CONVERT /u01/oradata/primary, /u02/oradata/aux_db SET DB_NAMEAUX_DB SET DB_UNIQUE_NAMEAUX_DB SET CONTROL_FILES/u02/oradata/aux_db/control01.ctl NOFILENAMECHECK; EXIT; EOF六、高级恢复特性总结对比特性适用场景停机数据丢失风险完全恢复数据文件/表空间损坏是表空间级无不完全恢复误操作回到历史点整库停机有恢复点之后块介质恢复少量数据块损坏无在线修复无Flashback Database逻辑错误快速回滚MOUNT状态有闪回点之后可传输表空间大数据量迁移表空间只读无DUPLICATE搭建测试库不影响生产无七、最佳实践定期使用 VALIDATE 主动发现坏块不要等到查询报错才知道有坏块BMR 适合大型数据文件的零星坏块避免恢复整个数据文件多数据库环境必须部署 RMAN Catalog集中管理备份信息TTS 是大规模迁移的首选比数据泵导入快10~100倍DUPLICATE 应该成为搭建测试库的标准流程保证测试环境与生产同步八、总结Oracle高级备份恢复的核心要点块介质恢复精准修复单个坏块在线操作不影响其他用户RMAN Catalog集中管理多库备份保存RMAN脚本提供更长历史可传输表空间最快的大数据量迁移方式复制文件导入元数据跨平台迁移不同字节序平台需 RMAN CONVERT 转换DUPLICATE从备份或活跃数据库快速克隆新数据库上一篇【第39篇】Oracle数据库恢复技术详解下一篇【第41篇】Oracle OMF——自动文件管理详解参考资料《Oracle 11g数据库管理员指南》— 刘宪军著Oracle官方文档Database Backup and Recovery User’s Guide - Advanced Recovery TechniquesOracle官方文档Database Backup and Recovery User’s Guide - Transportable Tablespaces