环境准备

  • 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
    6
    su - 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
    4
    crontab -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 导入文件的文件名