










数据库教程FGMT07‑Oracle数据库备份恢复与数据迁移
数据是业务系统最核心的资产,备份恢复是DBA岗位的底线能力。我是风哥,在大量生产项目实施中,硬件磁盘损坏、人为误删除数据、逻辑损坏等故障场景时有发生,一套完备的备份策略、熟练的恢复操作流程,是保障业务连续性的最后一道防线。风哥 itpux-com
本文基于Oracle19c单机非CDB数据库,硬件规格为单节点64G内存、8CPU,数据库实例与数据库名称fgedudb,业务操作用户fgedu,本地软件路径全部统一替换为/fgedudb。教程完整覆盖归档/非归档模式原理、冷备份、热备份、RMAN恢复管理器全套功能、完全恢复、不完全恢复、RMAN同机克隆、RMAN异机迁移、Data Pump(expdp/impdp)逻辑导入导出,配套大量可落地Shell、RMAN、SQL实战命令。区分物理备份与逻辑备份适用场景,讲解各类数据迁移方案选型,为容灾建设、数据库版本升级打下技术基础。
内容大纲:
Oracle备份分为物理备份与逻辑备份两大体系。
物理备份直接复制数据库底层物理文件(数据文件、控制文件、重做日志、参数文件),用于介质故障(磁盘损坏、存储硬件故障)场景灾难恢复;逻辑备份读取数据库逻辑对象,导出表、用户、元数据,适合误操作恢复、跨版本迁移、部分对象迁移。风哥教程 113257174
基线硬件规格64G内存、8CPU,实例
fgedudb关键spfile基线参数:
参数 参数值 说明 memory_target 48G 实例总内存,预留16G内存给操作系统 processes 2000 最大并发进程 undo_retention 900 undo保留时间,逻辑闪回依赖undo数据 parallel_max_servers 16 并行进程上限,适配8CPU硬件,备份并行通道参考该数值 db_recovery_file_dest_size 30G FRA快速恢复区,存放备份、归档、控制文件自动备份
归档日志依赖磁盘存储空间,归档磁盘被占满会直接挂起所有DML业务操作,生产环境必须持续监控归档磁盘使用率,配置备份清理策略。
SHUTDOWN IMMEDIATE干净关闭,所有数据文件处于一致性检查点SCN,操作系统拷贝全部物理文件。优点:操作简单,不需要特殊授权;缺点:必须停机,业务中断;仅在非归档模式可用。ASM存储环境下操作系统无法直接读取ASM磁盘文件,ASM环境不建议使用操作系统冷备份。网上搜索风哥教程可以学习全套数据库教程ALTER TABLESPACE ... BEGIN BACKUP;RMAN热备份自动处理检查点,不需要手动执行begin backup,生产环境优先选择RMAN。RMAN(Recovery Manager)是Oracle官方内置的物理备份工具,无需额外软件安装。风哥数据库教程 itpux-com
ALTER DATABASE OPEN RESETLOGS,重置数据库日志分支,不完全恢复结束立刻执行全新全库备份。| 迁移方案 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| RMAN DUPLICATE同机克隆 | 同一服务器创建测试副本库 | 物理块级别复制,速度快,完整保留索引约束 | db_name需要修改,磁盘存储资源消耗大 |
| RMAN异机恢复迁移 | 同版本Oracle完整数据库迁移 | 物理迁移速度快,完整数据一致性 | 源与目标Oracle大版本必须保持一致 |
| Data Pump expdp/impdp逻辑迁移 | 对象级迁移、跨大版本迁移、部分schema迁移 | 支持跨版本,可只迁移部分业务对象 | 大库导出导入耗时久,索引约束需要重建 |
RMAN DUPLICATE分为备份集方式复制、active database网络直接复制;active duplicate不需要本地保存备份集,通过网络直接从源库复制到目标auxiliary实例,适合机房网络带宽充足场景。
expdp导出、impdp导入,Oracle10g之后替代传统exp/imp工具。
REMAP_SCHEMA用户映射;REMAP_TABLESPACE表空间映射;CONTENT控制导出元数据/数据/全部对象。>重要提示:逻辑备份不能替代RMAN物理备份;逻辑备份适合迁移、误对象恢复,磁盘介质损坏场景,逻辑备份恢复速度远低于RMAN物理备份。
说明:操作系统RHEL7,硬件规格64GB内存,8核CPU;数据库实例
fgedudb,全部路径替换/fgedudb;oracle用户执行数据库操作,root负责操作系统目录;所有脚本务必先测试环境验证,生产执行前完成变更评审。
登录数据库
su - oracle
export ORACLE_BASE=/fgedudb/app
export ORACLE_HOME=/fgedudb/app/product/19.0.0/dbhome_1
export ORACLE_SID=fgedudb
sqlplus / as sysdba
查看当前归档模式
SELECT name,log_mode,open_mode FROM v$database;
如果当前为NOARCHIVELOG,切换为归档模式,需要停机进入mount阶段操作
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
ALTER SYSTEM ARCHIVE LOG START;
SELECT name,log_mode FROM v$database;
注意:ASM磁盘上文件操作系统cp无法直接访问,ASM环境禁止使用该方式,优先RMAN。
前提:数据库执行SHUTDOWN IMMEDIATE干净关闭;记录全部物理文件路径。
SELECT name FROM v$datafile;
SELECT name FROM v$controlfile;
SELECT member FROM v$logfile;
SELECT name FROM v$tempfile;
SHOW PARAMETER spfile;
操作系统创建冷备份存放目录
mkdir -p /fgedudb/backup/cold_fgedudb
chown oracle:oinstall /fgedudb/backup/cold_fgedudb
停机拷贝文件
sqlplus / as sysdba <<EOF
SHUTDOWN IMMEDIATE;
EOF
cp -rp /fgedudb/app/product/19.0.0/dbhome_1/dbs/* /fgedudb/backup/cold_fgedudb
#恢复冷备份操作:停机,拷贝回原路径,执行startup
sqlplus / as sysdba <<EOF
STARTUP;
EOF
进入rman连接本地目标库
rman target /
查看当前全部RMAN配置
SHOW ALL;
生产基线RMAN配置(64G/8CPU,磁盘备份,恢复窗口14天)
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 14 DAYS;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/fgedudb/backup/rman_fgedudb/%F.bkp';
CONFIGURE DEVICE TYPE DISK PARALLELISM 4 BACKUP TYPE TO COMPRESSED BACKUPSET;
CONFIGURE BACKUP OPTIMIZATION ON;
CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 2 TIMES TO DEVICE TYPE DISK;
创建备份存放操作系统目录
mkdir -p /fgedudb/backup/rman_fgedudb
chown oracle:oinstall /fgedudb/backup/rman_fgedudb
chmod 770 /fgedudb/backup/rman_fgedudb
RUN {
ALLOCATE CHANNEL ch1 DEVICE TYPE DISK FORMAT '/fgedudb/backup/rman_fgedudb/level0_%U.bkp';
ALLOCATE CHANNEL ch2 DEVICE TYPE DISK FORMAT '/fgedudb/backup/rman_fgedudb/level0_%U.bkp';
BACKUP AS COMPRESSED BACKUPSET TAG 'FULL_LEVEL0_FGEDUDB'
INCREMENTAL LEVEL 0 DATABASE PLUS ARCHIVELOG;
BACKUP CURRENT CONTROLFILE TAG 'CTL_LEVEL0_FGEDUDB' FORMAT '/fgedudb/backup/rman_fgedudb/ctl_%F.bkp';
RELEASE CHANNEL ch1;
RELEASE CHANNEL ch2;
}
RUN {
ALLOCATE CHANNEL ch1 DEVICE TYPE DISK FORMAT '/fgedudb/backup/rman_fgedudb/level1_%U.bkp';
ALLOCATE CHANNEL ch2 DEVICE TYPE DISK FORMAT '/fgedudb/backup/rman_fgedudb/level1_%U.bkp';
BACKUP AS COMPRESSED BACKUPSET TAG 'INC_LEVEL1_FGEDUDB'
INCREMENTAL LEVEL 1 DATABASE PLUS ARCHIVELOG;
RELEASE CHANNEL ch1;
RELEASE CHANNEL ch2;
}
CROSSCHECK BACKUP;
CROSSCHECK ARCHIVELOG ALL;
DELETE OBSOLETE;
DELETE EXPIRED BACKUP;
LIST BACKUP SUMMARY;
LIST CONTROLFILE BACKUP;
REPORT OBSOLETE;
场景:某个数据文件介质损坏,mount状态执行restore、recover
rman target /
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
RESTORE DATABASE;
RECOVER DATABASE;
ALTER DATABASE OPEN;
单数据文件损坏,数据库保持open,仅将损坏数据文件offline后恢复
ALTER DATABASE DATAFILE 5 OFFLINE;
RESTORE DATAFILE 5;
RECOVER DATAFILE 5;
ALTER DATABASE DATAFILE 5 ONLINE;
重要注意:不完全恢复完成必须open resetlogs,生成新数据库分支;恢复成功立刻重新执行一次全库备份。
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
RESTORE DATABASE;
#按时间点恢复示例,也可以使用UNTIL SCN
RECOVER DATABASE UNTIL TIME "TO_DATE('2026‑09‑05 14:30:00','yyyy‑mm‑dd hh24:mi:ss')";
ALTER DATABASE OPEN RESETLOGS;
同服务器,源库fgedudb,克隆目标SID:fgedudb_clone。
cp /fgedudb/app/product/19.0.0/dbhome_1/dbs/initfgedudb.ora /fgedudb/app/product/19.0.0/dbhome_1/dbs/initfgedudb_clone.ora
export ORACLE_SID=fgedudb_clone
sqlplus / as sysdba <<EOF
STARTUP NOMOUNT PFILE='/fgedudb/app/product/19.0.0/dbhome_1/dbs/initfgedudb_clone.ora';
EOF
export ORACLE_SID=fgedudb
rman target sys/Sys@Fgedu123@fgedudb auxiliary /
DUPLICATE DATABASE fgedudb TO fgedudb_clone
DB_FILE_NAME_CONVERT=('+DATA/fgedudb','+DATA/fgedudb_clone')
LOGFILE
GROUP 1 ('+DATA/fgedudb_clone/redo01.log') SIZE 2048M,
GROUP 2 ('+DATA/fgedudb_clone/redo02.log') SIZE 2048M,
GROUP 3 ('+DATA/fgedudb_clone/redo03.log') SIZE 2048M;
前置条件:目标服务器安装完全相同版本Oracle19c软件;源库全部RMAN备份片、控制文件备份拷贝到目标服务器
/fgedudb/backup/rman_fgedudb。
目标服务器操作:
su - oracle
export ORACLE_BASE=/fgedudb/app
export ORACLE_HOME=/fgedudb/app/product/19.0.0/dbhome_1
export ORACLE_SID=fgedudb
rman target /
SET DBID=1567894321;
STARTUP NOMOUNT;
#从备份片恢复spfile
RESTORE SPFILE FROM '/fgedudb/backup/rman_fgedudb/<spfile备份文件名>.bkp';
SHUTDOWN;
STARTUP NOMOUNT;
#恢复控制文件
RESTORE CONTROLFILE FROM '/fgedudb/backup/rman_fgedudb/<控制文件备份>.bkp';
ALTER DATABASE MOUNT;
#注册磁盘上全部备份集
CATALOG START WITH '/fgedudb/backup/rman_fgedudb/';
#重定向数据文件路径,如果存储路径发生变化
SET NEWNAME FOR DATABASE TO '+DATA/fgedudb';
RESTORE DATABASE;
SWITCH DATAFILE ALL;
RECOVER DATABASE;
ALTER DATABASE OPEN RESETLOGS;
操作系统创建dump存放目录
mkdir -p /fgedudb/backup/dpump_fgedudb
chown oracle:oinstall /fgedudb/backup/dpump_fgedudb
chmod 770 /fgedudb/backup/dpump_fgedudb
sqlplus创建数据库DIRECTORY目录对象,授权
CREATE OR REPLACE DIRECTORY DUMP_FGEDUDB AS '/fgedudb/backup/dpump_fgedudb';
GRANT READ,WRITE ON DIRECTORY DUMP_FGEDUDB TO fgedu;
GRANT READ,WRITE ON DIRECTORY DUMP_FGEDUDB TO system;
expdp system/Sys@Fgedu123@fgedudb \
DIRECTORY=DUMP_FGEDUDB \
DUMPFILE=schema_fgedu_%U.dmp \
LOGFILE=exp_schema_fgedu.log \
SCHEMAS=fgedu \
PARALLEL=4 \
COMPRESSION=ALL
expdp system/Sys@Fgedu123@fgedudb \
DIRECTORY=DUMP_FGEDUDB \
DUMPFILE=table_fgedu.dmp \
LOGFILE=exp_table_fgedu.log \
TABLES=fgedu.fgedu_dept,fgedu.fgedu_emp \
PARALLEL=2
expdp system/Sys@Fgedu123@fgedudb \
DIRECTORY=DUMP_FGEDUDB \
DUMPFILE=full_fgedudb_%U.dmp \
LOGFILE=exp_full_fgedudb.log \
FULL=YES \
PARALLEL=4
impdp system/Sys@Fgedu123@fgedudb \
DIRECTORY=DUMP_FGEDUDB \
DUMPFILE=schema_fgedu_%U.dmp \
LOGFILE=imp_schema_fgedu.log \
REMAP_SCHEMA=fgedu:fgedu_bak \
PARALLEL=4 \
TABLE_EXISTS_ACTION=SKIP
impdp system/Sys@Fgedu123@fgedudb \
DIRECTORY=DUMP_FGEDUDB \
DUMPFILE=schema_fgedu_%U.dmp \
LOGFILE=imp_meta.log \
SCHEMAS=fgedu \
CONTENT=METADATA_ONLY
/fgedudb/soft/rman_check_fgedudb.sh#!/bin/bash
export ORACLE_BASE=/fgedudb/app
export ORACLE_HOME=/fgedudb/app/product/19.0.0/dbhome_1
export ORACLE_SID=fgedudb
export PATH=$ORACLE_HOME/bin:$PATH
echo "====================数据库归档模式检查===================="
sqlplus -S / as sysdba <<EOF
set linesize 140 pagesize 80
SELECT name,log_mode,open_mode FROM v\$database;
SELECT sequence#,first_time,next_time FROM v\$archived_log ORDER BY sequence# DESC FETCH FIRST 10 ROWS ONLY;
EOF
echo "====================RMAN备份清单校验===================="
rman target / log=/fgedudb/soft/rman_list.log <<EOF
LIST BACKUP SUMMARY;
CROSSCHECK BACKUP;
EOF
cat /fgedudb/soft/rman_list.log
echo "====================FRA快速恢复区使用率===================="
sqlplus -S / as sysdba <<EOF
set linesize 140 pagesize 80
SELECT file_type,percent_space_used,percent_space_reclaimable FROM v\$flash_recovery_area_usage;
EOF
echo "====================监听状态===================="
lsnrctl status
赋予执行权限
chmod +x /fgedudb/soft/rman_check_fgedudb.sh
./fgedudb/soft/rman_check_fgedudb.sh
有备份不等于可以恢复,一份没有经过恢复演练的备份,不能算作有效备份。我是风哥,在多年项目实施过程中,见过大量生产环境备份脚本每日正常输出日志,但真正故障发生时,才发现备份片损坏、归档缺失、保留策略配置错误,备份完全不可用。风哥 itpux-com
本文基于硬件规格64G内存、8CPU的Oracle19c单机实例,全部路径替换为/fgedudb,数据库实例fgedudb,业务用户fgedu。完整覆盖归档模式原理、冷备份热备份、RMAN物理备份、完全恢复、不完全恢复、RMAN同机克隆、异机迁移、Data Pump数据泵逻辑导入导出,配套备份巡检自动化脚本。
生产实践必须牢记以下核心关键点:
ARCHIVELOG归档模式,NOARCHIVELOG模式仅限测试环境;归档磁盘必须纳入监控告警;CONTROLFILE AUTOBACKUP,合理配置备份恢复窗口保留策略,定期执行crosscheck校验备份介质有效性;open resetlogs之后,数据库开启全新日志分支,必须立刻执行全新全库备份,旧备份不再适合该分支恢复;网上搜索风哥教程可以学习全套数据库教程备份恢复属于DBA底线能力,不能只复制脚本执行,要理解备份、还原、恢复整套完整逻辑。后续RAC集群备份恢复、ADG容灾环境备份、磁带库介质备份、跨字节序XTTS迁移都是建立在这套知识之上。运维人员不仅要会写备份脚本,更要模拟各类故障场景演练恢复流程,才可以从容应对真实生产的数据故障。风哥数据库教程 itpux-com
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。