基于 mysql 镜像的定时自动备份数据和清除过期备份

0. 环境

CentOS 7
mysql8镜像
备份方式:mysqldump 命令

1. 实现

1.1 自动备份、清除脚本

mysql_backup.sh 脚本,本例将其放置在 /home/test/db_bk 文件夹下

#!/bin/bash
#备份日期
DATE=`date +%F`
#打印日志的时间
LOG_TIME=`date '+%c'`
#备份有效期30天
DATA_KEEP_ALIVED=30
#当前日期时间戳,用于判断备份是否过期
TODAY_TIMESTAMP=`date -d "-$DATA_KEEP_ALIVED day" +%s`
DB_USER="test_user"
DB_PASS="test_user2021@mysql"
DB_HOST="127.0.0.1"
DB_NAME="testdb"
DB_NAME1="testdb1"
DB_NAME2="testdb2"
#备份文件夹名称
BACK_PATH="backup"
#数据挂载备份路径,这个就是 mysql 镜像启动时挂载的路径
BACK_DIR="/data/mysql/data_bak"
#容器中备份路径,无需变动
CONTAINER_DIR="/var/lib/mysql/${BACK_PATH}"
#日志文件夹,就是想要存放 dumplog 的位置,自定义,文件夹不存在的话要自己建
LOG_PATH="/home/test/db_bk"

#创建备份文件夹,以日期为文件夹名进行区分
sudo docker exec -i mysql bash -c "mkdir -p /var/lib/mysql/${BACK_PATH}/${DATE}"
#开始备份文件
sudo docker exec -i mysql bash -c "mysqldump --no-defaults -u${DB_USER} -p${DB_PASS} ${DB_NAME} > ${CONTAINER_DIR}/${DATE}/${DB_NAME}.sql"
sudo docker exec -i mysql bash -c "mysqldump --no-defaults -u${DB_USER} -p${DB_PASS} ${DB_NAME} > ${CONTAINER_DIR}/${DATE}/${DB_NAME1}.sql"
sudo docker exec -i mysql bash -c "mysqldump --no-defaults -u${DB_USER} -p${DB_PASS} ${DB_NAME} > ${CONTAINER_DIR}/${DATE}/${DB_NAME2}.sql"
sudo echo -e "\nMysql auto dump completed databese from ${DB_HOST} at ${LOG_TIME}" >> "${LOG_PATH}/dumplog"
#删除过期备份
for back_path in `ls $BACK_DIR/$BACK_PATH`; do
     #日期转换为时间戳
    file_time=`date -d "$back_path" +%s`
    if [ $file_time -lt $TODAY_TIMESTAMP ]
    then
        echo `sudo rm -rf $BACK_DIR/$BACK_PATH/$back_path`
        sudo echo "Mysql auto delete overdue data: ${back_path}  at ${LOG_TIME}" >> "${LOG_PATH}/dumplog"
    fi
done

执行以上脚本后,会在挂在路径下生成 “/backup/日期” 的文件夹,文件夹内存着备份的 sql 文件,当需要恢复备份时,执行对应的 sql 文件即可。

1.2 定时任务

Linux 内置的 cron 进程可以用于开启定时任务
cron进程简介
进入 cron 编辑器:

#进入 cron 编辑器,使用方法和 vim 相同
crontab -e

编辑cron命令:

#每天凌晨 3:00 进行数据备份,格式就是: cron 表达式 + shell 命令;值得注意的是,这里得 cron 表达式是没有秒的,从分开始
0 3 * * * sh /home/test/db_bk/mysql_backup.sh

可以通过以下命令,查看定时任务情况:

cat /var/spool/mail/test

1.3 执行 sql 文件,恢复备份数据

执行以上脚本后,会在挂在路径下生成 “/backup/日期” 的文件夹,文件夹内存着备份的 sql 文件,当需要恢复备份时,执行对应的 sql 文件即可。

1.3.1 第三方工具实现

可以把备份的 sql 文件导出,然后用 navicat 之类的工具执行 sql 文件即可。

1.3.2 连接 mysql 执行

1.3.2.1
*注意:需要设置字符集,否则会乱码,mysql -u [用户] -p --default-character-set=utf8mb4

#目前执行报错,未解决,ERROR 3546 (HY000) at line 24: @@GLOBAL.GTID_PURGED cannot be changed: the added gtid set must not overlap with @@GLOBAL.GTID_EXECUTED,
sudo docker exec -i mysql bash -c "mysql -utest_user -ptest_user2021@mysql -Dtestdb < /var/lib/mysql/backup/2021-08-18/testdb.sql"

1.3.2.2

#1.进入容器
sudo docker exec -it bash mysql bash
#2.连接 mysql, 并通过 -D 选择数据库,也可以不用 -D,进入数据库后,通过 use testdb 数据库也行
mysql -utest_user -ptest_user2021@mysql -Dtestdb
#3.执行 sql 文件
source /var/lib/mysql/backup/2021-08-18/testdb.sql
#或者用这个命令执行 sql 文件,效果相同
\. /var/lib/mysql/backup/2021-08-18/testdb.sql

2. mysqldump

#适用于手动备份,输入命令后还要输入密码,相对安;但是写在脚本中,需要把密码加载 -p 之后
#dbnames,tables 都可以指定多个
mysqldump -u username -p dbnames [tables] > BackupName.sql;

数据库备份方式

你可能感兴趣的:(基于 mysql 镜像的定时自动备份数据和清除过期备份)