mysql日誌文件開啓及詳解:General_log 和 Binlog

轉自:https://blog.csdn.net/Abysscarry/article/details/79949480

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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章