天天看點

MySQL/MariaDB的日志

在Mysql/MariaDB的日志大緻分為下列幾種:

    查詢日志

        一般查詢日志:

        慢查詢日志:

    錯誤日志

    二進制日志

    中繼日志

    事務日志

簡要介紹一下這幾種日志,日志對我們分析MySQL服務有着很重要的幫助;

查詢日志:

     一般查詢日志: 預設關閉,因為會記錄所有的查詢語句;

MariaDB [(none)]> select @@general_log;
+---------------+
| @@general_log |
+---------------+
|             0 |
+---------------+      

    慢查詢日志:預設關閉,建議開啟,在SQL語句調優和MySQL伺服器性能分析時具有一定的參考意義;

        指的是查詢時間超過伺服器參數long_query_time所設定的時間的查詢語句;但是查詢擷取鎖的時間不計入查詢時間考核内;

MariaDB [(none)]> show global variables like 'long_query_time';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+      

        慢查詢日志可以以兩種形式存放,也受log_output伺服器參數的控制;

            1. 以檔案的形式存放于檔案系統中;

            2. 以系統表的形式存放于mysql.slow_log表中;

        慢查詢日志的功能開關:

            log_slow_queries { ON | OFF }

            slow_query_log { ON | OFF }

                慢查詢日志的功能開關,如果兩個開關都在,則修改一個的值,另一個值也随之改變;

MariaDB [(none)]> select @@log_slow_queries;
+--------------------+
| @@log_slow_queries |
+--------------------+
|                  0 |
+--------------------+
1 row in set (0.00 sec)

MariaDB [(none)]> select @@slow_query_log;
+------------------+
| @@slow_query_log |
+------------------+
|                0 |
+------------------+      

            log_slow_rate_limit = N    慢查詢日志的記錄頻率;

            log_slow_verbosity { ON | OFF }     是否詳細記錄慢查詢日志的功能開關;

            slow_query_log_file /PATH

                隻有log_output伺服器參數的值為FILE時,此伺服器參數才有效;其值為慢查詢日志的存放路徑及檔案名稱;預設路徑為資料目錄(datadir), 檔案名為:HOSTNAME-slow.log;

            log_queries_not_using_indexes { ON | OFF }

                對于那些沒有使用索引導緻的慢查詢是否記錄于慢查詢日志的功能開關;預設值為OFF;

        測試慢查詢:

MariaDB [(none)]> select sleep(10);
+-----------+
| sleep(10) |
+-----------+
|         0 |
+-----------+      

        mysql的用戶端工具mysqldumpslow可以幫助分析慢查詢日志;

            常用選項:

                -a:在歸類是不使用N代替數字,不使用S代替字元串;

                --debug, -d:輸出調試資訊,更友善日志分析;

                -t N:僅顯示慢查詢日志中的前N條慢查詢結果;

                --verbose, -v:顯示詳細資訊;

                -g pattern:通過grep進行select語句的篩選;

[root@master ~]# mysqldumpslow -a -v

Reading mysql slow query log from /var/lib/mysql/master-slow.log
Count: 1  Time=10.00s (10s)  Lock=0.00s (0s)  Rows_sent=1.0 (1), Rows_examined=0.0 (0), root[root]@localhost
  select sleep(10)      

錯誤日志:

    可以記錄資訊的内容

        1.mysqld|mysqld_safe程式啟動或關閉的過程中輸出的資訊;

2.mysqld服務運作過程中産生的錯誤資訊;

3.時間排程器在運作時産生的資訊;

4.在主從架構的MySQL複制模型中,SLAVE伺服器的複制線程啟動時産生的資訊;

5.可以通過log_warnings的伺服器參數控制将"Warning"類的資訊記錄于此;

MariaDB [(none)]> select @@log_error;
+------------------------------+
| @@log_error                  |
+------------------------------+
| /var/log/mariadb/mariadb.log |
+------------------------------+      

        與錯誤日志先關的伺服器變量參數;

            log_error /var/log/mariadb/mariadb.log

                    開啟錯誤日志記錄,并定義記錄錯誤日志的檔案路徑及檔案名;

            log_warnings 1

                    是否将mysqld運作過程中産生的"Warning"類的資訊一并記錄在錯誤日志檔案中的功能開關;

二進制日志:

    二進制日志包含了引起或可能引起資料變化的事件的資訊:如:

insert,update,delete

update和delete語句在執行時根據指定的條件沒有比對的行;

create,alter,drop

但是諸如select或show這樣的查詢語句,絕對不會被記錄在二進制日志中;

    二進制日志中的"事件",包含了引起資料變化或可能引起資料變化的SQL語句或SQL語句的執行結果,也有可能是二者的混合;

1.如果記錄SQL語句,日志中記錄的資料量比較小,可能産生潛在的結果不一緻,比如與時間有關的函數的執行結果;

2.如果記錄SQL語句的執行結果,能夠精确的儲存資料結果集,但是可能會導緻資料量過于龐大;

    到底該如何記錄二進制日志内容,由一個伺服器參數來決定的;

binlog_format STATEMENT

該變量的取值:

STATEMENT:以SQL語句方式記錄二進制日志;

ROW:以SQL語句在執行之後發送改變的資料行的資訊記錄二進制日志;

MIXED:混合模式,STATEMENT和ROW兩種模式都支援,但是在記錄某個事件時,隻能選擇一種格式來記錄,由MySQL自行決定到底使用何種格式;

MariaDB [(none)]> show global variables like 'binlog_format';
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+      

        二進制日志的功能:資料重放;

1.主從複制

2.用于資料的增量備份;

MySQL或MariaDB預設并沒有開啟二進制日志的記錄的功能,如果想要開啟;

1.修改伺服器參數:

SET @@GLOBAL.logbin={ ON | OFF | PATH }

2.修改配置檔案:

在主配置檔案/etc/my.cnf,添加一行

log_bin=/PATH/TO/binlog

注意:

1) MySQL或MariaDB 5.5+中,不支援ON或OFF的開關值,僅支援路徑;

2) 二進制日志檔案的路徑,原則上講,不應該與資料庫存放在同一個儲存設備之上;

MySQL/MariaDB的日志

            可以通過mysql的互動模式檢視二進制檔案的清單,檢視目前正在使用的日志檔案;

MariaDB [(none)]> show master logs;
+---------------+-----------+
| Log_name      | File_size |
+---------------+-----------+
| binlog.000001 |      3478 |
| binlog.000002 |     33156 |
| binlog.000003 |      1568 |
| binlog.000004 |       264 |
| binlog.000005 |       264 |
| binlog.000006 |       245 |
+---------------+-----------+
MariaDB [(none)]> show master status;
+---------------+----------+--------------+------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| binlog.000006 |      245 |              |                  |
+---------------+----------+--------------+------------------+      

        檢視某指定的二進制檔案中的時間内容:

MariaDB [(none)]> show binlog events  in 'binlog.000006'\G
*************************** 1. row ***************************
   Log_name: binlog.000006
        Pos: 4
 Event_type: Format_desc
  Server_id: 101
End_log_pos: 245
       Info: Server ver: 5.5.56-MariaDB, Binlog ver: 4      

    二進制日志的滾動:

        自動滾動:由MySQL自行控制的日志滾動;

            通過伺服器參數來控制的單個二進制日志檔案的大小上限;

MariaDB [(none)]> show global variables like 'max_binlog_size';
+-----------------+------------+
| Variable_name   | Value      |
+-----------------+------------+
| max_binlog_size | 1073741824 |
+-----------------+------------+      

        注意:因為二進制日志是在事務送出之後才會儲存且每個事務都必須存放于一個二進制日志檔案中,是以一些大事務的送出可能使得二進制日志檔案的大小超過這個上限的值;

        手動滾動:由使用者控制的日志滾動;

            1.重新開機MySQL服務;

            2.在MySQL用戶端的互動式模式中執行"FLUSH LOGS"語句;

    其他的一些與二進制日志有關的重要參數資訊;

sql_log_bin = { ON | OFF }

    指定是否啟用二進制日志功能;隻有在log_bin參數的值為ON時有效;

sync_binlog = N

    sync_binlog=0:異步更新;

        MySQL不會選擇同步緩存的資訊到磁盤檔案,緩存中的二進制日志何時刷寫到磁盤由檔案系統決定;該參數設定時MySQL的性能很好,但并不能很好的保證資料的一緻性和持久性;

    sync_binlog=N;每寫入N次二進制日志的事件(不是事務的數量),mysql會執行一次磁盤同步指令fdatasync()将緩存中的二進制日志刷寫到磁盤日志檔案中;為了保證資料集的持久性,通常會使用sync_binlog=1,尤其是在MySQL/MariaDB的主從複制架構之中;

    二進制日志的大緻内容格式:

中繼日志:

    其内容就是二進制日志的内容;

在主從架構的MySQL叢集服務中,從伺服器會從主伺服器複制二進制日志到本地,将其儲存在中繼日志中;

    二進制日志的格式是二進制格式,中繼日志的檔案格式為純文字格式;

與中繼日志有關的相關參數:

    relay_log = { ON | OFF | PATH }

        中繼日志功能開關,定義了中繼日志存放的路徑和檔案名稱;如果此參數值為空,則預設會将中繼日志放置于資料目錄中,檔案名預設為:HOSTNAME-relay-bin.xxxxxx;

        注意:通常需要使用中繼日志時,直接定義出檔案的路徑,而不使用預設值;以防止在主機名被更改之後,無法定位日志檔案的位置;

    relay_log_recovery = { ON | OFF }

        當從服務從當機狀态恢複後,如果中繼日志損壞,導緻一部分日志中的語句無法被重放或者全部不能被重放,此時是否自動放棄所有未執行的中繼日志的内容,并且從主伺服器重新擷取二進制日志的功能開關;建議開啟;

MySQL/MariaDB的日志
MySQL/MariaDB的日志

事務日志:

    在MySQL或MariaDB系統中,一般就是指InnoDB的事務日志,包含兩種日志;

    redo log

        提供資料重做功能,實作前滾操作;

        通常是實體日志;記錄的是資料頁的實體修改,而不是針對于某一行或某幾行的修改結果;

        如果使用redo log恢複資料,能恢複到最後一次送出事務後的位置;

    undo log

        提供資料恢複功能,實作復原操作:

        提供了恢複操作及MVCC功能;undo log中存放的内容是對應的行在被修改之前的内容,或者與修改資料相反的SQL語句;

        undo log一般是邏輯日志,根據每行中的資料修改來進行記錄,通常存放于邏輯表空間中;

    注意:undo log的執行過程并是不會redo log 的逆過程,實際上着兩種日志都是用來實作恢複功能的日志;

    redo log的第一部分是否能夠持久存儲,MySQL中通過innodb_flush_log_at_trx_commit伺服器參數來進行控制;

innodb_flsuh_log_at_trx_commmit = N  預設是2;

            如果該參數取值為1,事務每次送出都會将日志緩存中的日志寫入作業系統的緩沖區并立即調用fsync()刷寫到"log file on disk"中,這種日志刷寫方式即使系統直接崩潰也會丢失任何資料,資料的持久性也可以得到保證;但是每次送出事務都需要寫入磁盤,IO性能非常差;

            如果該參數為0,事務送出後,不會将事務日志緩存緩沖區中的日志寫入作業系統的緩沖區,每秒鐘送出給作業系統緩沖區一次并調用fsync()刷寫到"log file on disk"中;如果系統崩潰,會丢失一秒内的所有資料;

            如果該參數值為2,每次送出事務都直接寫入作業系統的緩存,然後由作業系統每秒調用fsync()函數将作業系統緩沖區中的日志内容寫入到"log file on disk"中;如果MySQL服務崩潰,不會丢失資料;但如果作業系統崩潰,會丢失一秒内的所有資料;

MariaDB [(none)]> show global variables like 'innodb_flush_log_at_trx_commit';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+      

    undo log的作用:

1.提供復原功能;

2.多版本并行控制(MVCC)

    在資料被修改時,InnoDB不僅記錄的redo log,還記錄了undo log;

是以可以在開啟事務之後的執行操作過程中,因為某些操作失敗或因為某些操作不合理,而借助于undo log進行復原;

undo log與redo log形式上不同,屬于邏輯日志。存放于表空間中;

        undo log預設存放在共享表空間中,如果啟用了innodb_file_per_table伺服器參數,則意味着每個表的獨立表空間中均會儲存與該表相關的undo log;

MariaDB [(none)]> show global variables like 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+      
MySQL/MariaDB的日志