上一篇【第24篇】Oracle数据字典与动态性能视图详解
下一篇明日更新,敬请期待
摘要
备份与恢复是Oracle数据库管理的核心任务,关系到数据的安全性和业务的连续性。本文详细讲解Oracle备份的分类(物理备份与逻辑备份)、RMAN(Recovery Manager)的使用、冷备份与热备份的操作流程、不完全恢复与完全恢复的场景,以及RMAN实战脚本,帮助DBA构建可靠的备份恢复体系。
一、备份与恢复概述
1.1 为什么需要备份
- 硬件故障:磁盘损坏、服务器故障
- 人为错误:误删除表、错误更新数据
- 软件故障:Oracle Bug、操作系统崩溃
- 灾难恢复:火灾、地震等不可抗力
- 数据迁移:数据库迁移、升级
1.2 备份类型分类
Oracle备份 ├── 物理备份(Physical Backup) │ ├── 冷备份(Consistent Backup / Offline Backup) │ └── 热备份(Hot Backup / Online Backup) │ ├── RMAN备份(推荐) │ └── 用户管理备份(User-Managed Backup) └── 逻辑备份(Logical Backup) ├── EXP/IMP(经典工具) └── EXPDP/IMPDP(数据泵,推荐)二、冷备份(Consistent Backup)
2.1 冷备份概述
冷备份是在数据库完全关闭状态下进行的备份,也称为一致性备份。
优点:
- 操作简单
- 备份文件一致
- 恢复速度快
缺点:
- 需要关闭数据库(业务中断)
- 只适用于可停机环境
2.2 冷备份步骤
-- 步骤1:关闭数据库SHUTDOWNIMMEDIATE;-- 步骤2:在操作系统中复制所有数据文件、控制文件、重做日志文件-- cp /u01/oradata/testdb/*.dbf /backup/-- cp /u01/oradata/testdb/*.ctl /backup/-- cp /u01/oradata/testdb/*.log /backup/-- 步骤3:备份参数文件-- cp $ORACLE_HOME/dbs/spfiletestdb.ora /backup/-- 步骤4:启动数据库STARTUP;2.3 冷备份脚本
#!/bin/bash# cold_backup.sh - Oracle冷备份脚本exportORACLE_SID=testdbexportORACLE_HOME=/u01/oracle/product/11.2.0/dbhome_1exportPATH=$ORACLE_HOME/bin:$PATHBACKUP_DIR=/backup/cold/$ORACLE_SID/$(date+%Y%m%d)mkdir-p$BACKUP_DIRecho"=== 关闭数据库 ==="sqlplus / as sysdba<<EOF SHUTDOWN IMMEDIATE; EXIT; EOFecho"=== 复制数据文件 ==="cp/u01/oradata/$ORACLE_SID/*.dbf$BACKUP_DIR/echo"=== 复制控制文件 ==="cp/u01/oradata/$ORACLE_SID/*.ctl$BACKUP_DIR/echo"=== 复制重做日志 ==="cp/u01/oradata/$ORACLE_SID/*.log$BACKUP_DIR/echo"=== 备份参数文件 ==="cp$ORACLE_HOME/dbs/spfile$ORACLE_SID.ora$BACKUP_DIR/echo"=== 启动数据库 ==="sqlplus / as sysdba<<EOF STARTUP; EXIT; EOFecho"=== 冷备份完成 ==="三、热备份(Hot Backup / Online Backup)
3.1 热备份概述
热备份是在数据库运行期间进行的备份,需要数据库运行在**归档模式(ARCHIVELOG)**下。
优点:
- 不需要关闭数据库(业务不中断)
- 支持时间点恢复
缺点:
- 操作复杂
- 会产生额外的重做日志归档
- 恢复时间较长
3.2 用户管理的热备份
-- 步骤1:检查数据库是否在归档模式SELECTlog_modeFROMv$database;-- 如果不是ARCHIVELOG,需要先切换到归档模式-- 步骤2:开始备份表空间ALTERTABLESPACEusers_dataBEGINBACKUP;-- 步骤3:在操作系统中复制数据文件-- cp /u01/oradata/testdb/users01.dbf /backup/-- 步骤4:结束备份ALTERTABLESPACEusers_dataENDBACKUP;-- 步骤5:备份归档日志-- cp /u03/archive/testdb/*.arc /backup/archive/-- 步骤6:备份控制文件ALTERDATABASEBACKUPCONTROLFILETO'/backup/control.bkp';3.3 查看备份状态
-- 查看哪些表空间处于备份模式SELECT*FROMv$backup;-- 查看数据文件头部的检查点信息SELECTfile#, status, checkpoint_change# FROM v$datafile_header;四、RMAN(Recovery Manager)备份
4.1 RMAN概述
RMAN是Oracle提供的专用备份恢复工具,支持增量备份、压缩备份、加密备份等高级功能。
RMAN优点:
- 自动管理备份集
- 支持增量备份
- 支持块级别的恢复
- 集成Catalog目录(可选)
4.2 RMAN基本命令
# 启动RMANrman target /# 查看RMAN配置RMAN>SHOW ALL;# 配置备份集保留策略(保留7天)RMAN>CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF7DAYS;# 配置备份集冗余度(保留2份)RMAN>CONFIGURE RETENTION POLICY TO REDUNDANCY2;# 配置控制文件自动备份RMAN>CONFIGURE CONTROLFILE AUTOBACKUP ON;# 配置备份集压缩RMAN>CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COMPRESSED BACKUPSET;4.3 RMAN全库备份
# 全库备份(包括数据文件、控制文件、SPFILE)rman target /<<EOF RUN { ALLOCATE CHANNEL ch1 DEVICE TYPE DISK FORMAT '/backup/rman/%U'; BACKUP DATABASE PLUS ARCHIVELOG; RELEASE CHANNEL ch1; } EOF4.4 RMAN增量备份
# 增量备份级别0(全量基础备份)rman target /<<EOF BACKUP INCREMENTAL LEVEL 0 DATABASE; EOF# 增量备份级别1(差异备份,默认)rman target /<<EOF BACKUP INCREMENTAL LEVEL 1 DATABASE; EOF# 增量备份级别1(累积备份)rman target /<<EOF BACKUP INCREMENTAL LEVEL 1 CUMULATIVE DATABASE; EOF4.5 RMAN表空间备份
# 备份单个表空间rman target /<<EOF BACKUP TABLESPACE users_data; EOF# 备份多个表空间rman target /<<EOF BACKUP TABLESPACE users_data, users_index; EOF4.6 RMAN归档日志备份
# 备份归档日志rman target /<<EOF BACKUP ARCHIVELOG ALL; EOF# 备份归档日志并删除已备份的归档rman target /<<EOF BACKUP ARCHIVELOG ALL DELETE INPUT; EOF五、RMAN恢复
5.1 完全恢复(Complete Recovery)
完全恢复将数据库恢复到最近一次提交的事务。
# 恢复整个数据库rman target /<<EOF STARTUP FORCE MOUNT; RESTORE DATABASE; RECOVER DATABASE; ALTER DATABASE OPEN; EOF# 恢复表空间rman target /<<EOF SQL 'ALTER TABLESPACE users_data OFFLINE'; RESTORE TABLESPACE users_data; RECOVER TABLESPACE users_data; SQL 'ALTER TABLESPACE users_data ONLINE'; EOF5.2 不完全恢复(Incomplete Recovery)
不完全恢复将数据库恢复到指定的时间点或SCN。
# 基于时间点的恢复(Time-Based Recovery)rman target /<<EOF STARTUP FORCE MOUNT; RUN { SET UNTIL TIME "TO_DATE('2024-01-15 10:30:00', 'YYYY-MM-DD HH24:MI:SS')"; RESTORE DATABASE; RECOVER DATABASE; } ALTER DATABASE OPEN RESETLOGS; EOF# 基于SCN的恢复(SCN-Based Recovery)rman target /<<EOF STARTUP FORCE MOUNT; RUN { SET UNTIL SCN 1234567; RESTORE DATABASE; RECOVER DATABASE; } ALTER DATABASE OPEN RESETLOGS; EOF# 基于日志序列号的恢复(Sequence-Based Recovery)rman target /<<EOF STARTUP FORCE MOUNT; RUN { SET UNTIL SEQUENCE 100 THREAD 1; RESTORE DATABASE; RECOVER DATABASE; } ALTER DATABASE OPEN RESETLOGS; EOF六、逻辑备份(EXPDP/IMPDP)
6.1 数据泵(Data Pump)概述
数据泵是Oracle 10g引入的逻辑备份工具,替代传统的EXP/IMP。
优点:
- 速度快(并行、直接路径)
- 支持断点续传
- 支持远程导出/导入
- 支持表空间传输
6.2 创建数据泵目录
-- 创建目录对象CREATEORREPLACEDIRECTORY dpump_dirAS'/backup/datapump';-- 授予目录权限GRANTREAD,WRITEONDIRECTORY dpump_dirTOscott;GRANTDATAPUMP_EXP FULL_DATABASETOsystem;GRANTDATAPUMP_IMP FULL_DATABASETOsystem;6.3 EXPDP导出
# 导出整个数据库expdp system/passwordFULL=yDIRECTORY=dpump_dirDUMPFILE=full_%U.dmpLOGFILE=full_exp.logPARALLEL=4FILESIZE=2G# 导出指定用户expdp system/passwordSCHEMAS=scottDIRECTORY=dpump_dirDUMPFILE=scott_%U.dmpLOGFILE=scott_exp.log# 导出指定表expdp system/passwordTABLES=scott.emp,scott.deptDIRECTORY=dpump_dirDUMPFILE=tables_%U.dmpLOGFILE=tables_exp.log# 导出时排除某些对象expdp system/passwordSCHEMAS=scottDIRECTORY=dpump_dirDUMPFILE=scott_nodata.dmpLOGFILE=scott_exp.logEXCLUDE=TABLE6.4 IMPDP导入
# 导入整个数据库impdp system/passwordFULL=yDIRECTORY=dpump_dirDUMPFILE=full_%U.dmpLOGFILE=full_imp.log# 导入指定用户impdp system/passwordSCHEMAS=scottDIRECTORY=dpump_dirDUMPFILE=scott_%U.dmpLOGFILE=scott_imp.log# 导入时重映射用户(从scott导入到app_user)impdp system/passwordDIRECTORY=dpump_dirDUMPFILE=scott_%U.dmpREMAP_SCHEMA=scott:app_userLOGFILE=remap_imp.log# 导入时重映射表空间impdp system/passwordDIRECTORY=dpump_dirDUMPFILE=scott_%U.dmpREMAP_TABLESPACE=users_data:new_data_tsLOGFILE=remap_ts_imp.log七、RMAN实战脚本
7.1 每日全备脚本
#!/bin/bash# daily_rman_backup.sh - RMAN每日全备脚本exportORACLE_SID=testdbexportORACLE_HOME=/u01/oracle/product/11.2.0/dbhome_1exportPATH=$ORACLE_HOME/bin:$PATHBACKUP_DATE=$(date+%Y%m%d)LOG_FILE=/backup/rman/log/${BACKUP_DATE}_full.log rman target /<<EOF>$LOG_FILE2>&1RUN { ALLOCATE CHANNEL ch1 DEVICE TYPE DISK FORMAT '/backup/rman/%U'; BACKUP AS COMPRESSED BACKUPSET DATABASE PLUS ARCHIVELOG; DELETE NOPROMPT OBSOLETE; RELEASE CHANNEL ch1; } EXIT; EOF# 检查RMAN执行结果ifgrep-q"RMAN-"$LOG_FILE;thenecho"RMAN备份失败,请检查日志:$LOG_FILE"exit1elseecho"RMAN备份成功:$LOG_FILE"fi7.2 增量备份脚本
#!/bin/bash# incremental_backup.sh - RMAN增量备份脚本exportORACLE_SID=testdbexportORACLE_HOME=/u01/oracle/product/11.2.0/dbhome_1BACKUP_DATE=$(date+%Y%m%d)DAY_OF_WEEK=$(date+%u)# 1=Monday, 7=Sundayif[$DAY_OF_WEEK-eq7];then# 周日:级别0备份BACKUP_TYPE="INCREMENTAL LEVEL 0"echo"执行级别0增量备份..."else# 其他日子:级别1差异备份BACKUP_TYPE="INCREMENTAL LEVEL 1"echo"执行级别1增量备份..."firman target /<<EOF RUN { ALLOCATE CHANNEL ch1 DEVICE TYPE DISK FORMAT '/backup/rman/%U'; BACKUP$BACKUP_TYPEDATABASE; BACKUP ARCHIVELOG ALL DELETE INPUT; DELETE NOPROMPT OBSOLETE; RELEASE CHANNEL ch1; } EOF八、恢复场景演练
8.1 场景1:误删除表
-- 如果开启了回收站功能-- 查看回收站SELECTobject_name,original_name,type,droptimeFROMuser_recyclebin;-- 闪回删除的表FLASHBACKTABLEempTOBEFOREDROP;-- 如果未开启回收站或已清空回收站-- 使用RMAN进行时间点恢复(参见5.2节)8.2 场景2:数据文件损坏
# 步骤1:将数据文件脱机sqlplus / as sysdba<<EOF ALTER DATABASE DATAFILE '/u01/oradata/testdb/users01.dbf' OFFLINE; EOF# 步骤2:使用RMAN还原数据文件rman target /<<EOF RESTORE DATAFILE '/u01/oradata/testdb/users01.dbf'; RECOVER DATAFILE '/u01/oradata/testdb/users01.dbf'; EOF# 步骤3:将数据文件联机sqlplus / as sysdba<<EOF ALTER DATABASE DATAFILE '/u01/oradata/testdb/users01.dbf' ONLINE; EOF8.3 场景3:控制文件损坏
# 如果有控制文件多路复用,复制完好的控制文件覆盖损坏的--cp/u02/oradata/testdb/control02.ctl /u01/oradata/testdb/control01.ctl# 如果所有控制文件都损坏,需要使用RMAN还原rman target /<<EOF STARTUP FORCE NOMOUNT; RESTORE CONTROLFILE FROM AUTOBACKUP; ALTER DATABASE MOUNT; RECOVER DATABASE; ALTER DATABASE OPEN RESETLOGS; EOF九、最佳实践
9.1 备份策略设计
- 生产环境必须使用归档模式
- RMAN备份为主,数据泵备份为辅
- 每日全备 + 归档日志备份
- 保留多份备份:本地 + 异地 + 磁带库
- 定期演练恢复:确保备份可用
9.2 备份监控
-- 查看RMAN备份历史SELECTsession_key,input_type,status,start_time,end_timeFROMv$rman_backup_job_detailsORDERBYstart_timeDESC;-- 查看备份集信息SELECTbs_key,backup_type,status,start_time,end_timeFROMv$backup_set_detailsORDERBYstart_timeDESC;9.3 备份检查清单
# 1. 检查数据库是否在归档模式sqlplus / as sysdba<<EOF SELECT log_mode FROM v$database; EOF# 2. 检查RMAN备份是否成功grep"RMAN-"/backup/rman/log/*.log# 3. 检查备份集是否完整rman target /<<EOF CROSSCHECK BACKUP; DELETE EXPIRED BACKUP; EOF# 4. 检查回收站是否开启sqlplus / as sysdba<<EOF SHOW PARAMETER recyclebin; EOF十、总结
Oracle备份与恢复的核心要点:
- 备份类型:冷备份(一致性)、热备份(归档模式下)、RMAN备份、数据泵备份
- RMAN备份:全备、增量备份、归档日志备份
- RMAN恢复:完全恢复、不完全恢复(时间点/SCN/日志序列号)
- 逻辑备份:EXPDP/IMPDP数据泵工具
- 恢复场景:误删表、数据文件损坏、控制文件损坏
- 最佳实践:归档模式、备份策略、定期演练、多地备份
上一篇【第24篇】Oracle数据字典与动态性能视图详解
下一篇明日更新,敬请期待
参考资料
- 《Oracle 11g数据库管理员指南》— 刘宪军著
- Oracle官方文档:Database Backup and Recovery User’s Guide
- Oracle官方文档:Database Utilities - Data Pump Export/Import