mysql二進制日志

MySQL的二進制日志(binary log)是一個二進制文件,主要用于記錄修改數(shù)據(jù)或有可能引起數(shù)據(jù)變更的MySQL語句。二進制日志(binary log)中記錄了對MySQL數(shù)據(jù)庫執(zhí)行更改的所有操作,并且記錄了語句發(fā)生時間、執(zhí)行時長、操作數(shù)據(jù)等其它額外信息,但是它不記錄SELECT、SHOW等那些不修改數(shù)據(jù)的SQL語句。二進制日志(binary log)主要用于數(shù)據(jù)庫恢復(fù)和主從復(fù)制,以及審計(audit)操作。


二進制日志(Binary log)

a、它包含的內(nèi)容及作用如下:

包含了所有更新了數(shù)據(jù)或者已經(jīng)潛在更新了數(shù)據(jù)(比如沒有匹配任何行的一個DELETE)

包含關(guān)于每個更新數(shù)據(jù)庫(DML)的語句的執(zhí)行時間信息

不包含沒有修改任何數(shù)據(jù)的語句,如果需要啟用該選項,需要開啟通用日志功能

主要目的是盡可能的將數(shù)據(jù)庫恢復(fù)到數(shù)據(jù)庫故障點,因為二進制日志包含備份后進行的所有更新

用于在主復(fù)制服務(wù)器上記錄所有將發(fā)送給從服務(wù)器的語句

啟用該選項數(shù)據(jù)庫性能降低1%,但保障數(shù)據(jù)庫完整性,對于重要數(shù)據(jù)庫值得以性能換完整。有些類似于oracle開啟歸檔模式。

b、開啟二進制日志的方法及屬性

使用--log-bin[=file_name]選項或在配置文件中指定log-bin啟動時,mysqld寫入包含所有更新數(shù)據(jù)的SQL命令的日志文件。

對于未給出file_name值, 默認名為-bin后面所跟的主機名。

在未指定絕對路徑的情形下,缺省位置保存在數(shù)據(jù)目錄下。

每個二進制日志名會添加一個數(shù)字擴展名用于日志老化,因此不支持自定義的擴展名,會被mysql數(shù)字擴展名動態(tài)替換。

若當前的日志大小達到max_binlog_size,則自動創(chuàng)建新的二進制日志

對于大的事務(wù),二進制日志會超過max_binlog_size設(shè)定的值。也即是事務(wù)僅僅寫入一個二進制日志

由是可知,二進制日志文件大小接近,其size不是完全相等,這點不同于oracle。

二進制日志文件會有一個對應(yīng)二進制日志索引文件,該文件包含所有的二進制日志,其文件名與二進制日志相同,擴展名為.index

二進制索引文件通過--log-bin-index[=file_name]選項來指定

RESET MASTER語句將刪除所有二進制日志文件,這將影響到從庫。也可以用PURGE MASTER LOGS只刪除部分二進制文件。


系統(tǒng)變量log_bin的值為OFF表示沒有開啟二進制日志(binary log)。ON表示開啟了二進制日志(binary log) show variables like 'log_bin';

查看當前服務(wù)器所有的二進制日志文件 show binary logs;? show master logs;

查看當前二進制日志文件狀態(tài) show master status;

show binlog events用于在二進制日志中顯示事件。如果未指定'log_name',則顯示第一個二進制日志。

方法1:使用show binlog events方式可以獲取當前以及指定binlog的日志,不適宜提取大量日志。

SHOW BINLOG EVENTS[IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]

方法2: 使用mysqlbinlog命令行查看日志內(nèi)容(適宜批量提取日志)。

查看第一個binlog文件的內(nèi)容(show binlog events) show binlog events;

查看某個特定binglog文件的內(nèi)容。? show binlog events in 'DB-Server-bin.000012';

show binlog events in 'DB-Server-bin.000012' from 336;

二進制日志開啟方法:查看系統(tǒng)變量log_bin,如果其值為OFF,表示沒有開啟二進制日志(binary log),如果需要開啟二進制日志,則必須在my.cnf中[mysqld]下面添加log-bin [=DIR\[filename]] ,DIR參數(shù)指定二進制文件的存儲路徑;filename參數(shù)指定二級制文件的文件名。 其中filename可以任意指定,但最好有一定規(guī)范。系統(tǒng)變量log_bin是靜態(tài)參數(shù),不能動態(tài)修改的(因為它不是Dynamic Variable)。如下所示:

show variables like 'log_bin';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| log_bin? ? ? | OFF? |

+---------------+-------+

1 row in set (0.00 sec)

mysql> set global log_bin=mysql_bin;

ERROR 1238 (HY000): Variable 'log_bin' is a read only variable

修改my.cnf,在[mysqld]下面增加log_bin=mysql_bin_log,重啟MySQL后,你就會發(fā)現(xiàn)log_bin變?yōu)榱薕N,二進制日志(binary log)默認放在數(shù)據(jù)目錄下(系統(tǒng)變量datadir下),如下所示:

校驗:show variables like 'log_bin';

使用命令flush logs切換二進制日志

驗證切換前:show master status;

切換:flush logs;

切換后:show master status;

請注意,每次重啟MySQL服務(wù)也會生成一個新的二進制日志文件,相當于二進制日志切換。切換二進制日志時,你會看到這些number會不斷遞增。另外,除了這些二進制日志文件外,你會看到還生成了一個DB-Server-bin.index的文件,這個文件中存儲所有二進制日志文件的清單又稱為二進制文件的索引。

二進制日志的刪除可以通過命令手工刪除,也可以設(shè)置自動清理。下面簡單介紹一下,如何刪除二進制日志。

purge binary logs to xxx; 表示刪除某個日志之前的所有二進制日志文件。這個命令會修改index中相關(guān)數(shù)據(jù) purge binary logs to 'on.000004';

清除某個時間點以前的二進制日志文件。 purge binary logs before '2017-03-10 10:10:00';

清除7天前的二進制日志文件 purge master logs before date_sub( now( ), interval 7 day);

清除所有的二進制日志文件(當前不存在主從復(fù)制關(guān)系) reset master;

設(shè)置expire_logs_days參數(shù),設(shè)置自動清理,其默認值為0,表示不啟用過期自動刪除功能,如果啟用了自動清理功能,表示超出此天數(shù)的二進制日志文件將被自動刪除,自動刪除工作通常發(fā)生在MySQL啟動時或FLUSH日志時。

系統(tǒng)變量log_bin_trust_function_creators,默認為OFF,這個參數(shù)開啟會限制存儲過程、Function、觸發(fā)器的創(chuàng)建。

系統(tǒng)變量sql_log_bin 用于控制會話級別二進制日志功能的開啟或關(guān)閉,默認為ON,表示啟用二進制日志功能。

系統(tǒng)變量binlog_format 指定二進制日志的類型。分別有STATEMENT、ROW、MIXED三種值。MySQL 5.7.6之前默認為STATEMENT模式。MySQL 5.7.7之后默認為ROW模式。這個參數(shù)主要影響主從復(fù)制。

復(fù)制的模式有下面幾種:基于SQL語句的復(fù)制(statement-based replication, SBR),基于行的復(fù)制(row-based replication, RBR),混合模式復(fù)制(mixed-based replication, MBR)。

mysql 5.5.20-log(路徑不能有空格)

一配置mysql 的my.ini,在[mysqld] 下添加二進制日志所在文件(log-bin-file) = C:/Program Files/MySQL/MySQL Server 5.0/log-bin/logbin.log

上面是配置mysql二進制日志存放的目錄,目錄可以隨便指定,在指定路徑時要注意以下兩點:

1 在目錄的文件夾命名中不能有空格,比如“aa bb”文件夾 是不允許的,這樣,在訪問日志時候會報錯;

2 指定目錄時候一定要以*.log結(jié)尾,即不能僅僅指定到文件夾的級別,如上面我寫的logbin.log,這時候,日志文件的名稱是logbin.000001 logbin.000002。。。不然不會有日志文件產(chǎn)生。

二 mysql.ini 修改后,保存,然后重啟mysql服務(wù),重啟后在C:/Program Files/MySQL/MySQL Server 5.0/log-bin 目錄下會產(chǎn)生logbin.000001 和 logbin.index 兩個文件。

三 查看二進制文件

在dos命令行中,進入到mysql的安裝目錄下,即C:/Program Files/MySQL/MySQL Server 5.0,再進到bin/目錄下,執(zhí)行mysqlbinlog命令查看日志:

mysqlbinlog ..\log-bin\logbin.000001

值得注意的是后面的路徑問題,路徑可以使用絕對路徑也可以使用相對路徑,分隔符可以是“/"也可以是“\”,兩種分割符都能正常識別,路徑中的文件夾名稱中不能有空格 ,這個測試過(如果是絕對路徑C:/Program Files/MySQL/MySQL Server 5.0/log-bin/logbin.000001就會報錯找不到文件 因為“C:/Program Files”帶空格)

為了方便查看日志內(nèi)容 可以導(dǎo)出到.sql文件

mysqlbinlog ..\log-bin\logbin.000001 ->a.sql


d、刪除歷史日志

--使用purge手動刪除指定日志

--使用expire-log-days刪除失效日志,設(shè)置變量expire_logs_days,刪除超出這個變量保留期之前的所有日志被刪除

--自動日志刪除通常發(fā)生在服務(wù)器啟動以及日志flush

--reset master方式

--使用before子句purge日志,binlog.000003被刪除

--重置所有日志

--reset master將刪除在索引文件中列出所有的日志文件并重置索引文件,最后生成一個新的binlog文件。

--該操作之前先備份binlog至其它位置以備以后需要。

--reset之后,從000001開始生成全新空日志


/*!40019 SET @@session.max_insert_delayed_threads=0*/;

/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;

DELIMITER /*!*/;

# at 4

#100830 16:30:55 server id 1? end_log_pos 98??? Start: binlog v 4, server v 5.0.

67-community-nt-log created 100830 16:30:55 at startup

# Warning: this binlog was not closed properly. Most probably mysqld crashed wri

ting it.

ROLLBACK/*!*/;

DELIMITER ;

# End of log file

ROLLBACK /* added by mysqlbinlog */;

/*!50003 SETCOMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容