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脚本