我们之前也介绍过,如何在 Linux
备份 MySQL
。
我是备份在本机,所以我采用 Oracle 自带的 expdp 功能进行备份;如需要异地的,则需要针对以下脚本进行加工,这里不阐述
准备工作
- 本机具有
Oracle
的expdp
导出功能
开始工作
创建 sh 脚本,命名为:oracle_backup.sh
,以下是脚本
#!/bin/sh export ORACLE_BASE=/mnt/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1 export ORACLE_SID=orcl export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin export ORACLE_DIRECTORY=bakdir # 备份目录 export DATA_DIR=/mnt/backup/bakdir # 删除备份时间 30 天 export DEL_TIME=`date -d "30 days ago" +%Y%m%d` # 备份时间 export BAKUP_TIME=`date +%Y%m%d%H%M%S` # 字符编码 export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK # 账号 export db_user="test" # 密码 export db_password="123456" # db schemas export db_schemas="data_schemas" mkdir -p $DATA_DIR echo "-- $(date +'%Y%m%d%H%M%S') 自动备份数据库并压缩开始 " >> $DATA_DIR/BAK_LOG.txt; echo "------------------------------------------------------------------" >> $DATA_DIR/BAK_LOG.txt; echo "-- $(date +'%Y%m%d%H%M%S') 开始备份的文件名:$DATA_DIR/${ORACLE_SID}_${BAKUP_TIME}.dmp" >> $DATA_DIR/BAK_LOG.txt; echo "Bakup file path $DATA_DIR/${ORACLE_SID}_${BAKUP_TIME}.dmp" expdp $db_user/$db_password@$ORACLE_SID schemas=$db_schemas directory=$ORACLE_DIRECTORY dumpfile=${ORACLE_SID}_${BAKUP_TIME}.dmp logfile=${ORACLE_SID}_${BAKUP_TIME}.log echo "-- $(date +'%Y%m%d%H%M%S') 备份成功:$DATA_DIR/${ORACLE_SID}_${BAKUP_TIME}.dmp" >> $DATA_DIR/BAK_LOG.txt; echo "------------------------------------------------------------------" >> $DATA_DIR/BAK_LOG.txt; echo "-- $(date +'%Y%m%d%H%M%S') 开始进行压缩:$DATA_DIR/${ORACLE_SID}_${BAKUP_TIME}.dmp -> tar.gz" >> $DATA_DIR/BAK_LOG.txt; cd $DATA_DIR && tar -czvf ${ORACLE_SID}_${BAKUP_TIME}.tar.gz ${ORACLE_SID}_${BAKUP_TIME}.dmp ${ORACLE_SID}_${BAKUP_TIME}.log echo "-- $(date +'%Y%m%d%H%M%S') 压缩成功:$DATA_DIR/${ORACLE_SID}_${BAKUP_TIME}.tar.gz" >> $DATA_DIR/BAK_LOG.txt; echo "------------------------------------------------------------------" >> $DATA_DIR/BAK_LOG.txt; echo "-- $(date +'%Y%m%d%H%M%S') 开始删除30天前备份记录文件:$DATA_DIR/${ORACLE_SID}_${DEL_TIME}.dmp" >> $DATA_DIR/BAK_LOG.txt; rm -rf $DATA_DIR/${ORACLE_SID}_${DEL_TIME}* echo "-- $(date +'%Y%m%d%H%M%S') 删除30天前备份记录文件:$DATA_DIR/${ORACLE_SID}_${DEL_TIME}.dmp 结束" >> $DATA_DIR/BAK_LOG.txt; echo "------------------------------------------------------------------" >> $DATA_DIR/BAK_LOG.txt; echo "-- $(date +'%Y%m%d%H%M%S') 开始删除当前备份记录文件:$DATA_DIR/${ORACLE_SID}_${BAKUP_TIME}.dmp" >> $DATA_DIR/BAK_LOG.txt; rm -rf $DATA_DIR/${ORACLE_SID}_${BAKUP_TIME}.dmp $DATA_DIR/${ORACLE_SID}_${BAKUP_TIME}.log echo "-- $(date +'%Y%m%d%H%M%S') 删除当前备份记录文件$DATA_DIR/${ORACLE_SID}_${BAKUP_TIME}.dmp 成功" >> $DATA_DIR/BAK_LOG.txt; echo "------------------------------------------------------------------" >> $DATA_DIR/BAK_LOG.txt; echo "-- $(date +'%Y%m%d%H%M%S') 自动备份数据库并压缩完毕 " >> $DATA_DIR/BAK_LOG.txt; echo " " >> $DATA_DIR/BAK_LOG.txt; echo " " >> $DATA_DIR/BAK_LOG.txt;
说明
- 上面的脚本是备份 30 天的数据库,我们可以每天导出一份 dmp 备份文件,文件的名称按
sid_当日日期
生成,然后进行打包压缩tar.gz
,最后再删除 30 天之前的数据库备份,然后删除当天备份的 dmp 以及 log;
赋予执行权限
chmod +x /mnt/backup/oracle_backup.sh
定时任务
在 Linux 中,我们利用 Crontab 来针对 oracle_backup.sh
脚本进行定时执行
crontab -e
添加一个定时任务,每天凌晨 1 点执行一次脚本,然后开始 Oracle 的备份
0 1 * * * /mnt/backup/oracle_backup.sh
备份日志 BAK_LOG.txt
-- 20200624010001 自动备份数据库并压缩开始 ------------------------------------------------------------------ -- 20200624010001 开始备份的文件名:/mnt/backup/bakdir/orcl_20200624010001.dmp -- 20200624010126 备份成功:/mnt/backup/bakdir/orcl_20200624010001.dmp ------------------------------------------------------------------ -- 20200624010126 开始进行压缩:/mnt/backup/bakdir/orcl_20200624010001.dmp -> tar.gz -- 20200624010237 压缩成功:/mnt/backup/bakdir/orcl_20200624010001.tar.gz ------------------------------------------------------------------ -- 20200624010237 开始删除30天前备份记录文件:/mnt/backup/bakdir/orcl_20200525.dmp -- 20200624010237 删除30天前备份记录文件:/mnt/backup/bakdir/orcl_20200525.dmp 结束 ------------------------------------------------------------------ -- 20200624010237 开始删除当前备份记录文件:/mnt/backup/bakdir/orcl_20200624010001.dmp -- 20200624010238 删除当前备份记录文件/mnt/backup/bakdir/orcl_20200624010001.dmp 成功 ------------------------------------------------------------------ -- 20200624010238 自动备份数据库并压缩完毕