利用shell语言开发MySQL备份脚本

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 ]

猜你喜欢

转载自blog.51cto.com/11576296/2333715