mysql引數調優

2021-06-16 16:18:43 字數 4977 閱讀 7583

l  max_connect_errors

max_connect_errors預設值為10,也即mysqld執行緒沒重新啟動過,一台物理伺服器只要連線 異常中斷累計超過10次,就再也無法連線上mysqld服務,為此建議大家設定此值至少大於等於10w; 若異常中斷累計超過引數設定的值,有二種解決辦法,執行命令:flush hosts;或者重新啟動mysqld服務;

l  interactive_timeout  and wait_timeout

u  interactive_timeout

處於互動狀態連線的活動被伺服器端強制關閉,而等待的時間,單位:秒;

u  wait_timeout

與伺服器端無互動狀態的連線,直到被伺服器端強制關閉而等待的時間,此引數只對基於tcp/ip或基於 socket通訊協議建立的連線才有效,單位:秒

u  推薦設定

interactive_timeout = 172800

wait_timeout  = 172800

l  transaction-isolation  and binlog-format

u  transaction-isolation

可供設定的值:read-uncommitted、read-committed、repeatable-read、serializable,預設的值為: repeatable-read,事務隔離級別設定的不同,對二進位制日誌登記格式影響非常大,詳細資訊可見文章解讀mysql事務的隔離級別和日誌登記模式選擇技巧;

u  binlog-format

複製的模式,可供設定的值:statement、row、mixed(注:5.0.*只有命令列式複製),5.1.*版本預設設定:mixed;

u  推薦配置

①   唯讀為主的業務應用場景

transaction-isolation =  read-committed

binlog-format  = mixed            #5.1.*版本,5.0.*只能設定為 statement

①   非唯讀為主的業務應用場景

transaction-isolation = repeatabled-read

binlog-format  = mixed            #5.1.*版本,5.0.*只能設定為 statement

l  skip_external_locking

外部鎖,也即作業系統所實施的鎖,只對myisam引擎有效,且容易造成死鎖發生,為此我們一律禁用;

l  innodb_adaptive_hash_index

innodb引擎會根據資料的訪問頻繁度,把錶的資料逐漸緩到記憶體,若是一張表的資料大量快取在 記憶體中,則使用雜湊索引(注:hash index)會更高效。innodb內有hash index機制,監控資料的訪 問情況,可以自動建立和維護乙個hash index,以提供訪問效率,減少記憶體的使用;

l  innodb_max_dirty_pages_pct

innodb主線程直接更新innodb_buffer_pool_size中存在的資料,並且不實時刷回磁碟,而是等待 相關的處罰事件發生,則允許快取空間的資料量不實時刷回磁碟的最大百分比。比例設定較小,有利於 減少mysqld服務出現問題的時候恢復時間,缺點則是需要更多的物理i/o,為此我們必須根據業務特點 和可承受範圍進行乙個折中,一般範圍建議設定為5%~90%,像我們sns遊戲行業的寫非常厲害,綜合 各方面因素,設定為20%;

l  innodb_commit_concurrency

含義:同一時刻,允許多少個執行緒同時提交innodb事務,預設值為0,範圍0-1000。

0      — 允許任意數量的事務在同一時間點提交;

n>0  — 允許n個事務在同一時間點提交;

注意事項:

①   mysqld提供服務時,不許把 innodb_commit_concurrency 的值從0改為非0,或非0的值改為0;

②   mysqld提供時,允許把 innodb_commit_concurrency 的值n>0改為m,且m>0;

l  innodb_concurrency_tickets

含義:同一時刻,能訪問innodb引擎資料的執行緒數,預設值為500,範圍1-4294967295。

補充說明:當訪問innodb引擎資料的執行緒數達到設定的上線,執行緒將會被放到佇列中,等待其他執行緒釋放ticket。

建議:mysql資料庫服務最大執行緒連線數引數max_connections,一般情況下都會設定在128-1024的範圍,再結合實際業務可能的最大事務併發度,innodb_concurrency_tickets保持預設值一般情況下足夠。

l  innodb_fast_shutdown  and innodb_force_recovery

innodb_fast_shutdown:

含義:設定innodb引擎關閉的方式,預設值為:1,正常關閉的狀態;

0         —  mysqld服務關閉前,先進行資料完全的清理和插入緩衝區的合併操作,若是髒資料較多或者伺服器效能等因素,會導致此過程需要數分鐘或者更長時間;

1          — 正常關閉mysqld服務,針對innodb引擎不做任何其他的操作;

2  — 若是mysqld出現崩潰,立即刷事務日誌到磁碟上並且冷關閉mysqld服務;沒有提交的事務將會丟失,但是再啟動mysqld服務的時候會進行事務回滾恢復

innodb_force_recovery:

mysqld服務出現崩潰之後,innodb引擎進行回滾的模式,預設值為0,可設定的值0~6;

只有在需要從錯誤狀態的資料庫進行資料備份時,才建議設定innodb_force_recovery的值大於0。 若是把此引數作為安全選項,也可以把引數的值設定大於0,防止innodb引擎的資料變更,設定不同值的作用:

0 — 正常的關閉和啟動,不會做任何強迫恢復操作;

1 — 跳過錯誤頁,讓mysqld服務繼續執行。跳過錯誤索引記錄和儲存頁,嘗試用

select *  inot outfile 『../filename』 from tablename;方式,完成資料備份;

2 — 阻止innodb的主線程執行。清理操作時出現mysqld服務崩潰,則會阻止資料恢復操作;

3 —  恢復的時候,不進行事務回滾;

4 — 阻止insert緩衝區的合併操作。不做合併操作,為防止出現mysqld服務崩潰。不計算表的統計資訊

5 — mysqld服務啟動的時候不檢查回滾日誌:innodb引擎對待每個不確定的事務就像提交的事務一樣;

6 — 不做事務日誌前滾恢復操作;

innodb_fast_shutdown = 1

#若是機房條件較好可設定為0(雙路電源、ups、raid卡電池和供電系統穩定性)

innodb_force_recovery =0

#至於出問題的時候,設定為何值,要視出錯的原因和程度,對資料後續做的操作

l  innodb_additional_mem_pool_size

含義:開闢一片記憶體用於快取innodb引擎的資料字典資訊和內部資料結構(比如:自適應hash索引結構);

預設值:build-in版本預設值為:1m;plugin-innodb版本預設值為:8m;

l  innodb_buffer_pool_size

含義:開闢一片記憶體用於快取innodb引擎表的資料和索引;

預設值:歷史預設值為:8m,現在版本預設值為:128m;

引數最大值:受限於cpu的架構,支援32位還是支援64位,另外還受限於作業系統為32位還是64位;

innodb_buffer_pool_size的值設定合適,會節約訪問表物件中資料的物理io。官方手冊上建議專用的資料庫伺服器,可考慮設定為物理記憶體總量的80%,但是個人建議要看物理伺服器的物理記憶體總量,以及考慮: 是否只使用innodb引擎、mysqld內部管理占用的記憶體、最大執行緒連線數和臨時表等因素,官方提供的80%值作為乙個參考,舉而個例子方便大家作決定(前提:物理伺服器為mysqld服務專用,且只用innodb引擎,假設資料量遠大於物理記憶體):

1).記憶體配置:24g    則 innodb_buffer_pool_size=18g

1).記憶體配置:32g    則 innodb_buffer_pool_size=24g

出現下列哪些情況,則可以考慮減小innodb_buffer_pool_size的值:

1).出現物理記憶體的競爭,可能導致作業系統的分頁;

2).innodb預分配額外的記憶體給緩衝區和結構管理,當分配的總記憶體量超過innodb_buffer_pool_size值的10%;

3).位址空間要求必須為連續的,在windows系統有乙個嚴重問題,dll需要載入在特定的位址空間;

4).初始化緩衝區的時間消耗,與緩衝區的大小成正比。官方提供的資料 linux x86 64位系統 初始化 innodb_buffer_pool_size=10g 大概需要6秒鐘;

l  innodb_flush_log_at_trx_commit  and  sync_binlog

innodb_flush_log_at_trx_commit = n:

n=0  – 每隔一秒,把事務日誌快取區的資料寫到日誌檔案中,以及把日誌檔案的資料重新整理到磁碟上;

n=1  – 每個事務提交時候,把事務日誌從快取區寫到日誌檔案中,並且重新整理日誌檔案的資料到磁碟上;

n=2  – 每事務提交的時候,把事務日誌資料從快取區寫到日誌檔案中;每隔一秒,重新整理一次日誌檔案,但不一定重新整理到磁碟上,而是取決於作業系統的排程;

sync_binlog =  n:

n>0  — 每向二進位制日誌檔案寫入n條sql或n個事務後,則把二進位制日誌檔案的資料重新整理到磁碟上;

n=0  — 不主動重新整理二進位制日誌檔案的資料到磁碟上,而是由作業系統決定;

n=1,1  — 適合資料安全性要求非常高,而且磁碟io寫能力足夠支援業務,比如充值消費系統;

n=1,0  — 適合資料安全性要求高,磁碟io寫能力支援業務不富餘,允許備庫落後或無複製;

n=2,0或2,m(0④   業務型別

sort_buffer_size,read_buffer_size,read_rnd_buffer_size,join_buffer_size

MySQL引數調優

l 通用類 key buffer size 含義 用於索引塊的緩衝區大小,增加它可得到更好處理的索引 對所有讀和多重寫 影響 對於myisam 表的影響不是很大,myisam 會使用系統的快取來儲存資料,所以大量使用 myisam 表的機器記憶體很快就會耗盡。但是,如果你將該值設得過大 例如,大於總...

mysql引數調優

優化之前我們需要知道什麼 業務相關的情況 mysql相關的配置 伺服器上需要關注那些 作業系統版本 是否為穩定版 cpu 網絡卡節電模式 建議資料庫應用的伺服器,關閉節電模式 伺服器numa設定 raid卡快取 磁碟排程策略 write back 回寫 宕機的話cache中資料,如果沒有刷入磁碟,可...

MySQL引數調優

l通用類 key buffer size 含義 用於索引塊的緩衝區大小,增加它可得到更好處理的索引 對所有讀和多重寫 影響 對於myisam表的影響不是很大,myisam會使用系統的快取來儲存資料,所以大量使用myisam表的機器記憶體很快就會耗盡。但是,如果你將該值設得過大 例如,大於總記憶體的5...