shell定时导出mysql数据库

   

首先指定一个用户,用来进行数据库导出操作,同时添加reload,REPLICATION CLIENT,select 权限,这里为了防止表被锁住,我没有添加LOCK TABLES 权限,后面导出时需要使用 --single-transaction --master-data=2参数 :

# mysql -uroot -p123
MySQL [(none)]> create user dumper@'127.0.0.1' IDENTIFIED BY '123';
MySQL [(none)]> grant select,REPLICATION CLIENT,reload on *.* to dumper@'127.0.0.1'
MySQL [(none)]> quit

由于数据库版本较高,修改/etc/my.cnf,在[mysqldump]下增加导出用的账号,不建议添加在 [client] 里,那样就所有块的操作都能共享了,修改完配置文件后, 只需要执行mysqldump 脚本就可以了;备份脚本中不需要涉及用户名密码相关信息:

# vim /etc/my.cnf
...
[mysqldump]
quick
max_allowed_packet = 500M
user=dumper
password=123
...

建立导出脚本:

# vim /data/wwwroot/script/mysql-backups.sh
#!/bin/sh
 
# Database info
DB_USER="dumper"
DB_PASS="123"
DB_HOST="127.0.0.1"
# Database array
DB_NAME=("bdm175223664_db" "zabbix")
# Others vars
BIN_DIR="/usr/local/mysql/bin/"
BCK_DIR="/data/wwwroot/mysql-backups"
DATE=`date +%F`
# create file
mkdir $BCK_DIR/$DATE
# TODO
# /usr/bin/mysqldump --opt -ubatsing -pbatsingpw -hlocalhost timepusher > /mnt/mysqlBackup/db_`date +%F`.sql
for var in ${DB_NAME[@]}
do
$BIN_DIR/mysqldump  --defaults-extra-file=/etc/my.cnf --opt --single-transaction --master-data=2 -h$DB_HOST $var > $BCK_DIR/$DATE/db_$var$DATE.sql
done

这里master-data=2表示在CHAGE MASTER语句( 在备份导出的文件里追加的二进制binlog文件的位置和名称 )前添加注释,这个参数会--lock-all-tables锁表,除非你指定了--single-transaction ( 以事务的形式执行 ),这样锁表就只会在dump开始的时候持续一小段时间了,不过还是不建议在dump的时候做什么操作。

建立定时清理脚本:

# vim /data/wwwroot/script/mysql-backups-clean.sh
find /data/wwwroot/mysql-backups  -mtime +30 -name "*.*" -exec rm -Rf {} \;

添加进crontab,定时执行

# crontab -e
30 0 *  * 6  /data/wwwroot/script/mysql-backups.sh > /dev/null
50 0 *  * 6  /data/wwwroot/script/mysql-backups-clean.sh > /dev/null

发表评论