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
fi
# 是否删除过期数据
expire_backup_delete="OFF"
expire_days=15
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!"
fi
可以执行一下脚本看看 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
在编辑界面 输入i 开始输入上面的内容
输入 : 退出到 命令行界面
输入 wq 保存退出
在 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
#Ubuntu上的服务名称是cron不是`crond`。所以你的命令应该是:
sudo service cron start
恢复命令(这个报错是说 数据库密码明文显示不安全,没关系)
docker exec -i docker容器ID mysql -uroot -p数据库密码 -D 需要恢复的数据库名 < ./20210903_对应的备份好的数据库名.sql
#使用减压命令 在文件 wms_202310110205.sql.gz 目录下
gunzip wms_202310110205.sql.gz
把备份好的sql.gz文件 减压后 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
docker exec -i mysql-3308 sh -c 'exec mysql -h192.168.1.109 -P3308 -uroot -p"root2020&" -D wms_202410' < /data/mysql-back/wms/wms_2024-10-11.sql
在 ubutn 麒麟系统中 命令行 前面加 sudo
使用 dbeaver 工具 还原数据库 使用上面的 数据库备份db_name_20220331.sql
如果不成功 打开备份sql文件
把 下面 两句注释了,重新还原,成功
-- CREATE DATABASE `test_db`
-- USE `test_db`;
错误排查
错误1
添加定时任务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。
错误2
在linux下修改crontab,新增了一个定时任务,保存后报以下错误:
errors in crontab file, can’t install
检查发现是新增的定时任务格式不对,在每天8:30执行某个sh脚本的crontab命令本来应该是这样:
30 8 * * * sh脚本
错误3
麒麟系统 中 sh文件 报错
mysql_backup_wms.sh: 41: [: ON: unexpected operator
使用的Linux发行版为Ubuntu 22.4,根本原因是:
从Ubuntu 6.10开始,默认使用dash(theDebian Almquist Shell)而不是bash(the GNUBourne-Again Shell).
但Login Shell(一开始通过字符界面登入系统,不是通过x window界面打开terminal终端的shell)还是bash. 原因是dash更快、更高效,而且它符合POSIX规范。Ubuntu在启动的时候会运行很多shell脚本,使用dash可以加快启动速度。
而Bash(GNU Bourne-Again Shell)是大多数Linux平台的内定Shell,也是更经典的shell工具。
解决办法就是将dash替换为bash
sudo dpkg-reconfigure dash
执行命令会产生一个界面,英文大概意思为:是否使用dash作为默认的系统shell工具,我们选择“No”