Ubuntu 上备份 Oracle 数据库的实用方案
在 Ubuntu 上,常用且可靠的备份方式包括 RMAN 物理备份、Data Pump 逻辑导出 与 文件系统级拷贝。下面给出可直接落地的步骤与脚本,涵盖环境准备、备份、验证与自动化。
一、备份方式总览与选择
| 方式 | 适用场景 | 优点 | 局限 |
|---|---|---|---|
| RMAN 物理备份 | 生产库、需要时间点恢复、最小化停机 | 支持全量/增量、可联机备份、恢复快 | 需数据库处于 归档模式,对存储与运维要求更高 |
| Data Pump 逻辑导出 | 迁移/开发/部分对象恢复、跨平台 | 灵活按用户/表/模式导出,便于移植 | 停机时间取决于导出规模,非块级一致性 |
| 文件系统级拷贝 | 无法使用 RMAN 的应急场景 | 简单直接 | 需停库或保证一致性,恢复复杂、风险高 |
二、RMAN 物理备份步骤
su - oraclesqlplus / as sysdba → archive log list;shutdown immediate;
startup mount;
alter database archivelog;
alter database open;
rman target /
RMAN> run {
allocate channel c1 type disk;
allocate channel c2 type disk;
backup filesperset 3
database format '/oracle/backup/full_%d_%T_%s_%p';
sql 'alter system archive log current';
backup archivelog all
format '/oracle/backup/arch_%d_%T_%s_%p' delete input;
backup current controlfile
format '/oracle/backup/ctl_%d_%T_%s_%p';
backup spfile
format '/oracle/backup/spfile_%d_%T_%s_%p';
}
RMAN> list backup;
RMAN> restore database validate;
BACKUP DATABASE INCREMENTAL LEVEL 1 PLUS ARCHIVELOG;BACKUP ARCHIVELOG ALL DELETE INPUT;BACKUP CURRENT CONTROLFILE;三、Data Pump 逻辑备份步骤
mkdir -p /data/exp_dir
chmod 775 /data/exp_dir
sqlplus / as sysdba
SQL> create directory exp_dir as '/data/exp_dir';
SQL> grant read, write on directory exp_dir to system;
expdp system/oracle@orcl \
directory=exp_dir \
dumpfile=full_backup.dmp \
logfile=expdp_full.log \
full=y
expdp system/oracle@orcl \
directory=exp_dir \
dumpfile=scott.dmp \
logfile=expdp_scott.log \
schemas=scott
expdp system/oracle@orcl \
directory=exp_dir \
dumpfile=emp_tab.dmp \
logfile=expdp_emp.log \
tables=scott.emp
impdp system/oracle@orcl \
directory=exp_dir \
dumpfile=full_backup.dmp \
logfile=impdp_full.log \
full=y
impdp system/oracle@orcl \
directory=exp_dir \
dumpfile=scott.dmp \
logfile=impdp_scott.log \
schemas=scott
Data Pump 适合跨平台迁移与按对象恢复,命令语法在 Linux/Ubuntu 与 Windows 上基本一致。
四、自动化与保留策略
rman target /
RMAN> configure retention policy to recovery window of 7 days;
RMAN> report obsolete;
RMAN> delete noprompt obsolete;
rman target / nocatalog log=/tmp/rman_del_arch.log append <<'EOF'
run {
allocate channel for maintenance type disk;
crosscheck archivelog all;
delete noprompt archivelog until time 'sysdate-1';
}
EOF
#!/bin/bash
export ORACLE_SID=orcl
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
export PATH=$ORACLE_HOME/bin:$PATH
BACKUP_DIR=/oracle/backup
LOG_DIR=/oracle/backup/logs
mkdir -p $BACKUP_DIR $LOG_DIR
rman target / nocatalog log=$LOG_DIR/rman_$(date +%F).log <<'EOF'
run {
allocate channel c1 type disk;
allocate channel c2 type disk;
backup filesperset 3
database format '${BACKUP_DIR}/full_%d_%T_%s_%p';
sql 'alter system archive log current';
backup archivelog all
format '${BACKUP_DIR}/arch_%d_%T_%s_%p' delete input;
backup current controlfile
format '${BACKUP_DIR}/ctl_%d_%T_%s_%p';
backup spfile
format '${BACKUP_DIR}/spfile_%d_%T_%s_%p';
}
EOF
# 删除过期备份(按保留策略)
rman target / nocatalog log=$LOG_DIR/rman_del_$(date +%F).log <<'EOF'
run {
allocate channel for maintenance type disk;
crosscheck backup;
crosscheck archivelog all;
delete noprompt obsolete;
}
EOF
crontab -e
# 每天 02:30 全备
30 2 * * * /bin/bash /oracle/backup/rman_full.sh
五、恢复要点与快速校验
rman target /
RMAN> shutdown immediate;
RMAN> startup mount;
RMAN> restore database;
RMAN> recover database;
RMAN> alter database open;
如控制文件/归档丢失,可先 RESTORE CONTROLFILE FROM '/path/ctl_*.bkp'; 再恢复。impdp system/oracle@orcl \
directory=exp_dir \
dumpfile=full_backup.dmp \
logfile=impdp_full.log \
full=y
sqlplus / as sysdba
SQL> select count(*) from dba_objects;
恢复前务必确认备份集完整可用,恢复过程中避免对原始数据造成二次破坏。