一.什么是分库分表备份
分库分表备份是一种数据库备份策略,用于处理大型数据库系统中的数据分布和备份需求。当数据库的数据量非常大时,单个数据库可能无法满足性能和可扩展性的要求。为了解决这个问题,使用分库分表技术将数据库拆分成多个库和表,每个库和表分别存储一部分数据。
在分库分表备份中,备份操作也需要按照分库分表的方式进行。具体而言,备份程序会遍历每个库和表,并对其进行备份操作。这样可以确保所有数据被备份,同时使备份过程更高效。
分库分表备份的主要优势有:
- 提高系统的可扩展性和性能:通过分库分表,可以将数据分布在多个节点上,从而提高系统的负载能力和处理性能。
- 精确备份和恢复:分库分表备份可以确保每个数据库和表的数据都得到备份,同时也可以针对需要恢复的具体数据进行恢复操作,提高了备份和恢复的精确性。
- 部分故障隔离:当某个库或表发生故障时,只需恢复受影响的库或表,而不需要恢复整个数据库系统。
二.基本思路
使用`mysqldump`实现分库分表备份的基本思路如下:
- 确定要备份的数据库列表:首先确定要备份的数据库列表,这些数据库可能是分布在不同的库中。
- 遍历数据库:对于每个数据库,遍历其中的表。
- 备份表:对于每个表,使用`mysqldump`命令备份表结构和数据到指定的备份文件中。
- 重复以上步骤:对其他数据库中的表重复执行步骤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`。