General_log 詳解
1.介紹
開啓 general log 將所有到達MySQL Server的SQL語句記錄下來。
一般不會開啓開功能,因爲log的量會非常龐大。但個別情況下可能會臨時的開一會兒general log以供排障使用。
相關參數一共有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’表示將日誌存入數據庫,這樣日誌信息就會被寫入到mysql.slow_log表中.
mysql數據庫支持同時兩種日誌存儲方式,配置的時候以逗號隔開即可,如:log_output=‘FILE,TABLE‘.日誌記錄到系統專用日誌表中,要比記錄到文件耗費更多的系統資源,因此對於需要啓用慢查日誌,又需要比夠獲得更高的系統性能,那麼建議優先記錄到文件.
2.開啓數據庫general_log步驟
先執行sql指令:show variables like ‘%log%’;
可以看到默認general_log是OFF的,我們直接開啓:set global general_log = ON;(永久修改需要在my.cnf的【mysqld】中添加:general_log = 1)
OK,現在mysql就會在general_log_file顯示的路徑文件裏記錄general日誌了!(從現在開始記錄)我默認的路徑是 /usr/local/mysql/data/VM_0_17_redhat.log
Binlog 詳解
1.介紹
MySQL的二進制日誌可以說是MySQL最重要的日誌了,它記錄了所有的DDL和DML(除了數據查詢語句)語句(記錄mysql內部增刪改等對mysql數據庫有更新的內容的記錄(對數據庫的改動),對數據庫的查詢select或show等不會被binlog日誌記錄),以事件形式記錄,還包含語句所執行的消耗的時間,MySQL的二進制日誌是事務安全型的。
一般來說開啓二進制日誌大概會有1%的性能損耗。
兩個最重要的使用場景:
其一:MySQL Replication在Master端開啓binlog,Mster把它的二進制日誌傳遞給slaves來達到master-slave數據一致的目的。
其二:自然就是數據恢復了,通過使用mysqlbinlog工具來使恢復數據。
二進制日誌包括兩類文件:
二進制日誌索引文件(文件名後綴爲.index)用於記錄所有的二進制文件;
二進制日誌文件(文件名後綴爲.00000*)記錄數據庫所有的DDL和DML(除了數據查詢語句)語句事件。
2.開啓binlog日誌
查看binlog開啓狀態:
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
網上很多教程都只是添加log-bin一行就行了,此處我們爲什麼要加 server-id?
因爲我們用的是5.7及以上版本的話,不加server-id重啓mysql服務會報錯,5.7以下版本就不用加了。
所以必須添加server-id這個參數!隨機指定一個不能和其他集羣中機器重名的字符串,如果只有一臺機器,那就可以隨便指定了。
注意!修改配置文件後重啓報錯最好定位到mysql的errlog,查看具體錯誤,我出現過一個錯誤就是用root自定義創建bin-log所在的目錄,沒給mysql用戶權限。
還有一種配置方式(指定三個參數):
log_bin=ON
log_bin_basename=/var/lib/mysql/mysql-bin
log_bin_index=/var/lib/mysql/mysql-bin.index
第一個參數是打開binlog日誌
第二個參數是binlog日誌的基本文件名,後面會追加標識來表示每一個文件
第三個參數指定的是binlog文件的索引文件,這個文件管理了所有的binlog文件的目錄
重啓後查看:
3.常用binlog日誌操作命令
1.查看所有binlog日誌列表
mysql> show master logs;
2.查看master狀態,即最後(最新)一個binlog日誌的編號名稱,及其最後一個操作事件pos結束點(Position)值
mysql> show master status;
3.刷新log日誌,自此刻開始產生一個新編號的binlog日誌文件
mysql> flush logs;
注:每當mysqld服務重啓時,會自動執行此命令,刷新binlog日誌;在mysqldump備份數據時加 -F 選項也會刷新binlog日誌;
4.重置(清空)所有binlog日誌
mysql> reset master;
5.查看binlog日誌內容(以表格形式)
mysql> show binlog events in 'mysql-bin.000002';
4.mysqlbinlog命令使用
mysqlbinlog功能是將mysql的binlog日誌轉換成Mysql語句,默認情況下binlog日誌是二進制文件,無法直接查看。我們直接在mysql目錄的bin目錄下啓動該命令。(在MySQL5.5以下版本使用mysqlbinlog命令時如果報錯,就加上 “–no-defaults”選項)
mysqlbinlog命令部分參數:
-d //指定庫的binlog
-r //相當於重定向到指定文件
--start-position--stop-position //按照指定位置精確解析binlog日誌(精確),如不接--stop-positiion則一直到binlog日誌結尾
--start-datetime--stop-datetime //按照指定時間解析binlog日誌(模糊,不準確),如不接--stop-datetime則一直到binlog日誌結尾
備註:myslqlbinlog分庫導出binlog,如使用-d參數,更新數據時必須使用use database。
例:解析yj-test數據庫的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)
5.binlog的三種工作模式
查看binlog日誌格式:
show variables like "binlog_format";
注:我的默認爲 ROW 模式,和網上說的默認不一樣(Statement)
(1)Row level
ROW是基於行級別的,他會記錄每一行記錄的變化,就是將每一行的修改都記錄到binlog裏面,記錄的非常詳細,但sql語句並沒有在binlog裏。
日誌中會記錄每一行數據被修改的情況,然後在slave端對相同的數據進行修改。在replication裏面也不會因爲存儲過程觸發器等造成Master-Slave數據不一致的問題,但是有個致命的缺點日誌量比較大.由於要記錄每一行的數據變化,當執行update語句後面不加where條件的時候或alter table的時候,產生的日誌量是相當的大。
(2)Statement level(默認)
每一條被修改數據的sql都會記錄到master的bin-log中,slave在複製的時候sql進程會解析成和原來master端執行過的相同的sql再次執行
優點:解決了 Row level下的缺點,不需要記錄每一行的數據變化,減少bin-log日誌量,節約磁盤IO,提高新能
(3)Mixed(混合模式)
結合了Row level和Statement level的優點。
在默認情況下是statement,但是在某些情況下會切換到row狀態,如當一個DML更新一個ndb引擎表,或者是與時間用戶相關的函數等。在主從的情況下,在主機上如果是STATEMENT模式,那麼binlog就是直接寫now(),然而如果這樣的話,那麼從機進行操作的時間,也執行now(),但明顯這兩個時間不會是一樣的,所以對於這種情況就必須把STATEMENT模式更改爲ROW模式,因爲ROW模式會直接寫值而不是寫語句(該案例是錯誤的,即使是STATEMENT模式也可以使用now()函數,具體原因以後再分析)。同樣ROW模式還可以減少從機的相關計算,如在主機中存在統計寫入等操作時,從機就可以免掉該計算把值直接寫入從機。
一般企業binlog模式的選擇:
互聯網公司使用MySQL的功能較少(不用存儲過程、觸發器、函數),選擇默認的Statement level;
用到MySQL的特殊功能(存儲過程、觸發器、函數)則選擇Mixed模式;
用到MySQL的特殊功能(存儲過程、觸發器、函數),又希望數據最大化一直則選擇Row模式;
先記錄這麼多吧,後面使用時再進一步記錄。
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/markdown_views-ea0013b516.css">
</div>