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)
修改mysql的服務配置文件,開啟二進制日誌功能
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日誌簡介