【Oracle】数据备份与恢复

在这里插入图片描述

个人主页:Guiat
归属专栏:Oracle

在这里插入图片描述

正文

1. Oracle备份恢复概述

Oracle数据库的备份与恢复就像给你的数据上了一道保险,万一出现意外情况,你总能有个可靠的退路。无论是硬件故障、人为误操作,还是自然灾害,备份都是你最后的救命稻草。

1.1 为什么备份这么重要?

数据库备份不仅仅是为了防范灾难,更是为了:

  • 保护企业的核心数据资产
  • 满足法律法规和合规性要求
  • 确保业务连续性不中断
  • 提供测试和开发环境的数据源
  • 支持历史数据的归档需求

1.2 Oracle备份策略全景图

Oracle提供了多种备份方式,每种都有自己的特点和适用场景:

Oracle备份策略
物理备份
逻辑备份
冷备份
热备份
RMAN备份
Export/Import
Data Pump
SQL脚本
数据库完全关闭
拷贝所有数据文件
归档模式下
在线备份
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 AS
  CURSOR c_tablespaces IS
    SELECT 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 LOOP
    BEGIN
      -- 开始表空间备份
      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);
      
    EXCEPTION
      WHEN OTHERS THEN
        -- 确保即使出错也要结束备份模式
        BEGIN
          EXECUTE IMMEDIATE 'ALTER TABLESPACE ' || ts.tablespace_name || ' END BACKUP';
        EXCEPTION
          WHEN 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 ]; then
    echo "RMAN备份成功完成 - $(date)"
else
    echo "RMAN备份失败 - $(date)"
    exit 1
fi

2.3.4 RMAN备份策略图

RMAN备份策略
0级增量备份
1级增量备份
归档日志备份
每周日执行
完整数据备份
每日执行
仅备份变化块
每小时执行
保证恢复连续性
恢复基础
快速恢复

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 恢复场景分类

不同的故障需要不同的恢复策略:

Oracle恢复场景
完全恢复
不完全恢复
实例恢复
介质恢复
基于时间恢复
基于SCN恢复
基于日志序列恢复
实例异常关闭
自动恢复
数据文件损坏
需要备份恢复
恢复到指定时间点
恢复到指定SCN
恢复到指定日志

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架构

主数据库
Primary
备用数据库
Standby
在线事务处理
生成归档日志
日志传输
Log Transport
日志应用
Log Apply
数据同步
灾难恢复
读取负载均衡

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 备份策略设计原则

一个好的备份策略应该考虑以下因素:

备份策略设计
业务需求分析
技术实现
成本控制
RTO恢复时间目标
RPO恢复点目标
业务重要性
备份频率
备份类型
存储方式
存储成本
网络带宽
人力成本
备份方案
实施部署
监控维护

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';
EOF

echo "3-2-1备份完成 - $(date)"

结语
感谢您的阅读!期待您的一键三连!欢迎指正!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Guiat

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值