MySQL数据库备份脚本
1.通过shell脚本远程备份数据库
1.1 远程备份数据库
- 要备份的MySQL数据库 – 192.168.106.128
- 数据远程备份的服务器 --192.168.106.129
1.2 脚本内容
- bakDB.sh
#!/bin/bash
#####################################################
#参数1:数据库用户名
username=root
#参数2:数据库用户密码
password=123456
#参数5:远程主机IP
defaultip=192.168.106.129
#参数7:如果clagent中的task_failed_log表不需要备份 这里就需要有数据
defaultignoretables=""
echo "主函数答应1:${defaultignoretables}`date`"
#最后等待即可,无需其他操作
shellpathrun="/opt/dbbak/hidden/run.sh"
shellpathmd="/opt/dbbak/hidden/mkdir.sh"
######################################################
#动态创建指定主机的指定目录
defaultbd=/data/bak/mysql/hongwei/
$shellpathmd $defaultbd $defaultip
#执行备份指令
#参数6:文件前缀,run脚本会在后面添加当前日期
defaultfileprefix=hongwei
#参数3:数据库名称
defaulttn=hongwei
echo "主函数答应2:${defaultignoretables}`date`"
$shellpathrun $username $password $defaulttn $defaultbd $defaultip $defaultfileprefix $defaultignoretables
######################################################
#动态创建指定主机的指定目录(备份all_out_api的数据)
defaultbdd=/data/bak/mysql/all_out_databases/
$shellpathmd $defaultbdd $defaultip
echo "主函数答应3:${defaultignoretables}------------`date`"
#多数据库备份
defaulttn1="redis hertzbeat"
#备份文件前缀,run脚本中后面会添加当前日期
defaultfileprefix1=all_out_databases
echo "主函数答应4:${defaultignoretables}------------`date`"
defaultignoretables=""
#执行备份指令
$shellpathrun $username $password "$defaulttn1" $defaultbdd $defaultip $defaultfileprefix1 $defaultignoretables
- run.sh
#!/bin/bash
####################################################
#填入用户名密码及其数据库实例参数
username=$1
password=$2
dbname=$3
####################################################
#手动创建目标备份目录:必须指定绝对路径
bakname=$4
#修改目标机器IP
aimip=$5
#文件名称前缀
fileprefix=$6
#是否追加自定义参数
ignoretables=$7
####################################################
#以下内容理论上无需改变
#以下内容理论上无需改变
#以下内容理论上无需改变
####################################################
dt=$(date "+%Y%m%d")
filename=$fileprefix$dt
####################################################
echo "-------111${ignoretables}-------"
if [ -f "/data/baktmp/${filename}.sql}" ];then
echo "/data/baktmp/${filename}.sql is exist}"
echo "-----------------------"
else
echo "-------${ignoretables}-------"
if [ -n "${ignoretables}" ];then
mysqldump -u$username -p$password --databases $dbname --ignore-table=$ignoretables --skip-lock-tables > /data/baktmp/$filename.sql
else
mysqldump -u$username -p$password --databases $dbname --skip-lock-tables > /data/baktmp/$filename.sql
fi
cd /data/baktmp/
tar cvzf $filename.tar.gz $filename.sql
fi
echo "####压缩成功,删除sql文件${filename}.sql"
if [ -f /data/baktmp/$filename.sql ];then
rm -f /data/baktmp/$filename.sql
else
echo "/data/baktmp/$filename.sql is not exit"
fi
#####################################################
#目标主机密码,在没有免密的时候需要
#若主机密码发生动态变更,此处同步即可
PASSWORD="123456"
######################################################
auto_change_pw() {
expect -c "set timeout -1;
spawn scp /data/baktmp/$filename.tar.gz root@$aimip:$bakname;
expect {
*密码* {send -- $PASSWORD\r;exp_continue;}
*yes/no* {send -- \"yes\"\r;exp_continue;}
*assword* {send -- $PASSWORD\r;exp_continue;}
eof {exit 0;}
}";
}
TD() {
hostname
echo "数据传输成功"
}
#TD
#启动转移指令
auto_change_pw
#转移成功后,删除生成的历史文件
if [ -f /data/baktmp/$filename.tar.gz ]
then
rm -f /data/baktmp/$filename.tar.gz
else
echo "/data/baktmp/$filename.tar.gz is not exit"
fi
- mkdir.sh
#!/bin/bash
####################################################
#手动创建目标备份目录:必须指定绝对路径
bakname=$1
aimip=$2
####################################################
#以下内容理论上无需改变
#以下内容理论上无需改变
#以下内容理论上无需改变
#####################################################
#目标主机密码,在没有免密的时候需要
#若主机密码发生动态变更,此处同步即可
PASSWORD="123456"
######################################################
auto_mkdir_pw() {
expect -c "set timeout -1;
spawn ssh $aimip \"mkdir -p $bakname\";
expect {
*密码* {send -- $PASSWORD\r;exp_continue;}
*yes/no* {send -- \"yes\r\";exp_continue;}
*assword* {send -- $PASSWORD\r;exp_continue;}
eof {exit 0;}
}";
}
#启动转移指令
auto_mkdir_pw
1.3 执行脚本
- 三个脚本bakDB.sh、run.sh、mkdir.sh上传到
/opt/dbbak/hidden/
目录下, - 给脚本赋予可执行权限
chmod +x bakDB.sh mkdir.sh run.sh
-rw-r--r-- 1 root root 1629 Jun 24 14:54 bakDB.sh
-rw-r--r-- 1 root root 906 Jun 24 14:36 mkdir.sh
-rw-r--r-- 1 root root 2321 Jun 24 14:36 run.sh
[root@hongwei hidden]# chmod +x bakDB.sh mkdir.sh run.sh
- 在128服务器上创建
/data/baktmp/
目录
[root@hongwei /]# mkdir -p /data/baktmp/
- 执行脚本
./bakDB.sh
# 将日志打印到dbbak.log文件中
[root@hongwei hidden]# ./bakDB.sh > /var/log/dbbak.log 2>&1
- 查看备份数据(129服务器)
[root@bigwork02 all_out_databases]# ll
total 4
-rw-r--r--. 1 root root 1001 Jun 24 15:43 all_out_databases20240624.tar.gz
解压后的sql内容如下图所示: