Oracle-自动全量备份
环境准备
CentOS Linux release 7.3.1611 (Core)
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
思路
- 三台安装 Oracle 的
CentOS 7.3
服务器,每台数据库服务器,存储着不同的数据库 - 利用 Oracle 的
Expdp
将数据导出来 - 利用
SCP
将导出来的数据库备份文件传送到其他两台服务器上,避免单点问题 - 将上面的步骤写成 Shell 脚本,利用
Crontab
定时执行 - 为了避免备份文件撑爆硬盘,通过
Shell
脚本定时删除备份文件 - 通过
impdp
恢复数据
备份策略
- 每周一凌晨三点执行全量备份任务
- 每月一号凌晨三点执行清理上上个月备份文件
开始部署
配置 Oracle 导入导出目录权限
1
2
3
4
5
6su - oracle #切换Oracle账户
mkdir ~/backup_dir #创建导出文件存放目录
sqlplus / as sysdba #以DBA的身份登录Oracle
create directory dir_dp as '/home/oracle/backup_dir'; #创建导入导出目录
create or replace directory dir_dp as '/home/oracle/backup_dir'; #修改导入导出目录 需要的话执行
grant read,write on directory dir_dp to chenlil; #授权 chenlil 用户对该目录开始导出数据
1
expdp chenlil/123456 schemas=chenlil DIRECTORY=dir_dp CONTENT=all compression=ALL DUMPFILE=chenlil.dmp logfile=chenlil.log
chenlil/123456
导出所需的用户名和密码 与上面授权的一致schemas=chenlil
导出库的名称DIRECTORY=dir_dp
导出的目录名 与上面配置的一致DUMPFILE=chenlil.dmp
导出文件的名称logfile=chenlil.log
导出日志的名称
生成导出脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31!/bin/bash
source ~/.bash_profile #刷新配置文件
scpip=(192.168.1.15 192.168.1.16) #备份的服务器IP
tmp=/home/oracle/backup_dir/ #备份文件存放目录
dir=/home/oracle/global_back_dmp/ #全局同步文件存放目录
dmpfile=`date +_%Y%m%d`.dmp #根据当前年月日生成的备份文件名
dumplog=`date +_%Y%m%d`.log #根据当前年月日生成的备份日志文件名
username=chenlil #导出所需的用户名
password=123456 #导出所需的密码
schemas=(chenlil chenlil1 chenlil2 chenlil3) #需要导出的库
清除之前的备份
rm -f ${tmp}*
备份过程
for s in ${schemas[@]}
do
expdp ${username}/${password} schemas=$s DIRECTORY=dir_dp CONTENT=all compression=ALL DUMPFILE=$s${dmpfile} logfile=$s${dumplog}
done
同步本地
cp ${tmp}* ${dir}
远程传输
for ip in ${scpip[@]}
do
scp ${tmp}*${dmpfile} oracle@$ip:${dir}
scp ${tmp}*${dumplog} oracle@$ip:${dir}
done添加定时任务—-每周一早上三点执行一下脚本
1
2
3
4crontab -e #编辑定时任务
每周一早上三点 执行全量备份任务
SHELL=/bin/bash
0 3 * * 1 cd /home/oracle/cron/ && ./oracle_backup.sh生成删除上上个月的备份文件脚本
1
2
3
4
5
6
7
8
9
10
11
12
13!/bin/sh
dir=/home/oracle/global_back_dmp/
nowdate=`date +%Y%m01` #本月第一天
startdate=`date -d"$nowdate last month last month" +%Y%m%d` #上上个月第一天
enddate=`date -d"$nowdate last month last day" +%Y%m%d` #上上个月最后一天
遍历上上个月的每一天
while (( $startdate <= $enddate ))
do
echo $startdate
find $dir -type f -name "*${startdate}*" -ls >> ~/del_file_list.txt
find $dir -type f -name "*${startdate}*" -exec rm -f {} \;
startdate=`date -d "+1 day $startdate" +%Y%m%d`
done添加定时任务—-每月一号执行一下清理脚本
1
2每个月一号早上三点 执行清除上个月备份文件
0 3 1 * * cd /home/oracle/cron/ && ./del_backup.sh
数据恢复
准备工作
- 同导出一样配置 Oracle 导入导出目录权限
- 将备份文件拷被至导入导出文件夹
执行命令
1
impdp chenlil/123456 schemas=chenlili dumpfile=chenlil_20200319.dmp logfile=impdp_chenlil_20200319.log directory=dir_dp
chenlil/123456
导入数据账号和密码schemas=chenlili
导入的库名称dumpfile=chenlil_20200319.dmp
导入的备份文件名称logfile=impdp_chenlil_20200319.log
导入过程的日志文件名directory=dir_dp
导入文件的文件名
本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Chenlil Blog!