MySql資料庫——檔案

readyao發表於2017-03-17

MySql資料庫(或者MySql伺服器或者MySql例項)的檔案型別主要有以下幾種:
引數檔案:告訴MySql例項啟動時在哪裡可以找到資料庫檔案,並且指定某些初始化引數,這些引數定義了某種記憶體結構的大小等設定,還會介紹各種引數的型別。
日誌檔案:用來記錄MySql例項對某種條件做出響應時寫入的檔案,如錯誤日誌檔案、二進位制日誌檔案、慢查詢日誌檔案、查詢日誌檔案等。
socket檔案:當用UNIX域套接字方式進行連線時需要的檔案。
**pid檔案:**MySql例項的程式ID檔案。
MySql表結構檔案:用來存放MySql表結構定義檔案。
儲存引擎檔案:因為MySql儲存引擎的關係,每個儲存引擎都會有自己的檔案來儲存各種資料。這些儲存引擎真正儲存了記錄和索引等資料。

1、引數檔案

MySql例項啟動時,資料庫會先去讀取一個配置引數檔案,用來尋找資料庫的各種檔案所在位置以及指定某些初始化引數,這些引數通常定義了某種記憶體結構有多大等。在預設情況下,MySql例項會按照一定的順序在指定的位置進行讀取,可以通過下面命令來尋找。

root@TryHard:~# mysql --help

下面是部分輸出:

Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf 

MySql例項可以不需要引數檔案,這時所有的引數值取決於編譯MySql時指定的預設值和原始碼中指定引數的預設值。
MySql資料庫的引數檔案是以檔案方式進行儲存的,可以直接通過文字編輯軟體進行引數的修改。

  • 什麼是引數

可以把資料庫引數看作是一個鍵值對(key/value)。比如下面的引數值為134217728,也就可以表示為innodb_buffer_pool_size=134217728。

mysql> show variables like 'innodb_buffer_pool_size'; 
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set (0.00 sec)

通過下面的命令來檢視資料庫中所有的引數:

mysql> show variables;

mysql> select * from GLOBAL_VARIABLES;

可以通過使用like來檢視某個特定的引數。

mysql> select * from GLOBAL_VARIABLES where variable_name like 'innodb_buffer%';
+------------------------------+----------------+
| VARIABLE_NAME                | VARIABLE_VALUE |
+------------------------------+----------------+
| INNODB_BUFFER_POOL_SIZE      | 134217728      |
| INNODB_BUFFER_POOL_INSTANCES | 1              |
+------------------------------+----------------+
2 rows in set (0.00 sec)

show variables命令比較簡單。

  • 引數型別

MySql資料庫中的引數可以分為兩類:
(1)動態引數
(2)靜態引數
動態引數意味著可以在MySql例項執行中進行更改,靜態引數意味著在整個例項的生命週期內都不能進行更改。
可以通過set命令對動態的引數值進行修改,下面是語法:

set global.system_var_name=value;
set session.system_var_name=value;
set @@global.system_var_name=value;
set @@session.system_var_name=value;

global和session關鍵字,它們表明該引數的修改是基於當前會話還是整個例項的生命週期。有些動態引數只能在會話中進行修改,如autocommit;而有些引數修改完後,在整個例項生命週期中都會生效,如binlog_cache_size;而有些引數既可以在會話中又可以在整個例項的生命週期內生效,如read_buffer_size。
即使在正例項生命週期中生效,但是如果重啟資料庫,它還是會從引數檔案中讀取引數的值。所以,如果想永久修改引數,則需要修改引數檔案的內容。

靜態變數不能修改,否則會出現下面的錯誤提示。

mysql> set global datadir='/db/mysql';
ERROR 1238 (HY000): Variable 'datadir' is a read only variable

2、日誌檔案

MySql中常見的日誌檔案有:
(1)錯誤日誌 error log
(2)二進位制日誌 binlog
(3)慢查詢日誌 slow query log
(4)查詢日誌log

- 錯誤日誌

錯誤日誌檔案對MySql的啟動、執行、關閉過程進行了記錄。在遇到問題時應該首先檢視該檔案以便於定位問題。該檔案不僅記錄了所有的錯誤資訊,也記錄一些警告資訊或正確的資訊。
可以通過下面命令定位該檔案:

mysql> show variables like 'log_error';
+---------------+--------------------------+
| Variable_name | Value                    |
+---------------+--------------------------+
| log_error     | /var/log/mysql/error.log |
+---------------+--------------------------+
1 row in set (0.00 sec)

可以看到錯誤檔案的路徑和檔名。

下面是檢視該檔案最後20行:

root@TryHard:~# tail -n 20 /var/log/mysql/error.log
161204 17:24:14  InnoDB: Shutdown completed; log sequence number 2448358
161204 17:24:14 [Note] /usr/sbin/mysqld: Shutdown complete

161204 17:25:02 [Warning] Using unique option prefix myisam-recover instead of myisam-recover-options is deprecated and will be removed in a future release. Please use the full name instead.
161204 17:25:02 [Note] Plugin 'FEDERATED' is disabled.
161204 17:25:02 InnoDB: The InnoDB memory heap is disabled
161204 17:25:02 InnoDB: Mutexes and rw_locks use GCC atomic builtins
161204 17:25:02 InnoDB: Compressed tables use zlib 1.2.8
161204 17:25:02 InnoDB: Using Linux native AIO
161204 17:25:02 InnoDB: Initializing buffer pool, size = 128.0M
161204 17:25:02 InnoDB: Completed initialization of buffer pool
161204 17:25:02 InnoDB: highest supported file format is Barracuda.
161204 17:25:03  InnoDB: Waiting for the background threads to start
161204 17:25:04 InnoDB: 5.5.49 started; log sequence number 2448358
161204 17:25:04 [Note] Server hostname (bind-address): '127.0.0.1'; port: 3306
161204 17:25:04 [Note]   - '127.0.0.1' resolves to '127.0.0.1';
161204 17:25:04 [Note] Server socket created on IP: '127.0.0.1'.
161204 17:25:04 [Note] Event Scheduler: Loaded 0 events
161204 17:25:04 [Note] /usr/sbin/mysqld: ready for connections.
Version: '5.5.49-0ubuntu0.14.04.1'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  (Ubuntu)
  • 慢查詢日誌

通過錯誤日誌可能會獲得關於資料庫優化的資訊,而慢查詢日誌可幫助DBA定位可能存在問題的SQL語句,從而進行SQL語句層面的優化。例如,可以在MySql啟動時設一個閥值,將執行時間超過該值的所有Sql語句都記錄到慢查詢日誌檔案中。
DBA每天或每過一段時間對其進行檢查,確認是否有Sql語句需要進行優化。該閥值可以通過引數long_query_time來設定,預設值為10,代表10秒。
在預設情況下,MySql資料庫並不會啟動慢查詢日誌,使用者需要手動將這個引數設定為ON。

mysql> show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)

mysql> show variables like 'log_slow_queries';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| log_slow_queries | OFF   |
+------------------+-------+
1 row in set (0.00 sec)

設定long_query_time這個閥值後,MySql資料庫會記錄執行時間超過該值的所有Sql語句,但執行時間正好等於long_query_time的情況並不會被記錄下。


另一個和慢查詢日誌有關的引數是long_queries_not_using_indexes,如果執行的Sql語句沒有使用索引,則MySql資料庫同樣會將這條Sql語句記錄到慢查詢日誌檔案。該引數預設是關閉的。

mysql> show variables like 'log_queries_not_using_indexes';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | OFF   |
+-------------------------------+-------+
1 row in set (0.00 sec)

MySql資料庫提供mysqldumpslow命令,該命令用來檢視慢查詢日誌。

MySql5.1開始可以將慢查詢的日誌記錄放入到表中,名為 slow_log,表結構如下,表的內容為空。

mysql> show create table mysql.slow_log\G
*************************** 1. row ***************************
       Table: slow_log
Create Table: CREATE TABLE `slow_log` (
  `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `user_host` mediumtext NOT NULL,
  `query_time` time NOT NULL,
  `lock_time` time NOT NULL,
  `rows_sent` int(11) NOT NULL,
  `rows_examined` int(11) NOT NULL,
  `db` varchar(512) NOT NULL,
  `last_insert_id` int(11) NOT NULL,
  `insert_id` int(11) NOT NULL,
  `server_id` int(10) unsigned NOT NULL,
  `sql_text` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
1 row in set (0.00 sec)

mysql> select * from mysql.slow_log;
Empty set (0.00 sec)

引數log_output指定了慢查詢輸出的格式,預設為FILE,可以將它設定為TABLE,然後就可以查詢slow_log表了。可以看到slow_log表的儲存引擎為CSV,對大資料量下的查詢效率可能不高,使用者可以把slow_log表的引擎轉換到MyISAM,並在start_time列下新增索引以進一步提高查詢的效率。但是如果已經啟動了慢查詢,直接轉換的話會出現錯誤,應該將其關閉,在改變儲存引擎。

mysql> show variables like 'log_output';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output    | FILE  |
+---------------+-------+
1 row in set (0.00 sec)

mysql> set global log_output='Table';
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'log_output';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output    | TABLE |
+---------------+-------+
1 row in set (0.00 sec)

開啟慢查詢:

mysql> set global log_slow_queries='ON';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> show variables like 'log_slow_queries';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| log_slow_queries | ON    |
+------------------+-------+
1 row in set (0.00 sec)

查詢slow_log表內容:

mysql> select * from mysql.slow_log;
Empty set (0.00 sec)

執行一條睡眠10秒的Sql語句:
mysql> select sleep(10);

+-----------+
| sleep(10) |
+-----------+
|         0 |
+-----------+
1 row in set (10.01 sec)

再次檢視slow_log表:

mysql> select * from mysql.slow_log\G
*************************** 1. row ***************************
    start_time: 2017-03-17 16:50:56
     user_host: root[root] @ localhost []
    query_time: 00:00:10
     lock_time: 00:00:00
     rows_sent: 1
 rows_examined: 0
            db: 
last_insert_id: 0
     insert_id: 0
     server_id: 0
      sql_text: select sleep(10)
1 row in set (0.00 sec)

可以看到剛才執行的Sql語句新增到了slow_log檔案中。

MySql的slow_log通過執行時間來對Sql語句進行捕獲,這是一個非常有用的優化技巧。但是當資料庫的容量較小時,可能因為資料庫剛建立,此時非常大的可能是資料全部快取在緩衝池中,Sql語句執行的時間可能都是非常短的,一般都是0.5秒。

  • 查詢日誌

下面命令用來檢視所有日誌的資訊,包括日誌檔案所在目錄。

mysql> show global variables like '%log%';
+-----------------------------------------+---------------------------------+
| Variable_name                           | Value                           |
+-----------------------------------------+---------------------------------+
| back_log                                | 50                              |
| binlog_cache_size                       | 32768                           |
| binlog_direct_non_transactional_updates | OFF                             |
| binlog_format                           | STATEMENT                       |
| binlog_stmt_cache_size                  | 32768                           |
| expire_logs_days                        | 10                              |
| general_log                             | OFF                             |
| general_log_file                        | /var/lib/mysql/TryHard.log      |
| innodb_flush_log_at_trx_commit          | 1                               |
| innodb_locks_unsafe_for_binlog          | OFF                             |
| innodb_log_buffer_size                  | 8388608                         |
| innodb_log_file_size                    | 5242880                         |
| innodb_log_files_in_group               | 2                               |
| innodb_log_group_home_dir               | ./                              |
| innodb_mirrored_log_groups              | 1                               |
| log                                     | OFF                             |
| log_bin                                 | OFF                             |
| log_bin_trust_function_creators         | OFF                             |
| log_error                               | /var/log/mysql/error.log        |
| log_output                              | TABLE                           |
| log_queries_not_using_indexes           | OFF                             |
| log_slave_updates                       | OFF                             |
| log_slow_queries                        | ON                              |
| log_warnings                            | 1                               |
| max_binlog_cache_size                   | 18446744073709547520            |
| max_binlog_size                         | 104857600                       |
| max_binlog_stmt_cache_size              | 18446744073709547520            |
| max_relay_log_size                      | 0                               |
| relay_log                               |                                 |
| relay_log_index                         |                                 |
| relay_log_info_file                     | relay-log.info                  |
| relay_log_purge                         | ON                              |
| relay_log_recovery                      | OFF                             |
| relay_log_space_limit                   | 0                               |
| slow_query_log                          | ON                              |
| slow_query_log_file                     | /var/lib/mysql/TryHard-slow.log |
| sql_log_bin                             | ON                              |
| sql_log_off                             | OFF                             |
| sync_binlog                             | 0                               |
| sync_relay_log                          | 0                               |
| sync_relay_log_info                     | 0                               |
+-----------------------------------------+---------------------------------+
41 rows in set (0.00 sec)

引數general_log_file定義了查詢日誌的檔名。
引數general_log表明查詢日誌是否開啟,預設是off,因為查詢日誌會記錄使用者的所有操作,其中還包含增刪查改等資訊,在併發操作大的環境下會產生大量的資訊從而導致不必要的磁碟IO,會影響mysql的效能的。如若不是為了除錯資料庫的目的建議不要開啟查詢日誌。

  • 二進位制日誌

二進位制檔案(binary log)記錄了對MySql資料庫執行更改的所有操作,但是不包括select和show這類操作,因為這類操作對資料本身並沒有修改。然而,如果操作本身並沒有導致資料庫發生變化,那麼該操作可能也會寫入二進位制日誌。

檢視二進位制日誌開啟狀態:

mysql> show global variables like "%log_bin%"; 
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin                         | OFF   |
| log_bin_trust_function_creators | OFF   |
| sql_log_bin                     | ON    |
+---------------------------------+-------+
3 rows in set (0.00 sec)

log_bin為OFF,表示二進位制日誌沒有開啟。


mysql> show global variables like '%log%';
+-----------------------------------------+---------------------------------+
| Variable_name                           | Value                           |
+-----------------------------------------+---------------------------------+
| back_log                                | 50                              |
| binlog_cache_size                       | 32768                           |
| binlog_direct_non_transactional_updates | OFF                             |
| binlog_format                           | STATEMENT                       |
| binlog_stmt_cache_size                  | 32768                           |
| expire_logs_days                        | 10                              |
| general_log                             | OFF                             |
| general_log_file                        | /var/lib/mysql/TryHard.log      |
| innodb_flush_log_at_trx_commit          | 1                               |
| innodb_locks_unsafe_for_binlog          | OFF                             |
| innodb_log_buffer_size                  | 8388608                         |
| innodb_log_file_size                    | 5242880                         |
| innodb_log_files_in_group               | 2                               |
| innodb_log_group_home_dir               | ./                              |
| innodb_mirrored_log_groups              | 1                               |
| log                                     | OFF                             |
| log_bin                                 | OFF                             |
| log_bin_trust_function_creators         | OFF                             |
| log_error                               | /var/log/mysql/error.log        |
| log_output                              | TABLE                           |
| log_queries_not_using_indexes           | OFF                             |
| log_slave_updates                       | OFF                             |
| log_slow_queries                        | ON                              |
| log_warnings                            | 1                               |
| max_binlog_cache_size                   | 18446744073709547520            |
| max_binlog_size                         | 104857600                       |
| max_binlog_stmt_cache_size              | 18446744073709547520            |
| max_relay_log_size                      | 0                               |
| relay_log                               |                                 |
| relay_log_index                         |                                 |
| relay_log_info_file                     | relay-log.info                  |
| relay_log_purge                         | ON                              |
| relay_log_recovery                      | OFF                             |
| relay_log_space_limit                   | 0                               |
| slow_query_log                          | ON                              |
| slow_query_log_file                     | /var/lib/mysql/TryHard-slow.log |
| sql_log_bin                             | ON                              |
| sql_log_off                             | OFF                             |
| sync_binlog                             | 0                               |
| sync_relay_log                          | 0                               |
| sync_relay_log_info                     | 0                               |
+-----------------------------------------+---------------------------------+
41 rows in set (0.00 sec)
sql_log_bin ={ON|OFF},

用於控制會話級別二進位制日誌功能的開啟或關閉。預設為ON,表示啟用記錄功能。使用者可以在會話級別修改此變數的值,但其必須具有SUPER許可權。

binlog_cache_size =32768   

預設值32768 Binlog Cache用於在開啟了二進位制日誌(binlog)記錄功能的環境,是MySQL 用來提高binlog的記錄效率而設計的一個用於短時間內臨時快取binlog資料的記憶體區域。一般來說,如果我們的資料庫中沒有什麼大事務,寫入也不是特別頻繁,2MB~4MB是一個合適的選擇。但是如果我們的資料庫大事務較多,寫入量比較大,可與適當調高binlog_cache_size。同時,我們可以通過binlog_cache_use 以及 binlog_cache_disk_use來分析設定的binlog_cache_size是否足夠,是否有大量的binlog_cache由於記憶體大小不夠而使用臨時檔案(binlog_cache_disk_use)來快取了。

binlog_stmt_cache_size= 32768  

當非事務語句使用二進位制日誌快取,但是超出binlog_stmt_cache_size時,使用一個臨時檔案來存放這些語句。

log_bin = mysql-bin

可以直接定義為檔案路徑,也可以為ON|OFF。

binlog-format= {ROW|STATEMENT|MIXED}  

指定二進位制日誌的型別,預設為STATEMENT。如果設定了二進位制日誌的格式,卻沒有啟用二進位制日誌,則MySQL啟動時會產生警告日誌資訊並記錄於錯誤日誌中。

sync_binlog = 0

設定多久同步一次二進位制日誌至磁碟檔案中,0表示不同步,任何正數值都表示對二進位制每多少次寫操作之後同步一次。當autocommit的值為1時,每條語句的執行都會引起二進位制日誌同步,否則,每個事務的提交會引起二進位制日誌同步。

max_binlog_cache_size= {4096 .. 18446744073709547520}

二進定日誌快取空間大小,5.5.9及以後的版本僅應用於事務快取,其上限由max_binlog_stmt_cache_size決定。

max_binlog_stmt_cache_size= {4096 .. 18446744073709547520} 

二進定日誌快取空間大小,5.5.9及以後的版本僅應用於事務快取。

expire_log_days ={0..99}

設定二進位制日誌的過期天數,超出此天數的二進位制日誌檔案將被自動刪除。預設為0,表示不啟用過期自動刪除功能。如果啟用此功能,自動刪除工作通常發生在MySQL啟動時或FLUSH日誌時。


二進位制日誌主要有以下幾個作用:
(1)恢復(recovery):某些資料的恢復需要二進位制日誌,例如,在一個資料庫全備檔案恢復後,使用者可以通過二進位制日誌進行point-in-time的恢復。
(2)複製(recovery):其原理和恢復類似,通過複製和執行二進位制日誌使一臺遠端的MySql資料庫(一般稱為slave或standby)與一臺MySql資料庫(一般稱為master或primary)進行實時同步。
(3)審計(audit):使用者可以通過二進位制日誌中的資訊來進行審計,判斷是否有對資料庫進行注入的攻擊。

二進位制日誌定義方式:

其一、log_bin可以直接定義為檔案路徑,也可以為ON|OFF。
其二、通過編輯my.cnf中的log-bin選項可以開啟二進位制日誌;
形式如下:

[root@stu18 ~]#my.cnf
[mysqld]
log-bin [=DIR \ [filename]]

其中,DIR引數指定二進位制檔案的儲存路徑;filename引數指定二級制檔案的檔名,其形式為filename.number,number的形式為000001、000002等。每次重啟mysql服務或執行mysql> flush logs;都會生成一個新的二進位制日誌檔案,這些日誌檔案的number會不斷地遞增。除了生成上述的檔案外還會生成一個名為filename.index的檔案。這個檔案中儲存所有二進位制日誌檔案的清單又稱為二進位制檔案的索引。

通過檢視log_bin發現沒有開啟二進位制日誌:

mysql> show variables like 'log_bin';    
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | OFF   |
+---------------+-------+
1 row in set (0.00 sec)

對檔案/etc/mysql/my.cnf進行編輯,將log_bin的註釋去掉,如下圖
這裡寫圖片描述

重新啟動mysql伺服器:

root@TryHard:~# mysqld start
170317 18:52:16 [Warning] Using unique option prefix key_buffer instead of key_buffer_size is deprecated and will be removed in a future release. Please use the full name instead.
170317 18:52:16 [Note] mysqld (mysqld 5.5.49-0ubuntu0.14.04.1-log) starting as process 31651 ...

可以看到已經啟動了mysql伺服器:
這裡寫圖片描述

重新檢視log_bin:

mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)

以下配置檔案的引數影響著二進位制日誌檔案的資訊和行為:
max_binlog_size, binlog_cache_size, sync_binlog, binlog-do-db, binlog-ignore-db, log-slave-update, binlog_format.

引數max_binlog_size指定了單個二進位制日誌檔案的最大值,如果超過該值,則產生新的二進位制日誌檔案,記錄到.index檔案。bin_log.index為二進位制的索引檔案,用來儲存之前產生的二進位制日誌序號。

mysql> show variables like 'max_binlog_size';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| max_binlog_size | 104857600 |
+-----------------+-----------+
1 row in set (0.00 sec)

當使用事務的表儲存引擎(如InnoDB儲存引擎)時,所有未提交的二進位制日誌會被記錄到一個快取中,等該事務提交時直接將緩衝中的二進位制日誌寫入二進位制日誌檔案,而該緩衝的大小由binlog_cache_size決定,預設大小為32K。

mysql> show variables like 'binlog_cache_size';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| binlog_cache_size | 32768 |
+-------------------+-------+
1 row in set (0.00 sec)

binlog_cache_size是基於會話的,也就是說,當一個執行緒開始一個事務時,MySql會自動分配一個大小為binlog_cache_size的快取,因此該值的設定需要相當訊息,不能設定太大。當一個事務的記錄大於設定的binlog_cache_size時,MySql會把緩衝中的日誌寫入一個臨時檔案中,因此該值也不能設定得太小。
通過下面的命令檢視binlog_cache_use,binlog_cache_disk_use的狀態,可以判斷當前binlog_cache_size的設定是否合適。

mysql> show global status like 'binlog_cache%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| Binlog_cache_disk_use | 0     |
| Binlog_cache_use      | 0     |
+-----------------------+-------+
2 rows in set (0.00 sec)

Binlog_cache_use記錄了使用緩衝寫二進位制日誌的次數,Binlog_cache_disk_use記錄了使用臨時檔案寫二進位制日誌的次數。


在預設情況下,二進位制日誌並不是在每次寫的時候同步到磁碟(使用者可以理解為緩衝寫)。因此,當資料庫所在作業系統發生當機時,可能會有最後一部分資料沒有寫入二進位制檔案中,這會給恢復和複製帶來問題。引數sync_binlog=[N]表示每寫緩衝多少次就同步到磁碟。如果將N設為1,即sync_binlog=1表示採用同步磁碟的方式來寫二進位制日誌,這時寫操作不使用作業系統的緩衝來寫二進位制日誌。sync_binlog的預設值為0,如果使用InnoDB儲存引擎進行復制,並且想得到最大的高可用性,建議將該值設定為ON。不過該值為ON時,會對資料庫的IO系統帶來一定的影響。

mysql> show variables like 'sync_binlog'; 
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog   | 0     |
+---------------+-------+
1 row in set (0.00 sec)

即使將sync_binlog設定為1,還是會有一種情況導致問題的發生。當使用InnoDB儲存引擎時,在一個事務發出COMMIT動作之前,由於sync_binlog=1,因此會將二進位制日誌立即寫入磁碟。如果這時已經寫入了二進位制日誌,但是提交還沒有發生,並且此時發生了當機,那麼在MySql資料庫下次啟動時,由於COMMIT操作並沒有發生,這個事務會被回滾掉。但是二進位制日誌已經記錄了該事務資訊,不能被回滾。這個問題可以通過將引數innodb_support_xa設定為1來解決,innodb_support_xa和XA事務有關,它同時也確保了二進位制日誌和InnoDB儲存引擎資料檔案的同步。


引數binlog-do-db和binlog-ignore-db表示需要寫入或忽略寫入哪些庫的日誌。預設為空,表示需要同步所有庫的日誌到二進位制日誌。


如果當前資料庫是複製中的slave角色,則它不會將從master取得並執行的二進位制日誌寫入自己的二進位制日誌檔案中去。如果需要寫入,要設定log-slave-update。如果需要搭建maste=>slave=>slave架構的複製,則必須設定該引數。


引數binlog_format影響了記錄二進位制日誌的格式。

mysql> show variables like 'binlog_format';   
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.00 sec)

在MySql5.1 版本之前,沒有這個引數。所有二進位制檔案的格式都是基於SQL語句(statement)級別的,因此基於這個格式的二進位制日誌檔案的複製(Replication)和Oracle的邏輯Standby有點相似。同時,對於複製有一定的要求。

MySql5.1開始引入了binlog_format引數,該引數的值為STATMENT,ROW,MIXED。
(1)STATEMENT格式和之前的MySql版本一樣,二進位制日誌檔案記錄的是日誌的邏輯Sql語句。
(2)在ROW格式下,二進位制日誌記錄的不再是簡單的Sql語句了,而是記錄表的行更改情況。如果設定了ROW格式,可以將InnoDB的事務隔離基本設為READ COMMITTED,以便獲得更好的併發性。
(3)在MIXED格式下,MySql預設採用STATEMENT格式進行二進位制日誌檔案的記錄,但是在一些情況下會使用ROW格式,可能的情況有:
1. 表的儲存引起為NDB,這時對錶的DML操作都會以ROW格式記錄。
2. 使用了UUID(),USER(),CURRENT_USER(),FOUND_ROWS(),ROW_COUNT()等不確定函式。
3. 使用了INSERT_DELEY語句;
4. 使用了使用者定義函式(UDF)
5. 使用了臨時表(temporary table)
這裡寫圖片描述

binlog_format是動態引數,因此可以在資料庫執行環境下進行更改。

二進位制日誌檔案的檔案格式為二進位制,不能像錯誤日誌檔案,慢查詢日誌檔案一樣用cat,head,tail等命令來檢視。要檢視二進位制日誌檔案的內容,必須通過MySql提供的工具mysqlbinlog。

3、套接字檔案

在Unix系統下本地連線MySql可以採用UNIX域套接字方式,這種方式需要一個套接字檔案。套接字檔案可以由引數socket控制。

mysql> show variables like 'socket';
+---------------+-----------------------------+
| Variable_name | Value                       |
+---------------+-----------------------------+
| socket        | /var/run/mysqld/mysqld.sock |
+---------------+-----------------------------+
1 row in set (0.01 sec)

4、pid檔案

當MySql例項啟動時,會將自己的程式ID寫入一個檔案中——該檔案就是pid檔案。

mysql> show variables like 'pid_file';
+---------------+----------------------------+
| Variable_name | Value                      |
+---------------+----------------------------+
| pid_file      | /var/run/mysqld/mysqld.pid |
+---------------+----------------------------+
1 row in set (0.00 sec)

5、表結構定義檔案

因為MySql外掛式儲存引擎的體系結構的關係,MySql資料的儲存是根據表進行的,每個表都會有與之對應的檔案。但不論表採用哪種儲存引擎,MySql都有一個以frm為字尾名的檔案,這個檔案記錄了該表的表結構定義。

frm還用來存放檢視的定義,如使用者建立了一個v_a檢視,那麼對應地產生一個v_a.frm檔案,用來記錄檢視的定義,該檔案是文字檔案,可以直接使用cat命令進行檢視。

相關文章