【Oracle】数据备份与恢复
个人主页:Guiat
归属专栏:Oracle
文章目录
- 1. Oracle备份恢复概述
- 1.1 为什么备份这么重要?
- 1.2 Oracle备份策略全景图
- 2. 物理备份详解
- 2.1 冷备份 - 最简单粗暴的方式
- 2.1.1 冷备份的步骤
- 2.1.2 冷备份恢复过程
- 2.2 热备份 - 不停机的备份艺术
- 2.2.1 启用归档模式
- 2.2.2 表空间级热备份
- 2.3 RMAN - Oracle的备份神器
- 2.3.1 RMAN基础配置
- 2.3.2 完整数据库备份
- 2.3.3 RMAN备份脚本示例
- 2.3.4 RMAN备份策略图
- 3. 逻辑备份详解
- 3.1 Data Pump - 现代逻辑备份利器
- 3.1.1 创建Directory对象
- 3.1.2 使用expdp进行导出
- 3.1.3 使用impdp进行导入
- 3.1.4 Data Pump监控和管理
- 3.2 传统Export/Import工具
- 3.2.1 Export导出示例
- 3.2.2 Import导入示例
- 4. 数据恢复策略
- 4.1 恢复场景分类
- 4.2 使用RMAN进行恢复
- 4.2.1 完整数据库恢复
- 4.2.2 单个数据文件恢复
- 4.2.3 基于时间点的恢复
- 4.2.4 表空间时间点恢复(TSPITR)
- 4.3 控制文件恢复
- 4.3.1 从自动备份恢复控制文件
- 4.3.2 从指定备份恢复控制文件
- 5. 高级备份恢复技术
- 5.1 闪回技术
- 5.1.1 闪回查询
- 5.1.2 闪回表
- 5.1.3 闪回删除(回收站)
- 5.1.4 闪回数据库
- 5.2 Oracle Data Guard
- 5.2.1 Data Guard架构
- 5.2.2 创建物理备用数据库
- 5.3 零数据丢失恢复设备(ZDLRA)
- 6. 备份恢复最佳实践
- 6.1 备份策略设计原则
- 6.2 3-2-1备份规则
- 6.2.1 实现3-2-1规则的脚本
正文
1. Oracle备份恢复概述
Oracle数据库的备份与恢复就像给你的数据上了一道保险,万一出现意外情况,你总能有个可靠的退路。无论是硬件故障、人为误操作,还是自然灾害,备份都是你最后的救命稻草。
1.1 为什么备份这么重要?
数据库备份不仅仅是为了防范灾难,更是为了:
- 保护企业的核心数据资产
- 满足法律法规和合规性要求
- 确保业务连续性不中断
- 提供测试和开发环境的数据源
- 支持历史数据的归档需求
1.2 Oracle备份策略全景图
Oracle提供了多种备份方式,每种都有自己的特点和适用场景:
2. 物理备份详解
2.1 冷备份 - 最简单粗暴的方式
冷备份就是把数据库完全关闭,然后把所有相关文件都拷贝一份。虽然简单,但是对业务影响比较大。
2.1.1 冷备份的步骤
-- 1. 首先查看数据库当前状态
SELECT name, open_mode FROM v$database;-- 2. 查看数据文件位置
SELECT file_name, tablespace_name FROM dba_data_files
UNION ALL
SELECT file_name, tablespace_name FROM dba_temp_files;-- 3. 查看控制文件位置
SELECT name FROM v$controlfile;-- 4. 查看日志文件位置
SELECT member FROM v$logfile;-- 5. 正常关闭数据库
SHUTDOWN IMMEDIATE;
关闭数据库后,在操作系统层面进行文件拷贝:
#!/bin/bash
# 冷备份脚本示例# 设置备份目录
BACKUP_DIR="/backup/cold_backup_$(date +%Y%m%d_%H%M%S)"
mkdir -p $BACKUP_DIR# 备份数据文件
cp /u01/oradata/ORCL/*.dbf $BACKUP_DIR/
cp /u01/oradata/ORCL/temp01.dbf $BACKUP_DIR/# 备份控制文件
cp /u01/oradata/ORCL/control*.ctl $BACKUP_DIR/# 备份日志文件
cp /u01/oradata/ORCL/redo*.log $BACKUP_DIR/# 备份参数文件
cp $ORACLE_HOME/dbs/spfileORCL.ora $BACKUP_DIR/
cp $ORACLE_HOME/dbs/initORCL.ora $BACKUP_DIR/# 备份密码文件
cp $ORACLE_HOME/dbs/orapwORCL $BACKUP_DIR/echo "冷备份完成,备份位置:$BACKUP_DIR"
2.1.2 冷备份恢复过程
#!/bin/bash
# 冷恢复脚本示例# 停止数据库
sqlplus / as sysdba << EOF
SHUTDOWN ABORT;
EXIT;
EOF# 恢复所有文件
BACKUP_DIR="/backup/cold_backup_20241201_140000"
cp $BACKUP_DIR/*.dbf /u01/oradata/ORCL/
cp $BACKUP_DIR/control*.ctl /u01/oradata/ORCL/
cp $BACKUP_DIR/redo*.log /u01/oradata/ORCL/
cp $BACKUP_DIR/spfileORCL.ora $ORACLE_HOME/dbs/
cp $BACKUP_DIR/orapwORCL $ORACLE_HOME/dbs/# 启动数据库
sqlplus / as sysdba << EOF
STARTUP;
EXIT;
EOF
2.2 热备份 - 不停机的备份艺术
热备份允许在数据库运行时进行备份,但有个前提条件:数据库必须运行在归档模式下。
2.2.1 启用归档模式
-- 检查当前归档模式
SELECT log_mode FROM v$database;-- 如果不是归档模式,需要先设置
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;-- 验证归档模式
SELECT log_mode FROM v$database;
SELECT name, log_mode FROM v$database;
2.2.2 表空间级热备份
-- 开始备份特定表空间
ALTER TABLESPACE USERS BEGIN BACKUP;-- 在操作系统层面拷贝数据文件
-- cp /u01/oradata/ORCL/users01.dbf /backup/hot_backup/-- 结束备份模式
ALTER TABLESPACE USERS END BACKUP;-- 强制日志切换,确保备份一致性
ALTER SYSTEM SWITCH LOGFILE;
完整的热备份脚本:
-- 创建热备份存储过程
CREATE OR REPLACE PROCEDURE hot_backup_all_tablespaces ASCURSOR c_tablespaces ISSELECT tablespace_name FROM dba_tablespaces WHERE status = 'ONLINE' AND contents != 'TEMPORARY';v_backup_dir VARCHAR2(200) := '/backup/hot_backup_' || TO_CHAR(SYSDATE, 'YYYYMMDD_HH24MISS');v_sql VARCHAR2(4000);
BEGIN-- 创建备份目录DBMS_OUTPUT.PUT_LINE('开始热备份到目录: ' || v_backup_dir);FOR ts IN c_tablespaces LOOPBEGIN-- 开始表空间备份EXECUTE IMMEDIATE 'ALTER TABLESPACE ' || ts.tablespace_name || ' BEGIN BACKUP';DBMS_OUTPUT.PUT_LINE('开始备份表空间: ' || ts.tablespace_name);-- 这里应该调用操作系统命令拷贝文件-- 实际环境中需要结合shell脚本-- 结束表空间备份EXECUTE IMMEDIATE 'ALTER TABLESPACE ' || ts.tablespace_name || ' END BACKUP';DBMS_OUTPUT.PUT_LINE('完成备份表空间: ' || ts.tablespace_name);EXCEPTIONWHEN OTHERS THEN-- 确保即使出错也要结束备份模式BEGINEXECUTE IMMEDIATE 'ALTER TABLESPACE ' || ts.tablespace_name || ' END BACKUP';EXCEPTIONWHEN OTHERS THEN NULL;END;RAISE;END;END LOOP;-- 备份控制文件EXECUTE IMMEDIATE 'ALTER DATABASE BACKUP CONTROLFILE TO ''' || v_backup_dir || '/control_backup.ctl''';-- 强制日志切换EXECUTE IMMEDIATE 'ALTER SYSTEM SWITCH LOGFILE';DBMS_OUTPUT.PUT_LINE('热备份完成!');
END;
/
2.3 RMAN - Oracle的备份神器
RMAN(Recovery Manager)是Oracle官方推荐的备份恢复工具,功能强大且易于管理。
2.3.1 RMAN基础配置
-- 连接到RMAN
$ rman target /-- 查看RMAN配置
RMAN> SHOW ALL;-- 配置备份保留策略
RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;-- 配置备份优化
RMAN> CONFIGURE BACKUP OPTIMIZATION ON;-- 配置控制文件自动备份
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;-- 设置备份存储位置
RMAN> CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/backup/rman/%U';
2.3.2 完整数据库备份
-- 完整数据库备份
RMAN> BACKUP DATABASE PLUS ARCHIVELOG;-- 带压缩的完整备份
RMAN> BACKUP AS COMPRESSED BACKUPSET DATABASE PLUS ARCHIVELOG;-- 增量备份(0级,相当于完整备份)
RMAN> BACKUP INCREMENTAL LEVEL 0 DATABASE;-- 增量备份(1级,只备份变化的块)
RMAN> BACKUP INCREMENTAL LEVEL 1 DATABASE;
2.3.3 RMAN备份脚本示例
#!/bin/bash
# RMAN备份自动化脚本# 设置环境变量
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export ORACLE_SID=ORCL
export PATH=$ORACLE_HOME/bin:$PATH# 设置备份目录
BACKUP_DIR=/backup/rman/$(date +%Y%m%d)
mkdir -p $BACKUP_DIR# 执行备份
rman target / << EOF
RUN {ALLOCATE CHANNEL ch1 DEVICE TYPE DISK FORMAT '$BACKUP_DIR/full_%U';ALLOCATE CHANNEL ch2 DEVICE TYPE DISK FORMAT '$BACKUP_DIR/full_%U';BACKUP AS COMPRESSED BACKUPSET DATABASE PLUS ARCHIVELOG;BACKUP CURRENT CONTROLFILE FORMAT '$BACKUP_DIR/control_%U';DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-1';RELEASE CHANNEL ch1;RELEASE CHANNEL ch2;
}
EXIT;
EOF# 检查备份状态
if [ $? -eq 0 ]; thenecho "RMAN备份成功完成 - $(date)"
elseecho "RMAN备份失败 - $(date)"exit 1
fi
2.3.4 RMAN备份策略图
3. 逻辑备份详解
3.1 Data Pump - 现代逻辑备份利器
Data Pump是Oracle推荐的逻辑备份工具,比传统的exp/imp工具性能提升了很多。
3.1.1 创建Directory对象
-- 创建目录对象
CREATE DIRECTORY dpump_dir AS '/backup/datapump';-- 授权给用户
GRANT READ, WRITE ON DIRECTORY dpump_dir TO hr;
GRANT READ, WRITE ON DIRECTORY dpump_dir TO system;
3.1.2 使用expdp进行导出
# 导出整个数据库
expdp system/password@orcl DIRECTORY=dpump_dir DUMPFILE=full_db_%U.dmp \LOGFILE=full_db_export.log FULL=Y PARALLEL=4# 导出特定用户
expdp system/password@orcl DIRECTORY=dpump_dir DUMPFILE=hr_user.dmp \LOGFILE=hr_export.log SCHEMAS=HR# 导出特定表
expdp hr/password@orcl DIRECTORY=dpump_dir DUMPFILE=employees.dmp \LOGFILE=emp_export.log TABLES=EMPLOYEES# 按查询条件导出
expdp hr/password@orcl DIRECTORY=dpump_dir DUMPFILE=recent_orders.dmp \LOGFILE=orders_export.log TABLES=ORDERS \QUERY='WHERE order_date > SYSDATE-30'
3.1.3 使用impdp进行导入
# 导入整个dump文件
impdp system/password@orcl DIRECTORY=dpump_dir DUMPFILE=full_db_01.dmp \LOGFILE=full_db_import.log# 导入到不同用户
impdp system/password@orcl DIRECTORY=dpump_dir DUMPFILE=hr_user.dmp \LOGFILE=hr_import.log REMAP_SCHEMA=HR:HR_BACKUP# 导入到不同表空间
impdp system/password@orcl DIRECTORY=dpump_dir DUMPFILE=hr_user.dmp \LOGFILE=hr_import.log REMAP_TABLESPACE=USERS:USERS_BACKUP# 只导入表结构,不导入数据
impdp system/password@orcl DIRECTORY=dpump_dir DUMPFILE=hr_user.dmp \LOGFILE=structure_only.log CONTENT=METADATA_ONLY
3.1.4 Data Pump监控和管理
-- 查看正在运行的Data Pump作业
SELECT owner_name, job_name, operation, job_mode, state
FROM dba_datapump_jobs;-- 连接到正在运行的作业
$ expdp system/password@orcl ATTACH=SYS_EXPORT_FULL_01-- 在交互模式下检查状态
Export> STATUS-- 暂停作业
Export> STOP_JOB-- 继续作业
Export> START_JOB-- 终止作业
Export> KILL_JOB
3.2 传统Export/Import工具
虽然Data Pump更强大,但在某些场景下,传统的exp/imp仍然有用。
3.2.1 Export导出示例
# 导出整个数据库
exp system/password@orcl FILE=full_database.dmp LOG=full_export.log FULL=Y# 导出特定用户
exp system/password@orcl FILE=hr_user.dmp LOG=hr_export.log OWNER=HR# 导出特定表
exp hr/password@orcl FILE=employees.dmp LOG=emp_export.log TABLES=EMPLOYEES# 导出表结构(不包含数据)
exp hr/password@orcl FILE=structure.dmp LOG=structure.log TABLES=EMPLOYEES ROWS=N
3.2.2 Import导入示例
# 导入dump文件
imp system/password@orcl FILE=hr_user.dmp LOG=hr_import.log FROMUSER=HR TOUSER=HR_NEW# 只导入表结构
imp system/password@orcl FILE=hr_user.dmp LOG=structure_import.log ROWS=N# 忽略创建错误继续导入
imp system/password@orcl FILE=hr_user.dmp LOG=hr_import.log IGNORE=Y
4. 数据恢复策略
4.1 恢复场景分类
不同的故障需要不同的恢复策略:
4.2 使用RMAN进行恢复
4.2.1 完整数据库恢复
-- 完整数据库恢复(数据库关闭状态)
RMAN> STARTUP MOUNT;
RMAN> RESTORE DATABASE;
RMAN> RECOVER DATABASE;
RMAN> ALTER DATABASE OPEN;-- 检查恢复后的数据库
RMAN> LIST BACKUP SUMMARY;
RMAN> REPORT SCHEMA;
4.2.2 单个数据文件恢复
-- 在线恢复数据文件(数据库开启状态)
RMAN> SQL "ALTER TABLESPACE USERS OFFLINE IMMEDIATE";
RMAN> RESTORE DATAFILE '/u01/oradata/ORCL/users01.dbf';
RMAN> RECOVER DATAFILE '/u01/oradata/ORCL/users01.dbf';
RMAN> SQL "ALTER TABLESPACE USERS ONLINE";-- 离线恢复数据文件
RMAN> SHUTDOWN IMMEDIATE;
RMAN> STARTUP MOUNT;
RMAN> RESTORE DATAFILE 4;
RMAN> RECOVER DATAFILE 4;
RMAN> ALTER DATABASE OPEN;
4.2.3 基于时间点的恢复
-- 恢复到指定时间点
RMAN> STARTUP MOUNT;
RMAN> RUN {SET UNTIL TIME "TO_DATE('2024-12-01 14:30:00','YYYY-MM-DD HH24:MI:SS')";RESTORE DATABASE;RECOVER DATABASE;
}
RMAN> ALTER DATABASE OPEN RESETLOGS;-- 恢复到指定SCN
RMAN> RUN {SET UNTIL SCN 1000000;RESTORE DATABASE;RECOVER DATABASE;
}
RMAN> ALTER DATABASE OPEN RESETLOGS;
4.2.4 表空间时间点恢复(TSPITR)
-- 执行表空间时间点恢复
RMAN> RECOVER TABLESPACE USERS UNTIL TIME "TO_DATE('2024-12-01 10:00:00','YYYY-MM-DD HH24:MI:SS')"AUXILIARY DESTINATION '/tmp/aux_dest';
4.3 控制文件恢复
4.3.1 从自动备份恢复控制文件
-- 启动到nomount状态
RMAN> STARTUP NOMOUNT;-- 恢复控制文件
RMAN> RESTORE CONTROLFILE FROM AUTOBACKUP;-- 挂载数据库
RMAN> ALTER DATABASE MOUNT;-- 恢复数据库
RMAN> RECOVER DATABASE;-- 打开数据库(可能需要resetlogs)
RMAN> ALTER DATABASE OPEN RESETLOGS;
4.3.2 从指定备份恢复控制文件
-- 从指定备份片恢复
RMAN> RESTORE CONTROLFILE FROM '/backup/rman/control_c-1234567890-20241201-00';-- 从最新备份恢复
RMAN> RESTORE CONTROLFILE FROM TAG 'weekly_backup';
5. 高级备份恢复技术
5.1 闪回技术
Oracle的闪回技术提供了多种数据恢复选项,无需传统的备份恢复过程。
5.1.1 闪回查询
-- 查看表在指定时间点的数据
SELECT * FROM employees
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '2' HOUR);-- 基于SCN的闪回查询
SELECT * FROM employees AS OF SCN 1000000;-- 查看数据变化历史
SELECT employee_id, first_name, last_name, VERSIONS_STARTTIME, VERSIONS_ENDTIME,VERSIONS_OPERATION
FROM employees
VERSIONS BETWEEN TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY) AND SYSTIMESTAMP
WHERE employee_id = 100;
5.1.2 闪回表
-- 启用表的行移动功能
ALTER TABLE employees ENABLE ROW MOVEMENT;-- 闪回表到指定时间点
FLASHBACK TABLE employees TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' HOUR);-- 闪回表到指定SCN
FLASHBACK TABLE employees TO SCN 1000000;
5.1.3 闪回删除(回收站)
-- 查看回收站内容
SELECT object_name, original_name, type, ts_name, createtime, droptime
FROM recyclebin;-- 恢复删除的表
FLASHBACK TABLE employees TO BEFORE DROP;-- 恢复删除的表并重命名
FLASHBACK TABLE employees TO BEFORE DROP RENAME TO employees_restored;-- 清空回收站
PURGE RECYCLEBIN;
5.1.4 闪回数据库
-- 启用闪回数据库
ALTER DATABASE FLASHBACK ON;-- 设置闪回恢复区大小
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 10G;-- 执行数据库闪回
STARTUP MOUNT;
FLASHBACK DATABASE TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '2' HOUR);
ALTER DATABASE OPEN RESETLOGS;
5.2 Oracle Data Guard
Data Guard提供了高可用性和灾难恢复解决方案。
5.2.1 Data Guard架构
5.2.2 创建物理备用数据库
-- 在主数据库上准备
ALTER DATABASE FORCE LOGGING;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 '/path/to/redo04.log' SIZE 100M;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=standby_db ASYNC VALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE) DB_UNIQUE_NAME=standby_db';-- 备份主数据库用于备用库
RMAN> BACKUP DATABASE PLUS ARCHIVELOG;-- 在备用数据库上恢复
RMAN> RESTORE DATABASE;
RMAN> RECOVER DATABASE;-- 启动备用数据库
STARTUP MOUNT;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
5.3 零数据丢失恢复设备(ZDLRA)
这是Oracle云端的备份服务,提供接近零的数据丢失保护。
-- 配置ZDLRA连接
CONFIGURE CHANNEL DEVICE TYPE 'SBT_TAPE' PARMS 'SBT_LIBRARY=/opt/oracle/backup/lib/libra.so, ENV=(ZDLRA_SID=zdlra_db)';-- 备份到ZDLRA
RMAN> BACKUP DATABASE TO DESTINATION 'ZDLRA';-- 从ZDLRA恢复
RMAN> RESTORE DATABASE FROM DESTINATION 'ZDLRA';
6. 备份恢复最佳实践
6.1 备份策略设计原则
一个好的备份策略应该考虑以下因素:
6.2 3-2-1备份规则
这是业界公认的备份最佳实践:
- 3份数据拷贝:1份生产数据 + 2份备份
- 2种不同媒介:本地磁盘 + 远程存储
- 1份异地备份:防范灾难性事件
6.2.1 实现3-2-1规则的脚本
#!/bin/bash
# 实现3-2-1备份规则的综合脚本# 配置参数
LOCAL_BACKUP="/backup/local"
REMOTE_BACKUP="/backup/remote"
CLOUD_BACKUP="s3://mybucket/oracle-backup"
ORACLE_SID="ORCL"# 本地RMAN备份
echo "开始本地RMAN备份..."
rman target / << EOF
RUN {ALLOCATE CHANNEL c1 DEVICE TYPE DISK FORMAT '$LOCAL_BACKUP/rman_%U';BACKUP AS COMPRESSED BACKUPSET DATABASE PLUS ARCHIVELOG;BACKUP CURRENT CONTROLFILE FORMAT '$LOCAL_BACKUP/control_%U';RELEASE CHANNEL c1;
}
EOF# 远程备份(使用rsync)
echo "开始远程同步备份..."
rsync -avz --delete $LOCAL_BACKUP/ backup-server:$REMOTE_BACKUP/# 云端备份(使用aws cli)
echo "开始云端备份..."
aws s3 sync $LOCAL_BACKUP $CLOUD_BACKUP --delete# 清理过期备份
echo "清理过期备份..."
rman target / << EOF
DELETE NOPROMPT OBSOLETE;
DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';
EOFecho "3-2-1备份完成 - $(date)"
结语
感谢您的阅读!期待您的一键三连!欢迎指正!