精彩文章免费看

Centos中使用脚本备份docker中的mysql - 以及恢复数据

备份数据库脚本mysql_backup_docker_dbname.sh

#!/bin/bash
# 设置mysql的登录用户名和密码(根据实际情况填写)
mysql_user="root"
mysql_password="root&"
mysql_host="6.135.32.78"
mysql_port="3306"
mysql_charset="utf8mb4"
mysql_database="db_name"
mysql_docker_name="mysql_docker"
# export MYSQL_PWD=${mysql_password}
# 备份文件存放地址(根据实际情况填写)
backup_location=/mysql-backup/dbname
#如果文件夹不存在,创建文件夹
if [ ! -d $backup_location ]; then
  mkdir $backup_location
# 是否删除过期数据
expire_backup_delete="OFF"
expire_days=30
backup_time=`date +%Y%m%d%H%M`
backup_dir=$backup_location
backup_file_name=$mysql_database"_"$backup_time".sql"
backup_file_name_zip=$mysql_database"_"$backup_time".sql.gz"
welcome_msg="Welcome to use MySQL backup tools!"
# 加上参数 -t 在定时任务中 不执行
# 备份指定数据库中数据(此处假设数据库是mysql_backup_test)
# docker exec -i mysql_docker mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -B $mysql_database > $backup_dir/mysql_backup_test-$backup_time.sql
# 正常备份
#   docker exec -i $mysql_docker_name mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password --default-character-set $mysql_charset --databases $mysql_database > $backup_dir/$backup_file_name
# 压缩 备份
docker exec -i $mysql_docker_name mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password --default-character-set $mysql_charset --databases $mysql_database  | gzip> $backup_dir/$backup_file_name_zip
# 删除过期数据
if [ "$expire_backup_delete" == "ON" -a  "$backup_location" != "" ];then
        `find $backup_location/ -type f -mtime +$expire_days | xargs rm -rf`
        echo "Expired backup data delete complete!"

可以执行一下脚本看看 mysql_backup_file 文件会不会有备份出来的sql文件

执行脚本命令 - (这个报错是说 数据库密码明文显示不安全,没关系)

cd 到脚本目录下

sh  mysql_daybackup.sh

看到备份出来

使用crontab 进行定时备份 每天备份一次

#新建定时任务命令
crontab -e
#查看定时任务命令
crontab -l
#删除所有定时任务命令
crontab -r

crontab定时命令
crontab -e

编辑 定时任务表 添加下面内容

每5分钟执行一次

*/5 * * * * sh /mysql-backup/mysql_backup_docker_dbname.sh

每天的 2:05 执行

5 2 * * * sh /mysql-backup/mysql_backup_docker_dbname.sh

在 crontab 命令中只有 “绝对路径”,不存在相对路径,故执行任何命令都需要写绝对路径

1、每小时的第5分钟执行 ls 命令

5 * * * * ls

2、每5分钟执行 ls 命令

*/5 * * * * ls

3、每天的 4:30 执行 ls 命令

30 4 * * * ls

4、每小时执行 ls 命令

0 * * * * ls

5、每天执行 ls 命令

0 0 * * * ls

可以使用命令查看定时任务
crontab -l

然后重启crontab服务

service crond restart
systemctl restart crond

恢复命令(这个报错是说 数据库密码明文显示不安全,没关系)

 docker exec -i docker容器ID mysql -uroot -p数据库密码 -D 需要恢复的数据库名 < ./20210903_对应的备份好的数据库名.sql

把备份好的sql 减压后 db_name_20220331.sql

执行下面的命令

docker exec -i docker容器名或ID sh -c 'exec mysql -h8.120.152.117 -P3306 -uroot -p"root&"'  -D 需要恢复的数据库名 < /mysql-backup/db_name_20220331.sql

添加定时任务crontab -e时出现了

no crontab for chenrui - using an empty one
No modification made

chenrui是我机器的名字,也就是当前用户的username

解决方法是,根据你的系统确定系统的编辑器是什么。
我的是vim,那么解决方法是:切换到root用户,终端输入

export EDITOR=vim

如果是emacs,切换到root用户,终端输入

export EDITOR=emacs

如果是nano,切换到root用户,终端输入

export EDITOR=nano

知道解决方法后,这个错误的原因是,系统没有指定默认的编辑器。上面的命令也就是选择一个默认编辑器就可以了。
再此执行crontab -e。

在linux下修改crontab,新增了一个定时任务,保存后报以下错误:
errors in crontab file, can’t install

检查发现是新增的定时任务格式不对,在每天8:30执行某个sh脚本的crontab命令本来应该是这样:

30 8 * * * sh脚本