1. 程式人生 > >mysql分庫備份指令碼[轉帖]

mysql分庫備份指令碼[轉帖]

#!/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的可能會被過濾掉,按照個人情況調整。
每天的備份樣式如下: 複製程式碼
[[email protected] db]# ls
2017-08-25
[[email protected] db]# cd 2017-08-25/
[[email protected] 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.gz
複製程式碼  logger解釋 複製程式碼
logger 是一個shell 命令介面,可以通過該介面使用Syslog的系統日誌模組,還可以從命令列直接向系統日誌檔案寫入一行資訊。
日誌的級別
日誌的級別分為七級,從緊急程度由高到底:
emerg 系統已經不可用,級別為緊急 
alert 警報,需要立即處理和解決 
crit 既將發生,得需要預防。事件就要發生 
warnig 警告 
err 錯誤資訊,普通的錯誤資訊 
notice 提醒資訊,很重要的資訊 
info 通知資訊,屬於一般資訊 
debug 這是除錯類資訊
複製程式碼

上邊的指令碼備份完畢後  就可以在   看到每個資料庫備份的資訊  logger的作用

複製程式碼
[[email protected] 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  [email protected]'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伺服器上拉下來