標籤:linux、mysql
MySQL中的日誌主要分為以下幾種:
查詢日誌
慢查詢日誌
錯誤記錄檔
二進位日誌
中繼日誌
交易記錄
說明:
支援本文實驗使用的linux系統是CentOS7版本,使用的資料庫是base源內建的MariaDB,資料庫使用的儲存引擎使用預設的InnoDB
1、查詢日誌
記錄查詢語句、日誌儲存位置
日誌的存放位置有兩個地方:一是儲存在指定檔案中,一是儲存在指定的表中。考慮到I/O壓力,一般二者不會同時記錄
MariaDB [mysql]> SHOW VARIABLES LIKE ‘general%‘;+------------------+-------------+| Variable_name | Value |+------------------+-------------+| general_log | ON || general_log_file | centos7.log |+------------------+-------------+2 rows in set (0.00 sec)#general_log預設是關閉的
從上述代碼可以看出,查詢日誌具有兩個變數;
下面來查看general_log表的詳細資料:
MariaDB [mysql]> DESC general_log;+--------------+------------------+------+-----+-------------------+-----------------------------+| Field | Type | Null | Key | Default | Extra |+--------------+------------------+------+-----+-------------------+-----------------------------+| event_time | timestamp(6) | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP || user_host | mediumtext | NO | | NULL | || thread_id | int(11) | NO | | NULL | || server_id | int(10) unsigned | NO | | NULL | || command_type | varchar(64) | NO | | NULL | || argument | mediumtext | NO | | NULL | |+--------------+------------------+------+-----+-------------------+-----------------------------+6 rows in set (0.00 sec)
事件時間
使用者主機
事件的進程id
服務id
命令類型
參數
以上這些資訊構成了general_log的主要內容,即記錄的查詢日誌的操作內容可以通過上述資訊顯示
SET @@global.general_log=ON; #預設此變數是全域的,但是修改後能夠立即生效
開啟查詢日誌後,接著我們進行一些查詢操作如:
SELECT user,host,password FROM mysql.user;
這些查詢操作就會被記錄到記錄檔centos7.log檔案中,此檔案是預設檔案可以修改。而此檔案的存放路徑是相對路徑即/var/lib/mysql/
cat /var/lib/mysql/centos7.log #能看到記錄的查詢操作了
以上示範的是日誌資訊記錄在檔案中,日誌還可以記錄在指定表中,只要修改一個變數即可:
SET @@global.log_output=TABLE;#預設是FILE
關於表的日誌記錄與檔案記錄類似,不再示範
2、慢查詢日誌
慢查詢:一條查詢指令已耗用時間超出一定時間長度的操作,這種操作會對使用者的體驗大打折扣,應該盡量避免
一般建議啟動此慢查詢日誌功能
MariaDB [mysql]> SELECT @@global.long_query_time;+--------------------------+| @@global.long_query_time |+--------------------------+| 10.000000 |+--------------------------+1 row in set (0.00 sec)
預設的慢查詢時間是10秒鐘
SELECT @@global.slow_query_log;#預設關閉慢查詢日誌SELECT @@global.slow_query_log_file;#預設檔案名稱為主機名稱-slow.log,如centos7-slow.log SELECT @@global.log_output; #預設是檔案記錄
並不是所有的指令執行時間超過10秒鐘都會記錄,其是有一個過濾器的
SELECT @@global.log_slow_filter;#此變數指定的指令才會使用慢查詢
慢查詢日誌的用法與general_log的基本相同,不再贅述
3、錯誤記錄檔
顧名思義,記錄錯誤資訊,主要記錄如下幾類資訊:
(1) mysqld啟動和關閉過程中輸出的資訊;
(2) mysqld運行中產生的錯誤資訊;
(3) event scheduler運行時產生的資訊;
(4) 主從複製架構中,從伺服器複製線程啟動時產生的日誌;
錯誤記錄檔是否開啟,可以使用下述命令查看
SELECT @@global.log_error;#預設是開啟的,即指定具體記錄檔路徑 如/var/log/mariadb/mariadb.log #如果未開啟,則查詢的結果是OFF
4、二進位日誌
用於記錄引起資料改變或存在引起資料改變的潛在可能性的語句(STATEMENT)或改變後的結果(ROW),也可能是二者混合;
作用:
重放 (replay),即發生故障時可以使用二進位日誌重新操作一遍故障發生前的指令
試想一下,在進行了全量備份資料庫後,過了一天主要資料庫裝置突然出現故障,這時我們雖然能夠使用全量備份來恢複資料庫,但是前一天的資料還未來得及備份,也就是說
少了一天的資料,這種情況下就可以使用二進位日誌恢複缺失的一天的資訊;
下面舉個例子說明二進位日誌在資料恢複中的重要作用:
CREATE DATABASE RDBMS;USE RDBMS;CREATE TABLE tbl (id int primary key,name char(30) not null,age int not null);INSERT INTO tbl VALUES (1,‘xiao wang‘,20),(2,‘xiao li‘,22);
MariaDB [RDBMS]> DESC tbl; +-------+----------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+----------+------+-----+---------+-------+| id | int(11) | NO | PRI | NULL | || name | char(30) | NO | | NULL | || age | int(11) | NO | | NULL | |+-------+----------+------+-----+---------+-------+3 rows in set (0.00 sec)MariaDB [RDBMS]> SELECT * FROM tbl;+----+-----------+-----+| id | name | age |+----+-----------+-----+| 1 | xiao wang | 20 || 2 | xiao li | 22 |+----+-----------+-----+2 rows in set (0.00 sec)
rpm -ql mariadb-server#可以查到設定檔的位置vim /etc/my.cnf.d/server.cnf[server]log_bin = /app/logs/master-log#指定二進位日誌的存放路徑,之所以在設定檔修改而不用命令列,是因為命令列不支援開啟二進位日誌功能
SHOW MASTER|BINARY LOGS;#查看二進位記錄檔列表SHOW MASTER STATUS;#查看當前正在使用的二進位記錄檔SHOW BINLOG EVENTS IN ‘master-log.000001‘;#查看二進位記錄檔的事件資訊
mysqlbinlog -uroot -p master-log.000001 > /root/binlog.sql#binlog.sql就是備份的資料庫檔案#mysqlbinlog是mysql內建的二進位日誌工具
當在全新的備份伺服器上就行恢複時
mysql < /root/binlog.sql
按上述方式恢複即可
在/app/logs/下的二進位檔案是無法直接使用cat或less查看的,所以需要使用mysqlbinlog專用工具
mysqlbinlog -uroot -pcentos master-log.000007 -j 430 --stop-position=874#-j 指定開始位置#--stop-position指定結束位置
查看的內容包含以下資訊:
事件的起始位置# at 553
事件發生的日期時間:#160831 9:56:08
事件發生的伺服器id:server id 1
事件的結束位置:end_log_pos 624
事件的類型:Query
事件發生時所在伺服器執行此事件的線程的ID: thread_id=2
語句的時間戳記與將其寫入二進位記錄檔中的時間差:exec_time=0
錯誤碼:error_code=0
設定事件發生時的時間戳記:SET TIMESTAMP=1472608568/*!*/;
事件內容:BEGIN
以上就是關於mysql日誌的簡單介紹
本文出自 “a_pan” 部落格,謝絕轉載!
MySQL日誌簡介