shell脚本:使用mysqldump实现分库分表备份

一.什么是分库分表备份

分库分表备份是一种数据库备份策略,用于处理大型数据库系统中的数据分布和备份需求。当数据库的数据量非常大时,单个数据库可能无法满足性能和可扩展性的要求。为了解决这个问题,使用分库分表技术将数据库拆分成多个库和表,每个库和表分别存储一部分数据。

在分库分表备份中,备份操作也需要按照分库分表的方式进行。具体而言,备份程序会遍历每个库和表,并对其进行备份操作。这样可以确保所有数据被备份,同时使备份过程更高效。

分库分表备份的主要优势有:

  • 提高系统的可扩展性和性能:通过分库分表,可以将数据分布在多个节点上,从而提高系统的负载能力和处理性能。
  • 精确备份和恢复:分库分表备份可以确保每个数据库和表的数据都得到备份,同时也可以针对需要恢复的具体数据进行恢复操作,提高了备份和恢复的精确性。
  • 部分故障隔离:当某个库或表发生故障时,只需恢复受影响的库或表,而不需要恢复整个数据库系统。

二.基本思路

使用`mysqldump`实现分库分表备份的基本思路如下:

  1. 确定要备份的数据库列表:首先确定要备份的数据库列表,这些数据库可能是分布在不同的库中。
  2.  遍历数据库:对于每个数据库,遍历其中的表。
  3. 备份表:对于每个表,使用`mysqldump`命令备份表结构和数据到指定的备份文件中。
  4. 重复以上步骤:对其他数据库中的表重复执行步骤3,直到所有的数据库和表都备份完成。

三.脚本编写

#!/bin/bash
#########################
#File name:mysqldump_db.sh
#Version:v1.0
#Email:admin@test.com
#Created time:2023-07-17 04:50:04
#Description:
#########################

# MySQL连接信息
db_user="root"
db_password="RedHat@123"
db_cmd="-u${db_user} -p${db_password}"
exclude_db="information_schema|mysql|performance_schema|sys|Database"
bak_dir=/backup/db/mysqldump_test/
# 判断备份路径是否存在
[ -d ${bak_dir} ] || mkdir ${bak_dir}

# 查找出需要备份的数据库
 mysql ${db_cmd} -e"show databases" -N 2>/dev/null | egrep -v "$exclude_db" > dbtmp
# 循环遍历数据库列表
while read db
do
        #对数据库进行备份
    mysqldump ${db_cmd} --set-gtid-purged=off $db 2>/dev/null | gzip > ${bak_dir}/`date +%F`-$db.sql.gz
        #判断是否备份成功
    if [ $? -eq 0 ]
    then
        echo "database $db is being backed up ... success!"
    else
        echo "database $db is being backed up ... failure!"
    fi
        #根据数据库进行分表备份 
    [ -d ${bak_dir}/$db ] || mkdir -p ${bak_dir}/$db
               # 获取数据库中的表名列表
    mysql ${db_cmd}  $db -e "SHOW TABLES;" | grep -v "Tables_in" > tbtmp

    # 循环遍历表名列表
    while read tb
    do
        # 对表进行备份
        mysqldump ${db_cmd} --set-gtid-purged=off $db $tb 2>/dev/null | gzip > ${bak_dir}/$db/`date +%F`-$db-$tb.sql.gz

        # 判断是否备份成功
        if [ "$?" -eq 0 ]; then
            echo "Backup of $db.$tb successful!"
        else
            echo "Backup of $db.$tb failed!"
        fi
    done < tbtmp
done < dbtmp
#删除临时文件
rm -rf tbtmp
rm -rf dbtmp                                                                    

运行结果如下:

四.脚本描述 

这个脚本是用于对MySQL数据库进行备份的。以下是脚本的解释:

1. 定义MySQL连接信息:

db_user="root"
db_password="RedHat@123"
db_cmd="-u${db_user} -p${db_password}"

   这里指定了 MySQL 的用户名和密码并在 `db_cmd` 变量中构建了传递给 MySQL 命令的连接信息。

2. 定义排除数据库和备份路径:

exclude_db="information_schema|mysql|performance_schema|sys|Database"
bak_dir=/backup/db/mysqldump_test/

   这里指定了需要从备份中排除的数据库列表,并设置了备份文件存储的目录。

3. 检查备份路径是否存在:

[ -d ${bak_dir} ] || mkdir ${bak_dir}

   这里通过判断备份目录是否存在,如果不存在则创建该目录。

4. 查找需要备份的数据库:

mysql ${db_cmd} -e"show databases" -N 2>/dev/null | egrep -v "$exclude_db" > dbtmp

   这里执行 MySQL 命令来获取数据库列表,将结果保存到 `dbtmp` 文件中,并对其中的数据库进行排除。

5. 循环遍历数据库列表:

while read db
do
...
done < dbtmp

   这里使用 `while read` 循环读取 `dbtmp` 文件中的每一行,即数据库列表。

6. 对数据库进行备份:

mysqldump ${db_cmd} --set-gtid-purged=off $db 2>/dev/null | gzip > ${bak_dir}/`date +%F`-$db.sql.gz

   这里使用 `mysqldump` 命令对每个数据库进行备份,备份的内容会经过 `gzip` 压缩,并将结果保存到以日期和数据库名称命名的压缩文件中。

7. 根据数据库分表进行备份:

[ -d ${bak_dir}/$db ] || mkdir -p ${bak_dir}/$db
mysql ${db_cmd}  $db -e "SHOW TABLES;" | grep -v "Tables_in" > tbtmp
while read tb
do
      ...
done < tbtmp

   这里首先检查存放分表备份的目录是否存在,若不存在则创建。然后获取指定数据库中的表名列表,并保存到 `tbtmp` 文件中。接着循环读取 `tbtmp` 文件中的每个表名,对每个表进行备份。

8. 删除临时文件:

rm -rf tbtmp
rm -rf dbtmp

   最后删除脚本运行过程中创建的临时文件 `tbtmp` 和 `dbtmp`。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值