事務日志:
事務日志的寫入類型為“追加”,因此其操作為“順序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,即不自動刪除