天天看點

MySQL自動化備份腳本使用說明

1   功能介紹

腳本名 bakrec_mysql.sh

腳本存放路徑 保證統一

備份路徑 須根據具體伺服器的分區情況,放到一個剩餘空間較大的分區.

備份目錄名 統一為backupdb

各個參數說明如下:

-a: backup all database #全庫備份

-e: backup each database#分庫備份

-d: backup single/multi database#備份指定的一個庫或者多個庫

-t: backup single/multi table of single database#備份一個庫下面的一個表或者多個表

-b: backup binlog#備份binlog日志,備份過程,每次記錄最後的二進制檔案号,将之前範圍内的binlog打包(bz2格式),放在$DIR_BACKUP目錄下

-r: recover all database(!require password!)#恢複全庫,為保安全,恢複時需要輸入密碼

-o: recover single database/talbe,you should be designation database name(!require password!)#恢複單庫或單表,恢複時需要輸入密碼

-p: create connect mysql password#建立連接配接mysql的密碼檔案,存放位置$DIR_MySQL/etc目錄下,權限是600

-s: configuration rsyncd#建立rsyncd服務(因backup機上有rsyncd服務,故不需要在每台DB server上建立rsyncd服務)

    If you want ceate a rsyncd, you should enter 'bakrec_mysql.sh -s cet'

    If you want restart rsyncd, you should enter 'bakrec_mysql.sh -s rst'

-c: sync to backup center#同步到backup機

2   備份政策 2.1     分庫備份

在腳本的LIST_EXCLUDE_DB='(test|information_schema|performance_schema)'可以過濾不備份的資料庫.

備份路徑 根據伺服器具體分區情況而定

備份目錄名統一 backupdb

關于是否打開binlog的函數解釋

function backup()

{

read_pwd

LOGBIN_STATUS=`$CMD_MYSQL -u$USER -p$PASSWD -N -s -e "SHOW VARIABLES LIKE 'log_bin'" | gawk '{print $2}'`

if [ $LOGBIN_STATUS = "ON" ]; then

  MASTER='--master-data=2'

else

  MASTER=' '

fi

}

這個函數的功能是檢測MySQL伺服器有沒有打開binlog日志,如果打開,則在備份的時候添加--master-data=2這個參數,否則不添加.

分庫備份在腳本中的實作函數為backup_each

function backup_each()

{

backup

for db in $($CMD_MYSQL -u$USER -p$PASSWD -N -s -e "SHOW DATABASES"|egrep -v $LIST_EXCLUDE_DB)

do

  $CMD_MYSQLDUMP -u$USER -p$PASSWD -x -R $MASTER $db --databases |gzip >$HOSTNAME.$db.$TIME.sql.gz

done

# delete 7 days ago

for db in $($CMD_MYSQL -u$USER -p$PASSWD -N -s -e "SHOW DATABASES"|egrep -v $LIST_EXCLUDE_DB)

do

  if [ ! -f $HOSTNAME.$db.$TIME_7.sql.gz ]; then

    echo

  else

    rm $HOSTNAME.$db.$TIME_7.sql.gz -f

  fi

done

}

功能說明:

依次備份除清單之外的所有庫,在本機會自動删除7天之前的備份

2.2     binlog備份

binlog備份在腳本中的實作函數為backup_binlog

function backup_binlog()

{

if [ -s $DIR_BACKUP/mysql-bin.queue ]; then

  read POS < $DIR_BACKUP/mysql-bin.queue

  cd $DIR_DATA

  tar -jcvf $DIR_BACKUP/$TIME_YM/$HOSTNAME.$POS.$TIME.bz2 `gawk -F'/' '{print $2}' $BINLOG_NAME.index |sed -n "/$POS/,//p"`

  cd -

  if [ -f $DIR_BACKUP/$TIME_YM/$HOSTNAME.$POS.$TIME_7.bz2 ]; then

    rm $DIR_BACKUP/$TIME_YM/$HOSTNAME.$POS.$TIME_7.bz2 -f

  fi

fi

# write last pos

gawk -F'/' '{print $2}' $DIR_DATA/$BINLOG_NAME.index | tail -n 1 >$DIR_BACKUP/mysql-bin.queue

}

邏輯如下:

1,如果檢測到$DIR_BACKUP/mysql-bin.queue這個檔案,并且檔案大小大于0個位元組.則讀取這個檔案内容,并付給變量POS,然後執行tar –jcvf指令,并删除7天之前的備份,否則直接執行gawk指令.

2,gawk指令的意思是把目前binlog日志的編号記錄到$DIR_BACKUP/mysql-bin.queue檔案内.

2.3     推到備份機

實作功能代碼如下

  c)

    rsync -czrpt  --password-file=$DIR_BIN/bakrec_mysql.password $DIR_BACKUP/$TIME_YM [email protected]::backup/$HOSTNAME

    result_status

    ;;

rsync參數的意思如下:

c: 打開校驗開關,強制對檔案傳輸進行校驗

z: 對備份的檔案在傳輸時進行壓縮處理(節省網絡帶寬,消耗本機CPU)

r: 對子目錄以遞歸模式處理

p: 保持檔案權限

t: 保持檔案時間資訊

同步的目錄$DIR_BACKUP/$TIME_YM

backup主機IP位址192.168.0.1

result_status函數功能,如果該語句執行失敗,則發送郵件給db-request

2.4     backup機設定

在backup機上面修改rsync配置,添加子產品backup上面的配置如下

uid = root

gid = root

max connections = 10

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsync.lock

log file = /var/log/rsyncd.log

[backupdb.cn5]

path = /backup

hosts allow = *

hosts deny = *

ignore errors

read only = no

list = no

auth users = user

secrets file = ****/password

說明

password為rsync連接配接的密碼檔案,格式

user:password

權限600

3   使用說明 3.1     定義變量

根據伺服器情況,可能會修改如下變量

DIR_MYSQL='/usr/local/mysql'

DIR_BACKUP="/tmp/backup"

對于rpm安裝,或者非正常的安裝,可能還需要修改

CMD_MYSQLDUMP="$DIR_MYSQL/bin/mysqldump"

CMD_MYSQL="$DIR_MYSQL/bin/mysql"

3.2     建立MySQL密碼檔案

執行腳本,加-p參數,自動建立$DIR_MYSQL/etc/passwordfile檔案,輸入密碼,腳本會自動寫入該檔案

# bash bakrec_mysql.sh  -p

Please enter MySQL(user=root)'s password:

驗證密碼檔案建立成功與否,以及權限600

# ls -l $FILE_PASSWD

檢視密碼檔案内容

# cat $FILE_PASSWD

3.3     建立rsync密碼檔案

權限600

3.4     測試備份與推送

bash –x 腳本名 測試的參數

可以看到腳本的執行過程.

-c參數是将備份目錄内容,推送到backup機

3.5     crontab設定

crontab執行腳本出錯總結:

    1) 腳本本身問題

    2) 腳本執行權限問題

    3) 腳本名字拼寫問題,指定了錯誤的腳本名

    4) 遺漏了腳本中需要的密碼檔案

    5) 備份的目錄不存在