大家好,我是Hunk。今天为大家分享的是如何将Docker内MySQL数据库的数据做定时备份。话不多说,直接开干!
1、编写脚本
在数据库服务器的/home
目录下,创建备份数据脚本文件mysqldump.sh
。
# 创建备份脚本,并输入以下内容
vim mysqldump.sh
#!/bin/bash
echo '##########################################'
echo '###### The database is automatically backed up at 01:00 am every day ######'
echo '##########################################'
# 设置环境变量
DATE=$(date +%Y_%m_%d_%H_%M_%S)
# 数据库用户名
USERNAME=root
# 数据库密码
PASSWORD=123456
# 要备份的数据库,多个时用空格隔开
DB=test
# 备份文件的名称,格式:数据库名+时间,如test-2024_01-12_19_29_08
BACKUP_NAME="$DB-$DATE"
# Docker Mysql 容器ID
DOCKERID=f707b6ed4f69
# 将备份产生的文件放到 /data_backup 目录下
DIR=/data_backup
# 判断备份目录是否存在,不存在则创建,最后进入该目录
echo 'Get system date: ' $DATE
if [ ! -d "$DIR" ]; then
mkdir $DIR
fi
cd $DIR
echo 'backup started...' $(date "+%Y-%m-%d %H:%M:%S")
# 备份 docker 容器中的数据库,下面有3种方式:备份全库、备份单个数据库实例、备份多个数据库实例
# 1-备份全部数据库
docker exec $DOCKERID /usr/bin/mysqldump -u $USERNAME --password=$PASSWORD -h 127.0.0.1 -A | gzip > /data_backup/$BACKUP_NAME.sql.gz
# 2-备份单个数据库实例
# docker exec $DOCKERID /usr/bin/mysqldump -u $USERNAME --password=$PASSWORD $DB | gzip > /data_backup/$BACKUP_NAME.sql.gz
# 3-备份多个数据库实例
# docker exec $DOCKERID /usr/bin/mysqldump -u $USERNAME --password=$PASSWORD --databases $DB | gzip > /data_backup/$BACKUP_NAME.sql.gz
# scp远程网络传输至异地服务器,需要提前安装expect工具(可选)
echo 'sql scp start'
/usr/bin/expect <<-EOF
set timeout -1;
spawn scp -P 远程服务器端口 /data_backup/$BACKUP_NAME.sql.gz root@远程服务器地址:/mysqldump/
expect {
"*password:" {send "远程服务器密码r";exp_continue;}
"yes/no" {send "yesr";}
}
EOF
# 最多保留的备份文件个数,比如每天都备份的话就只会保留最近5次的备份文件
ReservedNum=5
date=$(date "+%Y%m%d-%H%M%S")
FileNum=$(ls -l $DIR|grep ^- |wc -l)
while(( $FileNum > $ReservedNum))
do
OldFile=$(ls -rt $DIR| head -1)
echo $date "Delete File:"$OldFile
rm -rf $DIR/$OldFile
let "FileNum--"
done
# 数据备份结束!
echo 'backup completed!' $(date "+%Y-%m-%d %H:%M:%S")
1)注意将数据库的用户名、密码、要备份的数据库以及容器ID替换成自己的;2)若不需要远程异地部分则注释掉scp部分;如果需要异地备份,则需要将异地服务器远程地址、端口、密码替换成自己的(需要提前安装好expect命令工具)。
# 赋予脚本执行权限
chmod +x mysqldump.sh
2、编写定时任务
2.1 安装crond服务
# 检查crond服务是否安装
systemctl status crond
如果提示Unit crond.service could not be found.
,则说明需要安装crond服务。
## 安装crond
yum -y install crontabs
## 启动crond服务
systemctl start crond
## 设置开机自启
systemctl enable crond
2.2 添加定时任务
crontab -e
添加如下规则:如每天凌晨1点时执行root用户中的/home/mysqldump.sh
脚本命令
0 1 * * * root . /etc/profile;/bin/sh /home/mysqldump.sh
可以执行命令:cat /etc/crontab
看下crontab文件中的任务格式。
2.3 重启crond服务
systemctl restart crond
2.4 查看任务执行情况
cat /var/log/cron

大家好,我是Hunk。今天为大家分享的是如何将Docker内MySQL数据库的数据做定时备份。话不多说,直接开干!
1、编写脚本
在数据库服务器的/home
目录下,创建备份数据脚本文件mysqldump.sh
。
# 创建备份脚本,并输入以下内容
vim mysqldump.sh
#!/bin/bash
echo '##########################################'
echo '###### The database is automatically backed up at 01:00 am every day ######'
echo '##########################################'
# 设置环境变量
DATE=$(date +%Y_%m_%d_%H_%M_%S)
# 数据库用户名
USERNAME=root
# 数据库密码
PASSWORD=123456
# 要备份的数据库,多个时用空格隔开
DB=test
# 备份文件的名称,格式:数据库名+时间,如test-2024_01-12_19_29_08
BACKUP_NAME="$DB-$DATE"
# Docker Mysql 容器ID
DOCKERID=f707b6ed4f69
# 将备份产生的文件放到 /data_backup 目录下
DIR=/data_backup
# 判断备份目录是否存在,不存在则创建,最后进入该目录
echo 'Get system date: ' $DATE
if [ ! -d "$DIR" ]; then
mkdir $DIR
fi
cd $DIR
echo 'backup started...' $(date "+%Y-%m-%d %H:%M:%S")
# 备份 docker 容器中的数据库,下面有3种方式:备份全库、备份单个数据库实例、备份多个数据库实例
# 1-备份全部数据库
docker exec $DOCKERID /usr/bin/mysqldump -u $USERNAME --password=$PASSWORD -h 127.0.0.1 -A | gzip > /data_backup/$BACKUP_NAME.sql.gz
# 2-备份单个数据库实例
# docker exec $DOCKERID /usr/bin/mysqldump -u $USERNAME --password=$PASSWORD $DB | gzip > /data_backup/$BACKUP_NAME.sql.gz
# 3-备份多个数据库实例
# docker exec $DOCKERID /usr/bin/mysqldump -u $USERNAME --password=$PASSWORD --databases $DB | gzip > /data_backup/$BACKUP_NAME.sql.gz
# scp远程网络传输至异地服务器,需要提前安装expect工具(可选)
echo 'sql scp start'
/usr/bin/expect <<-EOF
set timeout -1;
spawn scp -P 远程服务器端口 /data_backup/$BACKUP_NAME.sql.gz root@远程服务器地址:/mysqldump/
expect {
"*password:" {send "远程服务器密码r";exp_continue;}
"yes/no" {send "yesr";}
}
EOF
# 最多保留的备份文件个数,比如每天都备份的话就只会保留最近5次的备份文件
ReservedNum=5
date=$(date "+%Y%m%d-%H%M%S")
FileNum=$(ls -l $DIR|grep ^- |wc -l)
while(( $FileNum > $ReservedNum))
do
OldFile=$(ls -rt $DIR| head -1)
echo $date "Delete File:"$OldFile
rm -rf $DIR/$OldFile
let "FileNum--"
done
# 数据备份结束!
echo 'backup completed!' $(date "+%Y-%m-%d %H:%M:%S")
1)注意将数据库的用户名、密码、要备份的数据库以及容器ID替换成自己的;2)若不需要远程异地部分则注释掉scp部分;如果需要异地备份,则需要将异地服务器远程地址、端口、密码替换成自己的(需要提前安装好expect命令工具)。
# 赋予脚本执行权限
chmod +x mysqldump.sh
2、编写定时任务
2.1 安装crond服务
# 检查crond服务是否安装
systemctl status crond
如果提示Unit crond.service could not be found.
,则说明需要安装crond服务。
## 安装crond
yum -y install crontabs
## 启动crond服务
systemctl start crond
## 设置开机自启
systemctl enable crond
2.2 添加定时任务
crontab -e
添加如下规则:如每天凌晨1点时执行root用户中的/home/mysqldump.sh
脚本命令
0 1 * * * root . /etc/profile;/bin/sh /home/mysqldump.sh
可以执行命令:
cat /etc/crontab
看下crontab文件中的任务格式。
2.3 重启crond服务
systemctl restart crond
2.4 查看任务执行情况
cat /var/log/cron

往期推荐
原文始发于微信公众号(Java浩窍门):牛逼!教你如何做好Docker内数据库的定时备份
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/244515.html