mysql分庫備份腳本
阿新 • • 發佈:2018-12-25
文件 ble 解決方法 防火 error 完成 grep delet ant
ERROR 1370 (42000): execute command denied to user backupAccount@‘localhost‘ for routine ‘databaseName.spName‘ 解決方法: grant execute on *.* to ‘mysqlbackup‘@‘localhost‘ identified by ‘mysql_ritto‘;
數據庫備份完畢後,可能有 需要把備份的文件傳輸到一個專門用來放備份文件的服務器上 我習慣用rsync 方法如下: 需求: 每天淩晨1點把 A服務器上/data/backup/db/下的數據備份文件放到 B服務器裏的/data/backup/db_192.168.1.11/目錄下 不是累加 是增量更新 (--delete) A服務器:
數據源服務器
B服務器:
文件中準備腳本文件
#!/bin/bash #created by yangqiqi 2017-08-24 #創建備份用戶 #grant select,lock tables,reload,super,file,show view on *.* to ‘mysqlbackup‘@‘localhost‘ identified by ‘my_password‘; #grant execute on *.* to ‘mysqlbackup‘@‘localhost‘ identified by ‘my_password‘; 授予調用存儲過程的權限 ##flush privileges; USERNAME=mysqlbackup #備份的用戶名 PASSWORD舊的備份代碼=my_password #備份的密碼 HOST=localhost #備份主機 DATE=`date +%Y-%m-%d` #用來做備份文件名字的一部分 OLDDATE=`date +%Y-%m-%d -d ‘-10 days‘` #本地保存天數 #指定命令所用的全路徑 MYSQL=/app/mysql5.5/bin/mysql MYSQLDUMP=/app/mysql5.5/bin/mysqldump MYSQLADMIN=/app/mysql5.5/bin/mysqladmin #創建備份的目錄和文件 BACKDIR=/data/backup/db [ -d ${BACKDIR} ] || mkdir -p ${BACKDIR} [-d ${BACKDIR}/${DATE} ] || mkdir ${BACKDIR}/${DATE} [ ! -d ${BACKDIR}/${OLDDATE} ] || rm -rf ${BACKDIR}/${OLDDATE} #保存10天 多余的刪除最前邊的 #開始備份 for循環想要備份的數據庫 MYSQLDUMP_LIST=`mysql -uroot -p‘123456‘ -e "show databases"| grep -Evi "database|infor|perfor"` for DBNAME in ${MYSQLDUMP_LIST} ##使用for依次羅列需要備份的數據庫 do${MYSQLDUMP} -B -F --master-data=2 --single-transaction -u${USERNAME} -p${PASSWORD} ${DBNAME} | gzip > ${BACKDIR}/${DATE}/${DBNAME}-backup-${DATE}.sql.gz /bin/sleep 2 logger "${DBNAME} has been backup successful - $DATE" done 舊版本的備份腳本
#!/bin/bash #created by qiqi 2018-5-4 ####################### 用戶說明 不寫入腳本裏############### MYSQL 備份用戶權限 需要以下權限: SELECT, RELOAD, SHOW DATABASES, LOCK TABLES, REPLICATION CLIENT, EVENT 權限列表 1.SELECT 讀取 2.SHOW DATABASES 允許訪問完整的數據庫列表 4.LOCK TABLES 允許鎖定表 5.RELOAD 允許載入和刷新服務器緩存 6.REPLICATION CLIENT 允許用戶詢問從屬服務器或主服務器的地址 7.EVENT 允許執行事務 mysql> GRANT SELECT,RELOAD,SHOW DATABASES,LOCK TABLES,EVENT,REPLICATION CLIENT ON *.* TO ‘back_user‘@‘192.168.0.203‘ IDENTIFIED BY ‘123456‘; mysql> FLUSH PRIVILEGES; ###################################################################### USERNAME=mysqlbackup #備份的用戶名 PASSWORD=xxxxx #備份的密碼 HOST=1.1.1.1 #備份主機 DATE=`date +%Y-%m-%d` #用來做備份文件名字的一部分 OLDDATE=`date +%Y-%m-%d -d ‘-3 days‘` #本地保存天數 #指定命令所用的全路徑 MYSQL=/data/mysql/bin/mysql MYSQLDUMP=/data/mysql/bin/mysqldump MYSQLADMIN=/data/mysql/bin/mysqladmin #創建備份的目錄和文件 BACKDIR=/data/backup/mysqldb [ -d ${BACKDIR} ] || mkdir -p ${BACKDIR} [ -d ${BACKDIR}/${DATE} ] || mkdir ${BACKDIR}/${DATE} [ ! -d ${BACKDIR}/${OLDDATE} ] || rm -rf ${BACKDIR}/${OLDDATE} #保存5天 多余的刪除最前邊的 #開始備份 for循環想要備份的數據庫 MYSQLDUMP_LIST=$(${MYSQL} -u${USERNAME} -p${PASSWORD} -h${HOST} --socket=/data/mysql3306/mysql.sock -e "show databases"| grep -Evi "database|infor|perfor|mysql") for DBNAME in ${MYSQLDUMP_LIST} ##使用for依次羅列需要備份的數據庫名字 do $MYSQLDUMP -u${USERNAME} -p${PASSWORD} -h${HOST} --single-transaction --master-data=2 --set-gtid-purged=off -F --triggers --routines --events --socket=/data/mysql3306/mysql.sock $DBNAME | gzip > ${BACKDIR}/${DATE}/${DBNAME}-${DATE}.sql.gz logger "${DBNAME} has been backup successful - $DATE" done
腳本註意點:
MYSQLDUMP_LIST=`mysql -uroot -p‘123456‘ -e "show databases"| grep -Evi "database|infor|perfor"` 過濾掉不需要備份的數據庫,這裏需要註意,過濾完成每天的備份樣式如下:
後拿到的庫名是自己需要備份的庫名,如果自建的庫有的也叫infor開頭或者perfor的可能會被過濾掉,按照個人情況調整。
[root@xxx db]# ls 2017-08-25 [root@xxx db]# cd 2017-08-25/ [root@xxx 2017-08-25]# ls mysql-backup-2017-08-25.sql.gz test2-backup-2017-08-25.sql.gz test-backup-2017-08-25.sql.gz test1-backup-2017-08-25.sql.gz test3-backup-2017-08-25.sql.gzlogger解釋
logger 是一個shell 命令接口,可以通過該接口使用Syslog的系統日誌模塊,還可以從命令行直接向系統日誌文件寫入一行信息。 日誌的級別 日誌的級別分為七級,從緊急程度由高到底: emerg 系統已經不可用,級別為緊急 alert 警報,需要立即處理和解決 crit 既將發生,得需要預防。事件就要發生 warnig 警告 err 錯誤信息,普通的錯誤信息 notice 提醒信息,很重要的信息 info 通知信息,屬於一般信息 debug 這是調試類信息
上邊的腳本備份完畢後 就可以在 看到每個數據庫備份的信息 logger的作用
[root@xxx 2017-08-25]# tail -f /var/log/messages Aug 25 09:30:06 xxx root: test has been backup successful - 2017-08-25 Aug 25 09:30:11 xxx root: test1 has been backup successful - 2017-08-25 Aug 25 09:30:16 xxx root: test2 has been backup successful - 2017-08-25 Aug 25 09:30:21 xxx root: test3 has been backup successful - 2017-08-25 Aug 25 09:40:02 xxx root: mysql has been backup successful - 2017-08-25 Aug 25 09:40:07 xxx root: test has been backup successful - 2017-08-25 Aug 25 09:40:12 xxx root: test1 has been backup successful - 2017-08-25 Aug 25 09:40:17 xxx root: test2 has been backup successful - 2017-08-25 Aug 25 09:40:22 xxx root: test3 has been backup successful - 2017-08-25調用存儲過程時報了下面的錯誤
ERROR 1370 (42000): execute command denied to user backupAccount@‘localhost‘ for routine ‘databaseName.spName‘ 解決方法: grant execute on *.* to ‘mysqlbackup‘@‘localhost‘ identified by ‘mysql_ritto‘;
數據庫備份完畢後,可能有 需要把備份的文件傳輸到一個專門用來放備份文件的服務器上 我習慣用rsync 方法如下: 需求: 每天淩晨1點把 A服務器上/data/backup/db/下的數據備份文件放到 B服務器裏的/data/backup/db_192.168.1.11/目錄下 不是累加 是增量更新 (--delete) A服務器:
數據源服務器
yum install rsync打開防火墻 關閉seLinux
-A INPUT -p tcp -m state --state NEW -m tcp --dport 873 -j ACCEPT
B服務器:
ssh-keygen把公鑰文件裏的id_rsa.pub內容復制到 A服務器裏的authorized_keys
文件中準備腳本文件
#!/bin/bash usr/bin/rsync -avz --delete -e "ssh -p 4396" [email protected]:/data/backup/db /data/backup/db_192.168.1.11/ logger "Successful backup file transfer - $DATE"采用的是 拉push的政策在B服務器上將需要的數據源從A服務器上拉下來
mysql分庫備份腳本