MySQL 二進(jìn)制日志的使用

本文的操作環(huán)境是 macOS Mojave 10.14.1, mysql 5.7.19

二進(jìn)制日志的作用

二進(jìn)制日志主要記錄 MySQL 數(shù)據(jù)庫的變化。它會記錄所有更改表數(shù)據(jù)和表結(jié)構(gòu)的事件,比如 update望门、delete 等善绎,它也會記錄語句執(zhí)行所用的時間祥楣。為了保證事件的準(zhǔn)確性检访,會記錄事件的長度眶拉。它不會記錄 select罗晕、show 語句的執(zhí)行济欢。使用二進(jìn)制日志主要有兩種用途:

  1. 主從備份赠堵。主庫上的二進(jìn)制日志記錄主庫的所有變更,主庫會把日志包含的事件發(fā)給從庫法褥,從庫執(zhí)行這些事件顾腊,從而與主庫的數(shù)據(jù)保持一致;
  2. 從二進(jìn)制日志恢復(fù)數(shù)據(jù)庫挖胃。

Binary logging is done immediately after a statement or transaction completes but before any locks are released or any commit is done. This ensures that the log is logged in commit order.

在 commit 執(zhí)行之前杂靶,寫入二進(jìn)制日志。

配置方式

默認(rèn)情況下酱鸭,二進(jìn)制日志是關(guān)閉的吗垮,可以通過修改 MySQL 的配置文件來啟動和設(shè)置二進(jìn)制日志。

查看 MySQL 配置文件的路徑:

shell> mysql --help | grep my.cnf
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf

如果是用 brew 安裝的 mysql凹髓,配置文件默認(rèn)在 /usr/local/etc/my.cnf

在配置文件的 [mysqld] 下面添加:

# 由于 mysql 的 bug烁登,必須配置 server-id,可以是任意值
server-id=11
# 開啟二進(jìn)制日志蔚舀,日志文件名稱是 mysql-bin
log-bin=mysql-bin
# 設(shè)置過期時間饵沧,10天后自動刪除舊的日志。默認(rèn)是 0赌躺,表示永不刪除
expire_logs_days = 10
# 設(shè)置每個日志文件的大小狼牺,超過這個值,重新創(chuàng)建新的文件礼患。最小值是4096B是钥,最大值是 1GB,默認(rèn)是1GB
max_binlog_size = 100M

注意:必須配置 server-id缅叠,否則啟動 MySQL 會報錯悄泥,官方文檔有說明:

If you specify the --log-bin option without also specifying a --server-id, the server is not allowed to start. (Bug #11763963, Bug #56739)

日志文件默認(rèn)保存在datadir目錄下,也可以設(shè)置為其他路徑肤粱,比如 log-bin=/usr/local/var/mysql/mysql-bin弹囚。即使在文件名稱后面添加后綴,mysql 也會忽略领曼,mysql 會添加數(shù)字后綴鸥鹉。

也可以直接配置為 log-bin,不加任何參數(shù)悯森。此時日志文件的默認(rèn)名稱是 host_name-bin宋舷,host_name 是你的主機(jī)名稱绪撵。

除了二進(jìn)制日志瓢姻,mysql 還會創(chuàng)建一個 mysql-bin.index 文件,該文件保存所有的二進(jìn)制日志的文件名稱音诈』眉睿可以直接使用 cat 命令查看绎狭,不要手動修改這個文件。

另外褥傍,每次重新啟動 mysql儡嘶,也會創(chuàng)建新的二進(jìn)制日志。

當(dāng)前客戶端可以暫時關(guān)閉二進(jìn)制日志: SET sql_log_bin=OFF恍风。

查看方法

使用 show variables like 'log_bin%'; 查詢二進(jìn)制日志設(shè)置:

image

使用 show binary logs; 查看二進(jìn)制日志文件個數(shù)及文件名稱:

image

使用 show master status 查看當(dāng)前正在使用的日志:

image

使用 SHOW SLAVE STATUS 可以在從庫上查看它在讀取哪個日志蹦狂;

使用 mysqlbinlog 查看二進(jìn)制日志的內(nèi)容,紅色方框里面是該文件的創(chuàng)建時間:

image

二進(jìn)制日志的格式

有三種格式:row-based logging(ROW)朋贬,statement-based logging(STATEMENT)凯楔,mixed-base logging(MIXED)。

There are several reasons why a client might want to set binary logging on a per-session basis:

  • A session that makes many small changes to the database might want to use row-based logging.
  • A session that performs updates that match many rows in the WHERE clause might want to use statement-based logging because it will be more efficient to log a few statements than many rows.
  • Some statements require a lot of execution time on the master, but result in just a few rows being modified. It might therefore be beneficial to replicate them using row-based logging.

官方文檔有這樣兩句話:

Statement may not be safe to log in statement format.

You can avoid these issues by using MySQL's row-based replication instead.

查看日志格式:

mysql> select @@session.binlog_format;
mysql> select @@global.binlog_format;

改變?nèi)罩靖袷剑?/p>

全局改變:

mysql> SET GLOBAL binlog_format = 'STATEMENT';
mysql> SET GLOBAL binlog_format = 'ROW';
mysql> SET GLOBAL binlog_format = 'MIXED';

客戶端改變:

mysql> SET SESSION binlog_format = 'STATEMENT';
mysql> SET SESSION binlog_format = 'ROW';
mysql> SET SESSION binlog_format = 'MIXED';

下面這張圖锦募,上面的日志是 ROW 格式摆屯,選中的日志是 STATEMENT 格式:

image

刪除二進(jìn)制日志

使用 reset master; 刪除所有的二進(jìn)制日志文件。MySQL 會重新創(chuàng)建二進(jìn)制日志糠亩,新的日志文件擴(kuò)展名從 000001 開始編號虐骑。

MySQL 還提供了刪除指定日志的方法:

purge master logs to 'log_name' 刪除比 log_name 編號小的日志,比如 purge master logs to 'mysql-bin.000003';赎线,編號小于 000003 的日志會被刪除廷没。

purge master logs before 'datatime' 刪除 datatime 之前的日志,日期格式是 YYYY-MM-DD hh:mm:ss垂寥。

如果日志文件正在用于主從備份腕柜,它不會被刪除。

使用二進(jìn)制日志恢復(fù)數(shù)據(jù)庫

在使用 mysql 的全量備份恢復(fù)數(shù)據(jù)庫之后矫废,可以再使用二進(jìn)制日志恢復(fù)到指定時間點盏缤。比如當(dāng)前時間是11點多,我不小心把一個重要的庫刪除了蓖扑。幸好每天凌晨兩點做了數(shù)據(jù)庫全量備份唉铜,這時我就可以先恢復(fù)數(shù)據(jù)庫到兩點,然后再使用二進(jìn)制日志恢復(fù)到刪除之前的數(shù)據(jù)庫律杠。

直接使用日志文件恢復(fù)數(shù)據(jù)庫:

shell> mysqlbinlog binlog_files | mysql -u root -p

可以把日志文件導(dǎo)出文本潭流,然后編輯文本,刪除一些不需要執(zhí)行的語句柜去,然后再恢復(fù)數(shù)據(jù)庫:

shell> mysqlbinlog binlog_files > tmpfile
shell> ... edit tmpfile ...
shell> mysql -u root -p < tmpfile

如果有多個日志文件灰嫉,在一個連接中使用它們:

shell> mysqlbinlog binlog.000001 binlog.000002 | mysql -u root -p

恢復(fù)到指定時間點:

shell> mysqlbinlog --stop-datetime="2018-10-25 11:00:00" \
         /var/log/mysql/bin.123456 | mysql -u root -p

從指定時間點恢復(fù):

shell> mysqlbinlog --start-datetime="2018-10-25 10:01:00" \
         /var/log/mysql/bin.123456 | mysql -u root -p

根據(jù)位置恢復(fù):

shell> mysqlbinlog --stop-position=368312 /var/log/mysql/bin.123456 \
         | mysql -u root -p

shell> mysqlbinlog --start-position=368315 /var/log/mysql/bin.123456 \
         | mysql -u root -p

位置信息可以從日志文件的 log_pos 獲取。

參考

  1. MySQL 二進(jìn)制日志簡介

  2. 二進(jìn)制日志所有參數(shù)

  3. mysqlbinlog 的使用方法

  4. 使用二進(jìn)制日志恢復(fù)數(shù)據(jù)庫

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嗓奢,一起剝皮案震驚了整個濱河市讼撒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖根盒,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钳幅,死亡現(xiàn)場離奇詭異,居然都是意外死亡炎滞,警方通過查閱死者的電腦和手機(jī)敢艰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來册赛,“玉大人钠导,你說我怎么就攤上這事∩瘢” “怎么了辈双?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長柜砾。 經(jīng)常有香客問我湃望,道長,這世上最難降的妖魔是什么痰驱? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任证芭,我火速辦了婚禮,結(jié)果婚禮上担映,老公的妹妹穿的比我還像新娘废士。我一直安慰自己,他們只是感情好蝇完,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布官硝。 她就那樣靜靜地躺著,像睡著了一般短蜕。 火紅的嫁衣襯著肌膚如雪氢架。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天朋魔,我揣著相機(jī)與錄音岖研,去河邊找鬼。 笑死警检,一個胖子當(dāng)著我的面吹牛孙援,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扇雕,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼拓售,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了镶奉?” 一聲冷哼從身側(cè)響起础淤,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤崭放,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后值骇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莹菱,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡移国,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年吱瘩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迹缀。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡使碾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出祝懂,到底是詐尸還是另有隱情票摇,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布砚蓬,位于F島的核電站矢门,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏灰蛙。R本人自食惡果不足惜祟剔,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望摩梧。 院中可真熱鬧物延,春花似錦、人聲如沸仅父。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笙纤。三九已至耗溜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間省容,已是汗流浹背强霎。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留蓉冈,地道東北人城舞。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像寞酿,于是被迫代替她去往敵國和親家夺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

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