分享java帶來的快樂

          我喜歡java新東西

          淺析MySql二進制日志的應(yīng)用

          mysql有4種不同的日志,分別是二進制日志,查詢?nèi)罩荆樵內(nèi)罩竞湾e誤日志,這些日記記錄著數(shù)據(jù)庫工作的方方面面,可以幫助我們了解數(shù)據(jù)庫的不同方面的蹤跡,下面先介紹二進制日志的作用和使用方法,并利用二進制日志對數(shù)據(jù)庫進行各種維護和優(yōu)化,其他日志也會在后面陸續(xù)會做詳細的介紹。

          二進制日志(bin-log日志)

          上一篇介紹mysql主從配置的blog中,已經(jīng)提過bin-log日志的作用和使用,bin-log日志記錄了所有的DDL和DML的語句,但不包括查詢的語句,語句以事件的方式保存,描述了數(shù)據(jù)的更改過程,此日志對發(fā)生災(zāi)難時數(shù)據(jù)恢復(fù)起到了極為重要的作用。

          開啟
          mysql默認是沒有開發(fā)bin-log日志,首先我們需要開啟bin-log日志,在my.cnf中修改



          指定了bin-log日志的路徑,開啟日志后需要myssqladmin flush log才生效,重啟后我們發(fā)現(xiàn)在剛才設(shè)定的路徑新增了log文件,這就是我們需要的二進制日志



          由于日志是以二進制方式存儲的,不能直接讀取,需要使用mysql自帶的mysqlbinlog工具來進行查看
          語法如下:

          #mysqlbinlog mysql-bin.000002

          現(xiàn)在我們嘗試向test1表插入數(shù)據(jù)



          然后使用mysqlbinlog工具進行日志查看

          #mysqlbinlog mysql-bin.000002 -d test



          清理

          如果每天都會生成大量的二進制日志,這些日志長時間不清理的話,將會對磁盤空間帶來很大的浪費,所以定期清理日志是DBA維護mysql的一個重要工作

          1)RESET MASTER
          在上面查看日志存放的文件夾中,二進制日志命名的格式是以mysql-bin.*,*代表日志的序號,序號是遞增的,其中還有mysql-bin.index是日志的索引文件,記錄了日志的最大序號
          我們執(zhí)行RESET MASTER命名刪除全部日志



          查看刪除后的日志



          可以看到,以前的日志全部被清空,新的日志從00001開始

          2)PURGE MASTER LOGS TO & PURGE MASTER LOGS BEFORE
          執(zhí)行PURGE MASTER LOGS TO 'mysql-bin.******'命令,是將'******'編號之前的所有日志進行刪除
          執(zhí)行PURGE MASTER LOGS BEFORE 'yyyy-mm-dd hh:mm:ss'命令,是將在'yyyy-mm-dd hh:mm:ss'時間之前的所有日志進行刪除

          3)-EXPIRE_LOGS_DAYS
          此參數(shù)是設(shè)置日志的過期天數(shù),過期的日志將會被自動刪除,這有利于減少我們管理日志的工作量,需要修改my.cnf



          這里我們設(shè)定保存日志為3天,3天之后過期的日志將被自動刪除

          恢復(fù)

          bin-log是記錄著mysql所有事件的操作,當(dāng)mysql發(fā)生災(zāi)難性錯誤時,可以通過bin-log做完整恢復(fù),基于時間點的恢復(fù),和基于位置的恢復(fù)

          完整恢復(fù),假定我們每天凌晨2點都會使用mysqldump備份數(shù)據(jù)庫,但在第二天早上9點由于數(shù)據(jù)庫出現(xiàn)了故障,數(shù)據(jù)無法訪問,需要恢復(fù)數(shù)據(jù),先使用昨天凌晨備份的文件進行恢復(fù)到凌晨2點的狀態(tài),在使用mysqlbinlog恢復(fù)自mysqldump備份以來的binlog
          mysql localhost mysql-bin.000001 | mysql -uroot -p
          這樣數(shù)據(jù)庫就可以完全的恢復(fù)到崩潰前的完全狀態(tài)

          基于時間點的恢復(fù),由于誤操作,比如說刪除了一張表,這時使用上面講的完全恢復(fù)是沒有用的,因為日志里面還存在誤操作的語句,,我們需要的是恢復(fù)到誤操作前的狀態(tài),然后跳過誤操作的語句,再恢復(fù)后面操作的語句,假定我們刪除了一張表的誤操作發(fā)生在10:00這個時間點,我們可以使用下面的語句用備份和binlog將數(shù)據(jù)恢復(fù)到故障前

          mysqlbinlog --stop-date='2010-09-04 9:59:59' /var/log/mysql-bin.000001 | mysql -uroot -p

          然后跳過誤操作的時間點,繼續(xù)執(zhí)行后面的binlog

          mysqlbinlog --start-date='2010-09-04 10:01:00' /var/log/mysql-bin.000001 | mysql -uroot -p

          其中--stop-date='2010-09-04 9:59:59' 和 --start-date='2010-09-04 10:01:00' 其中的時間是你誤操作的時間點,當(dāng)然了,這個時間點你需要你自己計算的,而且這個時間點還可以涉及到的不只是誤操作,還可以有正確的操作也被跳過去了。

          基于位置恢復(fù),由于上面提到的,使用基于時間點的恢復(fù)可能出現(xiàn),在一個時間點里面可能存在誤操作和其他正確的操作,所以我們需要一種更為精確的恢復(fù)方式
          使用mysqlbinlog查看二進制,可看到



          其中drop tables test1這個誤操作的end_log_pos為8879917,幾下這個id,得出它前后操作的id分別為8879916,8879918
          我們將進行位置恢復(fù)操作
          mysqlbinlog --stop-position='8879916' /var/log/mysql-bin.000001 | mysql -uroot -p

          mysqlbinlog 
          --start-position='8879918' /var/log/mysql-bin.000001 | mysql -uroot -p

          第一行是恢復(fù)到停止位置位置的所以事務(wù),第二性是恢復(fù)從給定的起始位置知道二進制日志結(jié)束所有事物。

          主從復(fù)制
          mysql的復(fù)制是指將主數(shù)據(jù)庫的DDL和DML操作通過二進制日志傳到從服務(wù)器上,然后在從服務(wù)器上對這些日志做重新執(zhí)行的操作,從而使得從服務(wù)器和主服務(wù)器保持數(shù)據(jù)的同步,通過二進制日志進行主從復(fù)制的可以看前一篇《MySQL 主從復(fù)制配置

          posted on 2013-09-12 15:03 強強 閱讀(377) 評論(0)  編輯  收藏 所屬分類: mysql

          主站蜘蛛池模板: 同江市| 临沂市| 女性| 上虞市| 武平县| 突泉县| 商河县| 乡城县| 宣武区| 文登市| 会东县| 都江堰市| 香河县| 壶关县| 宣武区| 西乌珠穆沁旗| 垫江县| 延安市| 墨竹工卡县| 额尔古纳市| 林州市| 邵武市| 南和县| 宜宾市| 高淳县| 手机| 柳州市| 枣强县| 合作市| 苏州市| 岳池县| 吉木乃县| 雷州市| 墨江| 永和县| 郎溪县| 新蔡县| 龙州县| 治县。| 云浮市| 灵山县|