Mysql二進制日誌文件的管理

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。

這個就不詳細敘述了,是我的都會了!

相關文章
相關標籤/搜索