网站迁移完成之后,忘了数据库备份工作没有完成。之前用的云虚拟主机数据库是分离出来的,阿里会帮你保留3天的数据库备份。现在的轻量应用服务器,数据库备份是需要自己完成的。因此搜索了许多资料,整理出如下本人认为比较适合我使用的方法。

一、编写数据库备份脚本、设置

参考资料如下

#!/bin/bash
DATE=`date +%Y%m%d%H%M` #every minute
DATABASE=springboot-admin #database name
DB_USERNAME=root #database username
DB_PASSWORD="mysql" #database password
BACKUP_PATH=/backup/mysqldata #backup path
#backup command
/usr/bin/mysqldump -u$DB_USERNAME -p$DB_PASSWORD -h 127.0.0.1 -R --opt $DATABASE | gzip > ${BACKUP_PATH}\/${DATABASE}_${DATE}.sql.gz
#just backup the latest 5 days
find ${BACKUP_PATH} -mtime +5 -name "${DATABASE}_*.sql.gz" -exec rm -f {} \;

经测试以上代码是可以使用成功备份数据库的,但是数据库备份时会出现警告!

mysqldump: [Warning] Using a password on the command line interface can be insecure.

大概意思是:命令行界面使用密码是不安全的

于是再参考了一些资料,我们的数据库用户名和密码,应该写在my.cnf配置文件里。

###在[mysqldump]下增加用户名和密码##################
[mysqldump]
user=root
password=mysql

脚本代码里不再需要涉及用户名和密码了,代码如下:

#!/bin/bash
DATE=`date +%Y%m%d%H%M` #every minute
DATABASE=springboot-admin #database name
BACKUP_PATH=/backup/mysqldata #backup path
#backup command
/usr/bin/mysqldump -h 127.0.0.1 -R --opt $DATABASE | gzip > ${BACKUP_PATH}\/${DATABASE}_${DATE}.sql.gz
#just backup the latest 5 days
find ${BACKUP_PATH} -mtime +5 -name "${DATABASE}_*.sql.gz" -exec rm -f {} \;

写好脚本代码(我用的是notepad++编辑的要转换为UNIX格式),可以随便命名为:backup_mysql_shell.sh保存到/root/目录,并设置权限为可执行。(我用WinSCP上传文件权限设置为755)

记得要根据脚本代码中的BACKUP_PATH=/backup/mysqldata目录

提前创建好文件夹,不然会出现

mysqldump: Got errno 32 on write

find: ‘/backup/mysqldata’: 没有那个文件或目录

保存好脚本代码后,可以马上执行脚本,测试一下是否可以正常工作。

[root@iz2zecnv***0sp3z ~]# /root/backup_mysql_shell.sh

然后查看/backup/mysqldata这个目录里有没有成功备份出来的数据库.gz压缩包,即可验证脚本代码是否成功了。

二、创建crontab计划任务

输入命令:crontab -e

[root@iz2zecnv***0sp3z ~]# crontab -e

###会进入编辑模式###########################

0 5 * * * /root/backup_mysql_shell.sh

###每天凌晨5点执行任务############################

编辑好按Esc(跳到命令模式),再分别输入:wq(保存文件并退出),按回车

################################################

####跳出如下信息?###############################

no crontab for root - using an empty one

crontab: installing new crontab

###再次输入命令crontab -e ########################

[root@iz2zecnv***0sp3z ~]# crontab -e

###进入编辑模式,刚才编辑好的内容还在###############

0 5 * * * /root/backup_mysql_shell.sh

#################################################

###Esc(跳到命令模式),再分别输入:wq(保存文件并退出),按回车###

###现在只跳出一行了,正常了吗?####################

crontab: installing new crontab

###查看运行状态##################################

[root@iz2zecnv***0sp3z ~]# service crond status

Redirecting to /bin/systemctl status crond.service

● crond.service - Command Scheduler

Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)

Active: active (running) since Mon 2018-12-31 16:27:10 CST; 1 day 8h ago

......

###列出当前的所有调度任务########################

[root@iz2zecnv***0sp3z ~]# crontab -l

0 5 * * * /root/backup_mysql_shell.sh

###计划任务应该正常添加上了吧#####################

参考一些资料,再次确认了,任务成功添加了。

/etc/crontab配置文件讲解

crontab -e 是针对使用者的 cron 来设计的,如果是 系统的例行性任务 时,就要编辑 /etc/crontab 这个文件。

那就是 crontab -e 这个 crontab 其实是 /usr/bin/crontab 这个运行档,但是 /etc/crontab 可是一个 纯文字档 ,必须用 root 的身份编辑一下这个文件。

/usr/bin/crontab只有管理员才有编辑权限,每个用户会以用户名作为文件名,里面存储计划任务要执行的操作

基于每个用户。crontab -e 编辑的计划任务,其实是保存在/var/spool/cron/$username里的

定时备份数据库任务完成,过几天就可以验证效果如何啦。