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 -*"
请根据实际情况修改参数