首页 > 技术文章 > Oracle数据库异地备份脚本

xiaoeryankee 2020-07-16 20:30 原文

脚本文件

#!/bin/bash

# 解析配置文件
# 通过`source`加载配置文件
source config
# 备份服务器地址
backIP=$BackIP
# 数据库SID
sid=$SID
# 数据库连接端口
port=$Port
# 数据库连接用户
user=$User
# 备份服务器系统用户
backUser=$BackUser
# 分解备份服务器用户名和密码
backUserName=$(echo $backUser | awk -F '/' '{print $1}')
backUserPasswd=$(echo $backUser | awk -F '/' '{print $2}')
# 远程服务器地址
remoteIP=$RemoteIP
# 远程服务器系统用户
remoteUser=$RemoteUser
# 分解远程服务器用户名和密码
remoteUserName=$(echo $remoteUser | awk -F '/' '{print $1}')
remoteUserPasswd=$(echo $remoteUser | awk -F '/' '{print $2}')
# 备份的用户目录
owner=xiaoer

# 判断当前系统登录用户是否是备份服务器用户,如果不是则切换用户
currentUser=$(whoami)
if [ $currentUser != $backUserName ];then
    expect -c "
    spawn su - $backUserName
    expect \"Password:\"
    send \"$backUserPasswd\r\"
    interact
    "
fi

# 远程机器相关操作
# B机器(远程机器)备份文件路径
remotePath=/home/yankee/$owner
# 如果支持免密登录时
ssh $remoteUserName@remoteIP -tt << EOF
    if [ ! -d $remotePath ];then
        mkdir $remotePath
    fi
    exit 0
EOF

# 备份机器相关操作
# 数据文件备份路径
# A机器备份文件路径
backdirk=/home/yankee/$owner
# 判断目录是否存在,如果不存在,则创建
if [ ! -d $backdir ];then
    mkdir $backdir
else
    echo $backdir exist!
fi
# 当前系统时间
dateTime=`date +%Y%m%d`
# oracle数据库连接信息
oracleSid="$backIP/$sid"
# 如果用户为多个用户时
userArray=(${user//,/ })
echo $userArray
for ele in ${userArray[@]}
do
    oracleOwn=$ele
    own=$(echo $oracleOwn | awk -F '/' '{print $1}')
    # 备份时生成的数据文件的信息
    exportDataBack=$dateTime.$own.dmp
    # 完整的备份文件路径
    filePath=$backdir/$exportDataBack
    # 备份oracle数据库的脚本语言
    exp $oracleOwn@$oracleSid file=$filePath rows=y grants=y compress=y
    # 此时会将数据库备份文件打包到执行脚本的目录下
    cd $backdir
    # 压缩数据库备份文件
    tar -zcvf $dateTime.$own.tar.gz $exportDataBack
    # 获取当前服务器中的数据文件的大小
    # 直接截取ls命令中所显示的文件大小
    size=$(ls -al ./ | grep $dateTime.$own.tar.gz | awk -F ' ' '{print $5}')
    # 将压缩文件大小保存到标志文件sizeFlag中
    echo $size > sizeFlag.$own
    # 获取标识文件中所存储的压缩文件大小
    keyValue=$(cat sizeFlag.$own)
    # 使用scp命令发送到远程服务器中的指定目录
    scp $dateTime.$own.tar.gz $remoteUserName@$remoteIP:$remotePath
    # 比较远程服务器的文件大小和标志文件中的文件大小是否一致
    # 获取远程服务器中的压缩文件大小
    ssh $remoteUserName@$remoteIP -tt << EOF
    echo $(ls -al $remotePath | grep $dateTime.$own.tar.gz | awk -F ' ' '{print $5}')
    scp $remotePath/remoteSize.$own $backUserName@$backIP:$backdir
    rm $remotePath/remoteSize.$own
    exit
EOF
    remoteSize=$(cat remoteSize.$own)
    if [ $keyValue == $remoteSize.$own ];then
        echo "finished"
        rm -rf $backdir
    else
        echo "failed"
    fi
done

配置文件

BackIP=192.168.21.100
SID=orcl
Port=1521
User=xiaoer/xiaoer
BackUser=yankee/yankee
RemoteIP=192.168.21.101
RemoteUser=yankee/yankee

推荐阅读