MySQL之六----MySQL數據庫各種日志管理


事務日志:

事務日志的寫入類型為“追加”,因此其操作為“順序IO”;通常也被稱為:預寫式日志 write ahead logging

事務日志文件: ib_logfile0, ib_logfile1

日志

事務日志 transaction log
錯誤日志 error log
通用日志 general log
慢查詢日志 slow query log
二進制日志 binary log
中繼日志 relay log

事務日志:transaction log

事務型存儲引擎自行管理和使用,建議和數據文件分開存放

redo log
undo log

Innodb事務日志相關配置:

show variables like '%innodb_log%';
innodb_log_file_size 5242880 每個日志文件大小
innodb_log_files_in_group 2 日志組成員個數
innodb_log_group_home_dir ./ 事務文件路徑
innodb_flush_log_at_trx_commit 默認為1

示例:

修改事務日志的文件存放路徑,比如,我們需要將事務日志存放在/data/logs目錄下,此時,我們需要新建一個目錄。

[root@centos7-1~]#mkdir /data/logs   新建一個logs目錄
[root@centos7-1~]#ll -d /data/logs
drwxr-xr-x 2 root root 6 Nov 20 09:22 /data/logs
[root@centos7-1~]#chown mysql.mysql /data/logs  修改目錄的所屬組和所有者
[root@centos7-1~]#ll -d /data/logs
drwxr-xr-x 2 mysql mysql 6 Nov 20 09:22 /data/logs

指定事務路徑:

vim /etc/my.cnf
[mysqld]
innodb_log_group_home_dir=/data/logs 

systemctl restart mariadb 重啟mysql服務

查看得知,此時的事務存放文件路徑已修改過來了:

innodb_flush_log_at_trx_commit

說明:設置為1,同時sync_binlog = 1表示最高級別的容錯
innodb_use_global_flush_log_at_trx_commit的值確定是否可以使用SET語句重置此變量

1默認情況下,日志緩沖區將寫入日志文件,並在每次事務后執行刷新到磁盤。這是完全遵守ACID特性
0提交時沒有任何操作; 而是每秒執行一次日志緩沖區寫入和刷新。 這樣可以提供更好的性能,但服務器崩潰可以清除最后一秒的事務
2每次提交后都會寫入日志緩沖區,但每秒都會進行一次刷新。 性能比0略好一些,但操作系統或停電可能導致最后一秒的交易丟失
3模擬MariaDB 5.5組提交(每組提交3個同步),此項MariaDB 10.0支持

查看set語句是否可以重置變量。

錯誤日志

mysqld啟動和關閉過程中輸出的事件信息
mysqld運行中產生的錯誤信息
event scheduler運行一個event時產生的日志信息
在主從復制架構中的從服務器上啟動從服務器線程時產生的信息

錯誤日志相關配置

SHOW GLOBAL VARIABLES LIKE 'log_error'  只能配置錯誤日志,不能修改
錯誤文件路徑
log_error=/PATH/TO/LOG_ERROR_FILE
是否記錄警告信息至錯誤日志文件
log_warnings=1|0 默認值1

在配置文件中可以看到錯誤日志的路徑:

vim /etc/my.cnf

 當前可以跟蹤數據庫的日志信息:

[root@centos7~]#tail -f /var/log/mariadb/mariadb.log
InnoDB: The log sequence number in ibdata files does not match
InnoDB: the log sequence number in the ib_logfiles!
InnoDB: Restoring possible half-written data pages from the doublewrite buffer...
191120  9:42:03  InnoDB: Waiting for the background threads to start
191120  9:42:04 Percona XtraDB (http://www.percona.com) 5.5.59-MariaDB-38.11 started; log sequence number 1685378
191120  9:42:04 [Note] Plugin 'FEEDBACK' is disabled.
191120  9:42:04 [Note] Server socket created on IP: '0.0.0.0'.
191120  9:42:04 [Note] Event Scheduler: Loaded 0 events
191120  9:42:04 [Note] /usr/libexec/mysqld: ready for connections.
Version: '5.5.60-MariaDB'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  MariaDB Server

通用日志:記錄對數據庫的通用操作,包括錯誤的SQL語句

文件:file,默認值
表:table
通用日志相關設置

general_log=ON|OFF
general_log_file=HOSTNAME.log
log_output=TABLE|FILE|NONE

將general_log=OFF改為ON

show variables  like 'general_log%'; 查看主機名生成的LOG日志。

 

show variables  like 'log_output';默認顯示的是file文件。

 

 set   global  log_output='table';將log日志改為表內。

優化思路:可以查詢哪些數據庫命令經常使用,如果頻繁使用,就需要加上索引,減少查詢慢,導致mysql服務性能下降,方便以后使用。

 

慢查詢日志

慢查詢日志:記錄執行查詢時長超出指定時長的操作

slow_query_log=ON|OFF 開啟或關閉慢查詢
long_query_time=N 慢查詢的閥值,單位秒
slow_query_log_file=HOSTNAME-slow.log 慢查詢日志文件
log_slow_filter = admin,filesort,filesort_on_disk,full_join,full_scan,
query_cache,query_cache_miss,tmp_table,tmp_table_on_disk上述查詢類型且查詢時長超過long_query_time,則記錄日志
log_queries_not_using_indexes=ON 不使用索引或使用全索引掃描,不論是否達到慢查詢閥值的語句是否記錄日志,默認OFF,即不記錄
log_slow_rate_limit = 1 多少次查詢才記錄,mariadb特有
log_slow_verbosity= Query_plan,explain 記錄內容
log_slow_queries = OFF 同slow_query_log 新版已廢棄

生產中將以下兩項的慢查詢開關打開即可:

  • 啟動slow_query_log=ON啟動起此配置內容,有助於后期排錯
  • log_queries_not_using_indexes=ON 不使用索引或使用全索引掃描,不論是否達到慢查詢閥值的語句是否記錄日志,默認OFF,即不記錄。

在mysql配置文件中修改配置:

vim /etc/my.cnf

啟用以下幾項內容,其他作為默認值,可不修改:

slow_query_log=ON|OFF 開啟或關閉慢查詢
long_query_time=2 慢查詢的閥值,單位秒(可以改為2秒,3秒),根據實際情況修改
log_queries_not_using_indexes=ON 不使用索引或使用全索引掃描,不論是否達到慢查詢閥值的語句是否記錄日志,默認OFF,即不記錄

分析哪條命令慢導致mysql查詢慢的原因:

1、set profiling=ON; 開啟功能

2、show profiles; 先查看當前文件的ID號。

3、show profile for query 4;查看某個ID號的具體信息。

MariaDB [hellodb]> set profiling=ON;  開啟功能
Query OK, 0 rows affected (0.00 sec)

MariaDB [hellodb]> select @@profiling;
+-------------+
| @@profiling |
+-------------+
|           1 |
+-------------+
1 row in set (0.00 sec)

MariaDB [hellodb]> show index from students;
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table    | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| students |          0 | PRIMARY  |            1 | StuID       | A         |          25 |     NULL | NULL   |      | BTREE      |         |               |
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.01 sec)

MariaDB [hellodb]> select * from students  where age=10000;
Empty set (0.00 sec)

MariaDB [hellodb]> show profiles;查看當前所有執行過的mysql命令中哪個時延最長,具體看看哪個數據比較慢。
+----------+------------+-----------------------------------------+
| Query_ID | Duration   | Query                                   |
+----------+------------+-----------------------------------------+
|        1 | 0.00235329 | select @@profiling                      |
|        2 | 0.00398939 | select * from testlog where age=10000   |
|        3 | 0.00893150 | show index from students                |
|        4 | 0.00510308 | select * from students  where age=10000 |
+----------+------------+-----------------------------------------+
4 rows in set (0.00 sec)

MariaDB [hellodb]> show profile for query 4;  比如查看query_ID  4的內容,看看是什么原因導致當前的mysql運行慢,都耗費了多長的時間。
+--------------------------------+----------+
| Status                         | Duration |
+--------------------------------+----------+
| starting                       | 0.000020 |
| Opening tables                 | 0.000017 |
| System lock                    | 0.000003 |
| Table lock                     | 0.000003 |
| Opening tables                 | 0.000002 |
| After opening tables           | 0.000055 |
| closing tables                 | 0.000005 |
| Unlocking tables               | 0.000011 |
| Waiting for query cache lock   | 0.000003 |
| Unlocking tables               | 0.000002 |
| checking query cache for query | 0.000031 |
| checking permissions           | 0.000006 |
| Opening tables                 | 0.000009 |
| After opening tables           | 0.000046 |
| System lock                    | 0.000028 |
| Table lock                     | 0.000009 |
| Waiting for query cache lock   | 0.000066 |
| init                           | 0.000088 |
| optimizing                     | 0.001249 |
| statistics                     | 0.000922 |
| preparing                      | 0.000043 |
| executing                      | 0.000004 |
| Sending data                   | 0.001897 |
| end                            | 0.000062 |
| query end                      | 0.000033 |
| closing tables                 | 0.000009 |
| Unlocking tables               | 0.000012 |
| freeing items                  | 0.000405 |
| updating status                | 0.000013 |
| Waiting for query cache lock   | 0.000004 |
| updating status                | 0.000029 |
| Waiting for query cache lock   | 0.000003 |
| updating status                | 0.000003 |
| storing result in query cache  | 0.000009 |
| cleaning up                    | 0.000004 |
+--------------------------------+----------+
35 rows in set (0.01 sec

二進制日志

二進制日志

記錄導致數據改變或潛在導致數據改變的SQL語句
記錄已提交的日志
不依賴於存儲引擎類型
功能:通過“重放”日志文件中的事件來生成數據副本

注意:建議二進制日志和數據文件分開存放
中繼日志:relay log
    主從復制架構中,從服務器用於保存從主服務器的二進制日志中讀取的事件

二進制日志記錄格式

二進制日志記錄三種格式
基於“語句”記錄:statement,記錄語句,默認模式
基於“行”記錄:row,記錄數據,日志量較大
混合模式:mixed, 讓系統自行判定該基於哪種方式進行

格式配置
show variables like ‘binlog_format';
二進制日志文件的構成
有兩類文件

日志文件:mysql|mariadb-bin.文件名后綴,二進制格式
                如: mariadb-bin.000001
索引文件:mysql|mariadb-bin.index,文本格式

二進制日志相關的服務器變量:

sql_log_bin=ON|OFF:是否記錄二進制日志,默認ON
log_bin=/PATH/BIN_LOG_FILE:指定文件位置;默認OFF,表示不啟用二進制日志功能,上述兩項都開啟才可
binlog_format=STATEMENT|ROW|MIXED:二進制日志記錄的格式,默認STATEMENT   可將格式改為row格式最好。
max_binlog_size=1073741824:單個二進制日志文件的最大體積,到達最大值會自動滾動,默認為1G
說明:文件達到上限時的大小未必為指定的精確值
sync_binlog=1|0:設定是否啟動二進制日志即時同步磁盤功能,默認0,由操作系統負責同步日志到磁盤
expire_logs_days=N:二進制日志可以自動刪除的天數。 默認為0,即不自動刪除

示例:

定義二進制文件路徑和文件前綴名稱,會將數據庫文件和二進制程序分離存放。

mkdir /data/logbin   創建二進制文件路徑
chown mysql.mysql  /data/logbin

修改MYSQL配置文件,指向對應的二進制配置文件路徑:

vim  /etc/my.cnf

log_bin=/data/logbin/mysql-bin

 

重啟mysql服務,查看當前的mysql二進制文件,此時已生成二進制文件。

可以臨時關閉二進制程序文件,如果我們在導入大批量的數據日志,已經確定要導入,可以臨時關閉二進制日志程序,提高效率。

還原數據時,不禁用二進制程序,恢復數據時,沒必要再記錄到生成恢復時的二進制日志程序,所以也需要禁用。

set  sql_log_bin=OFF  臨時關閉二進制程序,不需要重啟mysql服務。

 

二進制日志相關配置

查看mariadb自行管理使用中的二進制日志文件列表,及大小
SHOW {BINARY | MASTER} LOGS
查看使用中的二進制日志文件 
SHOW MASTER STATUS
查看二進制文件中的指定內容
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT[offset,] row_count]
show binlog events in ‘mysql-bin.000001' from 6516 limit 2,3

查看mariadb自行管理使用中的二進制日志文件列表,及大小

查看使用中的二進制日志文件

查看二進制文件中的指定內容

 示例: show binlog events in ‘mysql-bin.000001' from 6516 limit 2,3   從6516開始跳過前兩個看三個文件。

         show binlog events in ‘mysql-bin.000001' from 6516 limit  4    從6516開始查看前四個內容。

mysqlbinlog:二進制日志的客戶端命令工具

 命令格式:

mysqlbinlog [OPTIONS] log_file…
--start-position=# 指定開始位置
--stop-position=#
--start-datetime= 
--stop-datetime=
時間格式:YYYY-MM-DD hh:mm:ss
--base64-output[=name]
-v -vvv

可以查看二進制日志的詳細信息:

刪除數據庫中表內容恢復之

指定mysql二進制數據庫路徑,暫時禁用行格式的二進制日志,此時默認就是字符格式。

 啟用二進制日志功能,並插入一張表格內容:

此時,刪除hello表格:

delete  from hello;

然后通過二進制格式日志進行恢復,將最新的二進制日志文件導入到/root/mysql.log文件中。

此時並將二進制日志功能暫時關閉,避免生成恢復時的二進制日志記錄:

set  sql_log_bin=off;

修改 導出的二進制日志文件:

vim  /root/mysql.log

找到誤操作的命令,將其注釋掉或者刪除此行。

 mysql -pmagedu  hellodb <  /root/mysql.log  將修改后的二進制日志文件導入到刪除了的數據庫內。

查看之前被刪除的文件,已經恢復了誤刪除的文件。

 

二進制日志事件的格式:

# at 328
#151105 16:31:40 server id 1 end_log_pos 431 Query thread_id=1 exec_time=0
error_code=0
use `mydb`/*!*/;
SET TIMESTAMP=1446712300/*!*/;
CREATE TABLE tb1 (id int, name char(30))
/*!*/;
事件發生的日期和時間:151105 16:31:40
事件發生的服務器標識:server id 1
事件的結束位置:end_log_pos 431
事件的類型:Query
事件發生時所在服務器執行此事件的線程的ID:thread_id=1
語句的時間戳與將其寫入二進制文件中的時間差:exec_time=0
錯誤代碼:error_code=0
事件內容:
GTID:Global Transaction ID,mysql5.6以mariadb10以上版本專屬屬性:GTID

清除指定二進制日志:  建議保留半個月以上的二進制日志

PURGE { BINARY | MASTER } LOGS
{ TO 'log_name' | BEFORE datetime_expr }
示例:

PURGE BINARY LOGS TO ‘mariadb-bin.000003’;刪除3之前的日志
PURGE BINARY LOGS BEFORE '2017-01-23';
PURGE BINARY LOGS BEFORE '2017-03-22 09:25:30';

刪除所有二進制日志,index文件重新記數

RESET MASTER [TO #]; 刪除所有二進制日志文件,並重新生成日志文件,文件名從#開始記數,默認從1開始,一般是master主機第一次啟動時執行,MariaDB10.1.6開始支持TO #

切換日志文件:

FLUSH LOGS;

示例:

清除二進制日志文件,PURGE BINARY LOGS TO 'mysql-bin.000004'; 清除的是4以前的日志文件,不包含本身。

RESET MASTER [TO #]; 刪除所有二進制日志文件,並重新生成日志文件,文件名從#開始記數,默認從1開始,一般是master主機第一次啟動時執行,MariaDB10.1.6開始支持TO #

 

總結:

以下可以在生產中進行設置參數:

sql_log_bin=ON|OFF:是否記錄二進制日志,默認ON
log_bin=/PATH/BIN_LOG_FILE:指定文件位置;默認OFF,表示不啟用二進制日志功能,上述兩項都開啟才可,第一項默認開啟,此項指定二進制日志路徑即可。
binlog_format=row:二進制日志記錄的格式,默認STATEMENT   可將格式改為row格式最好,但是日志比較大,占用內存空間。
max_binlog_size=1073741824:單個二進制日志文件的最大體積,到達最大值會自動滾動,默認為1G   可以將數據設置大點,比如10G
說明:文件達到上限時的大小未必為指定的精確值
sync_binlog=1|0:設定是否啟動二進制日志即時同步磁盤功能,默認0,由操作系統負責同步日志到磁盤,為了數據安全,可以改為1,為了追求高性能改為0.
expire_logs_days=N:二進制日志可以自動刪除的天數。 默認為0,即不自動刪除


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM