CentOS定时备份mysql数据库和清理过期备份文件

953 阅读2分钟

  本篇主要用于介绍如何在linux服务器下编写备份mysql数据库文件和清理过期备份文件的脚本,以及设置定时任务启动脚本,做到每天定时备份数据库和清理过期备份文件的需求,同时也是一个踩坑记录,本以为网上会有很多相关的博客可以一下子就弄好,没想到花了半天时间,踩了不少坑,有些博客没有写清楚,只是简单地贴了一下命令,应该注意的地方也没有提示,所以这里记录下,希望可以帮到更多人。

整个流程主要分为:

  1. 创建备份数据库的文件夹;
  2. 编写备份数据库以及清理过期文件的脚本;
  3. 编写定时任务,定时启动脚本

创建备份目录

这里演示的备份目录是在/root/mysql_bak,可以根据自己想要把备份目录放在哪个文件夹下更改对应路径即可:

mkdir /root/mysql_bak

编写脚本

进入mysql_bak目录

cd /root/mysql_bak

创建backup.sh文件

touch backup.sh

赋予权限,如果不给予权限的话,该脚本是无法运行的

chmod 777 backup.sh

  vi查看backup.sh脚本,并粘贴以下代码(有些参数需要配置成自己的),这里要注意一下,不要通过其他编辑器打开该文件并粘贴代码,因为笔者踩过坑,利用xftp打开了文件编辑并保存,最后发现生成的sql文件带?号,经过查询才知道原来是因为windows下的换行符和Linux不一样导致的,最后通过在xshell使用vi命令粘贴脚本代码才不会有这个问题。

db_user="root"
db_pwd="123456"
db_name="demo"
bak_dir="/root/mysql_bak"
time="$(date +"%Y%m%d_%H%M%S")"
mysqldump -u$db_user  -p$db_pwd -h127.0.0.1 -P3306 $db_name > $bak_dir/${db_name}_$time.sql
#remove out-date backup
find $bak_dir -name "$db_name*.sql" -type f -mtime +7 -exec rm -rf {} \; > /dev/null 2>&1

代码解释

上述代码中,db_user为数据库账号,默认都是root,db_pwd为数据库密码,db_name为要备份的数据库名称,bak_dir为备份的目录,这里只需要改成自己数据库对应的相关信息以及自己的备份目录路径即可,切记等号左右不能留空格

  • 时间格式

这里备份使用的格式是%Y%m%d_%H%M%S,如20181218_170130,生成的文件格式如:demo_20181218_170130.sql,如果有需要可以改成自己要的格式。

  • 备份数据库的命令
mysqldump -u$db_user  -p$db_pwd -h127.0.0.1 -P3306 $db_name > $bak_dir/${db_name}_$time.sql

这里添加上-h127.0.0.1 -P3306 指定主机和端口号是为了解决出现下面的问题。

mysqldump: Got error: 1045: Access denied for user 'root'@'localhost' (using password: YES) when trying to connect

如果你的数据库是单独放在另外一台数据库服务器上,那么这里记得要改一下主机的ip哦。

  • 清理过期文件
find $bak_dir -name "$db_name*.sql" -type f -mtime +7 -exec rm -rf {} \; > /dev/null 2>&1

用于清理7天前的文件,下面会详细介绍,这里先跳过。

  • 测试脚本是否运行正常
./backup.sh

运行后没报错,执行查看命令ll,看看是否生成备份文件,可以看到生成了备份文件,说明脚本运行正常,接下来就差设置定时任务,定时启动这个脚本了。

编辑定时任务

执行以下命令:

crontab  -e

按insert键进入编辑状态,我现在的时间是17点20分,这里我们设置一下每天17点25分的定时任务,复制粘贴一下代码:

25 17 * * * /root/mysql_bak/backup.sh

保存并退出,时间的设置可以参考下面Crontab 格式,很容易理解的,第一个数字25为分钟,第二个数字17为小时。

Crontab 格式

分 时 日 月 周 执行命令
第 1 列分钟 1~59,每分钟用 * 或者*/1表示,整点分钟数为00或0
第 2 列小时 1~23(0 表示 0 点)
第 3 列日 1~31
第 4 列月 1~12
第 5 列星期 0~6(0 表示星期天)
第 6 列要运行的命令
0 3 * * * /root/mysql_bak/backup.sh,此命令表示在每天的凌晨三点执行一次脚本,可自行调整时间

重启crondtab服务

编写好定时任务后,需要重启crondtab服务,命令如下:

service crond restart

接下来就等时间到了后,查看备份目录是否生成了备份文件,果然生成了demo_20181218_172501.sql文件,这里生成的时间不是整点也好理解,因为脚本里使用的时间是脚本运行到那个地方时的时间。

查看crontab状态

当然我们也可以通过查看crontab的状态来知道backup.sh脚本是否被执行,

tail -f /var/log/cron

删除过期备份文件代码解释

#删除一分钟之前的备份
find $bak_dir -name "$db_name*.sql" -type f -mmin +1 -exec rm -rf {} \; > /dev/null 2>&1

#删除七天之前的备份
find $bak_dir -name "$db_name*.sql" -type f -mtime +7 -exec rm -rf {} \; > /dev/null 2>&1

  • -type f 表示查找普通类型的文件,f 表示普通文件,可不写;
  • -mtime +7 按照文件的更改时间来查找文件,+7表示文件更改时间距现在7天以前;如果是-mmin +7表示文件更改时间距现在7分钟以前;
  • -exec rm {} ; 表示执行一段shell命令,exec选项后面跟随着所要执行的命令或脚本,然后是一对{ },一个空格和一个\,最后是一个分号;
  • /dev/null 2>&1 把标准出错重定向到标准输出,然后扔到/DEV/NULL下面去。通俗的说,就是把所有标准输出和标准出错都扔到垃圾桶里面;其中的& 表示让该命令在后台执行

测试删除备份文件

可以先改成删除1分钟之前的备份测试下该命令,编辑backup.sh,将代码

find $bak_dir -name "$db_name*.sql" -type f -mtime +7 -exec rm -rf {} \; > /dev/null 2>&1

其中的mtime改成mmin,7改成1,然后保存退出。

执行该脚本

./backup.sh

然后再查看下目录,可以发现,1分钟前的的sql文件被删除了,说明删除备份文件的命令正确,这里删除的时间可以根据自己的需要更改。

  好了,到这里文章结束,如果觉得对你有帮助的话帮忙点个赞吧,让更多的人可以看到,如果有什么意见或建议,可以在评论区里留言。