mysql5.6.20配置文件my.cnf參數詳解

服務器爲硬件dell-R710,硬盤爲雙SSD硬盤130G,服務器有兩顆CPU,單顆cpu爲12核,服務器在安裝系統時CPU開啓了超線程。邏輯cpu爲48核。

此服務器爲單純的mysql服務器,此配置文件的參數主要是供筆者平時優化my.cnf作爲參考。廣大讀者切勿直接套用,出現任何問題與筆者無關。

配置文件詳細參數 介紹:

[mysqld]

back_log = 2000

此參數默認是:5.6.6以後的版本此參數需要設置此數值:

MySQL能暫存的連接數量。當主要MySQL線程在一個很短時間內得到非常多的連接請求,這就起作用。如果MySQL的連接數據達到max_connections時,新來的請求將會被存在堆棧中,以等待某一連接釋放資源,該堆棧的數量即back_log,如果等待連接的數量超過back_log,將不被授予連接資源。


back_log值指出在MySQL暫時停止回答新請求之前的短時間內有多少個請求可以被存在堆棧中。只有如果期望在一個短時間內有很多連接,你需要增加它,換句話說,這值對到來的TCP/IP連接的偵聽隊列的大小。


在mysql中back_log的設置取決於操作系統,在Linux下這個參數的值不能大於系統參數tcp_max_syn_backlog的值。通過以下命令可以查看tcp_max_syn_backlog的當前值 cat /proc/sys/net/ipv4/tcp_max_syn_backlog。

官網建議不超過900


basedir = /usr/local/mysql

binlog-format = MIXED

character_set_server = utf8

datadir = /data/mysql/data

event_scheduler = ON

開啓mysql計劃任務:參考資料https://yq.aliyun.com/ziliao/65065

expire_logs_days = 1

innodb_autoinc_lock_mode = 1

參數參考:http://www.cnblogs.com/JiangLe/p/6362770.html

innodb_buffer_pool_size = 1073741824

當我們使用InnoDB存儲引擎的時候,innodb_buffer_pool_size 參數可能是影響我們性能的最爲關鍵的一個參數了,他用來設置用於緩存 InnoDB 索引及數據塊的內存區域大小,類似於 MyISAM 存儲引擎的 key_buffer_size 參數,當然,可能更像是 Oracle 的 db_cache_size。簡單來說,當我們操作一個 InnoDB 表的時候,返回的所有數據或者去數據過程中用到的任何一個索引塊,都會在這個內存區域中走一遭。

和key_buffer_size 對於 MyISAM 引擎一樣,innodb_buffer_pool_size 設置了 InnoDB 存儲引擎需求最大的一塊內存區域的大小,直接關係到 InnoDB存儲引擎的性能,所以如果我們有足夠的內存,儘可將該參數設置到足夠打,將儘可能多的 InnoDB 的索引及數據都放入到該緩存區域中,直至全部。

我們可以通過 (Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests * 100% 計算緩存命中率,並根據命中率來調整 innodb_buffer_pool_size 參數大小進行優化。

對於單獨的MySQL數據庫服務器,最大可以把該值設置成物理內存的80%。

  這個參數和MyISAM的key_buffer_size有相似之處,但也是有差別的。這個參數主要緩存innodb表的索引,數據,插入數據時的緩衝。爲Innodb加速優化首要參數。

  該參數分配內存的原則:這個參數默認分配只有8M,可以說是非常小的一個值。如果是一個專用DB服務器,那麼他可以佔到內存的70%-80%。這個參數不能動態更改,所以分配需多考慮。分配過大,會使Swap佔用過多,致使Mysql的查詢特慢。如果你的數據比較小,那麼可分配是你的數據大小+10%左右做爲這個參數的值。例如:數據大小爲50M,那麼給這個值分配innodb_buffer_pool_size=64M

設置方法:

innodb_buffer_pool_size=4G

這個參數分配值的使用情況可以根據show innodb status\G;中的

----------------------

BUFFER POOL AND MEMORY

----------------------

Total memory allocated 4668764894; 

去確認使用情況。

innodb_additional_mem_pool:16M

作用:用來存放Innodb的內部目錄

這個值不用分配太大,系統可以自動調。不用設置太高。通常比較大數據設置16M夠用了,如果表比較多,可以適當的增大。如果這個值自動增加,會在error log有中顯示的。

innodb_data_file_path = ibdata1:500M:autoextend

innodb_data_home_dir = /data/mysql/data

innodb_file_per_table = 1

線上最好開啓獨立表空間

參數解釋http://www.ttlsa.com/mysql/innodb-innodb_file_per_table/


innodb_flush_log_at_trx_commit = 2

主要控制了innodb將log buffer中的數據寫入日誌文件並flush磁盤的時間點,取值分別爲0、1、2三個。0,表示當事務提交時,不做日誌寫入操作,而是每秒鐘將log buffer中的數據寫入日誌文件並flush磁盤一次;1,則在每秒鐘或是每次事物的提交都會引起日誌文件寫入、flush磁盤的操作,確保了事務的ACID;設置爲2,每次事務提交引起寫入日誌文件的動作,但每秒鐘完成一次flush磁盤操作。

實際測試發現,該值對插入數據的速度影響非常大,設置爲2時插入10000條記錄只需要2秒,設置爲0時只需要1秒,而設置爲1時則需要229秒。因此,MySQL手冊也建議儘量將插入操作合併成一個事務,這樣可以大幅提高速度。

根據MySQL手冊,在允許丟失最近部分事務的危險的前提下,可以把該值設爲0或2。

innodb_flush_log_at_timeout:參考地址:http://www.xuchanggang.cn/archives/567.html



innodb_flush_method = O_DIRECT

參數意義參考地址:

http://blog.csdn.net/gua___gua/article/details/44916207

通常來說,linux環境下具有raid控制器和write-back寫策略,o_direct是比較好的選擇

有數據表明,如果是大量隨機寫入操作,O_DIRECT會提升效率。但是順序寫入和讀取效率都會降低。所以使用O_DIRECT需要謹慎。

參考地址:http://www.orczhou.com/index.php/2009/08/innodb_flush_method-file-io/


innodb_io_capacity = 2000

參考地址:http://wubx.net/innodb-io-optimize-conf/

innodb_log_buffer_size = 8388608

作用:事務在內存中的緩衝。

分配原則:控制在2-8M.這個值不用太多的。他裏面的內存一般一秒鐘寫到磁盤一次。具體寫入方式和你的事務提交方式有關。在Oracle等數據庫瞭解這個,一般最大指定爲3M比較合適。

參考:Innodb_os_log_written(show global status 可以拿到)

如果這個值增長過快,可以適當的增加innodb_log_buffer_size

另外如果你需要處理大理的TEXT,或是BLOB字段,可以考慮增加這個參數的值。

設置方法:

innodb_log_buffer_size=8M

 此參數確定些日誌文件所用的內存大小,以M爲單位。緩衝區更大能提高性能,但意外的故障將會丟失數據。MySQL開發人員建議設置爲1-8M之間  

參考地址:http://imysql.cn/node/609

 

innodb_log_files_in_group = 3

innodb_log_files_in_group

作用:指定你有幾個日值組。

分配原則: 一般我們可以用2-3個日值組。默認爲兩個。

innodb_log_group_home_dir = /data/mysql/data

innodb_max_dirty_pages_pct = 50

參考:http://imysql.cn/node/609

作用:控制Innodb的髒頁在緩衝中在那個百分比之下,值在範圍1-100,默認爲90.

這個參數的另一個用處:當Innodb的內存分配過大,致使Swap佔用嚴重時,可以適當的減小調整這個值,使達到Swap空間釋放出來。建義:這個值最大在90%,最小在15%。太大,緩存中每次更新需要致換數據頁太多,太小,放的數據頁太小,更新操作太慢。

設置方法:

innodb_max_dirty_pages_pct=90

動態更改需要有Super權限:

set global innodb_max_dirty_pages_pct=50;


innodb_open_files = 1024

作用:限制Innodb能打開的表的數據。

分配原則:如果庫裏的表特別多的情況,請增加這個。這個值默認是300。

設置方法:

innodb_open_files=800 

請適當的增加table_cache


innodb_file_io_threads=4 

innodb_file_io_threads

作用:文件讀寫IO數,這個參數只在Windows上起作用。在LINUX上只會等於4

設置方法:

假如CPU是2顆8核的,那麼可以設置:

innodb_read_io_threads = 8

innodb_write_io_threads = 8

如果數據庫的讀操作比寫操作多,那麼可以設置:

innodb_read_io_threads = 10

innodb_write_io_threads = 6


參數意義參考:http://www.cnblogs.com/xinysu/p/6439715.html

http://ourmysql.com/archives/1290


innodb_thread_concurrency = 20

innodb_lock_wait_timeout = 10

innodb_buffer_pool_load_at_startup = 1

默認爲關閉OFF。如果開啓該參數,啓動MySQL服務時,MySQL將本地熱數據加載到InnoDB緩衝池中。

innodb_buffer_pool_dump_at_shutdown = 1

默認爲關閉OFF。如果開啓該參數,停止MySQL服務時,InnoDB將InnoDB緩衝池中的熱數據保存到本地硬盤。

如果一臺高負荷的機器重啓後,內存中大量的熱數據被清空,此時就會重新從磁盤加載到Buffer_Pool緩衝池裏,這樣當高峯期間,性能就會變得很差,連接數就會很高。

在MySQL5.6裏,一個新特性避免的這種問題的出現。

只有在正常關閉MySQL服務,或者pkill mysql時,會把熱數據dump到內存。機器宕機或者pkill -9 mysql,是不會dump。

參考地址:httphttp://gfsunny.blog.51cto.com/990565/1553591

key_buffer_size = 3221225472

參數參考:

key_buffer_size

key_buffer_size指定索引緩衝區的大小,它決定索引處理的速度,尤其是索引讀的速度。通過檢查狀態值Key_read_requests和Key_reads,可以知道key_buffer_size設置是否合理。比例key_reads / key_read_requests應該儘可能的低,至少是1:100,1:1000更好(上述狀態值可以使用SHOW STATUS LIKE ‘key_read%’獲得)。


key_buffer_size只對MyISAM表起作用。即使你不使用MyISAM表,但是內部的臨時磁盤表是MyISAM表,也要使用該值。可以使用檢查狀態值created_tmp_disk_tables得知詳情。


innodb_log_file_size = 1G

# 此參數確定數據日誌文件的大小,更大的設置可以提高性能,但也會增加恢復故障數據庫所需的時間  

參考地址:http://www.itpub.net/thread-1850609-1-1.html

local_infile = 1

要支持命令load data local infile,應當在/etc/mysql/my.cnf中添加這樣的設置

否則,mysql服務會提示錯誤:

ERROR 1148 (42000): The used command is not allowed with this MySQL version.

log-bin = /data/mysql/binlog/mysql-bin

log_bin_trust_function_creators = 1

參數參考:http://www.cnblogs.com/flying607/p/5576584.html

log_output = FILE

long_query_time = 1

log-error = /data/mysql/log/error.log

max_allowed_packet = 134217728

max_connect_errors = 1000000

max_connections = 2000


max_connections:MySql的最大連接數,如果服務器的併發連接請求量比較大,建議調高此值,以增加並行連接數量,當然這建立在機器能支撐的情況下,因爲如果連接數越多,MySql會爲每個連接提供連接緩衝區,就會開銷越多的內存,連接數太大,服務器消耗的內存越多,以至於影響服務器性能,所以要根據服務器的配置適當調整該值,不能盲目提高設值。可以過'conn%'通配符查看當前狀態的連接數量,以定奪該值的大小。

show variables like 'max_connections' 最大連接數,show status like 'max_used_connections'響應的連接數。

max_used_connections / max_connections * 100%(理想值≈ 85%),如果max_used_connections跟max_connections相同,那麼就是max_connections設置過低或者超過服務器負載上限了,低於10%則設置過大


myisam_sort_buffer_size = 33554432

myisam_recover = 1

join_buffer_size = 8388608

tmp_table_size = 33554432

net_buffer_length = 8192

每個客戶端線程都與一個connection連接緩衝區和結果緩衝區相關聯,默認值是16K。兩者最初的大小都是net_buffer_length,

但是根據需要會動態的擴大到max_allowed_packet設置的大小,結果緩衝區在每一個sql語句執行後都會縮小到設置的net_buffer_length


performance_schema = 1

performance_schema_max_table_instances = 200

能夠有效降低內存佔用。

pid-file = /data/mysql/mysqld.pid

port = 3306

query_cache_size = 0

使用查詢緩衝,MySQL將查詢結果存放在緩衝區中,今後對於同樣的SELECT語句(區分大小寫),將直接從緩衝區中讀取結果。

通過檢查狀態值Qcache_*,可以知道query_cache_size設置是否合理(上述狀態值可以使用SHOW STATUS LIKE ‘Qcache%’獲得)。如果Qcache_lowmem_prunes的值非常大,則表明經常出現緩衝不夠的情況,如果Qcache_hits的值也非常大,則表明查詢緩衝使用非常頻繁,此時需要增加緩衝大小;如果Qcache_hits的值不大,則表明你的查詢重複率很低,這種情況下使用查詢緩衝反而會影響效率,那麼可以考慮不用查詢緩衝。此外,在SELECT語句中加入SQL_NO_CACHE可以明確表示不使用查詢緩衝。


與查詢緩衝有關的參數還有query_cache_type、query_cache_limit、query_cache_min_res_unit。

query_cache_type指定是否使用查詢緩衝,可以設置爲0、1、2,該變量是SESSION級的變量。

query_cache_limit指定單個查詢能夠使用的緩衝區大小,缺省爲1M。

query_cache_min_res_unit是在4.1版本以後引入的,它指定分配緩衝區空間的最小單位,缺省爲4K。檢查狀態值Qcache_free_blocks,如果該值非常大,則表明緩衝區中碎片很多,這就表明查詢結果都比較小,此時需要減小query_cache_min_res_unit。

query_cache_type = 0

read_buffer_size = 20971520

# MySQL讀入緩衝區大小。對錶進行順序掃描的請求將分配一個讀入緩衝區,MySQL會爲它分配一段內存緩衝區。read_buffer_size變量控制這一緩衝區的大小。  

# 如果對錶的順序掃描請求非常頻繁,並且你認爲頻繁掃描進行得太慢,可以通過增加該變量值以及內存緩衝區大小提高其性能  

read_rnd_buffer_size = 16M

# MySQL的隨機讀緩衝區大小。當按任意順序讀取行時(例如,按照排序順序),將分配一個隨機讀緩存區。進行排序查詢時,  

# MySQL會首先掃描一遍該緩衝,以避免磁盤搜索,提高查詢速度,如果需要排序大量數據,可適當調高該值。但MySQL會爲每個客戶連接發放該緩衝空間,所以應儘量適當設置該值,以避免內存開銷過大 


max_heap_table_size = 33554432

定義了用戶可以創建的內存表(memory table)的大小。這個值用來計算內存表的最大行數值。這個變量支持動態改變  

tmp_table_size = 16M  

# MySQL的heap(堆積)表緩衝大小。所有聯合在一個DML指令內完成,並且大多數聯合甚至可以不用臨時表即可以完成。  

# 大多數臨時表是基於內存的(HEAP)表。具有大的記錄長度的臨時表 (所有列的長度的和)或包含BLOB列的表存儲在硬盤上。  

# 如果某個內部heap(堆積)表大小超過tmp_table_size,MySQL可以根據需要自動將內存中的heap表改爲基於硬盤的MyISAM表。還可以通過設置tmp_table_size選項來增加臨時表的大小。也就是說,如果調高該值,MySQL同時將增加heap表的大小,可達到提高聯接查詢速度的效果  

bulk_insert_buffer_size = 134217728

和key_buffer_size一樣,這個參數同樣也僅作用於使用 MyISAM存儲引擎,用來緩存批量插入數據的時候臨時緩存寫入數據。

#relay-log = /data/mysql/log/mysql-relay.log


secure-file-priv = /data/mysql/tmp

server-id = 1131053306

skip-slave-start

slave複製進程不隨mysql啓動而啓動skip-slave-start參數

參考地址:http://www.2cto.com/database/201307/230420.html

skip_name_resolve

slave-load-tmpdir = /data/mysql/tmp

slow-query-log-file = /data/mysql/log/mysql-slow.log

slow_query_log = 1

socket = /data/mysql/mysqld.sock

sort_buffer_size = 2097152(2M)

每個需要進行排序的線程分配該大小的一個緩衝區。增加這值加速ORDER BY或GROUP BY操作。默認數值是2097144(2M),可改爲16777208 (16M)。

table_open_cache = 128

參數介紹參考地址:http://www.cnblogs.com/fjping0606/p/6531292.html

table_open_cache指定表高速緩存的大小。每當MySQL訪問一個表時,如果在表緩衝區中還有空間,該表就被打開並放入其中,這樣可以更快地訪問表內容。

通過檢查峯值時間的狀態值Open_tables和Opened_tables,可以決定是否需要增加table_open_cache的值。

如果你發現open_tables等於table_open_cache,並且opened_tables在不斷增長,那麼你就需要增加table_open_cache的值了(上述狀態值可通過SHOW GLOBAL STATUS LIKE ‘Open%tables’獲得)。

注意,不能盲目地把table_open_cache設置成很大的值,設置太大超過了shell的文件描述符(通過ulimit -n查看),造成文件描述符不足,從而造成性能不穩定或者連接失敗。

mysql> show variables like '%table_open_cache%';

+----------------------------+-------+

| Variable_name              | Value |

+----------------------------+-------+

| table_open_cache           | 128   |

| table_open_cache_instances | 1     |

+----------------------------+-------+

mysql> SHOW  GLOBAL STATUS LIKE 'Open%tables';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| Open_tables   | 79    |

| Opened_tables | 112   |

+---------------+-------+

2 rows in set (0.00 sec)

發現open_tables爲79,table_open_cache爲128

比較適合的值:

Open_tables / Opened_tables >= 0.85

Open_tables / table_open_cache <= 0.95


thread_cache_size = 50

tmpdir = /data/mysql/tmp

user = mysql

wait_timeout = 2880000

transaction_isolation=read-committed

事務隔離級別

long_query_time=1

sync_binlog=0

innodb_flush_log_at_trx_commit=0

分配原則:這個參數只有3個值,0,1,2請確認一下自已能接受的級別。默認爲1,主庫請不要更改了。

[mysqld_safe]

log-error = /data/mysql/log/error.log

pid-file = /data/mysql/mysqld.pid


參考地址:http://blog.csdn.net/tonyxf121/article/details/7985517

http://blog.csdn.net/qq_22929803/article/details/51237056

參考地址:老葉茶館http://imysql.com/my_cnf_generator

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