今天我们继续来讲Mysql方面的知识。

最近在整理服务器的脚本,发现以前写的mysql每天自动备份脚本写的不太好,就重新写了一个:

#!/bin/bash ####目录环境的配置#### export datetime=`date +"%Y%m%d"` export mysqlbin_dir="/usr/local/mysql/bin" export datadir="`$mysqlbin_dir/mysql -h localhost -uroot -A -Bse "show variables like 'datadir';" |awk '{print $2}'`" export mysql_backup="/data/backup/mysql_backup" export masterbakdir="$mysql_backup/masterbakdir" export database="database" if [ ! -e "$masterbakdir/"$datetime"" ];then mkdir -p $masterbakdir/"$datetime" fi if [ ! -e "$mysql_backup/logs" ];then mkdir -p "$mysql_backup/logs" fi ####加只读锁,物理备份#### $mysqlbin_dir/mysql -A -Bse "flush tables with read lock;" #这里也可以用$mysqlbin_dir/mysqldump --lock-all-tables ,效果一样的只是用的脚本工具不一样 ####记录主库库状态#### $mysqlbin_dir/mysql -h localhost -A -e "select now();show master status\G;" |tee -a $masterbakdir/"$datetime"/masterstat_${datetime}.log echo "============================ start mysqldump `date`" | tee -a $masterbakdir/"$datetime"/masterstat_${datetime}.log ####mysqldump#### $mysqlbin_dir/mysqldump --allow-keywords --opt $database > $masterbakdir/$database-$datetime.sql if [ $? -eq 0 ] then echo "`date` database backup success" |tee -a $masterbakdir/"$datetime"/masterstat_${datetime}.log else echo "`date` database backup fail" |tee -a $masterbakdir/"$datetime"/masterstat_${datetime}.log fi echo "============================ end mysqldump `date`"|tee -a $masterbakdir/"$datetime"/masterstat_${datetime}.log $mysqlbin_dir/mysql -A -Bse "unlock tables;" ####删除30天前的备份,并且做日志##### find $masterbakdir -type f -ctime +30 -name "$database*" -exec rm -vf {} \; >> $mysql_backup/logs/free-${datetime}.log

然后再crontab中添加定时,一般都是在没什么人使用时没有数据写入时,因为备份是要确保数据同步要加只读锁,比如每天凌晨4点:

00 04 * * * /usr/local/scripts/master_dbbak.sh

在这里要注意的是如果是需要备份整个库,势必就有备份到mysql库,那么mysqldump就要添加--events --ignore-table=mysql.event参数,用来忽略mysql.event这张表,不然mysqldump后就会有警告:

Warning: Skipping the data of table mysql.event. Specify the --events option explicitly

如果数据多时会增加不必要的系统开销,mysql.event表记录的是当前库中创建的事件,在mysql没有启用时,一般是空的。
这个是一个基础脚本,以后还可以在这个基础上在添加上备份失败发邮件等等。

因为水平有限,难免有疏忽或者不准确的地方,希望大家能够直接指出来,我会及时改正。一切为了知识的分享。

后续会有更多的精彩的内容分享给大家。