2026年CentOS上SQLPlus数据库备份方法完全指南(2026)

一、SQLPlus备份概述

1.1 什么是SQLPlus?

SQLPlus是Oracle数据库官方命令行工具,用于连接、管理和操作Oracle数据库。在CentOS服务器运维中,SQLPlus是执行数据库备份的核心工具之一,支持逻辑备份(exp/expdp)和物理备份(RMAN)。

1.2 备份方式分类

备份方式 工具 类型 特点 适用场景
逻辑备份 exp/imp 传统导出 简单但功能有限 小型数据库、单表导出
逻辑备份 expdp/impdp 数据泵 高性能、功能丰富 中大型数据库、迁移
物理备份 RMAN 专用工具 支持增量备份、恢复 生产环境、关键业务
物理备份 冷备份 手动复制 需停库 维护窗口期
快照备份 存储级 LVM/存储 速度快、依赖存储 虚拟化环境

二、环境准备

2.1 安装SQLPlus客户端

# 下载Oracle Instant Client
cd /tmp
wget https://download.oracle.com/otn_software/linux/instantclient/2115000/oracle-instantclient-basic-21.15.0.0.0-1.el8.x86_64.rpm
wget https://download.oracle.com/otn_software/linux/instantclient/2115000/oracle-instantclient-sqlplus-21.15.0.0.0-1.el8.x86_64.rpm

# 安装
yum install -y oracle-instantclient-basic-21.15.0.0.0-1.el8.x86_64.rpm
yum install -y oracle-instantclient-sqlplus-21.15.0.0.0-1.el8.x86_64.rpm

# 配置环境变量
echo 'export ORACLE_HOME=/usr/lib/oracle/21/client64' >> ~/.bashrc
echo 'export PATH=$PATH:$ORACLE_HOME/bin' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=$ORACLE_HOME/lib' >> ~/.bashrc
source ~/.bashrc

# 验证安装
sqlplus -version

2.2 配置数据库连接

# 创建tnsnames.ora
mkdir -p $ORACLE_HOME/network/admin
cat > $ORACLE_HOME/network/admin/tnsnames.ora << 'EOF'
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )
EOF

# 测试连接
sqlplus username/password@ORCL

三、传统逻辑备份(exp/imp)

3.1 全库导出

# 全库导出
exp username/password@ORCL file=/backup/full_export.dmp log=/backup/full_export.log full=y

# 按用户导出
exp username/password@ORCL file=/backup/user_export.dmp log=/backup/user_export.log owner=scott

# 按表导出
exp username/password@ORCL file=/backup/table_export.dmp log=/backup/table_export.log tables=emp,dept

3.2 常用exp参数

参数 说明 示例
full 全库导出 full=y
owner 按用户导出 owner=scott,hr
tables 按表导出 tables=emp,dept
query 条件导出 query=”where deptno=10″
compress 压缩导出 compress=y
consistent 一致性读 consistent=y
direct 直接路径 direct=y
rows 是否导出数据 rows=n(仅导出结构)

3.3 数据导入

# 全库导入
imp username/password@ORCL file=/backup/full_export.dmp log=/backup/full_import.log full=y

# 按用户导入(从A用户导入到B用户)
imp username/password@ORCL file=/backup/user_export.dmp log=/backup/import.log fromuser=scott touser=hr

# 仅导入表结构
imp username/password@ORCL file=/backup/table_export.dmp log=/backup/import.log rows=n

四、数据泵备份(expdp/impdp)— 推荐方式

4.1 创建目录对象

-- 以DBA身份登录
sqlplus / as sysdba

-- 创建备份目录
CREATE DIRECTORY backup_dir AS '/backup/oracle';
GRANT READ, WRITE ON DIRECTORY backup_dir TO scott;
GRANT READ, WRITE ON DIRECTORY backup_dir TO hr;

-- 查看目录
SELECT * FROM dba_directories;

4.2 全库导出

# 全库导出(并行4个worker)
expdp username/password@ORCL directory=backup_dir dumpfile=full_%U.dmp logfile=full_export.log full=y parallel=4

# 按Schema导出
expdp username/password@ORCL directory=backup_dir dumpfile=schema_%U.dmp logfile=schema_export.log schemas=scott,hr parallel=4

# 按表导出
expdp username/password@ORCL directory=backup_dir dumpfile=table_%U.dmp logfile=table_export.log tables=scott.emp,scott.dept

4.3 增量导出

# 首次全量导出
expdp username/password@ORCL directory=backup_dir dumpfile=full_incr_%U.dmp logfile=full_incr.log full=y parallel=4

# 增量导出(仅导出变化的数据)
expdp username/password@ORCL directory=backup_dir dumpfile=incr_%U.dmp logfile=incr_export.log full=y parallel=4 content=DATA_ONLY

4.4 数据泵导入

# 全库导入
impdp username/password@ORCL directory=backup_dir dumpfile=full_%U.dmp logfile=full_import.log full=y parallel=4

# Schema重映射(从scott导入到hr)
impdp username/password@ORCL directory=backup_dir dumpfile=schema_%U.dmp logfile=remap_import.log remap_schema=scott:hr

# 表重映射
impdp username/password@ORCL directory=backup_dir dumpfile=table_%U.dmp logfile=remap_import.log remap_table=scott.emp:hr.employees

# 仅导入元数据(表结构)
impdp username/password@ORCL directory=backup_dir dumpfile=full_%U.dmp logfile=metadata_import.log content=METADATA_ONLY

五、RMAN物理备份

5.1 配置RMAN

# 进入RMAN
rman target /

# 配置备份参数
RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
RMAN> CONFIGURE BACKUP OPTIMIZATION ON;
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/backup/rman/ctl_%F';
RMAN> CONFIGURE DEVICE TYPE DISK PARALLELISM 4;
RMAN> CONFIGURE CHANNEL 1 DEVICE TYPE DISK FORMAT '/backup/rman/full_%U';
RMAN> CONFIGURE CHANNEL 2 DEVICE TYPE DISK FORMAT '/backup/rman/full_%U';

5.2 全库备份

# 全库备份(含归档日志)
RMAN> BACKUP DATABASE PLUS ARCHIVELOG;

# 全库备份到指定路径
RMAN> BACKUP AS COMPRESSED BACKUPSET DATABASE FORMAT '/backup/rman/full_%U' TAG 'FULL_BACKUP';

5.3 增量备份

# 增量备份级别0(相当于全量)
RMAN> BACKUP INCREMENTAL LEVEL 0 DATABASE FORMAT '/backup/rman/incr0_%U' TAG 'INCR_LEVEL0';

# 增量备份级别1(累积增量)
RMAN> BACKUP INCREMENTAL LEVEL 1 CUMULATIVE DATABASE FORMAT '/backup/rman/incr1_%U' TAG 'INCR_LEVEL1';

# 增量备份级别1(差异增量)
RMAN> BACKUP INCREMENTAL LEVEL 1 DATABASE FORMAT '/backup/rman/incr1_diff_%U' TAG 'INCR_LEVEL1_DIFF';

5.4 恢复操作

# 恢复数据库
RMAN> SHUTDOWN IMMEDIATE;
RMAN> STARTUP MOUNT;
RMAN> RESTORE DATABASE;
RMAN> RECOVER DATABASE;
RMAN> ALTER DATABASE OPEN RESETLOGS;

# 恢复特定表空间
RMAN> SQL 'ALTER TABLESPACE users OFFLINE';
RMAN> RESTORE TABLESPACE users;
RMAN> RECOVER TABLESPACE users;
RMAN> SQL 'ALTER TABLESPACE users ONLINE';

六、自动化备份脚本

6.1 全量备份脚本

#!/bin/bash
# /opt/scripts/oracle_backup.sh
# Oracle数据库自动化备份脚本

# 配置变量
ORACLE_SID="orcl"
ORACLE_HOME="/u01/app/oracle/product/21c/dbhome_1"
BACKUP_DIR="/backup/oracle"
DATE=$(date +%Y%m%d_%H%M%S)
LOG_FILE="$BACKUP_DIR/backup_${DATE}.log"
RETENTION_DAYS=7

# 设置环境变量
export ORACLE_SID ORACLE_HOME
export PATH=$ORACLE_HOME/bin:$PATH

# 创建备份目录
mkdir -p $BACKUP_DIR

# 执行数据泵全库导出
echo "$(date): 开始全库备份..." >> $LOG_FILE
expdp system/your_password@ORCL directory=backup_dir \
  dumpfile=full_${DATE}_%U.dmp \
  logfile=full_${DATE}.log \
  full=y \
  parallel=4 \
  compression=ALL \
  >> $LOG_FILE 2>&1

# 检查备份是否成功
if [ $? -eq 0 ]; then
    echo "$(date): 全库备份成功" >> $LOG_FILE
else
    echo "$(date): 全库备份失败!" >> $LOG_FILE
    # 发送告警邮件
    echo "Oracle全库备份失败,请检查日志:$LOG_FILE" | mail -s "Oracle备份告警" admin@example.com
    exit 1
fi

# 删除过期备份
find $BACKUP_DIR -name "full_*.dmp" -mtime +$RETENTION_DAYS -delete
find $BACKUP_DIR -name "full_*.log" -mtime +$RETENTION_DAYS -delete
echo "$(date): 已清理${RETENTION_DAYS}天前的备份" >> $LOG_FILE

6.2 添加Cron定时任务

# 每天凌晨2点执行全库备份
0 2 * * * /opt/scripts/oracle_backup.sh

# 每周日凌晨1点执行RMAN全量备份
0 1 * * 0 /opt/scripts/rman_backup.sh

# 每小时备份归档日志
0 * * * * /opt/scripts/archive_backup.sh

七、备份验证与恢复测试

7.1 验证备份完整性

# 验证expdp备份
impdp username/password@ORCL directory=backup_dir dumpfile=full_20260512_%U.dmp logfile=verify.log sqlfile=verify.sql content=METADATA_ONLY

# 验证RMAN备份
RMAN> VALIDATE BACKUPSET <backup_set_id>;
RMAN> RESTORE DATABASE VALIDATE;
RMAN> RESTORE ARCHIVELOG ALL VALIDATE;

7.2 定期恢复测试

# 在测试环境恢复数据库
# 1. 创建测试数据库实例
# 2. 执行RMAN恢复
RMAN> DUPLICATE TARGET DATABASE TO testdb BACKUPLOCATION '/backup/rman';

# 3. 验证数据完整性
sqlplus / as sysdba
SQL> SELECT count(*) FROM scott.emp;
SQL> SELECT count(*) FROM hr.employees;

八、备份安全与最佳实践

8.1 安全措施

  1. 加密备份
# expdp加密导出
expdp username/password@ORCL directory=backup_dir dumpfile=encrypted_%U.dmp \
  encryption=all encryption_mode=dual encryption_password=YourStrongPassword123 \
  full=y parallel=4
  1. 异地备份
# 使用rsync同步到远程服务器
rsync -avz --delete /backup/oracle/ backup-server:/backup/oracle/
  1. 访问控制
# 限制备份目录权限
chmod 700 /backup/oracle
chown oracle:oinstall /backup/oracle

8.2 最佳实践

  • 3-2-1原则:3份备份、2种介质、1份异地
  • 定期验证:每月至少验证一次备份可恢复性
  • 自动化:使用脚本+Cron实现无人值守备份
  • 监控告警:备份失败时及时通知运维人员
  • 保留策略:根据业务需求制定合理的保留周期
  • 文档化:记录所有备份策略和恢复流程

九、常见问题与解决方案

Q1:expdp导出报错ORA-39002?

A:检查目录对象权限是否正确:

GRANT READ, WRITE ON DIRECTORY backup_dir TO username;

Q2:RMAN备份占用磁盘空间过大?

A
1. 启用压缩:BACKUP AS COMPRESSED BACKUPSET DATABASE;
2. 定期删除过期备份:RMAN> DELETE EXPIRED BACKUP;
3. 配置保留策略:CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;

Q3:SQLPlus连接报错ORA-12154?

A
1. 检查tnsnames.ora配置是否正确
2. 确认TNS_ADMIN环境变量指向正确的目录
3. 使用tnsping ORCL测试连接

Q4:大数据量备份速度慢?

A
1. 增加并行度:parallel=8
2. 使用直接路径导出:expdp ... access_method=direct_path
3. 启用压缩减少I/O:compression=ALL
4. 备份到高速存储设备

十、总结

在CentOS上使用SQLPlus进行Oracle数据库备份需要根据业务需求选择合适的备份方式:

  1. 小型数据库:使用exp/expdp逻辑备份,配置简单
  2. 生产环境:使用RMAN物理备份,支持增量、压缩和恢复
  3. 关键业务:逻辑备份+物理备份双重保障
  4. 自动化:使用脚本和Cron实现无人值守备份

核心要点
– 优先使用expdp/impdp替代exp/imp
– 生产环境必须使用RMAN
– 定期验证备份可恢复性
– 遵循3-2-1备份原则
– 备份失败时及时告警

通过本文的指南,你可以建立完整的Oracle数据库备份体系,确保数据安全和业务连续性。

注:本文基于CentOS 7/8和Oracle 19c/21c编写,具体配置可能因版本差异而略有不同。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注