利用shell开发mysql分库分表备份(mydumper)脚本

1.1 MySQL架构和备份策略

#### 数据库架构
	MySQL架构的基础架构为主从复制(replication),目前数据量有 50G +。

#### mydumper工具的安装
    01:是在角色为slave的服务器上安装的;
    02:安装方法请参考博文:https://chenliang.blog.csdn.net/article/details/108571328  的"第1章"

#### 备份需求
    每天对业务库进行分库分表逻辑全备
    
#### 备份策略
	01:每天凌晨2点整在slave上进行备份;
	02:备份使用 mydumper 工具;
	03:备份的数据在本机保留最近7天的数据;
 
#### 脚本实现思路
	01:停止slave的sql线程(让slave的io线程继续从master上取binlog并存放到relaylog)
	02:手动刷新binlog文件;
	03:for循环备份出相关的业务库(每个业务库下的数据保存到分别的目录下)
	04:备份完成后启动slave的SQL线程
	05:删除本机7天前的备份数据
	06:退出脚本


1.2 备份数据的保存目录规划

/data/bak_mysql_3306/                                <== 这是目录[基本目录]
└── 2020-09-19                                       <== 这是目录[每天一个目录]
    ├── 20200919-小时-业务库1的库名-library-all-object  <== 这是目录
    │   ├── 备份出来的文件1
    │   ├── 备份出来的文件2
    │   ├── 备份出来的文件3
    │   ├── 备份出来的文件4
    │   ├── 备份出来的文件5
    │   └── 备份出来的文件N 
    │
    ├── 20200919-小时-业务库2的库名-library-all-object  <== 这是目录
    │   ├── 备份出来的文件1
    │   ├── 备份出来的文件2
    │   ├── 备份出来的文件3
    │   ├── 备份出来的文件4
    │   ├── 备份出来的文件5
    │   └── 备份出来的文件N
    └── bak.log                                         <== 这是脚本执行时记录的日志


1.3 Shell脚本内容

脚本是用root@localhost用户连接mysql后进行备份的,涉及到密码,我一般是把脚本的权限更改成700,该脚本也只能在操作系统下的root用户下执行,脚本中有进行限制;

#!/bin/bash
#
## Define variables
RETVAL=0
User="root"
Port="3306"
Pass="chenliang"
Path="/data/apps/mysql/bin"
Sock="/data/mysql/$Port/run/mysql.sock"
Login="$Path/mysql -u$User -p$Pass -S $Sock"
Dump="mydumper --user=$User --password=$Pass --socket=$Sock"
Dir1="/data/bak_mysql_3306"
Dir2=$(date +%Y-%m-%d)
Time=$(date +%Y%m%d-%H)
Baklog="$Dir1/$Dir2/bak.log"

## Determine the user to execute
if [ "$UID" -ne "$RETVAL" ];then
   echo "Must be roo to run scripts" >>$Baklog
   exit 1
fi

## Determine $Dir1/$Dir2/ directory is exists
if [ ! -d "$Dir1/$Dir2" ];then
   mkdir -p $Dir1/$Dir2
   RETVAL=$?
   if [ $RETVAL -eq 0 ];then
      echo -ne "$Time\n  01:mkdir -p $Dir1/$Dir2 dir success\n" >>$Baklog
    else
      echo -ne "$Time\n  01:mkdir -p $Dir1/$Dir2 dir fail -- exit\n">>$Baklog
      exit 1
   fi   
fi

## Check the installation of the MyDumper tool
Stat1=$(which mydumper|wc -l)
if [ $Stat1 -eq 0 ];then
   echo "  **: Not install mydumper(which mydumper)? exit 1 script"  >>$Baklog
   exit 1
fi

Stat2=$(mydumper -V|wc -l)
if [ $Stat2 -eq 0  ];then
   echo "  **: mydumper is install but myduper -V ?,exit 1 scipts" >>$Baklog
   exit 1 
fi


## Stop slave sql thread
$Login -e "stop slave sql_thread;"
RETVAL=$?
if [ $RETVAL -eq 0 ];then
   echo "  02:stop slave sql thread success" >>$Baklog
  else
   echo "  03:stop slave sql thread fail --exit" >>$Baklog
fi


## Manual flush logs;
$Login -e "flush logs;"
RETVAL=$?
if [ $RETVAL -eq 0 ];then
   echo "  03:flush logs success" >>$Baklog
  else
   echo "  03:flush logs fail" >>$Baklog
fi


## For loop backup mysql $Port instances business library and table
Database=$($Login -e "show databases;"|grep -Ev "_schema|mysql|sys|Database")
for database in $Database
do
    # Create $Dir1/$Dir2/${Time}-${database}-library-all-object directory
    mkdir $Dir1/$Dir2/${Time}-${database}-library-all-object
    RETVAL=$?
    if [ $RETVAL -eq 0 ];then
       echo  "  04:mkdir $Dir1/$Dir2/${Time}-${database}-library-all-object dir success" >>$Baklog
      else
       echo  "  04:mkdir $Dir1/$Dir2/${Time}-${database}-library-all-object dir fail   " >>$Baklog
    fi    

    # Backup database
    $Dump --database=$database --routines --events --triggers \
    --compress --outputdir=$Dir1/$Dir2/${Time}-${database}-library-all-object
    RETVAL=$?
    if [ $RETVAL -eq 0 ];then
       echo "    05:bak $database library all object securess" >>$Baklog
      else
       echo "    05:bak $database library all object fail    " >>$Baklog
    fi
done


## Start slave sql thread
$Login -e "start slave sql_thread;"
RETVAL=$?
if [ $RETVAL -eq 0 ];then
   echo "  06:start slave sql_thread success" >>$Baklog
  else
   echo "  06:start slave sql_thread fail   " >>$Baklog
fi


## Keep the last 7 days of data
find $Dir1 -maxdepth 1 -type d  -mtime +7|xargs rm -fr
RETVAL=$?
if [ $RETVAL -eq 0  ];then
   echo "  07:find $Dir1 -maxdepth 1 -type d -mtime +7  success" >>$Baklog
  else
   echo "  07:find $Dir1 -maxdepth 1 -type d -mtime +7  fail   " >>$Baklog
fi


## Scripts return values
exit $RETVAL


1.4 备份出来的结果

[root@node22 ~]# tree -p /data/bak_mysql_3306/
/data/bak_mysql_3306/
├── [drwxr-xr-x]  2020-09-19
│   ├── [drwxr-xr-x]  20200919-02-chenliang-library-all-object
│   │   ├── [-rw-r--r--]  chenliang.cl1-schema.sql.gz    # chenliang库下cl1表的创建语句;
│   │   ├── [-rw-r--r--]  chenliang.cl1.sql.gz           # chenliang库下cl1表中的数据
│   │   ├── [-rw-r--r--]  chenliang.cl2-schema.sql.gz    # chenliang库下cl2表的创建语句
│   │   ├── [-rw-r--r--]  chenliang.cl2.sql.gz           # chenliang库下cl2表中的数据
│   │   ├── [-rw-r--r--]  chenliang-schema-create.sql.gz # chenliang库的创建语句
│   │   └── [-rw-r--r--]  metadata                       # 备份时记录的binlog
│   ├── [drwxr-xr-x]  20200919-02-lili-library-all-object
│   │   ├── [-rw-r--r--]  lili.li1-schema.sql.gz         
│   │   ├── [-rw-r--r--]  lili.li1.sql.gz               
│   │   ├── [-rw-r--r--]  lili.li2-schema.sql.gz
│   │   ├── [-rw-r--r--]  lili.li2.sql.gz
│   │   ├── [-rw-r--r--]  lili-schema-create.sql.gz
│   │   └── [-rw-r--r--]  metadata
│   └── [-rw-r--r--]  bak.log
│
└── [drwxr-xr-x]  2020-09-20
    ├── [drwxr-xr-x]  20200920-02-chenliang-library-all-object
    │   ├── [-rw-r--r--]  chenliang.cl1-schema.sql.gz
    │   ├── [-rw-r--r--]  chenliang.cl1.sql.gz
    │   ├── [-rw-r--r--]  chenliang.cl2-schema.sql.gz
    │   ├── [-rw-r--r--]  chenliang.cl2.sql.gz
    │   ├── [-rw-r--r--]  chenliang-schema-create.sql.gz
    │   └── [-rw-r--r--]  metadata
    ├── [drwxr-xr-x]  20200920-02-lili-library-all-object
    │   ├── [-rw-r--r--]  lili.li1-schema.sql.gz
    │   ├── [-rw-r--r--]  lili.li1.sql.gz
    │   ├── [-rw-r--r--]  lili.li2-schema.sql.gz
    │   ├── [-rw-r--r--]  lili.li2.sql.gz
    │   ├── [-rw-r--r--]  lili-schema-create.sql.gz
    │   └── [-rw-r--r--]  metadata
    └── [-rw-r--r--]  bak.log

6 directories, 26 files


1.5 备份的日志查看

[root@node22 ~]# cat /data/bak_mysql_3306/2020-09-19/bak.log 
20200919-02
  01:mkdir -p /data/bak_mysql_3306/2020-09-19 dir success
  02:stop slave sql thread success
  03:flush logs success
  04:mkdir /data/bak_mysql_3306/2020-09-19/20200919-02-chenliang-library-all-object dir success
    05:bak chenliang library all object securess
  04:mkdir /data/bak_mysql_3306/2020-09-19/20200919-02-lili-library-all-object dir success
    05:bak lili library all object securess
  06:start slave sql_thread success
  07:find /data/bak_mysql_3306 -maxdepth 1 -type d -mtime +7  success
[root@node22 ~]# 
[root@node22 ~]# 
[root@node22 ~]# 
[root@node22 ~]# 
[root@node22 ~]# cat /data/bak_mysql_3306/2020-09-20/bak.log 
20200920-02
  01:mkdir -p /data/bak_mysql_3306/2020-09-20 dir success
  02:stop slave sql thread success
  03:flush logs success
  04:mkdir /data/bak_mysql_3306/2020-09-20/20200920-02-chenliang-library-all-object dir success
    05:bak chenliang library all object securess
  04:mkdir /data/bak_mysql_3306/2020-09-20/20200920-02-lili-library-all-object dir success
    05:bak lili library all object securess
  06:start slave sql_thread success
  07:find /data/bak_mysql_3306 -maxdepth 1 -type d -mtime +7  success
[root@node22 ~]# 


1.6 slave的状态查看

[root@node22 ~]# mysql -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock -e "show slave status\G"
mysql: [Warning] Using a password on the command line interface can be insecure.
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.16.1.21
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: 21_mysql_bin.000001
          Read_Master_Log_Pos: 5131
               Relay_Log_File: 22_relay_bin.000010
                Relay_Log_Pos: 313
        Relay_Master_Log_File: 21_mysql_bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 5131
              Relay_Log_Space: 8458
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 21
                  Master_UUID: 6f108d1f-f133-11ea-93a4-000c29e5fcf9
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 6f108d1f-f133-11ea-93a4-000c29e5fcf9:1-11
            Executed_Gtid_Set: 6f108d1f-f133-11ea-93a4-000c29e5fcf9:1-11
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,以下是一个备份MySQL数据库的Shell脚本示例: ```bash #!/bin/bash # MySQL数据库备份脚本 # 设置备份文件名和目录 BACKUP_DIR="/var/backups/mysql" DATE=$(date +%Y-%m-%d_%H-%M-%S) DB_NAME="mydatabase" FILENAME="$BACKUP_DIR/$DB_NAME-$DATE.sql" # 设置MySQL登录信息 MYSQL_USER="root" MYSQL_PASSWORD="password" # 执行备份 mysqldump -u $MYSQL_USER -p$MYSQL_PASSWORD $DB_NAME > $FILENAME # 压缩备份文件 gzip $FILENAME # 删除7天前的备份文件 find $BACKUP_DIR -type f -name "*.gz" -mtime +7 -exec rm {} \; ``` 上述脚本将会备份名为 "mydatabase" 的MySQL数据库,并将备份文件保存在 "/var/backups/mysql" 目录下。脚本将创建一个新的备份文件名,格式为 "mydatabase-YYYY-MM-DD_HH-MM-SS.sql",其中 "YYYY-MM-DD_HH-MM-SS" 是当前日期和时间。备份完成后,脚本将使用 gzip 压缩备份文件,并删除7天前的备份文件。 请注意,为了安全起见,建议将MYSQL_USERMYSQL_PASSWORD的值设置为有效的MySQL用户名和密码,而不是将其硬编码在脚本中。 ### 回答2: shell脚本备份MySQL数据库是一种自动化的数据库备份方式,它通过编写shell脚本来实现备份任务的执行。下面是一个简单的用于备份MySQL数据库的shell脚本示例: #!/bin/bash # 设置备份目录 BACKUP_DIR="/opt/backup/db" # 设置MySQL登录信息 DB_USER="root" DB_PASSWORD="yourpassword" # 设置备份文件名 BACKUP_FILE="db_backup_$(date +%Y%m%d%H%M%S).sql" # 创建备份目录 mkdir -p $BACKUP_DIR # 备份MySQL数据库到指定目录 mysqldump -u $DB_USER -p$DB_PASSWORD --all-databases > $BACKUP_DIR/$BACKUP_FILE # 判断备份是否成功 if [ $? -eq 0 ]; then echo "MySQL数据库备份成功,备份文件名为:$BACKUP_FILE" else echo "MySQL数据库备份失败" fi 在上述脚本中,首先定义了备份目录、MySQL登录信息和备份文件名的变量。然后,通过mkdir命令创建备份目录。接下来,使用mysqldump命令将MySQL数据库备份到指定目录,并将备份文件命名为当前日期和时间。最后,通过判断mysqldump命令执行的返回值来确定备份是否成功,并输出相应的提示信息。 使用该脚本进行MySQL数据库备份只需在终端中执行bash命令加上脚本路径即可,如:bash /path/to/backup_mysql.sh。执行完毕后,备份文件将保存在指定的备份目录中。 这种shell脚本备份MySQL数据库的方式可以自动化执行备份任务,提高工作效率,同时也方便了备份文件的管理和查找。 ### 回答3: shell脚本备份MySQL数据库是通过编写一个脚本文件来实现自动备份和恢复MySQL数据库的操作。下面是一个简单的示例: #!/bin/bash # Shell脚本备份MySQL数据库 # 定义备份存储目录和时间戳 backup_dir="/path/to/backup" timestamp=$(date +%Y%m%d%H%M%S) # 定义MySQL数据库的连接参数 db_user="root" db_password="password" db_host="localhost" db_name="database_name" # 创建备份目录 if [ ! -d "$backup_dir" ]; then mkdir -p $backup_dir fi # 使用mysqldump命令备份数据库 mysqldump -u$db_user -p$db_password -h$db_host $db_name > $backup_dir/${db_name}_${timestamp}.sql # 检查备份是否成功 if [ $? -eq 0 ]; then echo "数据库备份成功!" else echo "数据库备份失败!" fi # 清理过期备份(保留最新的N个备份) backup_count=$(ls -l $backup_dir | grep -c "^-" 2>/dev/null) if [ $backup_count -gt 10 ]; then oldest_backup=$(ls -tr $backup_dir | head -1) rm -f $backup_dir/$oldest_backup fi # 恢复MySQL数据库(如果需要) # mysql -u$db_user -p$db_password -h$db_host -e "DROP DATABASE $db_name;" # mysql -u$db_user -p$db_password -h$db_host -e "CREATE DATABASE $db_name;" # mysql -u$db_user -p$db_password -h$db_host $db_name < $backup_dir/latest.sql 这个脚本的功能是备份指定的MySQL数据库,将备份文件保存到指定的目录中,并可根据需要恢复数据库。脚本中使用了mysqldump命令来导出数据库,并使用mysql命令来恢复数据库。备份文件保留最新的10个,超过数量的将自动删除最旧的备份文件。可以根据实际需求修改备份目录、数据库连接参数和保留备份数量等设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值