1.1 MySQL相关路径
1.2 MySQL架构说明
1.3 MySQL备份思路
1.4 备份数据保存路径规划
1.5 备份脚本内容
1.6 脚本执行效果
1.1 MySQL相关路径
01:sock文件路径:/mnt/3307/mysql.sock
02:程序安装路径:/mnt/apps/mysql
03:用户:root@localhost,密码123456(当然这不是生产环境的密码)
04:实例端口号3307
05:/mnt是数据磁盘的挂载点
1.2 MySQL架构说明
01:3台服务器,做的主从复制(GTID模式)
02:数据库版本:MySQL 5.7.22
1.3 MySQL备份思路
01:在其中一台slave中停止sql thread
02:备份实例中的库,这里是全备: -B -F -R -x --set-gtid-purged=off 库名
03:备份实例中的库中的表:-F -R -x --set-gtid-purged=off 库名 表名
05:待所有库所有表备份完成后,再启动sql thread线程
06:每天凌晨2:30定时进行备份
1.4 备份数据保存路径规划
对于库的备份数据保存规划:
库全备的保存路径规划:/mnt/bak_实例端口号/sub_database/当天的时间/
库备份的文件名称规划:当天的时间_实例端口号_database-库名.sql.gz
库备份的文件名称示例:2018_12_20_3307_database-test.sql.gz
对于表的备份数据保存规划:
表全备的保存路径规划:/mnt/bak_实例端口号/sub_table/库名/当天的时间/
表备份的文件名称规划:当天的时间_实例端口号_表对应的库名_table-表名.sql.gz
表备份的文件名称示例:2018_12_20_3307_test_table-Students.sql.gz
1.5 备份脚本内容
#!/bin/bash # # Explain: MySQL sub-database and sub-table backup script # Blog url: http://blog.51cto.com/11576296 # mailbox: [email protected] # # Define variables RETVAL=0 User=root Port=3307 Pass="123456" Time=$(date +%Y_%m_%d) Sock="/mnt/3307/mysql.sock" Path="/mnt/apps/mysql/bin" Login="$Path/mysql -u$User -p$Pass -S $Sock" Dump="$Path/mysqldump -u$User -p$Pass -S $Sock" Database=$($Login -e "show databases"|grep -Ev "_schema|mysql|sys|Database") # Determine the user to execute if [ "$UID" -ne "$RETVAL" ];then echo "Must be roo to run scripts" exit 1 fi # Load locall functions [ -f /etc/init.d/functions ] && source /etc/init.d/functions # Stop slave sql thread $Login -e "stop slave sql_thread;" RETVAL=$? if [ $RETVAL -eq 0 ];then action "stop slave sql_thread" /bin/true else action "stop slave sql_thread" /bin/false fi # For loop backup mysql $Port instances database and table for database in $Database do # Determine $Bak_dir1 exists Bak_dir1="/mnt/bak_${Port}/sub_database/$Time" if [ ! -d "$Bak_dir1" ];then mkdir $Bak_dir1 -p RETVAL=$? if [ $RETVAL -eq 0 ];then action " mkdir \"$Bak_dir1\" dir" /bin/true else action " mkdir \"$Bak_dir1\" dir" /bin/false fi fi # backup database $Dump -B -F -R -x --set-gtid-purged=off $database|gzip >$Bak_dir1/${Time}_${Port}_database-${database}.sql.gz RETVAL=$? if [ $RETVAL -eq 0 ];then action " backup \"$database\" database" /bin/true else action " backup \"$database\" database" /bin/false fi Table=$($Login -e "use $database;show tables;"|grep -v "Tables_in") for table in $Table do # Determine $Bak_dir2 exists Bak_dir2="/mnt/bak_${Port}/sub_table/$database/$Time" if [ ! -d "$Bak_dir2" ];then mkdir $Bak_dir2 -p RETVAL=$? if [ $RETVAL -eq 0 ];then action " mkdir \"$Bak_dir2\" dir" /bin/true else action " mkdir \"$Bak_dir2\" dir" /bin/false fi fi $Dump -F -R -x --set-gtid-purged=off $database $table|gzip >$Bak_dir2/${Time}_${Port}_${database}_table-${table}.sql.gz RETVAL=$? if [ $RETVAL -eq 0 ];then action " backup ${database}.${table} table" /bin/true else action " backup ${database}.${table} table" /bin/false fi done done # Start slave sql thread $Login -e "start slave sql_thread;" RETVAL=$? if [ $RETVAL -eq 0 ];then action "start slave sql_thread" /bin/true else action "start slave sql_thread" /bin/false fi # Scripts return values exit $RETVAL
1.6 脚本执行效果
stop slave sql_thread [ OK ]
mkdir "/mnt/bak_3307/sub_database/2018_12_20" dir [ OK ]
backup "binbin" database [ OK ]
mkdir "/mnt/bak_3307/sub_table/binbin/2018_12_20" dir [ OK ]
backup binbin.biao1 table [ OK ]
backup binbin.biao2 table [ OK ]
backup "lanlan" database [ OK ]
mkdir "/mnt/bak_3307/sub_table/lanlan/2018_12_20" dir [ OK ]
backup lanlan.test table [ OK ]
backup lanlan.test02 table [ OK ]
start slave sql_thread [ OK ]