MySQL技術內幕InnoDB儲存引擎 03檔案

2021-08-15 09:52:18 字數 3817 閱讀 6899

當mysql例項啟動時,mysql會先去讀乙個配置引數檔案,用來尋找資料庫的各種檔案所在位置以及指定某些初始化引數,這些引數通常定義了某種記憶體結構有多大等設定。

mysql例項也可以不需要引數檔案,這時所有的引數值取決於編譯mysql時指定的預設值和源**中指定引數的預設值。

引數的值可以在information_schema架構下的global_variables檢視來進行查詢:

select * from global_variables where like 『innodb_buffer%』\g 或 show variables like 『innodb_buffer%』\g

引數可以分為兩類:動態引數和靜態引數

動態引數意味著你可以在mysql例項執行中進行修改;靜態引數說明在整個例項生命週期內都不得進行更改,就好像是唯讀的。可以通過set命令對動態的引數進行修改。

語法為:

set

| [global | session] system_var_name = expr

| [@@global. | @@session. |@@] system_var_name = expr

global和session表明該引數的修改是基於當前會話還是整個例項的生命週期。

set @@global.read_buffer_size = 1048576;

把read_buffer_size全域性值更改為1mb,而當前會話的read_buffer_size的值不會改變。需要注意的是,對變數的全域性值進行了修改,在這次的例項生命週期內都有效,但mysql例項本身並不會對引數檔案中的該值進行修改。也就是說下次啟動時,mysql例項還是會讀取引數檔案。

記錄了影響mysql資料庫的各種型別活動。常見的日誌檔案有錯誤日誌,二進位制日誌,慢查詢日誌,查詢日誌。

對mysql的啟動,執行,關閉過程進行了記錄。mysql dba在遇到問題時首先檢視該檔案。該檔案不但記錄了出錯資訊,也記錄了一些警告或者正確的資訊。預設err結尾。

show variables like 『log_error』;

可以通過錯誤日誌得到一些關於資料庫優化的資訊幫助,而慢查詢能為sql語句的優化帶來很好的幫助。可以設乙個閥值,將執行時間超過該閥值的所有sql語句記錄到慢查詢日誌檔案中。該閥值可以通過引數long_query_time來設定,預設值為10,代表10秒。

預設情況下,mysql資料庫並不啟動慢查詢日誌,需要手工將這個引數設為on,然後啟動。

另乙個和慢查詢日誌有關的是log_queries_not_using_indexes,如果執行的sql語句沒有使用索引,則mysql資料庫同樣會將這條sql語句記錄到慢查詢日誌檔案。首先確保開啟了log_queries_not_using_indexes。

mysqldumpslow命令,用於分析慢查詢日誌的資料。

引數log_output指定了慢查詢輸出的格式,預設為file,你可以將它設為table,然後就可以查詢mysql架構下的slow_log表了。檢視slow_log表的定義會發現,該錶使用的是csv引擎。

記錄了所有對mysql資料庫請求的資訊,不論這些請求是否得到了正確的執行。預設檔名為:主機名.log

記錄了對資料庫執行更改的所有操作,但是不包括select和show這類操作。因為這類操作對資料本身並沒有修改。

二進位制日誌的作用:

1.恢復:某些資料的恢復需要二進位制日誌。

2.複製:通過複製和執行二進位制日誌使得一台遠端的mysql資料庫與一台mysql資料庫進行實時同步。

通過配置引數log-bin[=name]可以啟動二進位制日誌。

bin_log.index為二進位制的索引檔案,用來儲存過往產生的二進位制日誌序號。

二進位制日誌檔案預設情況下並沒有啟動,需要手動指定引數來啟動。

引數max_binlog_size指定了單個二進位制日誌檔案的最大值,如果超過該值,則產生新的二進位制日誌檔案,字尾名+1,並記錄到.index檔案。

當使用事務的表儲存引擎時(如innodb),所有未提交的二進位制日誌都會被記錄到乙個快取中,等該事務提交時直接將緩衝中的二進位制日誌寫入二進位制檔案,而該緩衝的大小由binlog_cache_size決定。binlog_cache_size是基於會話(session)的,也就是說,當乙個執行緒開始乙個事務時,mysql會自動分配乙個大小為binlog_cache_size的快取。

當乙個事務的記錄大於設定的binlog_cache_size時,mysql會把緩衝中的日誌寫入乙個臨時檔案中。

預設情況下,二進位制日誌並不是每次寫的時候同步到磁碟。引數sync_binlog=[n]表示每寫緩衝多少次就同步到磁碟。

當使用sync_binlog為1時,在乙個事務發出commit動作之前,由於sync_binlog為1,因此會將二進位制日誌寫入磁碟。如果這時已經寫入了二進位制日誌,但提交還沒有發生,並在此時發生了宕機,可使用innodb_support_xa設為1來解決。

binlog_format影響了二進位制日誌的格式。innodb儲存引擎的預設事務隔離級別是repeatable read.該引數可設的值有statement, row和mixed。

1.statement,二進位制日誌檔案記錄的是日誌的邏輯sql語句。

2.在row格式下,二進位制日誌記錄的不是簡單的sql語句,而是記錄表的行更改情況。基於row格式的複製可以解決在statement格式下複製的問題。這種情況下,可以將innodb的事務隔離基本設為read commited。

3.mixed格式下,mysql預設採用statement格式進行二進位制日誌檔案的記錄,但在一些情況下會使用row格式,可能的情況:

(1)表的儲存引擎為ndb,這時對錶的dml操作都會以row格式記錄。

(2)使用了uuid(),user(),current_user(),found_rows(),row_count()等不確定函式。

(3)使用了insert delay語句。

(4)使用了使用者定義函式udf。

(5)使用了臨時表。

將引數binlog_format設定為row,這可以為資料庫的恢復和複製帶來更好的可靠性。但這會帶來二進位制檔案的增加,有些語句下row格式下可能需要更大的容量。這是因為,這時mysql資料庫不再將邏輯的sql操作記錄到二進位制日誌中,而是記錄對於每行的更改記錄資訊。

當mysql例項啟動時,會將自己的程序id寫入乙個檔案中——該檔案即為pid檔案。該檔案可由引數pid_file控制。

mysql對於資料的儲存是按照表的,所以每個表都會有與之對應的檔案。不論採用何種儲存引擎,mysql都有乙個以frm為字尾名的檔案,這個檔案記錄了該錶的表結構定義

frm還用來存放試圖的定義,如v_a檢視,那麼會產生乙個v_a.frm用來記錄檢視的定義。

innodb將儲存的資料按表空間進行存放。預設配置下,會有乙個名為ibdata1的檔案。設定innodb_data_file_path引數後,之後對於所有基於innodb儲存引擎的表的資料都會記錄到該檔案內。而通過設定innodb_file_per_table,我們可以將每個基於innodb儲存引擎的表單獨產生乙個表空間,檔名為.ibd.這樣不用將所有資料都存放於預設的表空間中。這些單獨的表空間檔案僅儲存該錶的資料,索引和插入緩衝等資訊,其餘資訊還是存放在預設的表空間中。

當例項或介質失敗時,重做日誌檔案就能派上用場。如資料庫由於所在主機斷電導致例項失敗,innodb儲存引擎會使用重做日誌恢復到斷電前的時刻,以此來保證資料的完整性。

MySQL技術內幕InnoDB儲存引擎

第5章 索引與演算法 p174 217 5.1 innodb儲存引擎索引概述 5.2 二分查詢法 5.3 平衡二叉樹 5.4 b 樹 5.4.1b 樹的插入操作 5.4.2b 樹的刪除操作 了解了一下例子 5.5b 樹索引 p181 195 5.5.1聚集索引 按主鍵建立b 樹索引 5.5.2非聚集...

MySQL技術內幕 InnoDB儲存引擎

第五章 索引與演算法 常用的型別有 all index range ref eq ref const system null 從左到右,效能從差到好 all full table scan,mysql將遍歷全表以找到匹配的行 index full index scan,index與all區別為ind...

MySQL技術內幕 InnoDB儲存引擎 筆記

mysql 體系結構和儲存引擎 資料庫 物理作業系統檔案或其他形式檔案內容的集合 資料庫例項 有資料庫後台程序 執行緒記憶乙個共享記憶體區組成 mysql資料庫在沒有配置檔案的情況下,會按照編譯時的預設引數設定啟動例項 mysql 按照 etc my.cnf etc mysql my.cnf usr...