1. 程式人生 > >MySQL日誌簡介

MySQL日誌簡介

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)
  • 修改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日誌簡介