shell脚本备份MySQL数据库和库下表

目录

注意:

一.脚本内容

二.执行效果

三.创建定时任务


注意:

  • 以下为对MySQL5.7.42版本数据库备份shell脚本参考
  • 运行备份的机器请确认mysqldump版本>5.7,否则备份参数--set-gtid-purged=OFF无效,考虑到一般数据库节点和备份节点不为同一节点,以下链接为mysql5.7.43的rpm安装包,解压后"yum localinstall -y mysql-community* 即可"

通过网盘分享的文件:mysql-5.7.43-1.el7.x86_64.rpm-bundle.tar

链接: https://pan.baidu.com/s/1C1dK_zeS0-p7ePih1ff4tg?pwd=cer9 提取码: cer9

  • 该脚本目前是对于整库、库下各表都做了备份,若不需要对各表进行备份,去除关于备表的for循环即可。

一.脚本内容

bash 复制代码
#!/bin/bash
# 定义连接mysql的用户、密码、地址、端口
mysql_user="root"
mysql_pass="SLBmysql2025"
mysql_host="192.168.2.199"
mysql_port="20307"
# 定义排除数据库变量
exdbname='information_schema|performance_schema|sys|mysql'
date="$(date +"%Y-%m-%d")"
# 定义备份路径变量
bak_path="/data/mysql/back"
# 日志存放位置
log_file="$bak_path/$date/backup.log"
# 定义日志保留天数
retain_days=7
# 定义备份参数
dump_opts='--set-gtid-purged=OFF --single-transaction --no-autocommit'
# 检查备份路径是否存在,不存在则创建
if [ ! -d "$bak_path" ]; then
    mkdir -p "$bak_path"
fi
# 获取数据库列表,排除指定数据库
#db_list=$(mysql -u$mysql_user -p$mysql_pass -h$mysql_host -P$mysql_port -e 'SHOW DATABASES;' 2>/dev/null | sed '1d' | grep -Ev "^($exdbname)$")
db_list=$(mysql -u$mysql_user -p$mysql_pass -h$mysql_host -P$mysql_port -Bse 'SHOW DATABASES;' 2>/dev/null | grep -Ev "^($exdbname)$")
# 检查是否获取到数据库列表
if [ -z "$db_list" ]; then
    echo "未获取到有效的数据库列表,请检查 MySQL 连接和权限。" > $log_file
    exit 1
fi
# 对每个数据库进行操作
for db in $db_list; do
    # 创建数据库对应的备份目录
    db_backup_dir="$bak_path/$date/$db"
    SIZE=$(mysql -u$mysql_user -p$mysql_pass -h$mysql_host -P$mysql_port --silent --skip-column-names -e "SELECT ROUND(SUM(data_length) / 1024 / 1024, 0) FROM information_schema.TABLES WHERE table_schema=\"$db\";")
    if [ ! -d "$db_backup_dir" ]; then
        mkdir -p "$db_backup_dir"
    fi
    # 备份整个数据库
    mysqldump -u$mysql_user -p$mysql_pass -h$mysql_host -P$mysql_port $dump_opts -B "$db" 2>/dev/null | gzip > "$db_backup_dir/${db}_$(date +%F).sql.gz"
    if [ $? -ne 0 ]; then
        echo "备份数据库 $db 失败。" >> $log_file
    else
        echo "数据库 $db 备份成功,存放路径 $db_backup_dir/${db}_$(date +%F).sql.gz,大小为 $SIZE M" >> $log_file
    fi
    
    # 获取数据库中的表列表
    tb_list=$(mysql -u$mysql_user -p$mysql_pass -h$mysql_host -P$mysql_port -N -e "SHOW TABLES FROM $db" 2>/dev/null)
    # 检查是否获取到表列表
    if [ -z "$tb_list" ]; then
        echo "未获取到数据库 $db 中的表列表。" >> $log_file
        continue
    fi
    # 对每个表进行操作
    for tb in $tb_list; do
        # 备份单个表
        mysqldump -u$mysql_user -p$mysql_pass -h$mysql_host -P$mysql_port $dump_opts "$db" "$tb" 2>/dev/null | gzip > "$db_backup_dir/${db}_${tb}_$(date +%F).sql.gz"
        if [ $? -ne 0 ]; then
            echo "备份表 $db.$tb 失败。" >> $log_file
        else
            echo "表 $db.$tb 备份成功,存放路径 $db_backup_dir/${db}_${tb}_$(date +%F).sql.gz" >> $log_file
        fi
    done
done

find $bak_path -mtime +$retain_days -exec rm -f {} \;

二.执行效果

bash 复制代码
[root@master01 mysql]# bash sh/backup.sh 
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@master01 mysql]# ll
total 12
drwxr-xr-x 3 root    root   24 Feb 17 22:19 back
drwxr-xr-x 7 polkitd root 4096 Feb 17 22:15 data
-rw-r--r-- 1 root    root 1802 Feb 16 18:18 my.cnf
-rw-r--r-- 1 root    root  242 Feb 16 18:18 mysql.txt
drwxr-xr-x 2 root    root   23 Feb 17 22:19 sh
[root@master01 mysql]# cd back/2025-02-17/
[root@master01 2025-02-17]# ll
total 4
-rw-r--r-- 1 root root 436 Feb 17 22:19 backup.log
drwxr-xr-x 2 root root  73 Feb 17 22:19 slb
drwxr-xr-x 2 root root  76 Feb 17 22:19 test
[root@master01 2025-02-17]# du -sh ./*
4.0K    ./backup.log
24K     ./slb
24K     ./test
[root@master01 2025-02-17]# cat backup.log 
数据库 slb 备份成功,存放路径 /data/mysql/back/2025-02-17/slb/slb_2025-02-17.sql.gz,大小为 0 M
表 slb.students 备份成功,存放路径 /data/mysql/back/2025-02-17/slb/slb_students_2025-02-17.sql.gz
数据库 test 备份成功,存放路径 /data/mysql/back/2025-02-17/test/test_2025-02-17.sql.gz,大小为 0 M
表 test.employees 备份成功,存放路径 /data/mysql/back/2025-02-17/test/test_employees_2025-02-17.sql.gz
[root@master01 2025-02-17]# pwd
/data/mysql/back/2025-02-17

三.创建定时任务

bash 复制代码
[root@master01 sh]# tail -1 /etc/crontab 
0 2 * * * root /usr/bin/bash /data/mysql/sh/mysql_backup.sh
相关推荐
白鲸开源1 小时前
(二)从分层架构到数据湖仓架构:数据仓库分层下的技术架构与举例
大数据·数据库·数据分析
阿维的博客日记1 小时前
从夯到拉的Redis和MySQL双写一致性解决方案排名
redis·分布式·mysql
好玩的Matlab(NCEPU)1 小时前
Redis vs RabbitMQ 对比总结
数据库·redis·rabbitmq
21号 11 小时前
16.MySQL 服务器配置与管理
服务器·数据库·mysql
我的offer在哪里1 小时前
MongoDB
数据库·mongodb
SamDeepThinking2 小时前
为超过10亿条记录的订单表新增字段
mysql
练习时长一年3 小时前
AI开发结构化输出
数据库
IvorySQL3 小时前
灾难恢复工具内核细节探究与分享
数据库·postgresql·开源
lypzcgf3 小时前
商城小程序数据库表结构文档
数据库·小程序·电商
jjw_zyfx3 小时前
Ubuntu上vue3 vite使用MBTiles搭建地图服务器
服务器·数据库·ubuntu