备份策略
备份是保护数据库免受数据丢失的重要手段。Oracle提供了多种备份方法和策略。
备份类型
按备份方式分类
- 物理备份:备份数据库的物理文件(数据文件、控制文件、重做日志文件)
- 逻辑备份:备份数据库的逻辑结构(表、索引、存储过程等)
按备份状态分类
- 一致性备份(冷备份):数据库关闭状态下进行的备份
- 非一致性备份(热备份):数据库运行状态下进行的备份
按备份内容分类
- 完全备份:备份整个数据库
- 增量备份:只备份自上次备份以来发生变化的数据
备份策略制定
-- 制定备份策略需要考虑的因素:
-- 1. 恢复时间目标(RTO):系统可容忍的最大停机时间
-- 2. 恢复点目标(RPO):可容忍的最大数据丢失量
-- 3. 备份窗口:可用于备份的时间段
-- 4. 存储容量:备份所需的存储空间
-- 5. 网络带宽:备份传输所需的网络资源
2.2 RMAN备份
RMAN(Recovery Manager)是Oracle提供的专业备份和恢复工具。
RMAN配置
# 启动RMAN
rman target /
# 配置RMAN参数
RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
RMAN> CONFIGURE BACKUP OPTIMIZATION ON;
RMAN> CONFIGURE DEFAULT DEVICE TYPE TO DISK;
RMAN> CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/backup/%d_%T_%s_%p';
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/backup/%F';
RMAN备份操作
# 全库备份
RMAN> BACKUP DATABASE;
# 表空间备份
RMAN> BACKUP TABLESPACE users, system;
# 数据文件备份
RMAN> BACKUP DATAFILE 1, 2, 3;
# 归档日志备份
RMAN> BACKUP ARCHIVELOG ALL;
# 控制文件备份
RMAN> BACKUP CURRENT CONTROLFILE;
# 备份备份集
RMAN> BACKUP BACKUPSET ALL;
# 增量备份
RMAN> BACKUP INCREMENTAL LEVEL 0 DATABASE; # 基础增量备份
RMAN> BACKUP INCREMENTAL LEVEL 1 DATABASE; # 差异增量备份
RMAN> BACKUP INCREMENTAL LEVEL 1 CUMULATIVE DATABASE; # 累积增量备份
RMAN备份管理
# 查看备份信息
RMAN> LIST BACKUP;
RMAN> LIST BACKUP SUMMARY;
RMAN> LIST BACKUP BY BACKUP;
RMAN> LIST BACKUP BY FILE;
# 查看备份集详细信息
RMAN> LIST BACKUPSET 123;
# 查看失效备份
RMAN> REPORT OBSOLETE;
# 删除过期备份
RMAN> DELETE OBSOLETE;
# 删除特定备份
RMAN> DELETE BACKUPSET 123;
RMAN> DELETE BACKUP OF DATABASE UNTIL TIME 'SYSDATE-7';
# 交叉检查备份
RMAN> CROSSCHECK BACKUP;
RMAN> CROSSCHECK ARCHIVELOG ALL;
# 更新备份状态
RMAN> CHANGE BACKUPSET 123 UNCATALOG;
2.3 数据泵导出导入
数据泵(Data Pump)是Oracle提供的高速数据迁移工具。
数据泵导出(EXPDP)
# 全库导出
expdp system/password DIRECTORY=dpump_dir DUMPFILE=full_export.dmp FULL=Y
# 模式导出
expdp hr/hr_password DIRECTORY=dpump_dir DUMPFILE=hr_export.dmp SCHEMAS=hr
# 表导出
expdp hr/hr_password DIRECTORY=dpump_dir DUMPFILE=emp_export.dmp TABLES=employees,departments
# 表空间导出
expdp system/password DIRECTORY=dpump_dir DUMPFILE=tbs_export.dmp TABLESPACES=users
# 查询导出
expdp hr/hr_password DIRECTORY=dpump_dir DUMPFILE=query_export.dmp QUERY=employees:"WHERE department_id=60"
# 并行导出
expdp system/password DIRECTORY=dpump_dir DUMPFILE=parallel_export_%U.dmp PARALLEL=4 FULL=Y
# 压缩导出
expdp system/password DIRECTORY=dpump_dir DUMPFILE=compressed_export.dmp COMPRESSION=ALL FULL=Y
# 加密导出
expdp system/password DIRECTORY=dpump_dir DUMPFILE=encrypted_export.dmp ENCRYPTION=all ENCRYPTION_PASSWORD=mypassword FULL=Y
数据泵导入(IMPDP)
# 全库导入
impdp system/password DIRECTORY=dpump_dir DUMPFILE=full_export.dmp FULL=Y
# 模式导入
impdp hr/hr_password DIRECTORY=dpump_dir DUMPFILE=hr_export.dmp SCHEMAS=hr
# 表导入
impdp hr/hr_password DIRECTORY=dpump_dir DUMPFILE=emp_export.dmp TABLES=employees,departments
# 表空间导入
impdp system/password DIRECTORY=dpump_dir DUMPFILE=tbs_export.dmp TABLESPACES=users
# 重新映射模式
impdp system/password DIRECTORY=dpump_dir DUMPFILE=hr_export.dmp REMAP_SCHEMA=hr:hr_new
# 重新映射表空间
impdp system/password DIRECTORY=dpump_dir DUMPFILE=tbs_export.dmp REMAP_TABLESPACE=users:users_new
# 并行导入
impdp system/password DIRECTORY=dpump_dir DUMPFILE=parallel_export_%U.dmp PARALLEL=4 FULL=Y
# 导入选项
impdp hr/hr_password DIRECTORY=dpump_dir DUMPFILE=emp_export.dmp TABLES=employees TABLE_EXISTS_ACTION=APPEND
数据泵管理
-- 查看数据泵作业
SELECT * FROM dba_datapump_jobs;
-- 停止数据泵作业
SELECT owner_name, job_name, operation, job_mode, state FROM dba_datapump_jobs;
-- 附加到数据泵作业
-- impdp system/password ATTACH=job_name
-- 创建目录对象
CREATE DIRECTORY dpump_dir AS '/u01/app/oracle/dpump';
GRANT READ, WRITE ON DIRECTORY dpump_dir TO hr;
-- 查看目录对象
SELECT directory_name, directory_path FROM dba_directories;
2.4 闪回技术
闪回技术是Oracle提供的快速恢复机制,可以在不使用备份的情况下恢复数据。
闪回查询
-- 查询过去时间点的数据
SELECT * FROM employees AS OF TIMESTAMP SYSDATE - 1/24; -- 1小时前的数据
SELECT * FROM employees AS OF TIMESTAMP TO_TIMESTAMP('2023-12-01 10:00:00', 'YYYY-MM-DD HH24:MI:SS');
-- 查询特定SCN的数据
SELECT * FROM employees AS OF SCN 123456;
-- 使用VERSIONS子句查看行的历史版本
SELECT versions_starttime, versions_endtime, versions_xid, versions_operation, salary
FROM employees VERSIONS BETWEEN TIMESTAMP SYSDATE-1 AND SYSDATE
WHERE employee_id = 100;
闪回表
-- 启用行移动(闪回表的前提条件)
ALTER TABLE employees ENABLE ROW MOVEMENT;
-- 闪回表到过去时间点
FLASHBACK TABLE employees TO TIMESTAMP SYSDATE - 1/24;
-- 闪回表到特定SCN
FLASHBACK TABLE employees TO SCN 123456;
-- 闪回表并忽略约束错误
FLASHBACK TABLE employees TO TIMESTAMP SYSDATE - 1/24 ENABLE TRIGGERS;
-- 查看闪回表操作
SELECT * FROM user_recyclebin;
闪回删除
-- 删除表(进入回收站)
DROP TABLE employees;
-- 查看回收站
SHOW RECYCLEBIN;
SELECT object_name, original_name, type, droptime FROM user_recyclebin;
-- 闪回删除的表
FLASHBACK TABLE employees TO BEFORE DROP;
-- 闪回到指定名称
FLASHBACK TABLE employees TO BEFORE DROP RENAME TO employees_old;
-- 清空回收站
PURGE RECYCLEBIN;
PURGE TABLE employees; -- 清空特定表
PURGE TABLESPACE users; -- 清空表空间回收站
PURGE DBA_RECYCLEBIN; -- 清空所有回收站
闪回数据库
-- 启用闪回数据库(需要预先配置)
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE FLASHBACK ON;
ALTER DATABASE OPEN;
-- 查看闪回数据库信息
SELECT flashback_on, log_mode FROM v$database;
SELECT oldest_flashback_scn, oldest_flashback_time FROM v$flashback_database_log;
-- 闪回数据库
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
FLASHBACK DATABASE TO TIMESTAMP SYSDATE - 1/24;
FLASHBACK DATABASE TO SCN 123456;
FLASHBACK DATABASE TO BEFORE TIMESTAMP SYSDATE - 1/24;
-- 打开数据库(RESETLOGS)
ALTER DATABASE OPEN RESETLOGS;
2.5 灾难恢复方案
物理备用数据库(Data Guard)
-- 主库配置
-- 1. 启用归档模式
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
-- 2. 强制记录日志
ALTER DATABASE FORCE LOGGING;
-- 3. 添加备用重做日志
ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 SIZE 50M;
-- 4. 创建密码文件
-- orapwd file=$ORACLE_HOME/dbs/orapwORCL password=manager entries=10
-- 5. 配置参数
ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(ORCL,STANDBY)';
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=standby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=STANDBY';
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE;
ALTER SYSTEM SET FAL_SERVER=STANDBY;
ALTER SYSTEM SET FAL_CLIENT=ORCL;
ALTER SYSTEM SET DB_FILE_NAME_CONVERT='/standby/','/primary/' SCOPE=SPFILE;
ALTER SYSTEM SET LOG_FILE_NAME_CONVERT='/standby/','/primary/' SCOPE=SPFILE;
ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO;
-- 备库配置
-- 1. 创建参数文件
-- *.db_name='ORCL'
-- *.db_unique_name='STANDBY'
-- *.log_archive_config='DG_CONFIG=(ORCL,STANDBY)'
-- *.log_archive_dest_2='SERVICE=orcl LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORCL'
-- *.fal_server='ORCL'
-- *.fal_client='STANDBY'
-- *.db_file_name_convert='/primary/','/standby/'
-- *.log_file_name_convert='/primary/','/standby/'
-- 2. 启动备库到NOMOUNT状态
STARTUP NOMOUNT;
-- 3. 使用RMAN克隆主库
-- RMAN TARGET sys/password@orcl AUXILIARY sys/password@standby
-- DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE DORECOVER;
-- 4. 启动应用重做日志
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
-- 5. 切换到主库
-- 在主库上执行:
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY;
SHUTDOWN IMMEDIATE;
STARTUP NOMOUNT;
ALTER DATABASE MOUNT STANDBY DATABASE;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
-- 在备库上执行:
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
SHUTDOWN IMMEDIATE;
STARTUP;
逻辑备用数据库
-- 创建逻辑备用数据库
-- 1. 在主库上创建逻辑备用数据库构建文件
EXECUTE DBMS_LOGSTDBY.BUILD;
-- 2. 使用RMAN创建物理备用数据库
-- 3. 转换为逻辑备用数据库
ALTER DATABASE RECOVER TO LOGICAL STANDBY;
-- 4. 启动逻辑备用数据库
ALTER DATABASE OPEN RESETLOGS;
ALTER DATABASE START LOGICAL STANDBY APPLY;
2.6 本章小结
本章详细介绍了Oracle数据库的备份与恢复技术,包括RMAN备份、数据泵导出导入、闪回技术和灾难恢复方案等内容。掌握这些备份恢复技能对于确保数据库数据安全和业务连续性至关重要。
练习题
- 配置RMAN并执行全库备份和增量备份,验证备份的有效性
- 使用数据泵导出导入特定表和模式,测试数据迁移功能
- 实验闪回查询和闪回表功能,恢复误删除或误修改的数据
- 配置Data Guard物理备用数据库,测试主备切换功能
- 制定完整的备份策略,包括备份频率、保留策略和恢复测试计划
- 实现闪回数据库功能,测试数据库级别的快速恢复