外观
Oracle 日常备份操作指南
备份基础概念
备份类型
物理备份
- 冷备份:关闭数据库后备份数据文件、控制文件和重做日志文件
- 热备份:数据库运行时备份(归档模式下)
- RMAN 备份:使用 Recovery Manager 进行的备份
逻辑备份
- 导出备份:使用 expdp/impdp 或 exp/imp 导出数据
- SQL 脚本:使用 SQL 语句生成的结构和数据脚本
备份级别
- 完整备份:备份整个数据库
- 增量备份:仅备份自上次备份以来更改的数据
- 差异备份:备份自上次完整备份以来更改的数据
备份模式
归档模式
- 启用归档日志
- 支持热备份和时间点恢复
- 推荐生产环境使用
非归档模式
- 不启用归档日志
- 仅支持冷备份
- 不推荐生产环境使用
备份目标
- 本地磁盘:快速但不安全
- 网络存储:NFS、SAN 等
- 磁带库:适合长期存储
- 云存储:如 Oracle Cloud、AWS、Azure 等
日常备份策略
1. 完整备份策略
生产环境推荐:
- 每日:增量备份
- 每周:完整备份
- 每月:完整备份(异地存储)
测试环境推荐:
- 每周:完整备份
- 按需:增量备份
2. 备份保留策略
- 生产环境:至少保留 30 天的备份
- 测试环境:至少保留 7 天的备份
- 归档日志:保留到下一次完整备份
3. 备份验证策略
- 每日:验证增量备份
- 每周:验证完整备份
- 每月:恢复测试
日常备份操作流程
1. 使用 RMAN 执行完整备份
步骤 1:连接到目标数据库
bash
rman target /步骤 2:执行完整备份
bash
# 备份数据库到磁盘
BACKUP DATABASE PLUS ARCHIVELOG;
# 备份数据库到磁带
BACKUP DATABASE PLUS ARCHIVELOG DEVICE TYPE SBT;
# 备份并压缩
BACKUP AS COMPRESSED BACKUPSET DATABASE PLUS ARCHIVELOG;
# 备份到指定位置
BACKUP DATABASE PLUS ARCHIVELOG FORMAT '/backup/oracle/%d_%T_%U.bak';步骤 3:备份控制文件
bash
# 单独备份控制文件
BACKUP CURRENT CONTROLFILE;
# 备份控制文件到追踪文件
ALTER DATABASE BACKUP CONTROLFILE TO TRACE;步骤 4:备份服务器参数文件
bash
# 备份 SPFILE
BACKUP SPFILE;2. 使用 RMAN 执行增量备份
步骤 1:连接到目标数据库
bash
rman target /步骤 2:执行增量备份
bash
# 级别 0 增量备份(相当于完整备份)
BACKUP INCREMENTAL LEVEL 0 DATABASE PLUS ARCHIVELOG;
# 级别 1 增量备份(差异)
BACKUP INCREMENTAL LEVEL 1 DATABASE PLUS ARCHIVELOG;
# 级别 1 增量备份(累积)
BACKUP INCREMENTAL LEVEL 1 CUMULATIVE DATABASE PLUS ARCHIVELOG;3. 使用 Data Pump 执行逻辑备份
步骤 1:创建导出目录
bash
# 创建物理目录
mkdir -p /backup/oracle/expdp
# 在数据库中创建目录对象
SQL> CREATE DIRECTORY expdp_dir AS '/backup/oracle/expdp';
SQL> GRANT READ, WRITE ON DIRECTORY expdp_dir TO system;步骤 2:执行全库导出
bash
# 全库导出
expdp system/password@orcl FULL=Y DIRECTORY=expdp_dir DUMPFILE=full_backup_%U.dmp LOGFILE=expdp_full.log COMPRESSION=ALL PARALLEL=4
# 导出特定用户
expdp system/password@orcl SCHEMAS=scott,hr DIRECTORY=expdp_dir DUMPFILE=schemas_backup.dmp LOGFILE=expdp_schemas.log
# 导出特定表
expdp system/password@orcl TABLES=scott.emp,scott.dept DIRECTORY=expdp_dir DUMPFILE=tables_backup.dmp LOGFILE=expdp_tables.log
# 导出表空间
expdp system/password@orcl TABLESPACES=users,example DIRECTORY=expdp_dir DUMPFILE=tablespaces_backup.dmp LOGFILE=expdp_tablespaces.log4. 执行冷备份
步骤 1:关闭数据库
bash
sqlplus / as sysdba
SHUTDOWN IMMEDIATE;步骤 2:备份关键文件
bash
# 备份数据文件
cp -p $ORACLE_BASE/oradata/$ORACLE_SID/*.dbf /backup/oracle/
# 备份控制文件
cp -p $ORACLE_BASE/oradata/$ORACLE_SID/control*.ctl /backup/oracle/
# 备份重做日志文件
cp -p $ORACLE_BASE/oradata/$ORACLE_SID/*.log /backup/oracle/
# 备份参数文件
cp -p $ORACLE_HOME/dbs/spfile$ORACLE_SID.ora /backup/oracle/
cp -p $ORACLE_HOME/dbs/init$ORACLE_SID.ora /backup/oracle/
# 备份密码文件
cp -p $ORACLE_HOME/dbs/orapw$ORACLE_SID /backup/oracle/步骤 3:启动数据库
bash
STARTUP;5. 备份归档日志
使用 RMAN 备份归档日志
bash
# 备份所有归档日志
BACKUP ARCHIVELOG ALL;
# 备份并删除已备份的归档日志
BACKUP ARCHIVELOG ALL DELETE INPUT;
# 备份特定范围的归档日志
BACKUP ARCHIVELOG FROM TIME 'SYSDATE-7' UNTIL TIME 'SYSDATE';手动备份归档日志
bash
# 查找归档日志位置
SQL> SHOW PARAMETER log_archive_dest;
# 复制归档日志
cp -p $ARCHIVE_DEST/*.arc /backup/oracle/archive/备份监控与管理
1. 监控备份作业
查看 RMAN 备份历史
bash
# 查看备份作业摘要
RMAN> LIST BACKUP SUMMARY;
# 查看详细备份信息
RMAN> LIST BACKUP;
# 查看特定文件的备份
RMAN> LIST BACKUP OF DATABASE;
RMAN> LIST BACKUP OF ARCHIVELOG ALL;查询备份相关视图
sql
-- 查看备份集
SELECT * FROM V$BACKUP_SET;
-- 查看备份片
SELECT * FROM V$BACKUP_PIECE;
-- 查看备份状态
SELECT * FROM V$BACKUP;
-- 查看归档日志
SELECT * FROM V$ARCHIVED_LOG;2. 备份报告生成
使用 RMAN 生成报告
bash
# 生成备份报告
RMAN> REPORT NEED BACKUP;
RMAN> REPORT OBSOLETE;
RMAN> REPORT SCHEMA;使用 SQL 生成备份报告
sql
-- 备份状态报告
SELECT
TO_CHAR(completion_time, 'YYYY-MM-DD HH24:MI:SS') completion_time,
backup_type,
status,
elapsed_seconds,
bytes/1024/1024/1024 GB
FROM
V$BACKUP_JOB_DETAILS
ORDER BY
completion_time DESC;3. 备份维护
删除过期备份
bash
# 删除过期备份
RMAN> DELETE OBSOLETE;
# 删除特定备份
RMAN> DELETE BACKUP OF DATABASE COMPLETED BEFORE 'SYSDATE-30';
# 删除归档日志备份
RMAN> DELETE BACKUP OF ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';交叉验证备份
bash
# 验证所有备份
RMAN> CROSSCHECK BACKUP;
# 验证归档日志备份
RMAN> CROSSCHECK ARCHIVELOG ALL;
# 验证特定备份
RMAN> CROSSCHECK BACKUP OF DATABASE;修复备份目录
bash
# 删除失效的备份记录
RMAN> DELETE EXPIRED BACKUP;
# 删除失效的归档日志记录
RMAN> DELETE EXPIRED ARCHIVELOG ALL;备份自动化
1. 使用 cron 调度备份
创建备份脚本
bash
#!/bin/bash
# 设置环境变量
ORACLE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1
ORACLE_SID=orcl
PATH=$ORACLE_HOME/bin:$PATH
# 备份日志
LOG_FILE=/backup/oracle/rman_backup_$(date +%Y%m%d).log
# 执行备份
rman target / << EOF > $LOG_FILE
RUN {
ALLOCATE CHANNEL c1 DEVICE TYPE DISK;
BACKUP AS COMPRESSED BACKUPSET
DATABASE PLUS ARCHIVELOG;
BACKUP CURRENT CONTROLFILE;
BACKUP SPFILE;
DELETE OBSOLETE;
RELEASE CHANNEL c1;
}
EOF
# 检查备份结果
if grep -q "RMAN-" $LOG_FILE; then
echo "备份失败,请查看日志文件: $LOG_FILE"
else
echo "备份成功完成"
fi调度 cron 作业
bash
# 编辑 crontab
crontab -e
# 添加每天凌晨 2 点执行完整备份
0 2 * * * /backup/oracle/rman_full_backup.sh
# 添加每 4 小时执行增量备份
0 */4 * * * /backup/oracle/rman_incremental_backup.sh2. 使用 Oracle Scheduler
创建备份作业
sql
-- 创建程序
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM(
program_name => 'BACKUP_PROGRAM',
program_type => 'EXECUTABLE',
program_action => '/backup/oracle/rman_backup.sh',
enabled => TRUE,
comments => 'RMAN 备份程序'
);
END;
/
-- 创建调度
BEGIN
DBMS_SCHEDULER.CREATE_SCHEDULE(
schedule_name => 'DAILY_BACKUP_SCHEDULE',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=DAILY; BYHOUR=2; BYMINUTE=0; BYSECOND=0',
end_date => NULL,
comments => '每日备份调度'
);
END;
/
-- 创建作业
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'DAILY_BACKUP_JOB',
program_name => 'BACKUP_PROGRAM',
schedule_name => 'DAILY_BACKUP_SCHEDULE',
enabled => TRUE,
comments => '每日 RMAN 备份作业'
);
END;
/3. 使用 Enterprise Manager
步骤 1:登录 Enterprise Manager
- 访问 https://hostname:5500/em
- 使用 sysdba 权限登录
步骤 2:创建备份策略
- 导航到 "可用性" → "备份与恢复" → "备份策略"
- 点击 "创建"
- 配置备份类型、调度和保留策略
步骤 3:监控备份作业
- 导航到 "可用性" → "备份与恢复" → "作业"
- 查看备份作业状态和历史
备份验证与测试
1. 备份验证
使用 RMAN 验证备份
bash
# 验证备份集
RMAN> VALIDATE BACKUPSET 123;
# 验证数据库备份
RMAN> VALIDATE DATABASE;
# 验证数据文件
RMAN> VALIDATE DATAFILE 1;
# 验证归档日志
RMAN> VALIDATE ARCHIVELOG ALL;使用 RESTORE 验证
bash
# 测试恢复(不实际执行)
RMAN> RESTORE DATABASE PREVIEW;
# 测试恢复控制文件
RMAN> RESTORE CONTROLFILE PREVIEW;2. 恢复测试
测试表级恢复
bash
# 备份表
RMAN> BACKUP TABLESPACE users;
# 模拟表损坏
SQL> ALTER TABLE scott.emp NOLOGGING;
SQL> TRUNCATE TABLE scott.emp;
# 恢复表空间
RMAN> RUN {
ALLOCATE CHANNEL c1 DEVICE TYPE DISK;
RESTORE TABLESPACE users;
RECOVER TABLESPACE users;
RELEASE CHANNEL c1;
}
# 验证表数据
SQL> SELECT COUNT(*) FROM scott.emp;测试时间点恢复
bash
# 执行时间点恢复
RMAN> RUN {
ALLOCATE CHANNEL c1 DEVICE TYPE DISK;
SET UNTIL TIME 'SYSDATE-1';
RESTORE DATABASE;
RECOVER DATABASE;
RELEASE CHANNEL c1;
}
# 打开数据库
SQL> ALTER DATABASE OPEN RESETLOGS;3. 备份性能测试
测试备份速度
bash
# 使用不同并行度测试
RMAN> BACKUP AS COMPRESSED BACKUPSET
DATABASE PLUS ARCHIVELOG
PARALLELISM 4;
# 测试不同备份类型
RMAN> BACKUP AS BACKUPSET DATABASE;
RMAN> BACKUP AS COMPRESSED BACKUPSET DATABASE;优化备份性能
- 增加通道数:使用 PARALLELISM 参数
- 使用压缩:减少备份大小
- 使用增量备份:减少备份时间
- 优化 I/O:使用多个磁盘通道
常见备份问题与解决方案
1. RMAN 备份失败
问题:RMAN 备份失败,出现 RMAN-03009 错误
解决方案:
- 检查目标路径权限
- 检查磁盘空间
- 检查通道配置
bash
# 检查备份目标路径
mkdir -p /backup/oracle
chown oracle:oinstall /backup/oracle
chmod 755 /backup/oracle
# 检查磁盘空间
df -h /backup
# 重新配置通道
RMAN> RUN {
ALLOCATE CHANNEL c1 DEVICE TYPE DISK FORMAT '/backup/oracle/%U';
BACKUP DATABASE;
RELEASE CHANNEL c1;
}2. 归档日志满
问题:归档日志目录空间不足
解决方案:
- 备份并删除归档日志
- 增加归档日志目录空间
- 调整归档日志保留策略
bash
# 备份并删除归档日志
RMAN> BACKUP ARCHIVELOG ALL DELETE INPUT;
# 检查归档日志配置
SQL> SHOW PARAMETER log_archive_dest;
SQL> SHOW PARAMETER db_recovery_file_dest;
# 增加闪回恢复区大小
SQL> ALTER SYSTEM SET db_recovery_file_dest_size=10G SCOPE=BOTH;3. 备份速度慢
问题:备份执行时间过长
解决方案:
- 增加并行度
- 使用增量备份
- 优化 I/O 配置
- 使用压缩备份
bash
# 使用并行备份
RMAN> BACKUP AS COMPRESSED BACKUPSET
DATABASE PLUS ARCHIVELOG
PARALLELISM 8;
# 使用增量备份
RMAN> BACKUP INCREMENTAL LEVEL 1 DATABASE;
# 优化通道配置
RMAN> CONFIGURE DEVICE TYPE DISK PARALLELISM 4;4. 备份文件损坏
问题:备份文件损坏,无法用于恢复
解决方案:
- 验证备份完整性
- 重新执行备份
- 使用多路备份
bash
# 验证备份
RMAN> VALIDATE BACKUPSET 123;
# 配置控制文件自动备份
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
# 配置多路备份
RMAN> CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/backup1/oracle/%U', '/backup2/oracle/%U';5. 备份权限问题
问题:备份失败,出现权限错误
解决方案:
- 检查 Oracle 用户权限
- 检查备份目标路径权限
- 检查目录权限
bash
# 修复文件权限
chown -R oracle:oinstall /backup/oracle
chmod -R 755 /backup/oracle
# 检查 Oracle 用户权限
id oracle
# 测试目录写入权限
su - oracle -c "touch /backup/oracle/test.txt"备份最佳实践
1. 备份策略最佳实践
- 制定详细的备份计划:包括备份类型、频率、保留策略
- 测试备份恢复:定期执行恢复测试
- 使用 RMAN:推荐使用 RMAN 进行备份
- 启用控制文件自动备份:确保控制文件安全
- 使用增量备份:减少备份时间和空间
- 压缩备份:减少存储需求
- 多路备份:提高可靠性
2. 备份操作最佳实践
- 在非业务高峰期执行备份:减少对系统影响
- 监控备份作业:及时发现和解决问题
- 记录备份操作:维护备份日志和文档
- 备份到多个位置:提高安全性
- 加密敏感数据备份:保护数据安全
- 定期清理过期备份:释放存储空间
3. 备份验证最佳实践
- 每次备份后验证:确保备份成功
- 定期执行恢复测试:验证可恢复性
- 检查备份完整性:使用 VALIDATE 命令
- 监控备份保留期:确保备份可用性
- 测试不同恢复场景:准备应对各种故障
4. 备份监控最佳实践
- 设置备份告警:及时通知备份失败
- 监控备份存储:确保有足够空间
- 监控备份性能:优化备份速度
- 分析备份趋势:预测存储需求
- 集成监控系统:与企业监控集成
常见问题(FAQ)
Q1: 生产环境应该使用哪种备份策略?
A1: 生产环境推荐的备份策略:
- 归档模式:必须启用
- RMAN 备份:使用 RMAN 进行备份
- 备份频率:每日增量备份,每周完整备份
- 备份类型:
- 完整备份:每周一次
- 增量备份:每天一次
- 归档日志:每 4-6 小时一次
- 保留策略:至少保留 30 天的备份
- 验证频率:每次备份后验证,每月执行恢复测试
Q2: RMAN 备份和传统备份有什么区别?
A2: RMAN 备份与传统备份的主要区别:
RMAN 备份:
- 支持增量备份
- 自动管理备份文件
- 支持备份验证
- 支持块级恢复
- 自动处理归档日志
- 提供更灵活的恢复选项
传统备份:
- 仅支持完整备份
- 需要手动管理备份文件
- 验证复杂
- 恢复过程繁琐
- 需要手动处理归档日志
Q3: 如何提高备份速度?
A3: 提高备份速度的方法:
- 增加并行度:使用 PARALLELISM 参数
- 使用多个通道:分配多个备份通道
- 使用增量备份:减少备份数据量
- 使用压缩备份:减少 I/O 操作
- 优化存储 I/O:使用高速存储设备
- 分离备份 I/O:使用不同的磁盘进行备份
- 调整 RMAN 参数:如 FILESPERSET、MAXOPENFILES 等
Q4: 如何确保备份的安全性?
A4: 确保备份安全性的措施:
- 备份到多个位置:本地和异地备份
- 加密备份:使用 RMAN 加密或存储加密
- 访问控制:限制备份文件的访问权限
- 定期验证:确保备份完整性
- 备份元数据:备份控制文件和参数文件
- 灾难恢复计划:制定详细的恢复计划
- 备份监控:及时发现备份问题
Q5: 归档日志满了怎么办?
A5: 解决归档日志满的步骤:
紧急处理:
- 备份并删除归档日志:
RMAN> BACKUP ARCHIVELOG ALL DELETE INPUT; - 或直接删除过期归档日志(不推荐)
- 备份并删除归档日志:
根本解决:
- 增加归档日志目录空间
- 调整归档日志保留策略
- 优化备份策略,增加归档日志备份频率
- 检查是否有长时间运行的事务
预防措施:
- 监控归档日志空间
- 设置归档日志空间告警
- 配置合理的归档日志保留策略
Q6: 如何备份 Oracle 19c 数据库?
A6: Oracle 19c 数据库备份步骤:
准备工作:
- 启用归档模式(如果尚未启用)
- 配置 RMAN 通道
- 设置备份目标路径
执行完整备份:
bashrman target / BACKUP AS COMPRESSED BACKUPSET DATABASE PLUS ARCHIVELOG; BACKUP CURRENT CONTROLFILE; BACKUP SPFILE;执行增量备份:
bashrman target / BACKUP INCREMENTAL LEVEL 1 DATABASE PLUS ARCHIVELOG;备份验证:
bashrman target / VALIDATE DATABASE;自动化:
- 创建备份脚本
- 使用 cron 或 Oracle Scheduler 调度
Q7: 如何从 RMAN 备份中恢复单个表?
A7: 从 RMAN 备份中恢复单个表的步骤:
方法 1:使用 RMAN 表恢复(12c+)
bashrman target / RECOVER TABLE scott.emp OF PLUGGABLE DATABASE pdb1 FROM BACKUPSET UNTIL TIME 'SYSDATE-1' REMAP TABLE scott.emp:emp_recov;方法 2:使用表空间恢复
bash# 确定表所在的表空间 SQL> SELECT tablespace_name FROM dba_tables WHERE owner='SCOTT' AND table_name='EMP'; # 备份当前表空间(可选) RMAN> BACKUP TABLESPACE users; # 恢复表空间到指定时间点 RMAN> RUN { SET UNTIL TIME 'SYSDATE-1'; RESTORE TABLESPACE users; RECOVER TABLESPACE users; } # 导出恢复的表 expdp system/password@orcl TABLES=scott.emp DIRECTORY=expdp_dir DUMPFILE=emp.dmp # 导入表到原 schema impdp system/password@orcl TABLES=scott.emp DIRECTORY=expdp_dir DUMPFILE=emp.dmp REMAP_TABLE=scott.emp:emp_recov
Q8: 如何备份 Oracle 数据库到云存储?
A8: 备份 Oracle 数据库到云存储的方法:
使用 RMAN 云集成(12.2+)
bash# 配置云存储 RMAN> CONFIGURE CHANNEL DEVICE TYPE 'SBT_TAPE' PARMS 'SBT_LIBRARY=/path/to/cloud/library, ENV=(CLOUD_STORAGE_CONTAINER=mycontainer)'; # 备份到云 RMAN> BACKUP DATABASE PLUS ARCHIVELOG;使用云存储网关
- 部署云存储网关
- 映射为本地挂载点
- 使用常规 RMAN 备份到挂载点
使用第三方工具
- 如 Commvault、NetBackup 等支持云存储的备份工具
使用 Oracle Cloud Backup Service
- 配置 Oracle Cloud Backup Module
- 使用 RMAN 备份到 Oracle Cloud
Q9: 如何监控 RMAN 备份作业?
A9: 监控 RMAN 备份作业的方法:
使用 RMAN 命令
bashRMAN> LIST BACKUP SUMMARY; RMAN> LIST BACKUP; RMAN> REPORT NEED BACKUP;查询数据字典视图
sql-- 备份作业详情 SELECT * FROM V$BACKUP_JOB_DETAILS ORDER BY completion_time DESC; -- 备份集信息 SELECT * FROM V$BACKUP_SET; -- 备份片信息 SELECT * FROM V$BACKUP_PIECE; -- 备份状态 SELECT * FROM V$BACKUP;使用 Enterprise Manager
- 导航到 "可用性" → "备份与恢复" → "作业"
- 查看备份作业状态和历史
设置备份告警
- 使用 Oracle Enterprise Manager 设置告警
- 或使用脚本监控备份日志
Q10: 如何优化 RMAN 备份性能?
A10: 优化 RMAN 备份性能的方法:
增加并行度
bashRMAN> CONFIGURE DEVICE TYPE DISK PARALLELISM 4;使用多个通道
bashRMAN> RUN { ALLOCATE CHANNEL c1 DEVICE TYPE DISK; ALLOCATE CHANNEL c2 DEVICE TYPE DISK; ALLOCATE CHANNEL c3 DEVICE TYPE DISK; ALLOCATE CHANNEL c4 DEVICE TYPE DISK; BACKUP DATABASE; RELEASE CHANNEL c1; RELEASE CHANNEL c2; RELEASE CHANNEL c3; RELEASE CHANNEL c4; }使用增量备份
bashRMAN> BACKUP INCREMENTAL LEVEL 1 DATABASE;使用压缩备份
bashRMAN> BACKUP AS COMPRESSED BACKUPSET DATABASE;优化 I/O
- 使用多个磁盘通道
- 分离备份 I/O 和生产 I/O
- 使用高速存储设备
调整 RMAN 参数
bashRMAN> CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/backup/%U' MAXPIECESIZE 4G; RMAN> CONFIGURE FILESPERSET 10;使用备份集大小限制
bashRMAN> CONFIGURE CHANNEL DEVICE TYPE DISK MAXPIECESIZE 2G;
