1. 程式人生 > 其它 >MySQL:日誌管理

MySQL:日誌管理

技術標籤:mysql運維

MySQL日誌型別

1.錯誤日誌

2.通用查詢日誌

3.慢查詢日誌

4.二進位制日誌

二進位制日誌的管理



  • MySQL有幾個不同的日誌檔案,可以幫助你找出mysqld內部發生的事情:
日誌檔案記入檔案中的資訊型別
錯誤日誌記錄啟動、執行或停止時出現的問題
查詢日誌記錄建立的客戶端連線和執行的語句
二進位制日誌記錄所有更改資料的語句。主要用於複製和即時點恢復
慢日誌記錄所有執行時間超過long_query_time秒的所有查詢或不使用索引的查詢
事務日誌記錄InnoDB等支援事務的儲存引擎執行事務時產生的日誌
  • 預設情況下,所有日誌創建於mysqld資料目錄中。通過重新整理日誌,你可以強制
    mysqld來關閉和重新開啟日誌檔案(或者在某些情況下切換到一個新的日誌)。當你執行一個FLUSH LOGS語句或執行mysqladmin flush-logs或mysqladmin refresh時,出現日誌重新整理。如果你正使用MySQL複製功能,從複製伺服器將維護更多日誌檔案,被稱為接替日誌。

1.錯誤日誌

  • 伺服器啟動和關閉過程中的資訊
  • 伺服器執行過程中的錯誤資訊
  • 事件排程器執行一個時間是產生的資訊
  • 在從伺服器上啟動從伺服器程序是產生的資訊

定義:

可以用--log-error[=file_name]選項來指定mysqld儲存錯誤日誌檔案的位置。如果沒有給定file_name值,mysqld

使用錯誤日誌名host_name.err 並在資料目錄中寫入日誌檔案。如果你執行FLUSH LOGS,錯誤日誌用-old重新命名字尾並且mysqld建立一個新的空日誌檔案。(如果未給出--log-error選項,則不會重新命名)。

  • 檢視當前錯誤日誌配置:
mysql> show global variables like '%log_error%';
  • 是否記錄警告日誌
mysql> SHOW GLOBAL VARIABLES LIKE '%log_warnings%';

2.通用查詢日誌

  • 啟動開關:general_log={ON|OFF}
  • 日誌檔案變數:general_log_file[=/PATH/TO/file]
  • 全域性日誌開關:log={ON|OFF} 該開關開啟後,所有日誌都會被啟用
  • 記錄型別:log_output={TABLE|FILE|NONE}:

因此,要啟用通用查詢日誌,需要至少配置general_log=ONlog_output={TABLE|FILE}。而general_log_file如果沒有指定,預設名是host_name.log

看看上述幾個值的預設配置:
SHOW GLOBAL VARIABLES LIKE '%general_log%';
mysql> SHOW GLOBAL VARIABLES LIKE '%log_output%';

3.慢查詢日誌

  • MySQL如果啟用了slow_query_log=ON選項,就會記錄執行時間超過long_query_time的查詢(初使表鎖定的時間不算作執行時間)。日誌記錄檔案為slow_query_log_file[=file_name],如果沒有給出file_name值, 預設為主機名,字尾為-slow.log。如果給出了檔名,但不是絕對路徑名,檔案則寫入資料目錄。
預設與慢查詢相關變數:
mysql> SHOW GLOBAL VARIABLES LIKE '%slow_query_log%';
  • 預設沒有啟用慢查詢,為了伺服器調優,建議開啟
開啟方法:
SET GLOBAL slow_query_log=ON; 當前生效,永久有效配置檔案中設定
  • 使用mysqldumpslow命令獲得日誌中顯示的查詢摘要來處理慢查詢日誌
# mysqldumpslow slow.log
  • 那麼多久算是慢呢?
如果查詢時長超過 long_query_time 的定義值(預設 10 秒),即為慢查詢:
mysql> SHOW GLOBAL VARIABLES LIKE 'long_query_time';

4.二進位制日誌

二進位制日誌啟動開關:
log-bin [= file_name]
5 .6 及以上版本一定要手動指定。 5 .6 以下版本預設 file_name $datadir/mysqld- binlog
  • 檢視二進位制日誌的工具為:mysqlbinlog

檢視二進位制日誌是否開啟:

mysql> show global variables like 'log_bin';

永久開啟方式:

[[email protected] ~]# vim /etc/my.cnf
在[mysqld]下新增:
log_bin
server_id=36            //需要配置server_id,這裡取ip地址後兩位,注意不要重複

重啟服務systemctl restart mysqld,進入mysql中。

mysql> show global variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.01 sec)

二進位制日誌的管理

[[email protected] ~]# ls /var/lib/mysql            //可以看到存放日誌的檔案

我們可以給存放二進位制日誌的檔案起名,與系統預設起名區分開來

日誌滾動

  • 每次重啟MySQL服務,日誌都會自動滾動一次。
  • 另外如果需要手動滾動,則使用命令 mysql> FLUSH LOGS

在sql裡重新整理或輸入指令,重啟mysql服務之後,會看到新的日誌檔案

日誌檢視

  • 檢視有哪些二進位制日誌檔案:
mysql> SHOW BINARY LOGS;
  • 檢視當前正在使用的是哪一個二進位制日誌檔案:
mysql> SHOW MASTER STATUS;
  • 檢視二進位制日誌內容:
mysql> SHOW BINLOG EVENTS IN 'mysqld-binlog.000002';     
//該語句還可以加上Position(位置),指定顯示從哪個Position(位置)開始: 
mysql> SHOW BINLOG EVENTS IN 'mysqld-binlog.000002' FROM 203;
  • 使用命令mysqlbinlog檢視二進位制日誌內容:
mysqlbinlog [options] log-files
  • 使用二進位制日誌還原資料:
使用 mysqlbinlog 讀取需要的日誌內容,使用標準輸入重定向到一個 sql 檔案,然後在 mysql 伺服器上匯入即可,如下:
[[email protected] mysql]# mysqlbinlog mysqld-binlog.000002 >/root/temp_date.sql

刪除二進位制日誌檔案

  • 二進位制日誌檔案不能直接刪除的,如果使用rm等命令直接刪除日誌檔案,可能導致資料庫的崩潰。
必須使用命令 PURGE 刪除日誌,語法如下:
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }
mysql> purge binary logs to 'mysql-bin.000002';    //刪除2號之前的日誌檔案
Query OK, 0 rows affected (0.01 sec)

用reset master命令刪除所有日誌,新日誌重新從000001開始編號

purge master logs to 'filename.******' 命令可以刪除指定編號前的所有日誌