docker下mysql的备份

docker ps -a  #查看mysql的CONTAINER ID
docker exec -it mysql bash  #进入docker容器内的mysql

#备份的命令如下所示,按回车键后再输入mysql密码
mysqldump -u [用户名] -p --databases [数据库1] [数据库2] [数据库n] > 文件备份名.sql
#仅供参考
$mysqldump -u root -p --databases xhc > all.sql

自己的数据库备份

mysqldump -u root -p --databases xhc > xhc1.sql
#备份所有数据库
$ mysqldump -u root -p root --all-databases >  data_`date +\%F`.sql

#Warning: Using a password on the command line interface can be insecure.
#翻译过来是:在命令行界面上使用密码可以是不安全的

ls -l
exit

docker cp MySQL:/xhc1.sql /home/docker/mysql/backup/data
ls
CKUP_ROOT=/home/docker/mysql
BACKUP_FILEDIR=$BACKUP_ROOT/backup/data
 
DATE=$(date +%Y%m%d)
 
#查询所有数据库
DATABASES=("xhc")
#循环数据库进行备份
for db in ${DATABASES[@]}
do
        echo [$(date +%Y-%m-%d#%H:%M:%S)]----------$BACKUP_FILEDIR/${db}_$DATE.sql.gz BEGIN----------
        docker exec -i "MySQL" mysqldump -uroot -proot --default-character-set=utf8 -q -R -B ${db} | gzip > $BACKUP_FILEDIR/${db}_$DATE.sql.gz
        echo [$(date +%Y-%m-%d#%H:%M:%S)]----------$BACKUP_FILEDIR/${db}_$DATE.sql.gz COMPLETE----------
        echo [$(date +%Y-%m-%d#%H:%M:%S)]----------删除历史备份---------------------------
        rm -f $BACKUP_FILEDIR/${db}_$(date -d -7day +%Y%m%d).sql.gz
        echo [$(date +%Y-%m-%d#%H:%M:%S)]----------删除成功-------------------------------
done
echo "done"

一步到位方法一

sudo docker exec MySQL sh -c 'exec mysqldump --all-databases -uroot -proot --all-databases' > /home/docker/mysql/backup/data_`date +\%F`.sql

方法二

sudo docker exec -it mysql mysqldump -uroot -p123456 --all-databases > /var/backup/data_`date +%F`.sql
docker exec MySQL sh -c 'exec mysqldump --all-databases -uroot -proot --all-databases' > /home/docker/mysql/backup/data_`date +\%F`.sql

一、定时备份

注意把以下命令中的DatabaseName换为实际的数据库名称;

vi bk.sh

输入/粘贴以下内容:

#!/bin/bash

mysqldump -uroot -proot xhc > /home/docker/mysql/backup/xhc_$(date +%Y%m%d_%H%M%S).sql

对备份进行压缩:

#!/bin/bash

mysqldump -uroot -proot xhc | gzip > /home/docker/mysql/backup/xhc_$(date +%Y%m%d_%H%M%S).sql.gz12

注意:

  • 把 username 替换为实际的用户名;
  • 把 password 替换为实际的密码;
  • 把 DatabaseName 替换为实际的数据库名;
crontab -e

每分钟备份一次

*/1 * * * * sh home/docker/mysql/backup/bk.sh

二、还原

#进入容器
sudo docker exec -it mysql bin/bash
#进入mysql
mysql -uroot -p

使用备份sql恢复数据库

source /home/docker/mysql/backup/emp_2022-04-55.sql

或者不进入mysql直接容器中还原

mysql -uroot -proot < /home/docker/mysql/backup/mp_2022-04-22.sql

三、定时任务

1.设置定时任务

crontab -e

内容如下:

添加一行(共六个参数:分 时 几号 几月 周几 命令)
0 1,13 * * * /usr/local/dbback/autoBackup.sh
表示每天1点整和13点整运行该命令
0 2 * * * find /backup/ -mtime +1 -name "*.sql" -delete && sudo docker exec MySQL sh -c 'exec mysqldump --all-databases -uroot -proot --all-databases' > /home/docker/mysql/backup/data_`date +\%F`.sql

命令说明:
每天凌晨2点执行

find /backup/ -mtime +1 -name "*.sql" -delete

根据需要自己选择

0 2 * * * find /backup/ -mtime +1 -name "*.sql" -delete && sudo docker exec MySQL sh -c 'exec mysqldump --all-databases -uroot -proot --all-databases' > /home/docker/mysql/backup/data_`date +/%F`.sql

2.定时任务不执行

更新:第二天发现没有备份文件,查看cron日志。如没有,请开启cron日志。方法如下:

编辑系统日志文件

vim /etc/rsyslog.d/50-default.conf

去掉前面的#注释符号

cron.*      /var/log/cron.log

重启日志服务

systemctl restart rsyslog.service

查看定时任务显示

cat /var/log/cron.log

四、测试数据库备份shell

测试shell

测试1:
KUP_ROOT=备份路径
BACKUP_FILEDIR=$BACKUP_ROOT/backup/data

DATE=$(date +%Y%m%d)

#查询所有数据库
DATABASES=("db")
#循环数据库进行备份
for db in ${DATABASES[@]}
do
        echo [$(date +%Y-%m-%d#%H:%M:%S)]---------- BEGIN----------
        docker exec MySQL sh -c 'exec mysqldump --all-databases -uroot -proot --all-databases' > $BACKUP_ROOT/backup/$(db)_$(date +%Y-%m-%d#%H:%M:%S).sql
        echo [$(date +%Y-%m-%d#%H:%M:%S)]----------COMPLETE--------
        echo [$(date +%Y-%m-%d#%H:%M:%S)]----------删除历史备份---------------------------
        rm -f $BACKUP_FILEDIR/${db}_$(date -d -7day +%Y%m%d).sql
        echo [$(date +%Y-%m-%d#%H:%M:%S)]----------删除成功-------------------------------
done
echo "done"
测试shell2:
#获取开始时间

NOW=$(date "+%Y%m%d_%H-%M-%S")

echo "*- 当前时间:$NOW -*"

echo "*- 正在进行备份数据库......"
#备份文件的目录

KUP=备份路径
BACKUP_ROOT=/home/docker/mysql
BACKUP_FILEDIR=$BACKUP_ROOT/backup/data
FILE=$BACKUP/$NOW/$NOW.sql.gz 
DATE=$(date +%Y%m%d)
 
#查询所有数据库
DATABASES=("db")
#循环数据库进行备份
for db in ${DATABASES[@]}
do
        echo [$(date +%Y-%m-%d#%H:%M:%S)]-------------BEGIN------------
        [ ! -d $BACKUP/$NOW ] && mkdir -p $BACKUP/$NOW
        docker exec MySQL sh -c 'exec mysqldump --all-databases -uroot -proot --all-databases' > $BACKUP/$NOW/$NOW.sql
        echo [$(date +%Y-%m-%d#%H:%M:%S)]------------COMPLETE----------

        echo [$(date +%Y-%m-%d#%H:%M:%S)]-----------ZIP BEGIN----------
        docker exec -i "MySQL" mysqldump -uroot -proot --default-character-set=utf8 -q -R -B $DATABASES | gzip > $FILE
        echo [$(date +%Y-%m-%d#%H:%M:%S)]----------END COMPLETE--------
        echo [$(date +%Y-%m-%d#%H:%M:%S)]----------删除历史备份--------
        rm -f $BACKUP_FILEDIR/DB_$(date -d -7day +%Y%m%d).sql
        echo [$(date +%Y-%m-%d#%H:%M:%S)]----------删除成功------------
done
echo "done"
测试3:
#!/bin/bash

#获取开始时间

NOW=$(date "+%Y%m%d_%H-%M-%S")

echo "*- 当前时间:$NOW -*"

echo "*- 正在进行备份数据库......"
#!/bin/bash

#获取开始时间

NOW=$(date "+%Y%m%d_%H-%M-%S")

echo "*- 当前时间:$NOW -*"

echo "*- 正在进行备份数据库......"
#备份文件的目录

BACKUP=备份路径backup
BACKUP_ROOT=备份路径
BACKUP_FILEDIR=$BACKUP_ROOT/backup/data
FILE=$BACKUP/$NOW/$NOW.sql.gz
DATE=$(date +%Y%m%d)

#查询所有数据库
DATABASES=("xhc")
#循环数据库进行备份
for db in ${DATABASES[@]}
do
        echo [$(date +%Y-%m-%d#%H:%M:%S)]-------------BEGIN------------
        [ ! -d $BACKUP/$NOW ] && mkdir -p $BACKUP/$NOW
        docker exec MySQL sh -c 'exec mysqldump --all-databases -uroot -proot --all-databases' > $BACKUP/$NOW/$NOW.sql
        echo [$(date +%Y-%m-%d#%H:%M:%S)]------------COMPLETE----------

        echo [$(date +%Y-%m-%d#%H:%M:%S)]-----------ZIP BEGIN----------
        docker exec -i "MySQL" mysqldump -uroot -proot --default-character-set=utf8 -q -R -B --all-databases | gzip > $FILE
        echo [$(date +%Y-%m-%d#%H:%M:%S)]----------END COMPLETE--------
        echo [$(date +%Y-%m-%d#%H:%M:%S)]----------删除历史备份--------
        rm -f $BACKUP_FILEDIR/DB_$(date -d -7day +%Y%m%d).sql
        echo [$(date +%Y-%m-%d#%H:%M:%S)]----------删除成功------------
done
#检验文件是否备份成功

if [ -f $FILE -a -s $FILE ]

then
        echo "[$(date +%Y-%m-%d#%H:%M:%S)]----------备份成功------------"
else
        echo "[$(date +%Y-%m-%d#%H:%M:%S)]-----备份失败,请重新尝试---------"
fi
#打包备份文件的压缩文件及上级目录

FILE=$NOW.tar.gz

#切到/home/docker/mysql/backup目录,并发送提示信息

cd $BACKUP_ROOT

echo "[$(date +%Y-%m-%d#%H:%M:%S)]--正在将备份资源打包为$FILE--"

#打包

tar -zvcf $BACKUP_ROOT/$FILE $NOW

#备份结束,删除打包前的备份文件目录
rm -rf $NOW
#清理过早的备份文件,5天前
find -atime +5 -name ".tar.gz" -exec rm -rf {} \;
#获取结束时间

NOW=$(date "+%y-%m-%d_%H:%M:%S")

echo "*- 数据库备份已完成"

echo "*- 当前时间:$NOW -*"

请根据实际情况修改参数