《Mysql應(yīng)用對MySQL日志操作的一些基本命令總結(jié)》要點:
本文介紹了Mysql應(yīng)用對MySQL日志操作的一些基本命令總結(jié),希望對您有用。如果有疑問,可以聯(lián)系我們。
MYSQL應(yīng)用MySQL日志主要包括:錯誤日志、查詢?nèi)罩尽⒙樵內(nèi)罩尽⑹聞?wù)日志、二進(jìn)制日志;
MYSQL應(yīng)用日志是mysql數(shù)據(jù)庫的重要組成部分.日志文件中記錄著mysql數(shù)據(jù)庫運行期間發(fā)生的變化;也就是說用來記錄mysql數(shù)據(jù)庫的客戶端連接狀況、SQL語句的執(zhí)行情況和錯誤信息等.當(dāng)數(shù)據(jù)庫遭到意外的損壞時,可以通過日志查看文件出錯的原因,并且可以通過日志文件進(jìn)行數(shù)據(jù)恢復(fù).
MYSQL應(yīng)用錯誤日志
MYSQL應(yīng)用在mysql數(shù)據(jù)庫中,錯誤日志功能是默認(rèn)開啟的.并且,錯誤日志無法被禁止.默認(rèn)情況下,錯誤日志存儲在mysql數(shù)據(jù)庫的數(shù)據(jù)文件中.錯誤日志文件通常的名稱為hostname.err.其中,hostname表示服務(wù)器主機名.
MYSQL應(yīng)用錯誤日志信息可以本身進(jìn)行配置的,錯誤日志所記錄的信息是可以通過log-error和log-warnings來定義的,其中l(wèi)og-err是定義是否啟用錯誤日志的功能和錯誤日志的存儲位置,log-warnings是定義是否將警告信息也定義至錯誤日志中.默認(rèn)情況下錯誤日志大概記錄以下幾個方面的信息:服務(wù)器啟動和關(guān)閉過程中的信息(未必是錯誤信息,如mysql如何啟動InnoDB的表空間文件的、如何初始化本身的存儲引擎的等等)、服務(wù)器運行過程中的錯誤信息、事件調(diào)度器運行一個事件時產(chǎn)生的信息、在從服務(wù)器上啟動服務(wù)器進(jìn)程時產(chǎn)生的信息.
MYSQL應(yīng)用下面我們來定義mysql錯誤日志的功能:
MYSQL應(yīng)用一般而言,日志級別的定義沒有回話變量都只是在全局級別下進(jìn)行定義.
MYSQL應(yīng)用
是否啟用了日志
MYSQL應(yīng)用
mysql>show variables like 'log_bin';
MYSQL應(yīng)用
mysql> show master status;
MYSQL應(yīng)用
shell>mysqlbinlog mail-bin.000001
MYSQL應(yīng)用
shell>mysqlbinlog mail-bin.000001 | tail
MYSQL應(yīng)用在5.6及以上版本一定要手動指定.5.6以下版本默認(rèn)file_name為$datadir/mysqld-binlog
二進(jìn)制日志用于記錄所有更改數(shù)據(jù)的語句.主要用于復(fù)制和即時點恢復(fù).
查看二進(jìn)制日志的工具為:mysqlbinlog
二進(jìn)制日志包括了所有更新了數(shù)據(jù)或者已經(jīng)潛在更新了數(shù)據(jù)(例如,沒有匹配任何行的一個DELETE)的所有語句.語句以“事件”的形式保存,它描述數(shù)據(jù)更改.二進(jìn)制日志還包括關(guān)于每個更新數(shù)據(jù)庫的語句的執(zhí)行時間信息.它不包括沒有修改任何數(shù)據(jù)的語句.
二進(jìn)制日志的主要目的是在數(shù)據(jù)庫存在故障時,恢復(fù)時能夠最大可能地更新數(shù)據(jù)庫(即時點恢復(fù)),因為二進(jìn)制日志包括備份后進(jìn)行的所有更新.二進(jìn)制日志還用于在主復(fù)制服務(wù)器上記錄所有將發(fā)送給從服務(wù)器的語句.
那么二進(jìn)制日志是記錄執(zhí)行的語句還是執(zhí)行后的結(jié)果數(shù)據(jù)呢?
第一種情況:
加入一個表有10萬行數(shù)據(jù),而現(xiàn)在要執(zhí)行一個如下語句將amount字段的值全部在原來的基礎(chǔ)上增加1000:
MYSQL應(yīng)用
UPDATE sales.january SET amount=amount+1000;
MYSQL應(yīng)用此時如果要記錄執(zhí)行后的結(jié)果數(shù)據(jù)的話,日志會非常大.
因此在這種情況下應(yīng)記錄執(zhí)行語句.這種方式就是基于語句的二進(jìn)制日志.
第二種情況:
如果向某個字段插入的是當(dāng)前的時間呢?如下:
MYSQL應(yīng)用
INSERT INTO tb SET Birthdate=CURRENT_TIME();
MYSQL應(yīng)用此時就不能記錄語句了,因為不同時間執(zhí)行的結(jié)果是不一樣的.這是應(yīng)該記錄這一行的值,這種就是基于行(row)的二進(jìn)制日志.
在有些情況,可能會結(jié)合兩種方式來記錄,這種叫做混合方式的二進(jìn)制日志.
二進(jìn)制日志記錄時間:
默認(rèn)情況下,并不是每次寫入時都將二進(jìn)制日志與硬盤同步.因此如果操作系統(tǒng)或機器(不僅僅是MySQL服務(wù)器)崩潰,有可能二進(jìn)制日志中最后的語句丟失了.要想防止這種情況,你可以使用sync_binlog全局變量(1是最平安的值,但也是最慢的),使二進(jìn)制日志在每N次二進(jìn)制日志寫入后與硬盤同步.
對非事務(wù)表的更新執(zhí)行完畢后立即保存到二進(jìn)制日志中.對于事務(wù)表,例如BDB或InnoDB表,所有更改表的更新(UPDATE、DELETE或INSERT) 被緩存起來,直到服務(wù)器接收到COMMIT語句.在該點,執(zhí)行完COMMIT之前,mysqld將整個事務(wù)寫入二進(jìn)制日志.當(dāng)處理事務(wù)的線程啟動時,它為緩沖查詢分配binlog_cache_size大小的內(nèi)存.如果語句大于該值,線程則打開臨時文件來保存事務(wù).線程結(jié)束后臨時文件被刪除.
MYSQL應(yīng)用日志恢復(fù):(數(shù)據(jù)庫備份時間:2013-02-30 10:10:10 數(shù)據(jù)出錯前一刻時間:2013-02-30 10:10:10)
利用mysqlbinlog.exe工具
(1)打開cmd,進(jìn)入到日志目錄下
(2)恢復(fù)備份數(shù)據(jù)庫
(3)重新執(zhí)行從備份數(shù)據(jù)庫開始到出錯前一刻日志,
例如1:用時間段恢復(fù)
MYSQL應(yīng)用
mysqlbinlog --start-datetime="2013-02-30 10:10:10" --stop-datetime="2013-02-30 10:10:10" log.00001 | mysql -uroot -p123456
MYSQL應(yīng)用由于在測試中發(fā)現(xiàn),用時間進(jìn)行恢復(fù),恢復(fù)這個時間段sql并不準(zhǔn)確,特此標(biāo)注(待研究)
例如2:用日志位置進(jìn)行恢復(fù)(必需打開日志,確定開始恢復(fù)日志位置和出錯前日志的位置)
???? (A):
MYSQL應(yīng)用
mysqlbinlog log.00001 >F:log.sql
MYSQL應(yīng)用-- 把二進(jìn)制文件log.00001導(dǎo)入文件日志log.sql中
???? (B):打開log.sql日志文件,確定恢復(fù)點
???? (C):
MYSQL應(yīng)用
mysqlbinlog --start-position="5230766" --stop-position="5231104" PC-201304011235-bin.000001 | mysql -uroot -p111111
MYSQL應(yīng)用備注:必需加上|后面mysql信息,重新執(zhí)行這段點之間日志
維易PHP培訓(xùn)學(xué)院每天發(fā)布《Mysql應(yīng)用對MySQL日志操作的一些基本命令總結(jié)》等實戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/13092.html