CentOS 上 SQL*Plus 备份与恢复实用技巧
一、适用场景与总体思路
- 在 CentOS 环境中,SQL*Plus 主要负责逻辑层面的备份与恢复(如用户/表/数据泵导出导入),物理层面(数据文件、控制文件、归档日志)建议使用 RMAN 或操作系统拷贝配合日志应用。
- 逻辑备份恢复常用工具:expdp/impdp(Data Pump),配合 SQL*Plus 做前置准备(目录对象、用户、表空间)与后置校验。
- 物理恢复(介质故障、数据文件损坏)以 RMAN 为主;在 非归档模式 下通常只能做“还原到上次全备”的时点恢复,且联机重做日志无法前滚,需谨慎评估数据丢失风险。
二、逻辑备份与恢复步骤(SQL*Plus + Data Pump)
- 前置准备(SQL*Plus)
- 创建目录对象并赋权(指向操作系统备份目录):
- create or replace directory expdata as ‘/home/oracle/backup’;
- grant read, write on directory expdata to system;
- 如需导入到新用户/新库,提前建好 tablespace、user 并授权:
- create tablespace tbs_data datafile ‘/u01/oradata/…/tbs_data01.dbf’ size 1G autoextend on;
- create user appuser identified by *** default tablespace tbs_data;
- grant connect, resource, dba to appuser;
- 备份(Data Pump,命令行执行)
- 全库:expdp system/*** directory=expdata dumpfile=full_$(date +%F).dmp full=y logfile=full_$(date +%F).log
- 按用户:expdp system/*** directory=expdata schemas=appuser dumpfile=app_$(date +%F).dmp logfile=app_$(date +%F).log
- 恢复(Data Pump,命令行执行)
- 按用户导入:impdp system/*** directory=expdata dumpfile=app_2025-12-07.dmp logfile=imp_app_2025-12-07.log
- 跨用户迁移:impdp system/*** directory=expdata dumpfile=app.dmp remap_schema=appuser:appuser_new logfile=imp_remap.log
- 表已存在处理:在导入命令中增加 table_exists_action=truncate|replace|skip(如仅导入增量或重跑,常用 truncate)
- 实用提示
- 备份/恢复前确保目录对象指向的 操作系统路径 存在且 oracle:oinstall 可写。
- 导入大量对象时建议加 parallel 参数提升速度;导入后核对 logfile 中的错误与统计信息。
三、物理备份与恢复要点(RMAN 为主,SQL*Plus 配合)
- 适用场景:数据文件、控制文件、整个实例级别的恢复;要求数据库处于 归档模式 以实现 完全恢复。
- 基本流程(RMAN)
- 全库备份:RMAN> backup database plus archivelog delete input;
- 丢失数据文件/表空间:RMAN> restore datafile <file#|name>; RMAN> recover datafile <file#|name>;
- 丢失控制文件:RMAN> restore controlfile from ‘’; RMAN> alter database mount; RMAN> recover database;
- 打开数据库:RMAN> alter database open resetlogs;(按实际是否需要 resetlogs 执行)
- 非归档模式的限制
- 只能还原到最近一次全备的“一致性点”,无法前滚联机日志,会丢失最后一次备份之后的所有变更;必要时需重建控制文件并 clear logfile group。
- SQL*Plus 辅助
- 恢复前后常用视图核对:
- v$recover_file(需恢复的数据文件)
- v$recovery_log(恢复所需重做/归档日志)
- v$archived_log(已归档日志)
- 打开数据库:SQL> alter database open;(或按 RMAN 提示执行)。
四、自动化与日常运维建议
- 定时全备脚本(示例)
- 目录与环境:/home/oracle/backup;在 oracle 用户下执行;确保 expdp 在 $ORACLE_HOME/bin。
- 示例脚本:
- #!/bin/bash
export DATA_DIR=“/home/oracle/backup”
BAKUP_TIME=$(date +%F)
$ORACLE_HOME/bin/expdp system/*** directory=expdata dumpfile=full_${BAKUP_TIME}.dmp full=y logfile=full_${BAKUP_TIME}.log
find ${DATA_DIR} -name “.dmp" -mtime +7 -delete
find ${DATA_DIR} -name ".log” -mtime +30 -delete
- 加入 crontab(每天 02:00):0 2 * * * /home/oracle/backup/backup.sh
- 目录与权限
- 备份目录提前创建并赋权:mkdir -p /home/oracle/backup; chown -R oracle:oinstall /home/oracle/backup
- 校验与演练
- 定期在测试环境做 导入验证 与 恢复演练;保留 至少 2–7 天 的备份并异地/离线存放一份。