數據庫各類日志
查詢日志:
記錄每一條sql語句,建議不開啟,因為如果訪問量過大,會占用相當大的資源,影響數據庫的性能。
vim /etc/my.cnf.d/server.cnf
general_log = ON | OFF #查詢日志開關
general_log_file localhost.log #查詢日志的文件名 (/var/lib/mysql)
log_output TABLE | FILE | NONE #查詢日志的存儲格式
慢查詢日志:
執行時長超出指定時間的查詢操作。(測試命令select sleep(4);)
slow_query_log = ON | OFF #開啟慢查詢日志
slow_query_log_file = localhost-slow.log #慢查詢日志的文件路徑
long_query_time #慢查詢時長,默認是10s
log_slow_rate_limit #如果記錄的慢查詢日志非常多的話,會按照速率來記錄,默認1s記錄一個
log_slow_verbosity=full | query_plan #記錄的詳細級別
錯誤日志:
mysqld啟動和關閉過程中輸出的事件信息。
mysqld運行中產生的錯誤。
event scheduler 運行一個event時產生的日志信息。
在主從復制架構中的從服務器上啟動從服務器線程時產生的信息。
log_error = /var/log/mysql_error.log #指定錯誤日志的輸出位置。
log_warnings 為0,表示不記錄告警信息。
log_warnings 為1,表示告警信息寫入錯誤日志。
log_warnings 大於1,表示各類告警信息,例如有關網絡故障的信息和重新連接信息寫入錯誤日志。(默認為2)
二進制日志:
針對時間點還原起着至關重要的作用。
查看二進制日志:
show master logs;
show binary logs;
show binlog events [in 'log_name']
show master status;
記錄導致數據改變或可能導致數據改變的sql語句。所有的增刪改,查詢沒有記錄到二進制日志文件之中。
log_bin = OFF | ON
log_bin_basename = /var/lib/mysql/mysql-bin
binlog_format = statement | row | mixed #二進制記錄格式
statement:基於語句記錄
row:基於行記錄
mixed:混合記錄
中繼日志:
復制架構中,備服務器用於保存主服務器的二進制日志中讀取到的事件。
事務日志:
transaction log (ib_logfile0 ib_logfile1)
innodb_buffer_pool_size #一般設為為物理內存的3/4或者4/5
innodb_log_files_in_group = 2 #事物日志文件的個數,默認為兩個事物日志文件
innodb_log_file_size=50331468(48m) #事務日志文件的單個大小 48 m
innodb_log_group_home_dir=./ #事務日志文件所在路徑,默認在mariadb的數據目錄/var/lib/mysql
事務型存儲引擎自行管理和使用(innodb),myisam引擎不支持事物,外鍵,行級鎖。
redo log:重做日志
undo log:撤銷日志
查詢日志:
show variables like '%general_log%';
#查看general_log與general_log_file的值,默認general_log狀態為OFF
show variables like '%log_output%';
#查看log_output格式
打開查詢日志:
[server]
general_log=1
show variables like '%general_log%';
#進入/var/lib/mysql查看查詢日志
tail -f localhost.log
#記錄每一條你的sql語句
慢查詢日志:
執行時長超出指定時間的查詢操作。
#需要注意的是:記錄太多,記錄太詳細也會對數據庫的性能造成影響。
[server]
slow_query_log=1
long_query_time=4
show variables like '%slow%';
#查看slow_query_log是否開啟,查看slow_query_log_file的名稱
show variables like '%long%';
#查看long_query_time的時間是4s。
tail -f localhost-slow.log
select sleep(5); #數據庫執行之后會被記錄到慢查詢日志
執行時長超出指定時間的查詢操作。
#需要注意的是:記錄太多,記錄太詳細也會對數據庫的性能造成影響。
[server]
slow_query_log=1
long_query_time=4
show variables like '%slow%';
#查看slow_query_log是否開啟,查看slow_query_log_file的名稱
show variables like '%long%';
#查看long_query_time的時間是4s。
tail -f localhost-slow.log
select sleep(5); #數據庫執行之后會被記錄到慢查詢日志
二進制日志:
show master logs; #如果提示你沒有在使用binary logging那么說明你沒有開啟二進制日志。
[server]
log_bin=mysql-bin
show master logs; #如果提示你沒有在使用binary logging那么說明你沒有開啟二進制日志。
[server]
log_bin=mysql-bin
#重啟數據庫
show binlog events in ‘mysql-bin.000001’; #只是記錄了一些版本信息,查看內容需要用到mysqlbinlog
show binlog events in ‘mysql-bin.000001’; #只是記錄了一些版本信息,查看內容需要用到mysqlbinlog
二進制日志文件無法使用vim十進制來查看,只能使用mysql提供的二進制文件查看工具——mysqlbinlog
mysqlbinlog mysql-bin.000001
show master logs; #可以查看到現在使用的二進制文件和文件的大小
mysqlbinlog mysql-bin.000001
show master logs; #可以查看到現在使用的二進制文件和文件的大小
#執行一些sql命令:create database kkk character set utf8;
#show master logs進行查看二進制的文件大小發生了變化
#mysqlbinlog mysql-bin.000001查看二進制文件的記錄,會發現其中記錄了剛剛的sql語句。
#show master logs進行查看二進制的文件大小發生了變化
#mysqlbinlog mysql-bin.000001查看二進制文件的記錄,會發現其中記錄了剛剛的sql語句。
show variables like ‘%binlog_format%';
#查看二進制日志的記錄格式,默認是mixed。(statement按語句記錄|row按行記錄|mixed混合)
statement
基於語句來記錄——當你已經有相同的表的時候,就會發生還原不了的情況。
但是它能夠很好的節省空間,你只需要記錄一條sql語句。
row
基於行記錄——也就是基於數據記錄。
還原就避免了基於語句記錄的缺點。
但是非常占用空間。
mixed
混合模式——數據庫會自己去判定到底記錄sql語句還是按行來記錄。
它是一種折中模式——既可能出現兩者的缺點,又在某種程度上規避了這種缺點。
#查看二進制日志的記錄格式,默認是mixed。(statement按語句記錄|row按行記錄|mixed混合)
statement
基於語句來記錄——當你已經有相同的表的時候,就會發生還原不了的情況。
但是它能夠很好的節省空間,你只需要記錄一條sql語句。
row
基於行記錄——也就是基於數據記錄。
還原就避免了基於語句記錄的缺點。
但是非常占用空間。
mixed
混合模式——數據庫會自己去判定到底記錄sql語句還是按行來記錄。
它是一種折中模式——既可能出現兩者的缺點,又在某種程度上規避了這種缺點。
sql_log_bin=1|0 #是否啟用二進制日志
log_bin_index=PATH #二進制日志索引位置
sync_binlog=1|0 #設定是否啟用二進制日志同步功能
max_binlog_size=SIZE #單個二進制文件最大體積,默認為1G
expire_logs_days=0 #超過多少天就清除二進制日志,默認為0,代表不啟用此功能
log_bin_index=PATH #二進制日志索引位置
sync_binlog=1|0 #設定是否啟用二進制日志同步功能
max_binlog_size=SIZE #單個二進制文件最大體積,默認為1G
expire_logs_days=0 #超過多少天就清除二進制日志,默認為0,代表不啟用此功能
#mysql-bin.index使用十進制存儲可以使用cat來查看。
二進制日志手動滾動:flush logs;
二進制日志文件的構成:
日志文件:mysql-bin.000001 二級制格式
索引文件:mysql-bin.index 索引文件
二進制日志手動滾動:flush logs;
二進制日志文件的構成:
日志文件:mysql-bin.000001 二級制格式
索引文件:mysql-bin.index 索引文件
#查看二進制日志文件的大小:
show variables like ’%max_binlog_size%'; #其值剛好一個G,如果超過1G就會滾動生成一個新的。
show variables like ’%max_binlog_size%'; #其值剛好一個G,如果超過1G就會滾動生成一個新的。
#查看索引文件的路徑
show variables like ‘%log_bin_index%’;
show variables like ‘%log_bin_index%’;
#sync_binlog=1|0 #設定是否啟用二進制日志同步功能
數據庫支持並發,但是二進制文件不支持。
開啟為1的話,立馬寫入,就會涉及io操作,會影響數據庫的性能,但是數據安全。
如果為0:等到資源空閑時寫入,保障了性能。
如果數據庫down了,設置為1沒有丟失,設置為0可能會有數據的丟失。
數據庫支持並發,但是二進制文件不支持。
開啟為1的話,立馬寫入,就會涉及io操作,會影響數據庫的性能,但是數據安全。
如果為0:等到資源空閑時寫入,保障了性能。
如果數據庫down了,設置為1沒有丟失,設置為0可能會有數據的丟失。
#查看二進制日志的過期刪除時間
show variables like ‘%expire_logs_days%’;
如果要刪除,一般不設置自動刪除,tar打包自己手動刪除。
show variables like ‘%expire_logs_days%’;
如果要刪除,一般不設置自動刪除,tar打包自己手動刪除。
二進制日志的滾動:
自動滾動:如果記錄的日志大小超過最大值,那么會生成一個新的二進制日志。mysql-bin.000001——>mysql-bin.000002——>mysql-bin.000003
手動滾動:
flush logs; #手動滾動二進制日志
show master logs; #查看二進制日志
show master status; #查看當前使用二級制日志文件
在重啟數據庫之后二進制日志也會滾動。
#需要注意的是:日志的滾動只能往前,無法向后,因為這樣的話還原就會有問題。二級制文件不要隨意刪除。
#日志滾動之后,mysql-bin.index會自動幫你記錄到文件中。
#二進制日志是數據庫之中最重要的日志。
#二級制日志的記錄格式:時間——server id——end_log_pos——CRC32——thread id——exec_time——error_code
#sever id 如果你做了數據庫的集群那么id號不能一樣,它是一種身份標識。
#如果是主從:都要有一個server id ,如果都為1——它會以為是自己,就不會同步了。
#end_log_pos 日志的結束位置;thread id 執行事件的線程id號;exec_time 從執行(語句的時間戳)到寫入花費的時間。
#error_code=0 錯誤代碼
自動滾動:如果記錄的日志大小超過最大值,那么會生成一個新的二進制日志。mysql-bin.000001——>mysql-bin.000002——>mysql-bin.000003
手動滾動:
flush logs; #手動滾動二進制日志
show master logs; #查看二進制日志
show master status; #查看當前使用二級制日志文件
在重啟數據庫之后二進制日志也會滾動。
#需要注意的是:日志的滾動只能往前,無法向后,因為這樣的話還原就會有問題。二級制文件不要隨意刪除。
#日志滾動之后,mysql-bin.index會自動幫你記錄到文件中。
#二進制日志是數據庫之中最重要的日志。
#二級制日志的記錄格式:時間——server id——end_log_pos——CRC32——thread id——exec_time——error_code
#sever id 如果你做了數據庫的集群那么id號不能一樣,它是一種身份標識。
#如果是主從:都要有一個server id ,如果都為1——它會以為是自己,就不會同步了。
#end_log_pos 日志的結束位置;thread id 執行事件的線程id號;exec_time 從執行(語句的時間戳)到寫入花費的時間。
#error_code=0 錯誤代碼
基於二進制日志還原數據:
兩種還原方式——基於位置和基於時間
還原工具——mysqlbinlog
#--start-datetime=
#--stop-datetime=
#--start-position=
#--stop-position=
中繼日志:
復制架構中,備服務器用於保存主服務器的二進制日志中讀取到的事件。
在復制架構之中,master的寫操作記錄到二進制文件之中,slave來同步master的寫操作,具體過程如下:
1、slave的 I/O thread請求master的二進制文件
2、master通過dump thread將二進制的內容發送到salve
3、slave將接受到的內容存放到自己的中繼日志之中
4、slave在通過SQL thread進行回放,同步到自己的數據庫中
兩種還原方式——基於位置和基於時間
還原工具——mysqlbinlog
#--start-datetime=
#--stop-datetime=
#--start-position=
#--stop-position=
中繼日志:
復制架構中,備服務器用於保存主服務器的二進制日志中讀取到的事件。
在復制架構之中,master的寫操作記錄到二進制文件之中,slave來同步master的寫操作,具體過程如下:
1、slave的 I/O thread請求master的二進制文件
2、master通過dump thread將二進制的內容發送到salve
3、slave將接受到的內容存放到自己的中繼日志之中
4、slave在通過SQL thread進行回放,同步到自己的數據庫中
事物日志:
show variables like ‘%buffer_pool%’; #查看buffer_pool的大小
buffer_pool對於數據庫的性能而言,起着重要的作用。搭好數據庫,第一件事就要改這個參數。
事務日志是成組來的,默認是兩個交替進行。
也是非常重要的一個日志。是由innodb自己來管理的。
大致過程如下:
1、數據庫client的操作,默認開起事務且自動提交,事務操作會寫到事務日志之中
2、再由事務日志同步到磁盤之中
3、將磁盤中的內容再讀到內存,也就是buffer_pool,客戶端請求數據就直接到內存之中獲取。
show variables like ‘%buffer_pool%’; #查看buffer_pool的大小
buffer_pool對於數據庫的性能而言,起着重要的作用。搭好數據庫,第一件事就要改這個參數。
事務日志是成組來的,默認是兩個交替進行。
也是非常重要的一個日志。是由innodb自己來管理的。
大致過程如下:
1、數據庫client的操作,默認開起事務且自動提交,事務操作會寫到事務日志之中
2、再由事務日志同步到磁盤之中
3、將磁盤中的內容再讀到內存,也就是buffer_pool,客戶端請求數據就直接到內存之中獲取。
數據庫down了,起來之后,會檢查事務日志,有哪些事務是提交了的,但沒有寫入磁盤,做redo操作。
沒有提交的事務,那么做undo操作——rollback——自動幫你撤銷。
沒有提交的事務,那么做undo操作——rollback——自動幫你撤銷。
mysql的進程是mysqld
錯誤日志:
錯誤日志開啟之后,如果不指定文件的路徑, 默認在系統日志/var/log/messages
這個時候記錄的日志文件需要注意它的權限,可能會因為權限問題導致無法寫入。
錯誤日志開啟之后,如果不指定文件的路徑, 默認在系統日志/var/log/messages
這個時候記錄的日志文件需要注意它的權限,可能會因為權限問題導致無法寫入。