mysql日志文件General_log和Binlog開啟及詳解
背景:
周末歸納下mysql的日志文件,其中g(shù)eneral_log在mysql入侵中已經(jīng)用到過,binlog即將會用到。注:mysql版本為5.7.20
General_log 詳解
1.介紹
開啟 general log 將所有到達(dá)MySQL Server的SQL語句記錄下來。
一般不會開啟開功能,因?yàn)閘og的量會非常龐大。但個別情況下可能會臨時(shí)的開一會兒general log以供排障使用。
相關(guān)參數(shù)一共有3:general_log、log_output、general_log_file
show variables like 'general_log'; -- 查看日志是否開啟 set global general_log=on; -- 開啟日志功能
show variables like 'general_log_file'; -- 看看日志文件保存位置 set global general_log_file='tmp/general.lg'; -- 設(shè)置日志文件保存位置
show variables like 'log_output'; -- 看看日志輸出類型 table或file set global log_output='table'; -- 設(shè)置輸出類型為 table set global log_output='file'; -- 設(shè)置輸出類型為file

log_output='FILE’ 表示將日志存入文件,默認(rèn)值是FILE
***log_output=‘TABLE’***表示將日志存入數(shù)據(jù)庫,這樣日志信息就會被寫入到***mysql.slow_log***表中.
mysql數(shù)據(jù)庫支持同時(shí)兩種日志存儲方式,配置的時(shí)候以逗號隔開即可,如:log_output=‘FILE,TABLE‘.日志記錄到系統(tǒng)專用日志表中,要比記錄到文件耗費(fèi)更多的系統(tǒng)資源,因此對于需要啟用慢查日志,又需要比夠獲得更高的系統(tǒng)性能,那么建議優(yōu)先記錄到文件.
2.開啟數(shù)據(jù)庫general_log步驟
先執(zhí)行sql指令:show variables like ‘%log%’;

可以看到默認(rèn)general_log是OFF的,我們直接開啟:***set global general_log = ON;***(永久修改需要在my.cnf的【mysqld】中添加:general_log = 1)

OK,現(xiàn)在mysql就會在***general_log_file***顯示的路徑文件里記錄general日志了?。◤默F(xiàn)在開始記錄)我默認(rèn)的路徑是 /usr/local/mysql/data/VM_0_17_redhat.log
Binlog 詳解
1.介紹
MySQL的二進(jìn)制日志可以說是MySQL最重要的日志了,它記錄了所有的DDL和DML(除了數(shù)據(jù)查詢語句)語句(記錄mysql內(nèi)部增刪改等對mysql數(shù)據(jù)庫有更新的內(nèi)容的記錄(對數(shù)據(jù)庫的改動),對數(shù)據(jù)庫的查詢select或show等不會被binlog日志記錄),以事件形式記錄,還包含語句所執(zhí)行的消耗的時(shí)間,MySQL的二進(jìn)制日志是事務(wù)安全型的。
一般來說開啟二進(jìn)制日志大概會有1%的性能損耗。
兩個最重要的使用場景:
其一:MySQL Replication在Master端開啟binlog,Mster把它的二進(jìn)制日志傳遞給slaves來達(dá)到master-slave數(shù)據(jù)一致的目的。
其二:自然就是數(shù)據(jù)恢復(fù)了,通過使用mysqlbinlog工具來使恢復(fù)數(shù)據(jù)。
二進(jìn)制日志包括兩類文件:
二進(jìn)制日志索引文件(文件名后綴為.index)用于記錄所有的二進(jìn)制文件;
二進(jìn)制日志文件(文件名后綴為.00000*)記錄數(shù)據(jù)庫所有的DDL和DML(除了數(shù)據(jù)查詢語句)語句事件。
2.開啟binlog日志
查看binlog開啟狀態(tài):
mysql> show variables like 'log_bin'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_bin | OFF | +---------------+-------+ 1 row in set (0.01 sec)
vim編輯打開mysql配置文件my.cnf:
vim /etc/my.cnf 在【mysqld】中添加: log-bin=/home/data/mysql-log/mysql-bin server-id=12345
網(wǎng)上很多教程都只是添加log-bin一行就行了,此處我們?yōu)槭裁匆?server-id?
因?yàn)槲覀冇玫氖?.7及以上版本的話,不加server-id重啟mysql服務(wù)會報(bào)錯,5.7以下版本就不用加了。

所以必須添加server-id這個參數(shù)!隨機(jī)指定一個不能和其他集群中機(jī)器重名的字符串,如果只有一臺機(jī)器,那就可以隨便指定了。
注意!修改配置文件后重啟報(bào)錯最好定位到mysql的errlog,查看具體錯誤,我出現(xiàn)過一個錯誤就是***用root自定義創(chuàng)建bin-log所在的目錄,沒給mysql用戶權(quán)限***。
還有一種配置方式(指定三個參數(shù)):
log_bin=ON log_bin_basename=/var/lib/mysql/mysql-bin log_bin_index=/var/lib/mysql/mysql-bin.index
第一個參數(shù)是打開binlog日志
第二個參數(shù)是binlog日志的基本文件名,后面會追加標(biāo)識來表示每一個文件
第三個參數(shù)指定的是binlog文件的索引文件,這個文件管理了所有的binlog文件的目錄
重啟后查看:


3.常用binlog日志操作命令
1.查看所有binlog日志列表
mysql> show master logs;
2.查看master狀態(tài),即最后(最新)一個binlog日志的編號名稱,及其最后一個操作事件pos結(jié)束點(diǎn)(Position)值
mysql> show master status;
3.刷新log日志,自此刻開始產(chǎn)生一個新編號的binlog日志文件
mysql> flush logs;
注:每當(dāng)mysqld服務(wù)重啟時(shí),會自動執(zhí)行此命令,刷新binlog日志;在mysqldump備份數(shù)據(jù)時(shí)加 -F 選項(xiàng)也會刷新binlog日志;
4.重置(清空)所有binlog日志
mysql> reset master;
5.查看binlog日志內(nèi)容(以表格形式)
mysql> show binlog events in 'mysql-bin.000002';
4.mysqlbinlog命令使用
mysqlbinlog功能是將mysql的binlog日志轉(zhuǎn)換成Mysql語句,默認(rèn)情況下binlog日志是二進(jìn)制文件,無法直接查看。我們直接在mysql目錄的bin目錄下啟動該命令。(在MySQL5.5以下版本使用mysqlbinlog命令時(shí)如果報(bào)錯,就加上 “–no-defaults”選項(xiàng))
mysqlbinlog命令部分參數(shù):
-d //指定庫的binlog -r //相當(dāng)于重定向到指定文件 --start-position--stop-position //按照指定位置精確解析binlog日志(精確),如不接--stop-positiion則一直到binlog日志結(jié)尾 --start-datetime--stop-datetime //按照指定時(shí)間解析binlog日志(模糊,不準(zhǔn)確),如不接--stop-datetime則一直到binlog日志結(jié)尾
備注:myslqlbinlog分庫導(dǎo)出binlog,如使用-d參數(shù),更新數(shù)據(jù)時(shí)必須使用use database。
例:解析yj-test數(shù)據(jù)庫的binlog日志并寫入my.sql文件
./mysqlbinlog -d yj-test /home/data/mysql-log/mysql-bin.000003 -r my.sql
//使用位置精確解析binlog日志 ./mysqlbinlog mysql-bin.000003 --start-position=100 --stop-position=200 -r my.sql
可以直接查看所有binlog信息:
mysql> show master logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 177 | | mysql-bin.000002 | 154 | +------------------+-----------+ 2 rows in set (0.00 sec)
注意:
查看binlog內(nèi)容可能存在兩個問題:
一是報(bào)錯,比如不支持’default-character-set=utf8’,這種是binlog工具和mysql配置出現(xiàn)沖突,可以在binlog命令后添加--no--defaults解決;
二是解析出來的binlog內(nèi)容中sql語句出現(xiàn)亂碼,如:
BINLOG ' Q738XBMBAAAAOwAAAFATAAAAAFsAAAAAAAEABHRlc3QAAnQxAAQPDw8KBigAKAAoAA8CA/z/AACU U3Q= Q738XB4BAAAALgAAAH4TAAAAAFsAAAAAAAEAAgAE/wABMgIxMQFSycYPZKuVcw== '
這種可以添加 --base64-output=DECODE-ROWS -v 參數(shù)解決!
5.binlog的三種工作模式
查看binlog日志格式:
show variables like "binlog_format";
注:我的默認(rèn)為 ROW 模式,和網(wǎng)上說的默認(rèn)不一樣(Statement)
(1)Row level
ROW是基于行級別的,他會記錄每一行記錄的變化,就是將每一行的修改都記錄到binlog里面,記錄的非常詳細(xì),但sql語句并沒有在binlog里。
日志中會記錄每一行數(shù)據(jù)被修改的情況,然后在slave端對相同的數(shù)據(jù)進(jìn)行修改。在replication里面也不會因?yàn)榇鎯^程觸發(fā)器等造成Master-Slave數(shù)據(jù)不一致的問題,但是有個致命的缺點(diǎn)日志量比較大.由于要記錄每一行的數(shù)據(jù)變化,當(dāng)執(zhí)行update語句后面不加where條件的時(shí)候或alter table的時(shí)候,產(chǎn)生的日志量是相當(dāng)?shù)拇蟆?/p>

(2)Statement level(默認(rèn))
每一條被修改數(shù)據(jù)的sql都會記錄到master的bin-log中,slave在復(fù)制的時(shí)候sql進(jìn)程會解析成和原來master端執(zhí)行過的相同的sql再次執(zhí)行
優(yōu)點(diǎn):解決了 Row level下的缺點(diǎn),不需要記錄每一行的數(shù)據(jù)變化,減少bin-log日志量,節(jié)約磁盤IO,提高新能
缺點(diǎn):statement level下對一些特殊功能的復(fù)制效果不是很好,比如:函數(shù)、存儲過程的復(fù)制。由于row level是基于每一行的變化來記錄的,所以不會出現(xiàn)類似問題
(3)Mixed(混合模式)
結(jié)合了Row level和Statement level的優(yōu)點(diǎn)。
在默認(rèn)情況下是statement,但是在某些情況下會切換到row狀態(tài),如當(dāng)一個DML更新一個ndb引擎表,或者是與時(shí)間用戶相關(guān)的函數(shù)等。在主從的情況下,在主機(jī)上如果是STATEMENT模式,那么binlog就是直接寫now(),然而如果這樣的話,那么從機(jī)進(jìn)行操作的時(shí)間,也執(zhí)行now(),但明顯這兩個時(shí)間不會是一樣的,所以對于這種情況就必須把STATEMENT模式更改為ROW模式,因?yàn)镽OW模式會直接寫值而不是寫語句(該案例是錯誤的,即使是STATEMENT模式也可以使用now()函數(shù),具體原因以后再分析)。同樣ROW模式還可以減少從機(jī)的相關(guān)計(jì)算,如在主機(jī)中存在統(tǒng)計(jì)寫入等操作時(shí),從機(jī)就可以免掉該計(jì)算把值直接寫入從機(jī)。
一般企業(yè)binlog模式的選擇:
互聯(lián)網(wǎng)公司使用MySQL的功能較少(不用存儲過程、觸發(fā)器、函數(shù)),選擇默認(rèn)的Statement level;
用到MySQL的特殊功能(存儲過程、觸發(fā)器、函數(shù))則選擇Mixed模式;
用到MySQL的特殊功能(存儲過程、觸發(fā)器、函數(shù)),又希望數(shù)據(jù)最大化一直則選擇Row模式;
先記錄這么多吧,后面使用時(shí)再進(jìn)一步記錄。
總結(jié)
到此這篇關(guān)于mysql日志文件General_log和Binlog開啟及詳解的文章就介紹到這了,更多相關(guān)mysql日志文件開啟內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL UPDATE 語句的非標(biāo)準(zhǔn)實(shí)現(xiàn)代碼
這篇文章主要介紹了MySQL UPDATE 語句的非標(biāo)準(zhǔn)實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
mysql存儲過程之游標(biāo)(DECLARE)原理與用法詳解
這篇文章主要介紹了mysql存儲過程之游標(biāo)(DECLARE)原理與用法,結(jié)合實(shí)例形式詳細(xì)分析了mysql存儲過程游標(biāo)(DECLARE)的基本功能、原理、使用方法及操作注意事項(xiàng),需要的朋友可以參考下2019-12-12
MySQL GRANT用戶授權(quán)的實(shí)現(xiàn)
授權(quán)就是為某個用戶賦予某些權(quán)限。MySQL 提供了 GRANT 語句來為用戶設(shè)置權(quán)限。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
MySQL數(shù)據(jù)庫跨版本遷移的實(shí)現(xiàn)三種方式
本文主要介紹了MySQL數(shù)據(jù)庫跨版本遷移的實(shí)現(xiàn),主要包含mysqldump,物理文件遷移和原地升級三種,具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05

