Oracle数据库备份分为逻辑备份(导出数据结构与内容)和物理备份(备份数据文件、控制文件等底层文件),以下是常用方法的实战步骤:
逻辑备份适合需要迁移数据、选择性恢复表或用户的场景,支持增量备份和压缩。
-- 创建目录对象(路径需存在且有写入权限)
CREATE OR REPLACE DIRECTORY DATA_PUMP_DIR AS '/u01/oracle/dumpfiles';
-- 授权用户访问目录(如system用户)
GRANT READ, WRITE ON DIRECTORY DATA_PUMP_DIR TO system;
expdp system/password@ORCL directory=DATA_PUMP_DIR dumpfile=full_backup.dmp logfile=expdp_full.log full=y
参数说明:full=y表示全库备份;directory指定备份目录;dumpfile定义备份文件名;logfile记录操作日志。SCHEMAS=SCOTT参数;若需覆盖现有对象,添加TABLE_EXISTS_ACTION=REPLACE。RMAN是Oracle官方推荐的物理备份工具,支持增量备份、压缩和归档日志备份,适合数据库级恢复。
-- 关闭数据库
SHUTDOWN IMMEDIATE;
-- 启动到MOUNT状态
STARTUP MOUNT;
-- 开启归档模式
ALTER DATABASE ARCHIVELOG;
-- 打开数据库
ALTER DATABASE OPEN;
验证归档模式:ARCHIVE LOG LIST;(显示“Database log mode: Archive Mode”即为成功)。rman target /
RUN {
ALLOCATE CHANNEL ch1 DEVICE TYPE DISK;
BACKUP DATABASE PLUS ARCHIVELOG; -- 备份数据库+归档日志
BACKUP CURRENT CONTROLFILE; -- 备份控制文件
RELEASE CHANNEL ch1;
}
EXIT;
参数说明:PLUS ARCHIVELOG包含归档日志,确保恢复到指定时间点;BACKUP CONTROLFILE备份控制文件(恢复必需)。/u01/oracle/backup_rman.sh):#!/bin/bash
export ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1
export ORACLE_SID=ORCL
export PATH=$ORACLE_HOME/bin:$PATH
rman target / <<EOF
RUN {
BACKUP DATABASE PLUS ARCHIVELOG FORMAT '/u01/oracle/physical_backup/full_%d_%T_%s.bak';
BACKUP CONTROLFILE FORMAT '/u01/oracle/physical_backup/controlfile_%d_%T.bak';
}
EXIT;
EOF
添加cron任务(每天凌晨2点执行):crontab -e
# 添加以下行
0 2 * * * /u01/oracle/backup_rman.sh
find /u01/oracle/physical_backup -name "*.bak" -mtime +30 -exec rm -f {} \;
适用于需要快速备份整个数据库目录的场景(如迁移环境),但无法实现增量备份,需在数据库关闭状态下操作。
# 备份数据库文件(假设数据目录为/u01/oracle/oradata/ORCL)
tar -zcvf /u01/oracle/fs_backup/oradata_backup.tar.gz /u01/oracle/oradata/ORCL
# 恢复数据库文件(需关闭数据库)
tar -zxvf /u01/oracle/fs_backup/oradata_backup.tar.gz -C /
# 启动数据库
sqlplus / as sysdba <<EOF
STARTUP;
EXIT;
EOF
恢复操作需根据数据丢失类型(如误删除、文件损坏、数据库崩溃)选择对应方法:
适用于逻辑备份丢失、表数据误删除或需要迁移数据的场景。
impdp system/password@ORCL directory=DATA_PUMP_DIR dumpfile=full_backup.dmp logfile=impdp_full.log full=y
SCHEMAS=SCOTT;TABLE_EXISTS_ACTION=REPLACE;DIRECTORY=NEW_DUMP_DIR(需提前创建并授权)。rman target /
RUN {
RESTORE DATABASE; -- 恢复所有数据文件
RECOVER DATABASE; -- 应用归档日志和重做日志
ALTER DATABASE OPEN; -- 打开数据库
}
EXIT;
若控制文件损坏(如control01.ctl丢失),需通过备份恢复:
rman target /
RUN {
SET NEWNAME FOR CONTROLFILE TO '/u01/oracle/oradata/ORCL/control01.ctl'; -- 指定新路径
RESTORE CONTROLFILE FROM '/u01/oracle/physical_backup/controlfile_ORCL_20250920.bak'; -- 从备份恢复
ALTER DATABASE MOUNT; -- 挂载数据库
RECOVER DATABASE USING BACKUP CONTROLFILE; -- 使用备份控制文件恢复
ALTER DATABASE OPEN RESETLOGS; -- 重置日志(必须步骤)
}
EXIT;
适用于误删除数据、误更新表或数据库崩溃(需开启闪回功能),恢复速度快且无需备份。
-- 开启归档模式(若未开启)
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
-- 开启闪回
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE FLASHBACK ON;
-- 验证闪回状态
SELECT flashback_on FROM v$database; -- 显示"YES"即为成功
-- 检查闪回时间范围(确认可恢复的时间窗口)
SELECT OLDEST_FLASHBACK_SCN, OLDEST_FLASHBACK_TIME FROM V$FLASHBACK_DATABASE_LOG;
-- 执行闪回(恢复到2025-09-20 10:00:00)
FLASHBACK DATABASE TO TIMESTAMP TO_TIMESTAMP('2025-09-20 10:00:00', 'YYYY-MM-DD HH24:MI:SS');
-- 打开数据库(需重置日志)
ALTER DATABASE OPEN RESETLOGS;
若数据库因控制文件、数据文件严重损坏或DROP TABLE/TRUNCATE TABLE无法启动,可使用ODU(Oracle Database Unloader)工具从数据文件中提取数据。
wget https://example.com/odu_linux_x86.tar.gz # 替换为实际下载链接
tar -xvf odu_linux_x86.tar.gz
chown -R oracle:oinstall odu
cd odu
CREATE TABLESPACE odu_ts DATAFILE '/u01/oradata/ORCL/odu_ts.dbf' SIZE 100M;
CREATE USER odu_user IDENTIFIED BY odu_password DEFAULT TABLESPACE odu_ts QUOTA UNLIMITED ON odu_ts;
GRANT CONNECT, RESOURCE TO odu_user;
./odudmp username/password@ORCL tablespaces=odu_ts output=/u01/recovered_data
impdp或SQL*Loader导入数据库。impdp导入逻辑备份,用RMAN恢复物理备份),避免备份失效。oracle用户(或具有SYSDBA权限的用户),确保目录权限正确(oracle:oinstall拥有读写权限)。ALTER SYSTEM SET RETENTION_TARGET=2880 SCOPE=BOTH;调整为8小时)。