一、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 安全措施
- 加密备份:
# expdp加密导出
expdp username/password@ORCL directory=backup_dir dumpfile=encrypted_%U.dmp \
encryption=all encryption_mode=dual encryption_password=YourStrongPassword123 \
full=y parallel=4
- 异地备份:
# 使用rsync同步到远程服务器
rsync -avz --delete /backup/oracle/ backup-server:/backup/oracle/
- 访问控制:
# 限制备份目录权限
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数据库备份需要根据业务需求选择合适的备份方式:
- 小型数据库:使用exp/expdp逻辑备份,配置简单
- 生产环境:使用RMAN物理备份,支持增量、压缩和恢复
- 关键业务:逻辑备份+物理备份双重保障
- 自动化:使用脚本和Cron实现无人值守备份
核心要点:
– 优先使用expdp/impdp替代exp/imp
– 生产环境必须使用RMAN
– 定期验证备份可恢复性
– 遵循3-2-1备份原则
– 备份失败时及时告警
通过本文的指南,你可以建立完整的Oracle数据库备份体系,确保数据安全和业务连续性。
注:本文基于CentOS 7/8和Oracle 19c/21c编写,具体配置可能因版本差异而略有不同。