InnoDB存儲引擎(三)文件

目錄

3.1 參數文件

3.2 日誌文件

3.2.1 錯誤日誌

3.2.2 慢查詢日誌

3.2.3 查詢日誌

3.2.4 二進制日誌

3.3 套接字文件

3.4 pid文件

3.5 表結構定義文件

3.6 InnoDB存儲引擎文件

3.6.1 表空間文件

3.6.2 重做日誌文件


MySQL數據庫和InnoDB存儲引擎表的各種類型文件如下:

  1. 參數文件:告訴MySQL實例啓動時在哪裏可以找到數據庫文件,並且指定某些初始化參數。

  2. 日誌文件:用來記錄MySQL實例對某種條件作出響應時寫入的文件,如錯誤日誌文件、二進制文件、慢查詢日誌文件、查詢日誌文件等。

  3. socket文件:當用UNIX域套接字方式進行連接時需要的文件。

  4. pid文件:MySQL實例的進程ID文件。

  5. MySQL表結構文件:用來存放MySQL表結構定義文件。

  6. 存儲引擎文件:存儲記錄和索引等數據。

3.1 參數文件

MySQL數據庫的參數文件是以文本方式進行存儲的。用戶可以直接通過一些常用的文本編輯器進行參數的修改。

可以把數據庫參數看成是一個鍵/值對。如:innodb_buffer_pool_size=1G。可以通過show varibales查看數據庫中的所有參數,也可以通過like 來過濾參數名。或者通過information_schema下的GLOBAL_VARIABLES視圖來查找。

mysql> show variables like 'innodb_buffer%'\G;
*************************** 1. row ***************************
Variable_name: innodb_buffer_pool_dump_at_shutdown
        Value: OFF
*************************** 2. row ***************************
Variable_name: innodb_buffer_pool_dump_now
        Value: OFF
*************************** 3. row ***************************
Variable_name: innodb_buffer_pool_filename
        Value: ib_buffer_pool
*************************** 4. row ***************************
Variable_name: innodb_buffer_pool_instances
        Value: 8
*************************** 5. row ***************************
Variable_name: innodb_buffer_pool_load_abort
        Value: OFF
*************************** 6. row ***************************
Variable_name: innodb_buffer_pool_load_at_startup
        Value: OFF
*************************** 7. row ***************************
Variable_name: innodb_buffer_pool_load_now
        Value: OFF
*************************** 8. row ***************************
Variable_name: innodb_buffer_pool_size
        Value: 134217728
8 rows in set (0.00 sec)

MySQL數據庫中的參數可以分爲兩類:

  1. 動態(dynamic)參數:可以在MySQL實例運行中進行更改

  2. 靜態(static)參數:在整個實例生命週期都不能更改,就好像是隻讀的

可以通過SET命令對動態的參數值進行修改,語法如下:

SET [global | session] system_var_name = expr
SET [@@global. | @@session.] system_var_name = expr
  • global:參數的修改是基於整個實例的生命週期

  • session:參數的修改是基於當前會話

3.2 日誌文件

日誌文件記錄了影響MySQL數據庫的各種類型活動。常見的日誌文件有:

  1. 錯誤日誌(error log)

  2. 二進制日誌(binlog)

  3. 慢查詢日誌(show query log)

  4. 查詢日誌(log)

這些日誌文件可以幫助DBA對MySQL數據庫的運行狀態進行診斷,從而更好地進行數據庫層面的優化。

3.2.1 錯誤日誌

對MySQL的啓動、運行、關閉過程進行了記錄。該文件不僅記錄了所有的錯誤信息,也記錄了一些警告或正確的信息。可以通過show variables like 'log_error'來定位該文件。默認情況下錯誤文件的文件名爲服務器的主機名。

3.2.2 慢查詢日誌

幫助定位可能存在問題的SQL語句,從而進行SQL語句層面的優化。例如,可以在MySQL啓動時設一個閾值,將運行時間超過該值的所有SQL語句都記錄到慢查詢日誌文件中。該閾值可以通過參數long_query_time來設置,默認值爲10,代表10秒。 只會記錄執行時間大於該閾值的SQL。

mysql>  show variables like 'long_query_time'\G;
*************************** 1. row ***************************
Variable_name: long_query_time
        Value: 10.000000
1 row in set (0.00 sec)

默認情況下,MySQL數據庫並不啓動慢查詢日誌,用戶需要手工將這個參數設置爲ON;

mysql> set global slow_query_log  = 'ON';
Query OK, 0 rows affected (0.02 sec)

mysql> show variables like 'slow_query_log'\G;
*************************** 1. row ***************************
Variable_name: slow_query_log
        Value: ON
1 row in set (0.00 sec)

MySQL 5.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,
  `thread_id` bigint(21) unsigned NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
1 row in set (0.00 sec)

3.2.3 查詢日誌

記錄了所有對MySQL數據庫請求的信息,無論這些請求是否得到了正確的執行。默認文件名:主機名.log

從MySQL 5.1開始,可以將查詢日誌的記錄放到mysql架構下的general_log表中。

mysql> show create table mysql.general_log\G;
*************************** 1. row ***************************
       Table: general_log
Create Table: CREATE TABLE `general_log` (
  `event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `user_host` mediumtext NOT NULL,
  `thread_id` bigint(21) unsigned NOT NULL,
  `server_id` int(10) unsigned NOT NULL,
  `command_type` varchar(64) NOT NULL,
  `argument` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'
1 row in set (0.02 sec)

3.2.4 二進制日誌

記錄了對MySQL數據庫執行更改的所有操作,但是不包括select和show這類操作,因爲這類操作對數據本身並沒有修改。此外,二進制日誌還包括執行數據庫更改操作的時間等其他額外信息。

默認不開啓,需要手動修改配置文件參數來啓動。

bin_log.index爲二進制的索引文件,用來存儲過往產生的二進制日誌序號。如果超過二進制文件的最大值,則產生新的二進制文件,後綴名+1,並記錄到.index文件。

二進制日誌主要有以下幾種作用:

  1. 恢復:某些數據的恢復需要二進制日誌

  2. 複製:通過複製和執行二進制日誌使一臺遠程的MySQL數據庫(一般稱爲slave或standby)與一臺MySQL數據庫(一般稱爲master或primary)進行實時同步

  3. 審計:通過二進制日誌中的信息來進行審計,判斷是否有對數據進行注入的攻擊

二進制日誌的格式有三種,由binlog_format控制:STATEMENT、ROW和MIXED

3.3 套接字文件

在UNIX系統本地連接MySQL可以採用UNIX域套接字方式,這種方式需要一個套接字文件。套接字文件可由參數scoket控制。

mysql> show variables like 'socket'\G;
*************************** 1. row ***************************
Variable_name: socket
        Value: /var/run/mysqld/mysqld.sock
1 row in set (0.00 sec)

3.4 pid文件

當MySQL實例啓動時,會將自己的進程ID寫入一個文件中——該文件即爲 pid文件。該文件可由參數pid_file 控制,默認位於數據庫目錄下,文件名爲主機名.pid。

mysql> show variables like 'pid_file'\G;
*************************** 1. row ***************************
Variable_name: pid_file
        Value: /var/run/mysqld/mysqld.pid
1 row in set (0.00 sec)

3.5 表結構定義文件

因爲MySQL插件式存儲引擎的體系結構的關係,MySQL 數據的存儲是根據表進行的,每個表都會有與之對應的文件。但不論表採用何種存儲引擎,MySQL都有一個以frm爲後綴名的文件,這個文件記錄了該表的表結構定義。

frm還用來存放視圖的定義,如用戶創建了一個v_a視圖,那麼對應地會產生一個v_a.frm 文件,用來記錄視圖的定義,該文件是文本文件,可以直接使用cat命令進行查看。

3.6 InnoDB存儲引擎文件

每個表存儲引擎有自己獨有的文件,這些文件包括重做日誌文件、表空間文件。

3.6.1 表空間文件

InnoDB採用將存儲的數據按表空間(tablespace)進行存放的設計。在默認配置下會有一個初始大小爲10MB,名爲ibdata1的文件。該文件就是默認的表空間文件(tablespace file),用戶可以通過參數innodb data_ file_ path對其進行設置。

若設置了參數innodb_file_per_table,則用戶可以將每個基於InnoDB存儲引擎的表產生一個獨立表空間。獨立表空間的命名規則爲:表名.ibd。這樣就可以不用將所有的數據都存放於默認的表空間中。

這些單獨的表空間文件僅存儲該表的的數據、索引和插入緩衝BITMAP等信息,其餘信息還是存放在默認的表空間中。InnoDB存儲引擎對於文件的存儲方式如下:

表存儲引擎文件

3.6.2 重做日誌文件

在默認情況下,在InnoDB存儲引擎的數據目錄下會有兩個名爲ib_logfile0和ib_logfile1的文件,採用循環寫入的方式運行,它們記錄了對於InnoDB存儲引擎的事務日誌。

當實例或介質失敗(media failure)時,重做日誌文件就能派上用場。例如,數據庫由於所在主機掉電導致實例失敗,InnoDB存儲引擎會使用重做日誌恢復到掉電前的時刻,以此來保證數據的完整性。

重做日誌文件的大小設置對於InnoDB存儲引擎的性能有着非常大的影響。太大,恢復可能需要很長的時間;太小,會頻繁地發生async checkpoint,導致性能的抖動。

重做日誌和二進制日誌的區別

  二進制日誌 重做日誌
層級 記錄所有與MySQL數據庫有關的日誌記錄,包括InnoDB、MyISAM等 只記錄InnoDB存儲引擎本身的事務日誌
記錄內容 記錄的是關於一個事務的具體操作內容 記錄的是關於每個頁的更改的物理情況
寫入時間 僅在事務提交前進行提交,即只寫磁盤一次,無論這時該事務多大 在事務進行的過程中,不斷有重做日誌條目被寫入到重做日誌文件中
寫入方式 日誌可以重加 日誌是循環重複寫的

重做日誌寫入過程如下:寫入重做日誌文件的操作不是直接寫,而是先寫入一個重做日誌緩衝中,然後按照一定的條件順序地寫入日誌文件。

重做日誌寫入過程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章