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) 備份的目錄不存在