mysql日志文件General_log和Binlog開啟及詳解
背景:
周末歸納下mysql的日志文件,其中general_log在mysql入侵中已經(jīng)用到過,binlog即將會用到。注:mysql版本為5.7.20
General_log 詳解
1.介紹
開啟 general log 將所有到達MySQL Server的SQL語句記錄下來。
一般不會開啟開功能,因為log的量會非常龐大。但個別情況下可能會臨時的開一會兒general log以供排障使用。
相關參數(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'; -- 設置日志文件保存位置
show variables like 'log_output'; -- 看看日志輸出類型 table或file set global log_output='table'; -- 設置輸出類型為 table set global log_output='file'; -- 設置輸出類型為file
log_output='FILE’ 表示將日志存入文件,默認值是FILE
***log_output=‘TABLE’***表示將日志存入數(shù)據(jù)庫,這樣日志信息就會被寫入到***mysql.slow_log***表中.
mysql數(shù)據(jù)庫支持同時兩種日志存儲方式,配置的時候以逗號隔開即可,如:log_output=‘FILE,TABLE‘.日志記錄到系統(tǒng)專用日志表中,要比記錄到文件耗費更多的系統(tǒng)資源,因此對于需要啟用慢查日志,又需要比夠獲得更高的系統(tǒng)性能,那么建議優(yōu)先記錄到文件.
2.開啟數(shù)據(jù)庫general_log步驟
先執(zhí)行sql指令:show variables like ‘%log%’;
可以看到默認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)在開始記錄)我默認的路徑是 /usr/local/mysql/data/VM_0_17_redhat.log
Binlog 詳解
1.介紹
MySQL的二進制日志可以說是MySQL最重要的日志了,它記錄了所有的DDL和DML(除了數(shù)據(jù)查詢語句)語句(記錄mysql內(nèi)部增刪改等對mysql數(shù)據(jù)庫有更新的內(nèi)容的記錄(對數(shù)據(jù)庫的改動),對數(shù)據(jù)庫的查詢select或show等不會被binlog日志記錄),以事件形式記錄,還包含語句所執(zhí)行的消耗的時間,MySQL的二進制日志是事務安全型的。
一般來說開啟二進制日志大概會有1%的性能損耗。
兩個最重要的使用場景:
其一:MySQL Replication在Master端開啟binlog,Mster把它的二進制日志傳遞給slaves來達到master-slave數(shù)據(jù)一致的目的。
其二:自然就是數(shù)據(jù)恢復了,通過使用mysqlbinlog工具來使恢復數(shù)據(jù)。
二進制日志包括兩類文件:
二進制日志索引文件(文件名后綴為.index)用于記錄所有的二進制文件;
二進制日志文件(文件名后綴為.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?
因為我們用的是5.7及以上版本的話,不加server-id重啟mysql服務會報錯,5.7以下版本就不用加了。
所以必須添加server-id這個參數(shù)!隨機指定一個不能和其他集群中機器重名的字符串,如果只有一臺機器,那就可以隨便指定了。
注意!修改配置文件后重啟報錯最好定位到mysql的errlog,查看具體錯誤,我出現(xiàn)過一個錯誤就是***用root自定義創(chuàng)建bin-log所在的目錄,沒給mysql用戶權限***。
還有一種配置方式(指定三個參數(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日志的基本文件名,后面會追加標識來表示每一個文件
第三個參數(shù)指定的是binlog文件的索引文件,這個文件管理了所有的binlog文件的目錄
重啟后查看:
3.常用binlog日志操作命令
1.查看所有binlog日志列表
mysql> show master logs;
2.查看master狀態(tài),即最后(最新)一個binlog日志的編號名稱,及其最后一個操作事件pos結(jié)束點(Position)值
mysql> show master status;
3.刷新log日志,自此刻開始產(chǎn)生一個新編號的binlog日志文件
mysql> flush logs;
注:每當mysqld服務重啟時,會自動執(zhí)行此命令,刷新binlog日志;在mysqldump備份數(shù)據(jù)時加 -F 選項也會刷新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語句,默認情況下binlog日志是二進制文件,無法直接查看。我們直接在mysql目錄的bin目錄下啟動該命令。(在MySQL5.5以下版本使用mysqlbinlog命令時如果報錯,就加上 “–no-defaults”選項)
mysqlbinlog命令部分參數(shù):
-d //指定庫的binlog -r //相當于重定向到指定文件 --start-position--stop-position //按照指定位置精確解析binlog日志(精確),如不接--stop-positiion則一直到binlog日志結(jié)尾 --start-datetime--stop-datetime //按照指定時間解析binlog日志(模糊,不準確),如不接--stop-datetime則一直到binlog日志結(jié)尾
備注:myslqlbinlog分庫導出binlog,如使用-d參數(shù),更新數(shù)據(jù)時必須使用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)容可能存在兩個問題:
一是報錯,比如不支持’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";
注:我的默認為 ROW 模式,和網(wǎng)上說的默認不一樣(Statement)
(1)Row level
ROW是基于行級別的,他會記錄每一行記錄的變化,就是將每一行的修改都記錄到binlog里面,記錄的非常詳細,但sql語句并沒有在binlog里。
日志中會記錄每一行數(shù)據(jù)被修改的情況,然后在slave端對相同的數(shù)據(jù)進行修改。在replication里面也不會因為存儲過程觸發(fā)器等造成Master-Slave數(shù)據(jù)不一致的問題,但是有個致命的缺點日志量比較大.由于要記錄每一行的數(shù)據(jù)變化,當執(zhí)行update語句后面不加where條件的時候或alter table的時候,產(chǎn)生的日志量是相當?shù)拇蟆?/p>
(2)Statement level(默認)
每一條被修改數(shù)據(jù)的sql都會記錄到master的bin-log中,slave在復制的時候sql進程會解析成和原來master端執(zhí)行過的相同的sql再次執(zhí)行
優(yōu)點:解決了 Row level下的缺點,不需要記錄每一行的數(shù)據(jù)變化,減少bin-log日志量,節(jié)約磁盤IO,提高新能
缺點:statement level下對一些特殊功能的復制效果不是很好,比如:函數(shù)、存儲過程的復制。由于row level是基于每一行的變化來記錄的,所以不會出現(xiàn)類似問題
(3)Mixed(混合模式)
結(jié)合了Row level和Statement level的優(yōu)點。
在默認情況下是statement,但是在某些情況下會切換到row狀態(tài),如當一個DML更新一個ndb引擎表,或者是與時間用戶相關的函數(shù)等。在主從的情況下,在主機上如果是STATEMENT模式,那么binlog就是直接寫now(),然而如果這樣的話,那么從機進行操作的時間,也執(zhí)行now(),但明顯這兩個時間不會是一樣的,所以對于這種情況就必須把STATEMENT模式更改為ROW模式,因為ROW模式會直接寫值而不是寫語句(該案例是錯誤的,即使是STATEMENT模式也可以使用now()函數(shù),具體原因以后再分析)。同樣ROW模式還可以減少從機的相關計算,如在主機中存在統(tǒng)計寫入等操作時,從機就可以免掉該計算把值直接寫入從機。
一般企業(yè)binlog模式的選擇:
互聯(lián)網(wǎng)公司使用MySQL的功能較少(不用存儲過程、觸發(fā)器、函數(shù)),選擇默認的Statement level;
用到MySQL的特殊功能(存儲過程、觸發(fā)器、函數(shù))則選擇Mixed模式;
用到MySQL的特殊功能(存儲過程、觸發(fā)器、函數(shù)),又希望數(shù)據(jù)最大化一直則選擇Row模式;
先記錄這么多吧,后面使用時再進一步記錄。
總結(jié)
到此這篇關于mysql日志文件General_log和Binlog開啟及詳解的文章就介紹到這了,更多相關mysql日志文件開啟內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MySQL數(shù)據(jù)庫跨版本遷移的實現(xiàn)三種方式
本文主要介紹了MySQL數(shù)據(jù)庫跨版本遷移的實現(xiàn),主要包含mysqldump,物理文件遷移和原地升級三種,具有一定的參考價值,感興趣的可以了解一下2024-05-05