MySQL之六 5.7日志文件


修改英文

localectl  set-locale LANG=en_US.UTF-8

localectl  list-locales

 

Centos 7 編譯安裝:

  yum groupinstall "Development Tools" -y   安裝包組

  yum install ncurses-devel  openssl-devel  libevent-devel  jemalloc-devel cmake

 

systemd service unit file

MySQL安裝參考: https://www.cnblogs.com/f-ck-need-u/p/7590376.html#2-3-systemd-




一、日志

  • 查詢日志(query log):記錄建立的客戶端連接和執行的語句
  • 慢查詢日志(slow query log) :記錄所有執行時間超過long_query_time秒的所有查詢(並不一定是查詢語句自己執行速度慢導致的)
  • 錯誤日志(error log) :  記錄mysql服務的啟停時正確和錯誤的信息,還記錄啟動、停止、運行過程中的錯誤信息。
  • 二進制日志(binary log) :記錄所有更改數據的語句,還用於復制,恢復數據庫用
  • 中繼日志(reley log):mysql 主從復制架構中用到的日志
  • 事務日志:transaction  log   (支持事務型存儲引擎的ACID功能)
  • 更新日志: -log-update (二進制日志已經代替了老的更新日志,更新日志在MySQL 5.1中不再使用)

官方文檔:https://dev.mysql.com/doc/

二、日志刷新

mysql> FLUSH LOGS;
shell> mysqladmin flush-logs
shell> mysqladmin refresh

三、查詢當前日志記錄的狀況

mysql>show variables like 'log%';(是否啟用了日志)

mysql> show master status;(怎樣知道當前的日志)

mysql> show master logs;(顯示二進制日志的數目)

在這里插入圖片描述

 

四、日志

4.1、一般查詢日志(不啟用)   了解即可 

查詢日志分為一般查詢日志和慢查詢日志,它們是通過查詢是否超出變量 long_query_time 指定時間的值來判定的。在超時時間內完成的查詢是一般查詢,可以將其記錄到一般查詢日志中,但是建議關閉這種日志(默認是關閉的),超出時間的查詢是慢查詢,可以將其記錄到慢查詢日志中。

a)記錄查詢操作l兩種地方:

      • 文件:file
      • 表:table  

b)和查詢日志有關的變量有: 

long_query_time = 10 # 指定慢查詢超時時長,超出此時長的屬於慢查詢,會記錄到慢查詢日志中
log_output={TABLE|FILE|NONE}  # 定義一般查詢日志和慢查詢日志的輸出格式,不指定時默認為file

TABLE表示記錄日志到表中,FILE表示記錄日志到文件中,NONE表示不記錄日志。只要這里指定為NONE,即使開啟了一般查詢日志和慢查詢日志,也都不會有任何記錄。

 

c)和一般查詢日志相關的變量有:

  mysql> show global variables like 'general%';

general_log=off # 是否啟用一般查詢日志,為全局變量,必須在global上修改。
sql_log_off=off # 在session級別控制是否啟用一般查詢日志,默認為off,即啟用
general_log_file=/mydata/data/hostname.log  # 默認是庫文件路徑下主機名加上.log

 

d)查看日志的存放方式:show variables like 'log_output';

如果設置mysql> set global log_output=’table’ 的話,則日志結果會記錄到名為gengera_log的表中,這表的默認引擎都是CSV
如果設置表數據到文件set global log_output=file;

設置general log的日志文件路徑: set global general_log_file
=’/tmp/general.log’;
開啟general log: set global general_log
=on; 關閉general log: set global general_log=off;

 

注:在MySQL 5.6以前的版本還有一個"log"變量也是決定是否開啟一般查詢日志的。在5.6版本開始已經廢棄了該選項。

  默認沒有開啟一般查詢日志,也不建議開啟一般查詢日志。此處打開該類型的日志,看看是如何記錄一般查詢日志的。

  一般查詢日志查詢的不止是select語句,幾乎所有的語句都會記錄。


4.2、 慢查詢(重點)

mysql記錄慢查詢日志是在查詢執行完畢且已經完全釋放鎖之后才記錄的,因此慢查詢日志記錄的順序和執行的SQL查詢語句順序可能會不一致(例如語句1先執行,查詢速度慢,語句2后執行,但查詢速度快,則語句2先記錄)。

注意,MySQL 5.1之后就支持微秒級的慢查詢超時時長,對於DBA來說,一個查詢運行0.5秒和運行0.05秒是非常不同的,前者可能索引使用錯誤或者走了表掃描,后者可能索引使用正確。

另外,指定的慢查詢超時時長表示的是超出這個時間的才算是慢查詢,等於這個時間的不會記錄。

 

mysql> SHOW GLOBAL VARIABLES LIKE 'long_query_time';   默認10s

    SET GLOBAL long_query_time=number  #修改默認時長

 

和慢查詢有關的變量:

long_query_time=10 # 指定慢查詢超時時長(默認10秒),超出此時長的屬於慢查詢
log_output={TABLE|FILE|NONE} # 定義一般查詢日志和慢查詢日志的輸出格式,默認為file
slow_query_log={1|ON|0|OFF}  # 也是是否啟用慢查詢日志,默認不啟用
slow_query_log_file=/mydata/data/hostname-slow.log  #默認路徑為庫文件目錄下主機名加上-slow.log
log_queries_not_using_indexes=OFF # 查詢沒有使用索引的時候是否也記入慢查詢日志

 

a) 啟用慢查詢日志

 mysql> set @@global.slow_query_log=on;     (注:@@是服務器全局變量,@是用戶級別變量)

b)查看慢查詢配置情況:

  mysql> show global status like '%slow%';

c) 查看慢查詢日志路徑:

 mysql> show variables like '%slow%';

 

 

4.3、錯誤日志

錯誤日志是最重要的日志之一,它記錄了MariaDB/MySQL服務啟動和停止正確和錯誤的信息,還記錄了mysqld實例運行過程中發生的錯誤事件信息。

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

log_warnings=1|0 : 是否記錄警告信息至錯誤日志文件中

mysql> show variables like '%log_err%';
錯誤日志歸檔,備份錯誤日志
shell>mv host_name.err host_name.err-old
shell> mysqladmin -u root -p flush-logs
ahell>mv host_name.err-old back-directory

 

4.4、二進制日志 (重點)

  二進制日志包含了引起或可能引起數據庫改變(如delete語句但沒有匹配行)的事件信息,但絕不會包括select和show這樣的查詢語句。語句以"事件"的形式保存,所以包含了時間、事件開始和結束位置等信息。

  二進制日志是以事件形式記錄的,不是事務日志(但可能是基於事務來記錄二進制日志),不代表它只記錄innodb日志,myisam表也一樣有二進制日志。

  對於事務表的操作,二進制日志只在事務提交的時候一次性寫入(基於事務的innodb二進制日志),提交前的每個二進制日志記錄都先cache,提交時寫入對於非事務表的操作,每次執行完語句就直接寫入。

  MariaDB/MySQL默認沒有啟動二進制日志,要啟用二進制日志使用 --log-bin=[on|off|file_name] 選項指定,如果沒有給定file_name,則默認為datadir下的主機名加"-bin",並在后面跟上一串數字表示日志序列號,如果給定的日志文件中包含了后綴(logname.suffix)將忽略后綴部分。

 

  當重啟mysql服務或刷新日志或者達到日志最大值時,將滾動二進制日志文件,滾動日志時只修改日志文件名的數字序列部分。

  二進制日志文件的最大值通過變量 max_binlog_size 設置(默認值為1G)。但由於二進制日志可能是基於事務來記錄的(如innodb表類型),而事務是絕對不可能也不應該跨文件記錄的,如果正好二進制日志文件達到了最大值但事務還沒有提交則不會滾動日志,而是繼續增大日志,所以 max_binlog_size 指定的值和實際的二進制日志大小不一定相等。

 

  因為二進制日志文件增長迅速,但官方說明因此而損耗的性能小於1%,且二進制目的是為了恢復定點數據庫和主從復制,所以出於安全和功能考慮,極不建議將二進制日志和datadir放在同一磁盤上

 

a) 開啟二進制日志首先需添加如下到配置文件中

注意:對於mysql 5.7,直接啟動binlog可能會導致mysql服務啟動失敗,這時需要在配置文件中的mysqld為mysql實例分配server_id。

[root@localhost ~]# vi /etc/my.cnf

[mysqld]

server_id=1234           #文件名隨便去

log_bin=mysql-bin      #等號兩邊不能有空格

[root@localhost mysql5.7]# systemctl restart mysqld.service

 

b)查看二進制日志

1.使用mysqlbinlog工具。

2.使用show顯示對應的信息。

SHOW {BINARY | MASTER} LOGS                # 查看使用了哪些日志文件列表
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos]    # 查看日志中進行了哪些操作
SHOW MASTER STATUS                      # 顯式正在使用中的二進制日志信息

mysql> SHOW BINLOG EVENTS IN 'mysql-bin.000001';
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
| mysql-bin.000001 | 4 | Format_desc | 1234 | 123 | Server ver: 5.7.24-log, Binlog ver: 4 |
| mysql-bin.000001 | 123 | Previous_gtids | 1234 | 154 | |
+------------------+-----+----------------+-----------+-------------+---------------------------------------+

Pos :當前這個事件在日志文件中的位置  (起始位置)

Server_id :代表在哪一個服務器上運行的

End_log_pos :當前事件結束以后的下一個位置

 

c)二進制日志記錄格式

  •   基於“語句”記錄:statement
  •   基於“行”記錄:row 
  •   混合模式:mixed ,讓系統自行判定該基於哪種方式進行

d) 二進制日志文件的構成

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

e)服務變量

查看是否啟用二進制日志:
  show variables like '%log_bin%';

查看所有的二進制參數
  show variables like '%binlog%';

查看文件的位置
  show variables like '%datadir%';

注意:在配置binlog相關變量的時候,相關變量名總是搞混,

因為有的是binlog,有的是log_bin,當他們分開的時候,log在前,當它們一起的時候,bin在前。在配置文件中也同樣如此。

  • log_bin = {on | off | base_name} #指定是否啟用記錄二進制日志或者指定一個日志路徑(路徑不能加.否則.后的被忽略)
  • sql_log_bin ={ on | off } #指定是否啟用記錄二進制日志,只有在log_bin開啟的時候才有效(5.7以下才有)
  • expire_logs_days = #指定自動刪除二進制日志的時間,即日志過期時間  (0: 不啟用此功能)
  • binlog_do_db = #明確指定要記錄日志的數據庫
  • binlog_ignore_db = #指定不記錄二進制日志的數據庫   
  • log_bin_index = #指定mysql-bin.index文件的路徑
  • binlog_format = { mixed | row | statement } #指定二進制日志基於什么模式記錄
  • binlog_rows_query_log_events = { 1|0 } # MySQL5.6.2添加了該變量,當binlog format為row時,默認不會記錄row對應的SQL語句,設置為1或其他true布爾值時會記錄,但需要使用mysqlbinlog -v查看,這些語句是被注釋的,恢復時不會被執行。
  • max_binlog_size =1073741824(1G)#指定單個二進制日志文件最大值,超出指定值將自動滾動。但由於事務不會跨文件,所以並不一定總是精確。
    •  注:到達最大值會自動滾動;文件達到上限時的大小未必為指定的精確值
  • binlog_cache_size = 32768 #基於事務類型的日志會先記錄在緩沖區,當達到該緩沖大小時這些日志會寫入磁盤
  • max_binlog_cache_size = #指定二進制日志緩存最大大小,硬限制。默認4G,夠大了,建議不要改
  • binlog_cache_use:使用緩存寫二進制日志的次數(這是一個實時變化的統計值)
  • binlog_cache_disk_use:使用臨時文件寫二進制日志的次數,當日志超過了binlog_cache_size的時候會使用臨時文件寫日志,如果該變量值不為0,則考慮增大binlog_cache_size的值
  • binlog_stmt_cache_size = 32768 #一般等同於且決定binlog_cache_size大小,所以修改緩存大小時只需修改這個而不用修改binlog_cache_size
  • binlog_stmt_cache_use:使用緩存寫二進制日志的次數
  • binlog_stmt_cache_disk_use: 使用臨時文件寫二進制日志的次數,當日志超過了binlog_cache_size的時候會使用臨時文件寫日志,如果該變量值不為0,則考慮增大binlog_cache_size的值
  • sync_binlog = { 0 | n } #這個參數直接影響mysql的性能和完整性(重點)
    • sync_binlog=0:不同步,日志何時刷到磁盤由FileSystem決定,這個性能最好。
    • sync_binlog=n:每寫n次二進制日志事件(不是事務),MySQL將執行一次磁盤同步指令fdatasync()將緩存日志刷新到磁盤日志文件中。Mysql中默認的設置是sync_binlog=0,即不同步,這時性能最好,但風險最大。一旦系統奔潰,緩存中的日志都會丟失。

  在innodb的主從復制結構中,如果啟用了二進制日志(幾乎都會啟用),要保證事務的一致性和持久性的時候,必須將sync_binlog的值設置為1,因為每次事務提交都會寫入二進制日志,設置為1就保證了每次事務提交時二進制日志都會寫入到磁盤中,從而立即被從服務器復制過去。

 

 

4.5、mysqlbinlog  (客戶端CLI)

二進制日志可以使用mysqlbinlog命令查看。

  mysqlbinlog [option] log-file1 log-file2...

-d,--database=name:只查看指定數據庫的日志操作

-o,--offset=#:忽略掉日志中的前n個操作命令
-r,--result-file=name:將輸出的日志信息輸出到指定的文件中,使用重定向也一樣可以。
-s,--short-form:顯示簡單格式的日志,只記錄一些普通的語句,會省略掉一些額外的信息如位置信息和時間信息以及基於行的日志。可以用來調試,生產環境千萬不可使用
--set-charset=char_name:在輸出日志信息到文件中時,在文件第一行加上set names char_name
--start-datetime,--stop-datetime:指定輸出開始時間和結束時間內的所有日志信息 --start-position=#,--stop-position=#:指定輸出開始位置和結束位置內的所有日志信息 -v,-vv:顯示更詳細信息,基於row的日志默認不會顯示出來,此時使用-v或-vv可以查看

 

4.6、二進制日志事件的格式:
# at 219
#200705 19:43:36 server id 1234 end_log_pos 337 CRC32 0x4626bea0 Query    thread_id=2    exec_time=0    error_code=0
use `testdb`/*!*/;
SET TIMESTAMP=1593949416/*!*/;
create table tb2 (id int, name char(30))
/*!*/;


事件發生的日期和事件 :200705 19:43:36

事件發生的服務器標識:server  id  1234

事件結束位置:end_log_pos 337

事件的類型:Query

事件發生時所在服務器執行此事的線程的ID:thread_id=2
語句的時間戳與將其寫入二進制文件中的事件差:exec_time=0 
錯誤代碼:error_code=0
事件內容:后三行
 
GTID :Global  Transaction ID  全局事務ID號
    專屬屬性:GTID
  

 

5、中繼日志

  復制架構中,從服務器用於保存從主服務器的二進制日志中讀取到的事件

6、事務日志 :transaction log

  事務型存儲引擎自行管理和使用

   redo  log    重做日志

   undo  log   撤銷日志

https://www.cnblogs.com/f-ck-need-u/p/9001061.html#auto_id_6


免責聲明!

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



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