前几天刚刚把博客框架搭建起来,可以愉快的写文章了,但是写的文章需要花很多时间码出来,如果VPS或网站等挂掉了,那我的文章内容不就丢失啦。于是咨询了资深的Web大佬(好朋友小龙的表弟),他建议使用crontab来实现定时备份。有了这个关键词,还能难倒我Steven吗?通过Google一顿狂搜,终于找到一篇看起来可以用的文章。本文主要参考了【 Ken的杂谈 】的文章,不过文中遇到的问题我也会一并在文章Tip出来哦。

一、前言

1、本文主要内容

  • 实现数据库全量备份
  • 实现定时执行备份
  • 实现定时清理7天之前的备份

2、环境信息

环境/工具说明
MySQLv5.7.x
mysqldumpMySQL自带的数据导出工具
crontab功能相当于Windows的任务计划工具

二、备份准备&备份测试

1、备份目录准备

#mysql专用目录
mkdir /mysql
#mysql备份目录
mkdir /mysql/backup
#mysql备份脚本
mkdir /mysql/backup/scripts
#mysql备份文件
mkdir /mysql/backup/files
#mysql备份日志
mkdir /mysql/backup/logs

2、备份脚本准备

  • 新建完整备份脚本
vi /mysql/backup/scripts/backup_full.sh
  • 脚本内容
#!/bin/bash

#备份目录
BACKUP_ROOT=/mysql/backup
BACKUP_FILEDIR=$BACKUP_ROOT/files
BACKUP_LOGDIR=$BACKUP_ROOT/logs

#当前日期
DATE=$(date +%Y%m%d)

#密码
PASSWD="123456"

######备份######

#查询所有数据库
#-uroot -p123456表示使用root账号执行命令,且root账号的密码为:123456
DATABASES=$(mysql -uroot -p$PASSWD -e "show databases" | grep -Ev "Database|sys|information_schema")
#DATABASES=$(mysql -uroot -p123456 -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME NOT IN ('sys','mysql','information_schema','performance_schema');" | grep -v "SCHEMA_NAME","ken.io")
echo $DATABASES
#循环数据库进行备份
for db in $DATABASES
do
    echo
    echo ----------$BACKUP_FILEDIR/${db}_$DATE.sql.gz BEGIN----------
    mysqldump -uroot -p$PASSWD --default-character-set=utf8 -q --lock-all-tables --flush-logs -E -R --triggers -B $db | gzip > $BACKUP_FILEDIR/${db}_$DATE.sql.gz
    echo ----------$BACKUP_FILEDIR/${db}_$DATE.sql.gz COMPLETE----------
    echo
done

echo "done"


Tip1:解决Syntax error: word unexpected (expecting “do”)错误

由于我在Windows 10下使用MobaXterm远程访问的VPS服务器,发现远程vim创建sh脚本文件后,无法粘贴,希望有知道的同学告知。于是只能现在Windows下创建sh文件,然后复制相应的代码到sh文件中。再上传到VPS服务器上,修改其所属用户权限。执行后发现如上红色字体的错误。通过Google找了一圈,发现有的说不能是Tab,要是空格,我试过都不行。最后找到这篇文章,终于解决。解决步骤如下:

DOS下的文本文件是以\r\n作为断行标志的,表示成十六进制就是0D 0A。而Unix下的文本文件是以\n作为断行标志的,表示成十六进制就是 0A。DOS格式的文本文件在Linux底下,用较低版本的vi打开时行尾会显示^M。我的vi版本较高,看不到^M。 dos2unix和unix2dos,dos2unix把”\r\n”转化成”\n”,unixtodos把”\n”转化成”\r\n”。

下载dos2unix
  • ② 使用dos2unix转换文件

命令dos2unix和unix2dos的使用非常简单,格式为:dos2unix filename

dos2unix filename
  • ③ 更多转换方法

1.如果一次转换多个文件,把这些文件名直接跟在dos2unix之后。(注:也可以加上-o参数,也可以不加,效果一样) 。

格式:dos2unix file1 file2 file3

格式:dos2unix -o file1 file2 file3

2.如果想把转换的结果保存在别的文件,而源文件不变,则可以使用-n参数。

格式:dos2unix -n oldfile newfile

3.如果要保持文件时间戳不变,加上-k参数。所以上面几条命令都是可以加上-k参数来保持文件时间戳的。

格式:dos2unix -k file

格式:dos2unix -k file1 file2 file3

3、备份测试&验证

#执行备份脚本
sh /mysql/backup/scripts/backup_full.sh

#查看备份文件
ls /mysql/backup/files -h

#解压指定文件({file}自己替换成备份的文件)
gunzip /mysql/backup/files/{file}

三、定时任务

  • 安装crontab
#Redhat、Centos、Fedora等
yum install -y crontab
#Debian、Ubuntu等
apt-get install -y cron //大部分情况下Debian都已安装

1、定时执行MySQL完整备份

  • 创建定时备份任务
#添加定时任务
crontab -e

#每天凌晨3点执行
00 3 * * * sh /mysql/backup/scripts/backup_full.sh

#查看定时任务
crontab -l

Tip2:如果是第一次执行“crontab -e”,会提示选择编辑器,选择合适的编辑器即可。 由于没用过nano, 心想试试吧,所以选择了nano, 经过设置发现,不习惯使用nano, 于是想重设下, 网上查了下, 貌似没有!!! 无奈之下, 从装一台服务器测试, 发现当你第一次crontab -e选择编辑器的时候就会提醒你: 以后若要该改变选择, 输入select-editor, 选择vim搞定。

2、定时清理7天以前的备份

  • 创建文件清理脚本
#创建脚本文件
vi /mysql/backup/scripts/backup_full_clean.sh

#写入以下内容
#!/bin/bash
find /mysql/backup/files -mtime +7 -name "*.gz" -exec rm -rf {} \;
  • 创建定时清理任务
#添加定时任务
crontab -e

#每天凌晨1点执行
00 1 * * * sh /mysql/backup/scripts/backup_full_clean.sh

#查看定时任务
crontab -l
crontab -l命令

四、我的总结

1、crontab命令示例

命令说明
* * * * * command每1分钟执行一次command
30 * * * * command每30分钟执行一次command
3,59 * * * * myCommand每小时的第3和第59分钟执行
3,59 9-18 * * * myCommand在上午9点到18点的第3和第59分钟执行
3,59 9-18 */2 * * myCommand每隔两天的上午9点到18点的第3和第59分钟执行
3,59 9-18 * * 1 myCommand每周一上午9点到18点的第3和第59分钟执行

2、附录

3、总结

虽然前面介绍使用crontab来定时备份数据库到指定目录,但如果VPS挂掉,那就尴尬了,建议大家可以定期备份到自己的nas主机上。如果哪位Shell大佬能够写一个自动发邮件的,Steven甘愿当小白鼠配合测试哦。如果各位小伙伴能够有更加方便的方法备份,烦请告知,我也来学习一下。其实写博客主要还是记录,知道每天都做了哪些,学习了哪些,也是给自己一个备忘录,俗话说:“ 好记性不如烂笔头 ”。以前都是存放在网易云笔记上,但担心哪天网易云笔记像360等关掉网盘一样,那就瓦特了。

本文由 Steven 创作,可自由转载、引用,但需署名作者且注明出处。