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

2024-10-10  本文已影响0人  zhanglb12

备份数据库脚本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”

上一篇 下一篇

猜你喜欢

热点阅读