InnoDB 存儲引擎的文件學習

學習《mysql 技術內幕:InnoDB 存儲引擎》 第三章關於數據庫文件以及 innodb 存儲引擎相關文件介紹,學習心得總結以下:mysql

mysql 文件主要包括參數文件,日誌文件,socket 文件,pid文件,表結構文件,存儲引擎文件。sql

參數文件

mysql 啓動時會讀取配置參數文件,若是找不到文件,會使用默認值和源代碼中指定參數的默認值。數據庫

查看參數的兩種方式:緩存

  • show variables
show varables like "%innodb_use_native_aio%";
複製代碼
  • information_schema.GLOBAL_VARIABLES
select * from GLOBAL_VARIABLES where varable_name like "%innodb_use_native_aio%";
複製代碼

參數分類:bash

  • 動態參數:

在實例運行中能夠修改,可是隻在當前生命週期中有效,若是 mysql 重啓,仍是會從新讀取參數文件。因此若是想要在全部生命週期中有效,必須修改參數文件。服務器

對參數的修改能夠分爲 global 和 session,表示影響的是整個生命週期仍是當前會話。有些參數只能在當前會話中修改,有的參數只能在整個生命週期中修改,有些參數既能夠在當前會話中修改也能夠在整個生命中期中修改。網絡

set @@global.read_buffer_size=104876;
set @@session.read_buffer_size=78929;
select @@session.read_buffer_size;
select @@global.read_buffer_size;
複製代碼
  • 靜態參數:

在整個生命中期中不能夠修改。session

日誌文件

記錄了 Mysql 數據庫各類類型的操做行爲,主要包括錯誤日誌,慢查詢日誌,查詢日誌,二進制日誌。架構

錯誤日誌

不只記錄了全部錯誤信息,還有一些告警和正確的提示信息,方便定位問題。能夠查看參數 log_error 來找到 mysql 錯誤日誌文件的位置異步

show variables like "%log_error%"
複製代碼
慢查詢日誌

能夠經過參數 log_slow_queries 設置是否開啓慢查詢日誌。

主要能夠記錄三種慢查詢 SQL:

  • 查詢時間大於參數 long_query_time 的 SQL
  • 沒有使用索引的查詢,是否記錄取決於 log_queries_not_using_indexes 參數的設置
  • 對邏輯讀取次數大於參數 long_query_io 次數的 SQL 記錄到慢查詢中

慢查詢日誌的輸出格式,由 log_output 格式指定,主要有兩種格式:

  • FILE 若是是文件格式,可使用 mysqldumpslow 命令分析慢查詢日誌
- 查詢執行時間最長的 10 條 SQL 語句
mysqldumpslow -s al -n 10 david.log
複製代碼
  • TABLE:記錄在 mysql 架構下的 slow_log 表中。
查詢日誌

查詢日誌記錄了全部對 MYSQL 數據庫請求的信息,不管這些請求是否獲得正確的執行。經過 general_log 和 general_log_file 參數設置。

二進制日誌

二進制日誌(binary log) 記錄了對 MYSQL 數據庫執行更改的全部操做,可是不包括 SELECT 和 SHOW 類型操做,經過參數 log-bin 參數來開啓,主要用途以下:

  • 恢復數據
  • 複製:經過 binary log 將本數據庫和其它數據庫進行同步
  • 審計:對數據的修改作審計

開啓 binary log 會對性能形成必定的影響,可是這個影響有限,差很少 1% 的降低。

一些關於二進制日誌的配置參數:

  • max_binlog_size:指定了二進制文件的最大值,若是超過該值,則產生新的二進制文件
  • binlog_cache_size:該參數記錄二進制文件緩存的大小
當使用事務時,二進制文件的記錄會被先放入緩存,當事務提交時後面再寫入二進制文件,該參數記錄二進制文件緩存的大小。當超過這個值可是事務沒有被提交,這個時候會把緩存中的值寫入臨時文件。
複製代碼
  • binlog_cache_use:記錄使用緩存寫二進制日誌的次數
  • binlog_cache_disk_use:記錄了使用臨時文件寫二進制日誌的次數
  • sync_binlog:表示二進制文件每次寫緩存多少次被同步到磁盤。
  • binlog_do_db:表示須要寫入哪些庫的二進制文件
  • binlog_ingore_db:忽略哪些庫的二進制文件
  • log_slave_update:是否主動將 master 取得的並執行的二進制日誌寫入 slave 角色中,高可用狀況下,該參數必須開啓
  • innodb_support_xa: 該參數能夠確保二進制日誌與 InnoDb 存儲數據文件的同步,若是不開啓該參數,有些狀況下雖然事務回滾了,可是仍然記錄了二進制文件,會致使數據不一致
  • binlog_format:記錄二進制日誌的格式,5.1 版本引入,動態參數,能夠運行時修改。一共有三種日誌格式:
- STATEMENT
記錄日誌文件執行的邏輯 SQL 語句,可是若是在服務器上運行 rand,uuid 等函數或者使用觸發器,均可能致使主從服務器數據不一致,默認的日誌格式就是 STATEMENT。

- ROW
記錄表的行的更改狀況,不會出現數據不一致狀況,但因爲記錄的是行數據的更改,二進制文件有時候會很大,開啓該參數對於磁盤的開銷和複製的網絡開銷都有必定的成本
- MIXED
採用 STATEMENT 和 ROW 混合的方式記錄日誌,一般狀況下使用 STATEMENT 方式,一些特殊狀況下使用 ROW 方式:
    1) 存儲引擎爲 NDB
    2)使用 UUID,USER,CURRENT_USER,FOUND_ROWS,ROW_COUNT 等不肯定函數
    3)使用了 INSERT DELAY 語句
    4)使用了用戶定義的函數
    5)使用了臨時表
複製代碼

binary log 文件格式二進制的,不能直接查看,必須用工具 mysqlbinlog 命令分析查看

mysqlbinlog --start-position=203 test.000004
複製代碼

socket 文件

在本地鏈接 MYSQL 時使用 UNIX 域套接字方式時會用到的鏈接文件,經過參數 socket 來設置套接字文件的存儲位置

pid 文件

存放 mysql 進程 ID,經過參數 pid_file 來設置 pid 文件存放位置

表結構文件

以 frm 爲後綴名的文件,記錄了相關表和視圖的結構定義。

InnoDB 存儲引擎文件

上面介紹的查詢日誌,二進制日誌等都是 mysql 數據庫自己的問題,和存儲引擎無關,而每一個存儲引擎有本身獨立文件,其中InnoDB 存儲引擎文件包括重作日誌文件和表空間文件:

表空間文件
  • 經過參數 innodb_data_file_path 設置表空間文件的共享空間
  • 經過 innodb_data_per_table 設置是否基於每一個表產生一個獨立的表空間
  • 單獨的表空間只存儲了該表的數據,索引和插入緩存 BITMAP 等信息,其它信息仍然存放在默認共享表空間中。
重作日誌文件
  • 重作日誌文件記錄了 InnoDB 存儲引擎的事務日誌,在發生宕機的狀況下,對事務操做進行恢復操做。
  • 重作日誌文件至少有一個重作日誌文件組,每一個重作日誌文件組至少有 2 個重作日誌文件。
  • 爲了保證高可用性,能夠設置鏡像日誌文件組,將日誌組存儲在不一樣的磁盤上。
  • 重作日誌的寫入不須要 doublewrite,由於寫入是按照一個扇區的大小進行寫入的,是寫入的最小單位,因此能夠保證寫入的可靠性。
  • 重作日誌也有緩存,可是緩存不大,默認爲 8MB,將重作日誌緩存刷新到日誌文件文件的三個條件:
- Master Thread 會每一秒刷新一次
- 每一個事物提交時會將刷新,由 innodb_flush_log_at_trx_commit 參數控制:
    0 表示事務提交時,不寫入重作日誌文件,而是等待 Master Thread 的定時刷新
    1 表示每當事務提交時,就必須同步寫入重作日誌文件,爲了保證 ACID 中的持久性,事務必須設置爲 1。才能保證宕機時能夠恢復
    2 表示重作日誌文件異步寫入磁盤
- 當重作日誌緩存池剩餘空間小於 1/2 時會刷新,重作日誌緩存不能設置過小,不然會致使頻繁的執行 checkpoint 操做,致使性能的抖動。
複製代碼
  • 重作日誌文件幾個相關的參數:
- innodb_log_file_size:指定每一個重作日誌文件的大小
- innodb_log_files_in_group:每一個日誌文件中重作日誌文件的數量
- innodb_mirrored_log_groups:日誌鏡像文件組的數量
- innodb_log_group_home_dir:日誌文件組所在路徑
複製代碼
  • 重作日誌文件和二進制文件的區別:
- 二進制日誌文件記錄全部與 MYSQL 數據庫有關的記錄,而重作日誌文件只記錄了關於 InnoDB 的事務日誌
- 二進制日誌文件記錄的是關於一個事務的具體操做內容,而重作日誌文件記錄了 InnoDB 關於每一個頁的更改的物理狀況
- 二進制日誌文件僅在事務提交前進行提交,而重作日誌文件在事務進行的過程當中,卻有不斷重作日誌條目被寫入
複製代碼

本文涉及到的相關配置參數

  • log_error:錯誤日誌文件所在位置
  • long_query_time:慢查詢日誌閾值,默認是 10 s
  • long_slow_queries:是否開啓慢查詢日誌記錄,默認是 off
  • long_queries_not_using_indexes:是否開啓查詢沒有使用索引時記錄到慢查詢日誌中,默認爲 0
  • long_throttle_queries_not_using_indexes:表示每分鐘允許記錄到慢查詢日誌中未使用索引的 SQL 個數
  • log_output:指定慢查詢日誌的輸出格式,默認是 FILE,能夠將其設置爲 TABLE,就能夠 slow_log 表中查詢了
  • long_query_io:將超過指定邏輯 IO 次數的 SQL 語句記錄到慢查詢日誌中
  • general_log:是否開啓查詢日誌
  • general_log_file:查詢日誌記錄文件
  • log-bin:是否開啓 binary log
  • max_binlog_size:指定了二進制文件的最大值,若是超過該值,則產生新的二進制文件
  • binlog_cache_size:該參數記錄二進制文件緩存的大小
  • binlog_cache_use:記錄使用緩存寫二進制日誌的次數
  • binlog_cache_disk_use:記錄了使用臨時文件寫二進制日誌的次數
  • sync_binlog:表示二進制文件每次寫緩存多少次被同步到磁盤。
  • binlog_do_db:表示須要寫入哪些庫的二進制文件
  • binlog_ingore_db:忽略哪些庫的二進制文件
  • log_slave_update:是否主動將 master 取得的並執行的二進制日誌寫入 slave 角色中,高可用狀況下,該參數必須開啓
  • innodb_support_xa: 該參數能夠確保二進制日誌與 InnoDb 存儲數據文件的同步
  • binlog_format:記錄二進制日誌的格式,5.1 版本引入,動態參數,能夠運行時修改。
  • socket:套接字文件的存儲位置
  • pid_file:pid 文件存放位置
  • innodb_data_file_path:定義 innodb 表空間文件位置
  • innodb_file_per_table:設置是否每一個表都會產生一個獨立的表空間
  • innodb_flush_log_at_trx_commit:是否在事務提交時將重作日誌緩存文件寫入磁盤文件
  • innodb_log_file_size:指定每一個重作日誌文件的大小
  • innodb_log_files_in_group:每一個日誌文件中重作日誌文件的數量
  • innodb_mirrored_log_groups:重作日誌鏡像文件組的數量
  • innodb_log_group_home_dir:重作日誌文件組所在路徑
相關文章
相關標籤/搜索