1. 程式人生 > 其它 >競賽覆盤(2)-新冠疫情相似句對判定大賽 線上第一名方案

競賽覆盤(2)-新冠疫情相似句對判定大賽 線上第一名方案

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

不管是哪個資料庫產品,一定會有日誌檔案。在MySQL中,主要有5種日誌檔案:

  1. 錯誤日誌(error log):記錄mysql服務的啟停時正確和錯誤的資訊,還記錄啟動、停止、執行過程中的錯誤資訊。
  2. 查詢日誌(general log):記錄建立的客戶端連線和執行的語句。
  3. 二進位制日誌(bin log):記錄所有更改資料的語句,可用於資料複製。
  4. 慢查詢日誌(slow log):記錄所有執行時間超過long_query_time的所有查詢或不使用索引的查詢。
  5. 中繼日誌(relay log)
    :主從複製時使用的日誌。

15.1、日誌的重新整理操作

  以下操作會重新整理日誌檔案,重新整理日誌檔案時會關閉舊的日誌檔案並重新開啟日誌檔案。對於有些日誌型別,如二進位制日誌,重新整理日誌會滾動日誌檔案,而不僅僅是關閉並重新開啟。

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

15.2、錯誤日誌

  錯誤日誌是最重要的日誌之一,它記錄了MySQL服務啟動和停止正確和錯誤的資訊,還記錄了mysqld例項執行過程中發生的錯誤事件資訊

  可以在MySQL配置檔案中的mysqld配置部分使用”--log-error=[file_name]“來指定mysqld記錄的錯誤日誌檔案如果沒有指定file_name,則預設的錯誤日誌檔案為datadir目錄下的hostname.err ,hostname表示當前的主機名。如果不知道錯誤日誌的位置,可以檢視變數log_error來檢視。

# 檢視錯誤日誌的位置
SHOW VARIABLES LIKE '%log_error%'
SELECT @@log_error

  在MySQL 5.5.7之前,重新整理日誌操作(如flush logs)會備份舊的錯誤日誌(以_old結尾),並建立一個新的錯誤日誌檔案並開啟,在MySQL 5.5.7之後,執行重新整理日誌的操作時,錯誤日誌會關閉並重新開啟,如果錯誤日誌不存在,則會先建立。

在MariaDB/MySQL正在執行狀態下刪除錯誤日誌後,不會自動建立錯誤日誌,只有在重新整理日誌的時候才會建立一個新的錯誤日誌檔案。

15.3、一般查詢日誌

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

  使用”--general_log={0|1}“來決定是否啟用一般查詢日誌,使用”--general_log_file=file_name“來指定查詢日誌的路徑。不給定路徑時預設的檔名以hostname.log 命名。

  和查詢日誌有關的變數有:

# 指定慢查詢超時時長,超出此時長的屬於慢查詢,會記錄到慢查詢日誌中
long_query_time = 10 
# 定義一般查詢日誌和慢查詢日誌的輸出格式,不指定時預設為file
log_output={TABLE|FILE|NONE} 
  • TABLE:表示記錄日誌到表中.
  • FILE:表示記錄日誌到檔案中.
  • NONE:表示不記錄日誌。

  只要這裡指定為NONE,即使開啟了一般查詢日誌和慢查詢日誌,也都不會有任何記錄。

  和一般查詢日誌相關的變數有:

# 是否啟用一般查詢日誌,為全域性變數,必須在global上修改。
general_log=off 
# 在session級別控制是否啟用一般查詢日誌,預設為off,即啟用
sql_log_off=off 
# 預設是庫檔案路徑下主機名加上.log
general_log_file=/data/mysqldata/hostname.log  

  預設沒有開啟一般查詢日誌,也不建議開啟一般查詢日誌。此處開啟該型別的日誌,看看是如何記錄一般查詢日誌的。

  首先開啟一般查詢日誌

# 啟用一般查詢日誌
mysql> set @@global.general_log=1;

# 可以看出我的主機名稱s1 一般查詢日誌檔案時s1.log
[root@s1 ~]# ll /data/mysqldata/*.log
-rw-r-----. 1 mysql mysql    184 Dec 15 14:39 /data/mysqldata/s1.log

  執行幾個語句。

mysql> select host,user from mysql.user;
mysql> show variables like "%error%";
mysql> use mysql_test;
mysql> create table tt(id int);
mysql> insert into tt values(233);
mysql> set @a:=3;

  檢視一般查詢日誌的內容。

[root@s1 ~]# cat /data/mysqldata/s1.log
2020-12-15T06:44:30.821127Z 6 Query show databases
2020-12-15T06:44:38.736325Z 6 Query SELECT DATABASE()
2020-12-15T06:44:38.736494Z 6 Init DB mysql_test
2020-12-15T06:44:44.932452Z 6 Query create table tt(id int)
2020-12-15T06:44:50.195845Z 6 Query insert into ttt values(233)
2020-12-15T06:45:00.035198Z 6 Query insert into tt values(233)
2020-12-15T06:45:09.826891Z 6 Query set @a:=3

  由此可知,一般查詢日誌記錄的不止是select語句,幾乎所有的語句都會記錄

15.4、慢查詢日誌

  查詢超出變數long_query_time指定時間值的為慢查詢但是查詢獲取鎖(包括鎖等待)的時間不計入查詢時間內。

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

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

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

  和慢查詢有關的變數:

# 指定慢查詢超時時長(預設10秒),超出此時長的屬於慢查詢
long_query_time=10
# 定義一般查詢日誌和慢查詢日誌的輸出格式,預設為file
log_output={TABLE|FILE|NONE} 
# 是否啟用慢查詢日誌,預設不啟用
log_slow_queries={yes|no}    
# 也是是否啟用慢查詢日誌,此變數和log_slow_queries修改一個另一個同時變化
slow_query_log={1|ON|0|OFF} 
# 預設路徑為庫檔案目錄下主機名加上-slow.log
slow_query_log_file=/data/mysqldata/hostname-slow.log  
 # 查詢沒有使用索引的時候是否也記入慢查詢日誌
log_queries_not_using_indexes=OFF

  現在啟用慢查詢日誌。

mysql> set @@global.slow_query_log=on;

  因為預設超時時長為10秒,所以進行一個10秒的查詢。

mysql> select sleep(10);

  檢視慢查詢日誌檔案。這裡看到雖然sleep了10秒,但是最後查詢時間超出了847微秒,因此這裡也記錄了該查詢。

[root@s1 ~]# cat /data/mysqldata/s1-slow.log 
/usr/local/jdy/mysql/bin/mysqld, Version: 5.7.22 (MySQL Community Server (GPL)). started with:
Tcp port: 3306  Unix socket: /tmp/mysql.sock
Time                 Id Command    Argument
/usr/local/jdy/mysql/bin/mysqld, Version: 5.7.22 (MySQL Community Server (GPL)). started with:
Tcp port: 3306  Unix socket: /tmp/mysql.sock
Time                 Id Command    Argument
# Time: 2020-12-15T07:08:39.066210Z
# User@Host: root[root] @  [192.168.116.1]  Id:     7
# Query_time: 10.001191  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
SET timestamp=1608016119;
select sleep(10);

  隨著時間的推移,慢查詢日誌檔案中的記錄可能會變得非常多,這對於分析查詢來說是非常困難的。好在提供了一個專門歸類慢查詢日誌的工具mysqldumpslow。

mysqldumpslow  [options]  filename

  options

    • -d: debug
    • -v:顯示詳細資訊
    • -t NUM:僅顯示前n條查詢
    • -a:歸類時不要使用N替換數字,S替換字串
    • -g PATTERN:通過grep來篩選select語句。

  該工具歸類的時候,預設會將同文本但變數值不同的查詢語句視為同一類,並使用N代替其中的數值變數,使用S代替其中的字串變數。可以使用-a來禁用這種替換。如:

[root@s1 ~]# ln  -s  /usr/local/jdy/mysql/bin/mysqldumpslow   /usr/bin

[root@s1 ~]# mysqldumpslow /data/mysqldata/s1-slow.log 
Reading mysql slow query log from /data/mysqldata/s1-slow.log
Count: 1  Time=10.00s (10s)  Lock=0.00s (0s)  Rows=1.0 (1), root[root]@[192.168.116.1]
  select sleep(N)

[root@s1 ~]# mysqldumpslow -a /data/mysqldata/s1-slow.log 
Reading mysql slow query log from /data/mysqldata/s1-slow.log
Count: 1  Time=10.00s (10s)  Lock=0.00s (0s)  Rows=1.0 (1), root[root]@[192.168.116.1]
  select sleep(10)

  顯然,這裡歸類後的結果只是精確到0.01秒的,如果想要顯示及其精確的秒數,則使用-d選項啟用除錯功能。

[root@s1 ~]# mysqldumpslow -d /data/mysqldata/s1-slow.log 

Reading mysql slow query log from /data/mysqldata/s1-slow.log
[[/usr/local/jdy/mysql/bin/mysqld, Version: 5.7.22 (MySQL Community Server (GPL)). started with:
Tcp port: 3306  Unix socket: /tmp/mysql.sock
Time                 Id Command    Argument
/usr/local/jdy/mysql/bin/mysqld, Version: 5.7.22 (MySQL Community Server (GPL)). started with:
Tcp port: 3306  Unix socket: /tmp/mysql.sock
Time                 Id Command    Argument
# Time: 2020-12-15T07:08:39.066210Z
# User@Host: root[root] @  [192.168.116.1]  Id:     7
# Query_time: 10.001191  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
SET timestamp=1608016119;
select sleep(10);
]]
<<>>
<<>>
<<# Time: 2020-12-15T07:08:39.066210Z
# User@Host: root[root] @  [192.168.116.1]  Id:     7
# Query_time: 10.001191  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
SET timestamp=1608016119;
select sleep(10);
>> at /usr/bin/mysqldumpslow line 97, <> chunk 1.
[[# Time: 2020-12-15T07:08:39.066210Z
# User@Host: root[root] @  [192.168.116.1]  Id:     7
# Query_time: 10.001191  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
SET timestamp=1608016119;
select sleep(10);
]]
{{  select sleep(N)}}

Count: 1  Time=10.00s (10s)  Lock=0.00s (0s)  Rows=1.0 (1), root[root]@[192.168.116.1]
  select sleep(N)

  慢查詢在SQL語句調優的時候非常有用,應該將它啟用起來,且應該讓慢查詢閾值儘量小,例如1秒甚至低於1秒。就像一天執行上千次的1秒語句,和一天執行幾次的20秒語句,顯然更值得去優化這個1秒的語句。

15.5、二進位制日誌

(1)、二進位制日誌檔案

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

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

  對於事務表的操作,二進位制日誌只在事務提交的時候一次性寫入(基於事務的innodb二進位制日誌)提交前的每個二進位制日誌記錄都先cache,提交時寫入。

  所以,對於事務表來說,一個事務中可能包含多條二進位制日誌事件它們會在提交時一次性寫入。而對於非事務表的操作,每次執行完語句就直接寫入。

  MySQL預設沒有啟動二進位制日誌,要啟用二進位制日誌使用--log-bin=[on|off|file_name]選項指定,如果沒有給定file_name,則預設為datadir下的主機名加“-bin”,並在後面跟上一串數字表示日誌序列號,如果給定的日誌檔案中包含了字尾(logname.suffix)將忽略字尾部分。

[root@s1 ~]# ll /data/mysqldata/
-rw-r-----. 1 mysql mysql      154 Dec 15 16:06 on.000001
-rw-r-----. 1 mysql mysql       12 Dec 15 16:06 on.index

  或者在配置檔案中的[mysqld]部分設定log-bin也可以。注意:對於mysql 5.7,直接啟動binlog可能會導致mysql服務啟動失敗,這時需要在配置檔案中的mysqld為mysql例項分配server_id。

[mysqld]
# server_id=1234
log-bin=[on|filename]

  mysqld還建立一個二進位制日誌索引檔案,當二進位制日誌檔案滾動的時候會向該檔案中寫入對應的資訊。所以該檔案包含所有使用的二進位制日誌檔案的檔名。預設情況下該檔案與二進位制日誌檔案的檔名相同,副檔名為’.index’。要指定該檔案的檔名使用--log-bin-index[=file_name]選項。當mysqld在執行時不應手動編輯該檔案,免得mysqld變得混亂。

  當重啟mysql服務或重新整理日誌或者達到日誌最大值時,將滾動二進位制日誌檔案,滾動日誌時只修改日誌檔名的數字序列部分。

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

  因為二進位制日誌檔案增長迅速,但官方說明因此而損耗的效能小於1%,且二進位制目的是為了恢復定點資料庫和主從複製,所以出於安全和功能考慮,極不建議將二進位制日誌和datadir放在同一磁碟上。

(2)、檢視二進位制日誌

 MySQL中檢視二進位制日誌的方法主要有幾種。

  1. 使用mysqlbinlog工具。
  2. 使用show顯示對應的資訊。
# 檢視使用了哪些日誌檔案
SHOW {BINARY | MASTER} LOGS      
# 檢視日誌中進行了哪些操作
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos]   
# 顯式主伺服器中的二進位制日誌資訊
SHOW MASTER STATUS       

①、mysqlbinlog

  二進位制日誌可以使用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可以檢視

在進行測試之前,先對日誌進行一次重新整理,以方便解釋二進位制日誌的資訊。

shell> mysqladmin -uroot -p refresh

  假設現在的日誌檔案是mysql-bin.000001,裡面暫時只有一些初始資訊,沒有記錄任何操作過的記錄。

  下面是每個二進位制日誌檔案的初始資訊。可以看到記錄了時間和位置資訊(at 4)。

[root@s1 ~]# mysqlbinlog --no-defaults /data/mysqldata/on.000001

  現在在資料庫中執行下面的操作:

use test;
create table student(studentid int not null primary key,name varchar(30) not null,gender enum('female','mail'));
alter table student change gender gender enum('female','male');
insert into student values(1,'malongshuai','male'),(2,'gaoxiaofang','female');

  再檢視二進位制日誌資訊。

[root@s1 ~]# mysqlbinlog --no-defaults /data/mysqldata/on.000001

  將上述資訊整理為下圖:其中timestamp記錄的是從1970-01-01到現在的總秒數時間戳,可以使用 date -d ‘@1490736093’ 轉換。

  • 位置0-120記錄的是二進位制日誌的一些固定資訊。
  • 位置120-305記錄的是use和create table語句,語句的記錄時間為5:20:00。但注意,這裡的use不是執行的use語句,而是MySQL發現要操作的資料庫為test,而自動進行的操作並記錄下來。人為的use語句是不會記錄的。
  • 位置305-441記錄的是alter table語句,語句的記錄時間為5:20:21。
  • 位置441-702記錄的是insert操作,因為該操作是DML語句,因此記錄了事務的開始BEGIN和提交COMMIT。
    • begin的起止位置為441-520;
    • insert into語句的起止位置為520-671,記錄的時間和自動開啟事務的begin時間是一樣的;
    • commit的起止位置為671-702。

  使用-r命令將日誌檔案匯入到指定檔案中,使用重定向也可以實現同樣的結果。並使用-s檢視簡化的日誌檔案。

[root@s1 ~]# mysqlbinlog --no-defaults /data/mysqldata/on.000001 -r /tmp/binlog.000001
[root@s1 ~]# mysqlbinlog --no-defaults /data/mysqldata/on.000001 -s > /tmp/binlog.sample

  比較這兩個檔案,看看簡化的日誌檔案簡化了哪些東西。

  從上圖中可以看出,使用-s後,少了基於行的日誌資訊,也少了記錄的位置和時間資訊。

  使用-o可以忽略前N個條目,例如上面的操作涉及了6個操作。忽略掉前3個後的日誌顯示如下:可以看到直接從位置441開始顯示了。

[root@s1 ~]# mysqlbinlog --no-defaults -o 3 /data/mysqldata/on.000001

  使用-d可以只顯示指定資料庫相關的操作。例如先切換到其他資料庫進行一番操作,然後再使用-d檢視日誌。

mysql> use mysql_test;
mysql> create table mytest(id int);
[root@s1 ~]# mysqlbinlog --no-defaults /data/mysqldata/on.000001 -d bigdata

  可以看到,除了指定的mysql資料庫的資訊輸出了,還非常簡化的輸出了其他資料庫的資訊。

  mysqlbinlog最有用的兩個選項就是指定時間和位置來輸出日誌。

  指定時間時,將輸出指定時間範圍內的日誌。指定的時間可以不和日誌中記錄的日誌相同。

[root@s1 ~]# mysqlbinlog --no-defaults /data/mysqldata/on.000001 --start-datetime='2017-03-28 00:00:01' --stop-datetime='2017-03-29 05:21:23'

  同理指定位置也一樣,但是指定位置時有個要求是如果指定起始位置,則必須指定日誌檔案中明確的起始位置。例如,日誌檔案中有位置120、305、441,可以指定起始和結束位置為120、500,但是不可以指定起止位置為150、500,因為日誌檔案中不存在150這個位置。

[root@s1 ~]# mysqlbinlog --no-defaults /data/mysqldata/on.000001 --start-position=150 --stop-position=441

②、show binary logs

  該語句用於檢視當前使用了哪些二進位制日誌檔案。

  可以通過檢視二進位制的index檔案來檢視當前正在使用哪些二進位制日誌。

[root@s1 ~]# cat /data/mysqldata/on.index 
./on.000001
./on.000002
./on.000003

  也可以在mysql環境中使用 show {binary | master} logs 來檢視。binary和master是同義詞。

mysql> show binary logs;
+-----------+-----------+
| Log_name  | File_size |
+-----------+-----------+
| on.000001 |     11977 |
| on.000002 |       177 |
| on.000003 |       154 |
+-----------+-----------+

③、show binlog events

  該語句用於檢視日誌中進行了哪些操作。

mysql> show binlog events in 'on.000002';

  可以指定起始位置。同樣,起始位置必須指定正確,不能指定不存在的位置。

mysql> SHOW BINLOG EVENTS IN 'on.000001' FROM 1255;

④、show master status

  該語句用於顯示主伺服器中的二進位制日誌資訊。如果是主從結構,它只會顯示主從結構中主伺服器的二進位制日誌資訊。

mysql> show master status;
+-----------+----------+--------------+------------------+-------------------+
| File      | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------+----------+--------------+------------------+-------------------+
| on.000003 |      154 |              |                  |                   |
+-----------+----------+--------------+------------------+-------------------+

  可以檢視到當前正在使用的日誌及下一事件記錄的開始位置,還能檢視到哪些資料庫需要記錄二進位制日誌,哪些資料庫不記錄二進位制日誌。

(3)、刪除二進位制日誌

  刪除二進位制日誌有幾種方法。不管哪種方法,都會將刪除後的資訊同步到二進位制index檔案中。

  1.reset master將會刪除所有日誌,並讓日誌檔案重新從000001開始。

mysql> reset master;

  2.PURGE { BINARY | MASTER } LOGS { TO ‘log_name’ | BEFORE datetime_expr }

# 將會清空00000X之前的所有日誌檔案。例如刪除000006之前的日誌檔案
 purge master logs to "binlog_name.00000X"
mysql> purge master logs to "on.000001";
mysql> purge binary logs to "on.000001";

  master和binary是同義詞

# 將會刪除指定日期之前的所有日誌。但是若指定的時間處在正在使用中的日誌檔案中,將無法進行purge。
purge master logs before 'yyyy-mm-dd hh:mi:ss' 
mysql> purge master logs before '2017-03-29 07:36:40';

mysql> show warnings;
+---------+------+---------------------------------------------------------------------------+
| Level   | Code | Message                                                                   |
+---------+------+---------------------------------------------------------------------------+
| Warning | 1868 | file ./mysql-bin.000003 was not purged because it is the active log file.

  3.使用--expire_logs_days=N選項指定過了多少天日誌自動過期清空

(4)、二進位制日誌的記錄格式

  在MySQL 5.1之前,MySQL只有一種基於語句statement形式的日誌記錄格式。即將所有的相關操作記錄為SQL語句形式。但是這樣的記錄方式對某些特殊資訊無法同步記錄,例如uuid,now()等這樣動態變化的值。

  從MySQL 5.1開始,MySQL支援statement、row、mixed三種形式的記錄方式。row形式是基於行來記錄,也就是將相關行的每一列的值都在日誌中儲存下來,這樣的結果會導致日誌檔案變得非常大,但是保證了動態值的確定性。還有一種mixed形式,表示如何記錄日誌由MySQL自己來決定。

  日誌的記錄格式由變數 binlog_format 來指定其值有:row,statement,mixed。innodb引擎的創始人之一在部落格上推薦使用row格式

  下面將記錄格式改為row。

mysql> alter table student add birthday datetime default  now();
mysql> flush logs;
mysql> set binlog_format='row';
mysql> insert into student values(7,'xiaowoniu','female',now());  

(5)、二進位制日誌相關的變數

  注意:在配置binlog相關變數的時候,相關變數名總是搞混,因為有的是binlog,有的是log_bin,當他們分開的時候,log在前,當它們一起的時候,bin在前。在配置檔案中也同樣如此。

變數名稱 變數說明
log_bin

log_bin= {on | off | base_name} 指定是否啟用記錄二進位制日誌或者指定一個日誌路徑(路徑不能加.否則.後的被忽略)

sql_log_bin

sql_log_bin={ on | off } #指定是否啟用記錄二進位制日,只有在log_bin開啟的時候才有效

expire_logs_days

expire_logs_days= #指定自動刪除二進位制日誌的時間,即日誌過期時間

binlog_do_db

binlog_do_db= #明確指定要記錄日誌的資料庫

binlog_ignore_db

binlog_ignore_db= #指定不記錄二進位制日誌的資料庫

log_bin_index

log_bin_index= #指定mysql-bin.index檔案的路徑

binlog_format

binlog_format= { mixed | row | statement } #指定二進位制日誌基於什麼模式記錄

binlog_rows_query_log_events

binlog_rows_query_log_events= { 1|0 } # MySQL5.6.2添加了該變數,當binlog format為row時,
預設不會記錄row對應的SQL語句,設定為1或其他true布林值時會記錄,
但需要使用mysqlbinlog -v檢視,這些語句是被註釋的,恢復時不會被執行。

max_binlog_size

max_binlog_size= #指定二進位制日誌檔案最大值,超出指定值將自動滾動。但由於事務不會跨檔案,所以並不一定總是精確。

binlog_cache_size

binlog_cache_size= 32768 #基於事務型別的日誌會先記錄在緩衝,當達到該緩衝大小時這些日誌會寫入磁碟

max_binlog_cache_size

max_binlog_cache_size= #指定二進位制日誌快取最大大小,硬限制。預設4G,夠大了,建議不要改

binlog_cache_use

binlog_cache_use:使用快取寫二進位制日誌的次數(這是一個實時變化的統計值)

binlog_cache_disk_use

binlog_cache_disk_use:使用臨時檔案寫二進位制日誌的次數,
當日志超過了binlog_cache_size的時候會使用臨時檔案寫日誌,如果該變數值不為0,則考慮增大binlog_cache_size的值

binlog_stmt_cache_size

binlog_stmt_cache_size= 32768 #一般等同於且決定binlog_cache_size大小,所以修改快取大小時只需修改這個而不用修改binlog_cache_size

binlog_stmt_cache_use

binlog_stmt_cache_use:使用快取寫二進位制日誌的次數

binlog_stmt_cache_disk_use

binlog_stmt_cache_disk_use: 使用臨時檔案寫二進位制日誌的次數,當日志超過了binlog_cache_size的時候會使用臨時檔案寫日誌,
如果該變數值不為0,則考慮增大binlog_cache_size的值

sync_binlog sync_binlog= { 0 | n } #這個引數直接影響mysql的效能和完整性
  • sync_binlog=0:不同步,日誌何時刷到磁碟由FileSystem決定,這個效能最好。
  • sync_binlog=n:每寫n次事務(注意,對於非事務表來說,是n次事件,對於事務表來說,是n次事務,而一個事務裡可能包含多個二進位制事件),
    MySQL將執行一次磁碟同步指令fdatasync()將快取日誌重新整理到磁碟日誌檔案中。
    Mysql中預設的設定是sync_binlog=0,即不同步,這時效能最好,但風險最大。一旦系統奔潰,快取中的日誌都會丟失。

  在innodb的主從複製結構中,如果啟用了二進位制日誌(幾乎都會啟用),要保證事務的一致性和永續性的時候,必須將sync_binlog的值設定為1,因為每次事務提交都會寫入二進位制日誌,設定為1就保證了每次事務提交時二進位制日誌都會寫入到磁碟中,從而立即被從伺服器複製過去。**

(6)、二進位制日誌定點還原資料庫

  只需指定二進位制日誌的起始位置(可指定終止位置)並將其儲存到sql檔案中,由mysql命令來載入恢復即可。當然直接通過管道送給mysql命令也可。

  至於是基於位置來恢復還是基於時間點來恢復,這兩種行為都可以。選擇時間點來恢復比較直觀些,並且跨日誌檔案恢復時更方便。

mysqlbinlog --stop-datetime="2014-7-2 15:27:48" /tmp/mysql-bin.000008 | mysql -u user -p password

  恢復多個二進位制日誌檔案時:

mysqlbinlog mysql-bin.[*] | mysql -uroot -p password

  或者將它們匯入到一個檔案中後恢復。

mysqlbinlog mysql-bin.000001 > /tmp/a.sql
mysqlbinlog mysql-bin.000002 >>/tmp/a.sql
mysql -u root -p password -e "source /tmp/a.sql"

@s1 ~