CentOS下mysql定时备份(crontab+mysql的备份sh脚本)

时间:2024-03-15 09:51:27

     背景还是数据库被劫持事件,需要增加数据库自动备份。

一、要备份的数据库环境

     系统:CentOS7.6

     数据库:mysql5.6

二、备份方案

     使用crontab + shell脚本(mysql备份命令)。

三、mysql命令备份试验

     首先来直接试试mysql的备份命令:

     在mysql的安装目录同级目录下建mysqlBack目录,在这个目录里再建command、sql2个目录。例如:

CentOS下mysql定时备份(crontab+mysql的备份sh脚本)

  因为这里使用的是mysql的数据泵命令mysqldump ,具体命令如下:

/usr/local/mysql/bin/mysqldump --opt -u数据库用户名 -p数据库密码 -hlocalhost mp > /usr/local/mysqlBack/sql/db_`date +%F`.sql

解释:

这里前面的路径是mysqldump命令所在的目录,也就是mysql安装目录下的bin目录,后面的路径是自己想要备份的路径,date+%F这里用到的是系统的常量。

  • [ /usr/local/mysql/bin/mysqldump ] 是mysqldump命令所在的目录
  • [--opt ] 参数
  • [-uroot ] -u数据库用户名 -h数据库地址 数据库名 > 导出的文件路径;
  • [ -hlocalhost] 数据库地址
  • [mp] 要备份的数据库名
  • [> /usr/local/mysqlBack/sql/db_`date +%F`.sql] 存储到mysqlBack目录下的sql目录下,文件名db_2018-7-26.sql文件

   这里特别注意date与+%F之间又空格,名称上面包裹的符号不是单引号,而是数字键1前面的按键。

  这个命令还有其他一些参数,大家自行百度,这条命令我觉得够用了。

  看看命令执行的结果:

CentOS下mysql定时备份(crontab+mysql的备份sh脚本)

四、mysql备份命令转化为crontab脚本

   1.先验证系统是否支持crontab,执行命令:crontab -l

    如果报 “command not found” ,就说明该crontab服务没有安装 如果报 “no crontab for root” ,就说明已经安装crontab服务了, 不用再安装了 

其实-v,-u都可以,出现:

CentOS下mysql定时备份(crontab+mysql的备份sh脚本)

这也表示是安装了的。

2.如果没有则安装crontab服务(如果系统不支持yum方式安装,那需要找rpm方式安装,或者先安装yum支持)

yum install -y vixie-cron yum install crontabs /sbin/service crond start chkconfig --level 35 crond on      

3.编辑一个文件

命名为xxx.sh。注意使用文本编辑器保存时,文件一定要选所有文件,名称连后缀一起哦。如果怕不保险,可以先使用vi/vim命令生成一个空文件,然后把文件使用ftp工具复制到本地修改。内容:

DB_USER="数据库用户名"
DB_PASS="数据库密码"
DB_HOST="localhost"
DB_NAME="要备份的数据库名称"
BIN_DIR="/usr/local/mysql/bin"  #mysql的安装目录的bin目录
BACK_DIR="/usr/local/mysqlBack/sql"  #mysql准备备份保存的目录
DATE=`date +%F`  #文件名,注意date与+之间有个空格
$BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS -h$DB_HOST $DB_NAME > $BACK_DIR/db_$DB_NAME_$DATE.sql  #这就是先前的测试命令

4.加入到crontab服务中

 crontab -e

然后输入:00 01 * * * /bin/sh /usr/local/mysqlBack/command/xxx.sh

前面时cron表达式,这里设置为明天凌晨1点备份。/bin/sh为脚本执行标识,后面就是xxx.sh所在的目录。

查看加入服务是否成功

命令:crontab -l

如果出现:

CentOS下mysql定时备份(crontab+mysql的备份sh脚本)

这就表示设置成功了,明天就可以看到自动备份的文件了。sql目录下将会出现db_yyyy-MM-dd.sql文件。

多个备份命令可以都写再一个sh文件里,只需要多设置DB_NAME就行,比如DB_NAME1,DB_NAME2,但是注意

$BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS -h$DB_HOST $DB_NAME > $BACK_DIR/db_$DB_NAME_$DATE.sql这条命令也要设置多个哦,替换$DB_NAME为$DB_NAME1就行。

这样是不是感觉很low,没错确实还有优化方法:

dbNames=(db_name1 db_name2 db_name3)

for dbName in ${dbNames[*]}
do
  #dumpFile=$dbName-$DATE.sql.gz
  dumpFile=$dbName-$DATE.sql
  #mysqldump -u$user -p$userPWD $dbName | gzip > $newdir/$dumpFile
  $BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS -h$DB_HOST $dbName > $BACK_DIR/$dumpFile
done

上面就是用到一个循环处理,文件还可以加gzip压缩参数哦。

当然如果怕搞混,也是可以分开写多个的。

补充cron表达式相关,注意这里的cron表达式时5位制

 crontab文件格式:

  *           *        *        *        *           command命令

minute   hour    day   month   week      command命令

分          时         天      月        星期       命令

 

minute: 表示分钟,可以是从0到59之间的任何整数。

hour:表示小时,可以是从0到23之间的任何整数。

day:表示日期,可以是从1到31之间的任何整数。

month:表示月份,可以是从1到12之间的任何整数。

week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。

command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

 特殊字符:

星号(*):代表每的意思,例如month字段如果是星号,则表示每月都执行该命令操作。

逗号(,):表示分隔时段的意思,例如,“1,3,5,7,9”。

中杠(-):表示一个时间范围,例如“2-6”表示“2,3,4,5,6”。

正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

查看crontab服务是否启动

ervice crond status

执行后出现runing表示在运行

CentOS下mysql定时备份(crontab+mysql的备份sh脚本)

查看crintab执行日志

tail -f /var/log/cron

CentOS下mysql定时备份(crontab+mysql的备份sh脚本)

看到自己的脚本名称,就表示执行了。

ok就说到这里,希望能帮到大家。