Mysql的二進制日誌記錄的是全部mysql數據庫發生變動的信息,所以對數據庫很是重要,二進制日誌的做用我歸納了一下主要包含以下幾個方面:mysql
一、能夠用於數據庫基於時間點的還原。sql
二、能夠用來分析數據庫發生更改的狀況,好比程序的bug致使數據庫數據更改等等。shell
三、二進制日誌還能夠用來重建數據庫。數據庫
從上面的幾點能夠看出mysql的二進制日誌仍是很是重要的,在平常工做中,二進制日誌又每每很是佔空間,尤爲是寫入比較頻繁的數據庫,二進制日誌更是增加迅猛。那麼在DBA的平常工做中如何來管理二進制日誌呢?接下來就來詳細敘述一下我在平常工做中是如何管理二進制日誌的。vim
我是經過以下方式來管理二進制日誌的:bash
1. 經過shell腳本每小時作一次二進制日誌flush操做服務器
2. 經過shell腳本每小時進行一次二進制日誌的備份工做,將一小時新產生的二進制日誌遷移到nfs備份服務器,並壓縮存放,腳本最後附上!.net
3. 在my.cnf配置文件中加上expire_logs_days = 5,這樣mysql會自動刪除5天前的日誌。rest
設置步驟以下:日誌
一、搭建NFS備份服務器。
搭建NFS很是簡單,以下幾步就能夠完成:
yum -y install setup-* initscripts-* nfs-utils-* portmap-* quota-*
編輯/etc/exports,添加一行二進制日誌的備份條目:
vim /etc/exports
/data/binlog_backup 192.168.3.135(rw,sync,no_root_squash) *(ro)
讓192.168.3.135這個IP能夠讀寫,其餘的只讀。
配置完成以後從新啓動portmap和nfs就能夠了:
/etc/rc.d/init.d/portmap restart
/etc/rc.d/init.d/nfs restart
至此服務器端的NFS就設置完成了。接下來設置客戶端就是咱們的mysql服務器如何掛載:
/etc/rc.d/init.d/portmap start
mkdir /data/binlog_backup
mount -t nfs 192.168.3.92:/data/binlog_backup /data/binlog_backup
若是不啓動客戶端的portmap的話掛載的時候會報:mount.nfs: Input/output error,記得將mount的命令添加到/etc/rc.local中,否則下次重啓服務器後會致使備份二進制日誌失敗。
二、將腳本放到mysql數據庫上,並設置計劃任務爲每小時運行一次。
腳本內容以下:
cat bin_log_magment.sh
#!/bin/bash
#Purpose:管理mysql二進制日誌,每小時刷新二進制日誌,並將日誌複製到nfs服務器上,方便之後恢復和問題分析!
#Author:carl_zhang
#Date:2012-5-15
#some variables 一些參數
#定義數據庫的相關信息
USERNAME=root
PASSWORD=zhang@123
HOSTIP=localhost
MYSQL=/usr/local/mysql/bin/mysql
#設置二進制日誌的路徑
BIN_LOG_DIR=/data/dbdata
#設置二進制日誌備份的路徑
BIN_LOG_BACKUP_DIR=/data/binlog_backup
#定義一個常量來跳過最後一個日誌文件
COUNT=0
#定義一個日誌文件
LOGFILE=$BIN_LOG_BACKUP_DIR/binlog_backup.log
#找出二進制日誌的名稱前綴
BINLOG_PREFIX=`grep "log-bin=" /etc/my.cnf | awk -F'=' '{print $2}'`
#檢查backup.file文件是否存在,第一次跑的時候若是沒有這個會報錯
if [ ! -f "$BIN_LOG_BACKUP_DIR/backup.file" ];then
touch $BIN_LOG_BACKUP_DIR/backup.file
fi
#運行文件比較以前先執行一下flush logs
$MYSQL -u$USERNAME -p$PASSWORD -h$HOSTIP -e "flush logs"
#比較二進制日誌文件列表和已備份的二進制文件列表
FILE_LIST=`comm -23 $BIN_LOG_DIR/$BINLOG_PREFIX.index $BIN_LOG_BACKUP_DIR/backup.file`
#統計日誌文件的個數
FILE_COUNT=`comm -23 $BIN_LOG_DIR/$BINLOG_PREFIX.index $BIN_LOG_BACKUP_DIR/backup.file|wc -l`
#程序正文
#開始備份二進制日誌文件
for file in $FILE_LIST
do
BINLOG_NAME=`basename $file`
let COUNT=$COUNT+1
if [ $COUNT -eq $FILE_COUNT ];then
#跳過最新的那個二進制日誌文件
echo "skip the lastest binlog file" >> $LOGFILE
else
cp $BIN_LOG_DIR/$BINLOG_NAME $BIN_LOG_BACKUP_DIR/
if [ $? -eq 0 ];then
echo "`date -d "today" +%Y-%m-%d-%H-%M-%S` $BINLOG_NAME backup success" >> $LOGFILE
else
echo "`date -d "today" +%Y-%m-%d-%H-%M-%S` $BINLOG_NAME backup faild, Please check it out" >> $LOGFILE
exit 5
fi
#對二進制日誌進行壓縮存放
gzip $BIN_LOG_BACKUP_DIR/$BINLOG_NAME
if [ $? -eq 0 ];then
echo "`date -d "today" +%Y-%m-%d-%H-%M-%S` $BINLOG_NAME gzip success" >> $LOGFILE
else
echo "`date -d "today" +%Y-%m-%d-%H-%M-%S` $BINLOG_NAME gzip faild, Please check it out" >> $LOGFILE
exit 5
fi
echo ./$BINLOG_NAME >> $BIN_LOG_BACKUP_DIR/backup.file
fi
done
若是你們須要使用這個腳本,請自行更改對應的配置信息,好比IP地址,用戶名密碼、以及目錄等等。
注意由於這裏有mysql的用戶名和密碼,須要將腳本的權限設置成700,使用命令爲:
chmod 700 bin_log_magment.sh
手工運行沒有問題之後,添加到計劃任務中去:
00 */1 * * * /var/script/bin_log_magment/bin_log_magment.sh >/dev/null 2>&1
三、設置my.cnf配置文件,加上expire_logs_days = 5,並重啓mysql。
這個就不詳細敘述了,是我的都會了!