目录
一、说明
上一篇文章介绍了Windos环境下的数据库(MySQL)备份,这篇文章介绍Linux下数据库备份。Linux系统数据库安装有两种情况,分别为原生环境和Docker环境:原生环境指数据库直接安装在系统中;Docker环境指MySQL作为容器安装。
自动备份实现方式为:脚本+crontab定时任务。
原生环境安装MySQL:https://www.runoob.com/mysql/mysql-install.html
Docker环境安装MySQL:https://www.runoob.com/docker/docker-install-mysql.html
注:以上两篇文章,本人未做验证,仅供参考。
Linux版本:
MySQL版本:
二、原生环境
1.创建shell脚本文件
[root]# vim /usr/sbin/mysqlbak.sh
mysqlbak.sh脚本内容如下:
#!/bin/bash
# 保存的目录
data_dir="/backup/mysql"
# 保存文件的名字,注意date是用#倒引号#包起来的
data_name="bak_`date +%Y%m%d%H`.sql"
if [ ! -d $data_dir ]; then
mkdir -p $data_dir
fi
# mysqldump备份命令
# -uroot 用户名
# -p123456 密码
# talentpool_lg 数据库名称
mysqldump -uroot -p123456 talentpool_lg > $data_dir/$data_name
# 删除7天前的备份文件
find $data_dir -name "bak_*.sql" -type f -m +7 -exec rm -rf {} \;
2.验证脚本是否可用
[root]# sh /usr/sbin/mysqlbak.sh #执行shell脚本
[root]# cd /backup/mysql #进入备份目录
[root]# ls -l #查看是否有备份文件
3.把脚本文件添加到crontab
crontab的命令可参考:https://www.runoob.com/linux/linux-comm-crontab.html
[root@JD ~]# date #查看当前系统时间
Thu Jun 20 11:47:55 CST 2019
[root@JD ~]# crontab -e #进入编辑界面
>50 11 * * * sh /usr/sbin/mysqlbak.sh
crontab: installing new crontab
[root@JD ~]# crontab -l #查看内容
50 11 * * * sh /usr/sbin/mysqlbak.sh
[root@JD ~]# /usr/sbin/crond restart #重启cron服务
crond: can't lock /var/run/crond.pid, otherpid may be 9051: Resource temporarily unavailable
[root@JD ~]# sudo rm -rf /var/run/crond.pid #针对以上报错,执行此命令
[root@JD ~]# /usr/sbin/crond restart #再次重启cron服务
[root@JD ~]# cd /backup/mysql #过设定的备份时间(11:50)后进入备份目录
[root@JD mysql]# ls #查看是否有备份文件
bak_2019062011.sql
三、Docker环境
Docker下的MySQL自动备份,原理与原生一致,区别在于,脚本写在容器内部,cron计划在容器内执行,备份文件也保存在容器目录下。
1.在MySQL容器内添加自动备份脚本并执行计划
[root]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b47f1cb38e21 mysql:5.6.40 "docker-entrypoint.s…" 9 days ago Up 2 hours new_mysql
[root]# docker exec -it new_mysql bash #进入mysql容器
# apt-get update && apt-get install vim #安装vim
# apt-get update && apt-get install cron #安装cron
# vim /usr/sbin/dockerbak.sh
//---dockerbak.sh脚本内容开始---//
!/bin/bash
data_dir="/backup/mysql"
data_name="bak_`date +%Y%m%d%H`.sql"
if [ ! -d $data_dir ]; then
mkdir -p $data_dir
fi
mysqldump -uroot -p123456 talentpool_lg > $data_dir/$data_name
find $data_dir -name "bak_*.sql" -type f -mtime +7 -exec rm -rf {} \;
//---dockerbak.sh脚本内容结束---//
//验证脚本是否可用
# sh /usr/sbin/dockerbak.sh #直接执行脚本
# cd /backup/mysql #进入备份目录
# ls -l #查看目录下文件
//添加脚本到crontab
# crontab -e #添加脚本到crontab
> 30 23 * * * sh /usr/sbin/dockerbak.sh #设定为每天23:30备份
# crontab -l #查看crontab内容
> 30 23 * * * sh /usr/sbin/dockerbak.sh
# service cron status #查看cron状态
>[FAIL] cron is not running ... failed!
# service cron start #启动cron
>[ ok ] Starting periodic command scheduler: cron.
# service cron status #再次查看cron状态
>[ ok ] cron is running.
注意查看容器时间与系统时间是否一致,时间不一致会导致计划不生效。同步时间方法如下,同步之后重启容器生效。
//同步主机与容器时间的命令,new_mysql为容器名(还可使用容器ID)
[root]# docker cp /etc/localtime new_mysql:/etc/
//重启容器
[root]# docker restart $(docker ps -a -q)
//重启之后,容器的cron服务可能会关闭,再次开启一下
[root]# docker exec -it new_mysql bash
# service cron restart
# exit
2.在Linux系统下添加一个复制脚本并执行计划
因为备份的文件保存在容器内,不方便查看,可在Linux添加一个复制脚本,把备份文件复制到主机目录下。
[root]# vim /usr/sbin/copybak.sh #创建复制脚本
//---copyback.sh脚本开始---//
>docker_name=new_mysql
>data_dir="/backup/mysql"
>data_name="bak_`date +%Y%m%d%H`.sql"
>
>if [ ! -d $data_dir ]; then
> mkdir -p $data_dir
>fi
>
>docker cp $docker_name:$data_dir/$data_name $data_dir
>find $data_dir -name "bak_*.sql" -type f -mtime +7 -exec rm -rf {} \;
//---copyback.sh脚本结束---//
[root]# crontab -e #把脚本添加到crontab
40 23 * * * sh /usr/sbin/copybak.sh #定时备份时间为:23:30,定时复制时间设为:23:40
[root]# # /usr/sbin/crond restart #重启cron服务
[root]# sudo rm -rf /var/run/crond.pid #直接重启会报错,先执行这个命令
[root]# # /usr/sbin/crond restart #重启cron服务
四、参考链接
1.https://blog.csdn.net/qq_32684319/article/details/86996369
2.https://blog.csdn.net/MR1269427885/article/details/82978311
3.https://www.jianshu.com/p/be1e581acb8e