my.cnf配置文檔詳解


原文地址: https://www.cnblogs.com/zhangweizhong/p/12179438.html

 

MySql對於開發人員來說應該都比較熟悉,不管是小白還是老碼農應該都能熟練使用。但是要說到的各種參數的配置,我敢說大部分人並不是很熟悉,當我們需要優化mysql,改變某項參數的時候。還是要到處在網上查找,有點不方便。今天就把我所知道的MySql的配置文件my.cnf做一個簡單的說明吧,注意,我總結的mysql是Linux環境下的。

 

其實,如果你要做mysql性能優化,那么熟悉my.cnf 的相關參數是必不可少的。不然,很多時候就會出現:網上查資料說是調下某個參數性能能提升,實際你調完之后卻沒有任何效果。所以我建議大家一定要把mysql重要的配置參數弄懂(加粗部分為重點參數)。

 

配置文件位置

my.cnf文件可以自定義位置,也可以使用如下默認的位置,只要放在默認位置,MySQL自動識別:
/etc/my.cnf       全局選項
/etc/mysql/my.cnf   全局選項
SYSCONFDIR/my.cnf   全局選項
$MYSQL_HOME/my.cnf  服務器特定選項(僅限服務器)
defaults-extra-file   指定的文件 --defaults-extra-file(如果有的話)
~/.my.cnf        用戶特定的選項, ~表示當前用戶的主目錄(的值 $HOME)。
~/.mylogin.cnf     用戶特定的登錄路徑選項(僅限客戶端) 在上表中, 首先它會找/etc/my.cnf 這個文件, 如果這個文件不存在,那么它接下來去找/etc/mysql/my.cnf這個文件

 

 

 

配置參數參考

[client]
port = 3306

[mysqld]
#默認存儲引擎INNODB
default-storage-engine=INNODB
#GROUP_CONCAT長度
group_concat_max_len =99999

#端口號
port = 3306


#套接字文件
#這里要注意:有時候重啟mysql會提示/tmp/mysql.sock不存在,此時通常會由於兩種情況導致,解決方法可以參考我之前記錄的文章,親測有效:https://www.cnblogs.com/zhangweizhong/p/12179452.html
socket = /usr/local/mysql/mysql.sock

 

#pid寫入文件位置
pid-file = /usr/local/mysql/mysqld.pid

 

#數據庫文件位置
datadir = /home/data/mysql/data

 

#控制文件打開的個數;
open_files_limit = 10240

 

#SQL模式
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

 

#當外部鎖定(external-locking)起作用時,每個進程若要訪問數據表,
#則必須等待之前的進程完成操作並解除鎖定。由於服務器訪問數據表時經常需要等待解鎖,
#因此在單服務器環境下external locking會讓MySQL性能下降。
#所以在很多Linux發行版的源中,MySQL配置文件中默認使用了skip-external-locking來避免external locking。
skip-external-locking

 

#跳過DNS反向解析
skip-name-resolve

 

#關閉TIMESTAMP類型默認值
explicit_defaults_for_timestamp

#不受client字符集影響,保證sever端字符集
skip-character-set-client-handshake

 

#初始連接字符集UTF8
init-connect='SET NAMES utf8'

 

#默認數據庫字符集
character-set-server=utf8

#查詢緩存0,1,2,分別代表了off、on、demand
query_cache_type = 1

#單位秒,握手時間超過connect_timeout,連接請求將會被拒絕
connect_timeout = 20

 

#設置在多少秒沒收到主庫傳來的Binary Logs events之后,從庫認為網絡超時,Slave IO線程會重新連接主庫。
#該參數的默認值是3600s ,然而時間太久會造成數據庫延遲或者主備庫直接的鏈接異常不能及時發現。
#將 slave_net_timeout 設得很短會造成 Master 沒有數據更新時頻繁重連。一般線上設置為5s
slave_net_timeout = 30

 

#這個參數用來配置從服務器的更新是否寫入二進制日志,這個選項默認是不打開的,
#但是,如果這個從服務器B是服務器A的從服務器,同時還作為服務器C的主服務器,那么就需要開發這個選項,
#這樣它的從服務器C才能獲得它的二進制日志進行同步操作
log-slave-updates=1

#用於slave服務器,io線程會把server id與自己相同的event寫入日志,與log-slave-updates選項沖突
replicate-same-server-id=0

server_id=10112879101

# 打開二進制日志功能.
# 在復制(replication)配置中,作為MASTER主服務器必須打開此項
# 如果你需要從你最后的備份中做基於時間點的恢復,你也同樣需要二進制日志
log-bin =/home/data/mysql/binlog/mysql-bin.log

#relay-log日志
relay-log=mysql-relay-bin

#master-info-repository以及relay-log-info-repository打開以啟用崩潰安全的二進制日志/從服務器功能(在事務表而不是平面文件中存儲信息)
master-info-repository=TABLE
relay-log-info-repository=TABLE

#不寫入binlog二進制日志中的數據庫
binlog-ignore-db=mysql # No sync databases
binlog-ignore-db=test # No sync databases
binlog-ignore-db=information_schema # No sync databases
binlog-ignore-db=performance_schema # No sync databases

#寫入binlog二進制日志中數據庫
binlog-do-db=business_db
binlog-do-db=user_db
binlog-do-db=plocc_system

#清理binlog
expire-logs-days=15
max_binlog_size = 1073741824 # Bin logs size ( 1G )


#使binlog在每1000次binlog寫入后與硬盤同步
sync_binlog = 1000


#指定只復制哪個庫的數據
replicate-do-db=business_db
replicate-do-db=user_db
replicate-do-db=plocc_system


#開啟事件調度器Event Scheduler
event_scheduler=1

 

#MySQL能暫存的連接數量。當主要MySQL線程在一個很短時間內得到非常多的連接請求,這就起作用。
#如果MySQL的連接數據達到max_connections時,新來的請求將會被存在堆棧中,以等待某一連接釋放資源,
#該堆棧的數量即back_log,如果等待連接的數量超過back_log,將不被授予連接資源
#如果系統在短時間內有很多連接,則需要增大該參數的值,該參數值指定到來的TCP/IP連接的監聽隊列的大小。默認值50。
back_log = 500

 

#MySQL允許最大的進程連接數,
#如果經常出現Too Many Connections的錯誤提示,則需要增大此值。
max_connections = 6000

 

#每個用戶的最大的進程連接數
max_user_connection = 3000

 

#每個客戶端連接請求異常中斷的最大次數,如果達到了此限制.
#這個客戶端將會被MySQL服務阻止,直到執行了”FLUSH HOSTS” 或者服務重啟
#非法的密碼以及其他在鏈接時的錯誤會增加此值.
#查看 “Aborted_connects” 狀態來獲取全局計數器
max_connect_errors = 6000

 

#表調整緩沖區大小。
#table_cache 參數設置表高速緩存的數目。每個連接進來,都會至少打開一個表緩存。
#因此,table_cache 的大小應與 max_connections 的設置有關。例如,對於 200 個並行運行的連接,應該讓表的緩存至少有 200 × N ,這里 N 是應用可以執行的查詢的一個聯接中表的最大數量。此外,還需要為臨時表和文件保留一些額外的文件描述符。
#當Mysql訪問一個表時,如果該表在緩存中已經被打開,則可以直接訪問緩存;如果還沒有被緩存但是在 Mysql 表緩沖區中還有空間,那么這個表就被打開並放入表緩沖區;如果表緩存滿了,則會按照一定的規則將當前未用的表釋放,或者臨時擴大表緩存來存放,使用表緩存的好處是可以更快速地訪問表中的內容。
#執行 flush tables 會清空緩存的內容。
#一般來說,可以通過查看數據庫運行峰值時間的狀態值 Open_tables 和 Opened_tables ,判斷是否需要增加 table_cache 的值(其中 open_tables 是當前打開的表的數量, Opened_tables 則是已經打開的表的數量)。
#即如果open_tables接近table_cache的時候,並且Opened_tables這個值在逐步增加,那就要考慮增加這個#值的大小了。還有就是Table_locks_waited比較高的時候,也需要增加table_cache。
table_cache = 614

 

 

#表描述符緩存大小,可減少文件打開/關閉次數
table_open_cache = 2048

 

#設置在網絡傳輸中一次消息傳輸量的最大值。系統默認值 為1MB,最大值是1GB,必須設置1024的倍數。
#當與大的BLOB字段一起工作時相當必要
max_allowed_packet = 64M

 

# 在一個事務中binlog為了記錄SQL狀態所持有的cache大小
# 如果你經常使用大的,多聲明的事務,你可以增加此值來獲取更大的性能.
# 所有從事務來的狀態都將被緩沖在binlog緩沖中然后在提交后一次性寫入到binlog中
# 如果事務比此值大, 會使用磁盤上的臨時文件來替代.
# 此緩沖在每個連接的事務第一次更新狀態時被創建
binlog_cache_size = 1M

 

# 獨立的內存表所允許的最大容量.
# 此選項為了防止意外創建一個超大的內存表導致用盡所有的內存資源.
max_heap_table_size = 256M

 

#Sort_Buffer_Size被用來處理類似ORDER BY以及GROUP BY隊列所引起的排序,每一個要做排序的請求,都會分到一個sort_buffer_size大的緩存
#Sort_Buffer_Size 是一個connection級參數,在每個connection(session)第一次需要使用這個buffer的時候,一次性分配設置的內存。
#Sort_Buffer_Size 並不是越大越好,由於是connection級的參數,過大的設置+高並發可能會耗盡系統內存資源。例如:500個連接將會消耗 500*sort_buffer_size(8M)=4G內存
#如果超過Sort_Buffer_Size設置的大小,MySQL會將數據寫入磁盤來完成排序,導致效率降低。
#屬重點優化參數
sort_buffer_size = 8M

 

#用於表間關聯緩存的大小,和sort_buffer_size一樣,該參數對應的分配內存也是每個連接獨享。
#大部分表關聯都比較影響查詢性能,
#所以將此值設大能夠減輕性能影響。
#通過 “Select_full_join” 狀態變量查看表關聯的數量
join_buffer_size = 8M

 

#thread_cache_size表示可以重新利用保存在緩存中線程的數量,當斷開連接時如果緩存中還有空間,那么客戶端的線程將被放到緩存中,
#如果線程重新被請求,那么請求將從緩存中讀取,如果緩存中是空的或者是新的請求,那么這個線程將被重新創建,如果有很多新的線程,減少線程創建的開銷
#可以通過比較 Connections 和 Threads_created 狀態變量,來查看thread_cache_size的設置是否起作用。
#設置規則:1GB 內存配置為8,2GB配置為16,3GB配置為32,4GB或更高內存,可配置更大。
thread_cache_size = 128

 

#此值表示允許應用程序在同一時間運行的線程的數量.
#設置thread_concurrency的值的正確與否,對mysql的性能影響很大, 在多個cpu(或多核)的情況下,錯誤設置了thread_concurrency的值, 會導致mysql不能充分利用多cpu(或多核), 出現同一時刻只能一個cpu(或核)在工作的情況。
#thread_concurrency應設為CPU核數的2倍
#屬重點優化參數
thread_concurrency = 8

 

#此值用來緩沖 SELECT 的結果並且在下一次同樣查詢的時候不再執行直接返回結果,如果你有大量的相同的查詢並且很少修改表,那么query_cache_size可以極大的提高數據庫性能,
#需要注意的是:有時候數據庫出現了性能問題,大家就習慣的認為把這個值調大就行了。然而,這個參數加大后也引發了一系列問題。
#我們首先分析一下 query_cache_size的工作原理:一個SELECT查詢在DB中工作后,DB會把該語句緩存下來,當同樣的一個SQL再次來到DB里調用時,DB在該表沒發生變化的情況下把結果從緩存中返回給Client。
#這里有一個關建點,就是DB在利用Query_cache工作時,要求該語句涉及的表在這段時間內沒有發生變更。那如果該表在發生變更時,Query_cache里的數據又怎么處理呢?
#首先要把Query_cache和該表相關的語句全部置為失效,然后在寫入更新。那么如果Query_cache非常大,該表的查詢結構又比較多,查詢語句失效也慢,一個更新或是Insert就會很慢,這樣看到的就是Update或是Insert怎么這么慢了。
#所以在數據庫寫入量或是更新量也比較大的系統,該參數不適合分配過大。而且在高並發,寫入量大的系統,建議把該功能禁掉。
#重點優化參數
query_cache_size = 64M

 

#指定單個查詢能夠使用的緩沖區大小,只有小於此設定值的結果才會被緩沖
#此設置用來保護查詢緩沖,防止極大的結果集將其他所有的查詢結果都覆蓋
#缺省為1M
query_cache_limit = 2M

 

#被全文檢索索引的最小的字長.
#你也許希望減少它,如果你需要搜索更短字的時候.
#注意在你修改此值之后,
#你需要重建你的 FULLTEXT 索引
ft_min_word_len = 4

 

#設置MYSQL線程使用的堆大小,此容量的內存在每次連接時被預留.
#MySQL 本身常不會需要超過64K的內存
#如果你使用你自己的需要大量堆的UDF函數
#或者你的操作系統對於某些操作需要更多的堆,
#你也許需要將其設置的更高一點.
thread_stack = 192K

 

#設定默認的事務隔離級別.可用的級別如下:
#READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE
transaction_isolation = READ-COMMITTED

 

#此值表示內存中臨時表的最大大小,超過限值后就往硬盤寫
#此限制是針對單個表的,而不是總和
#注意:
# 1. max_heap_table_size 比 tmp_table_size 小時,則系統會把 max_heap_table_size 的值作為最大的內存臨時表的上限。這樣可達到提高聯接查詢速度的效果,建議盡量優化查詢,要確保查詢過程中生成的臨時表在內存中,避免臨時表過大導致生成基於硬盤的MyISAM表。
# 2. 通過show global status like '%created_tmp%' 查詢:Created_tmp_disk_tables和Created_tmp_tables的值,Created_tmp_disk_tables / Created_tmp_tables 值越小越好
tmp_table_size = 256M

 

#binlog日志類型
#mixed:混合型
binlog_format=mixed

 

#開啟慢查詢日志
slow_query_log

 

#文件格式
log_output = FILE

 

# 所有的使用了比這個時間(以秒為單位)更多的查詢會被認為是慢速查詢.
# 不要在這里使用”0″, 否則會導致所有的查詢,甚至非常快的查詢頁被記錄下來(由於MySQL 目前時間的精確度只能達到秒的級別).
long_query_time = 0.5

 

#慢查詢日志位置
slow_query_log_file=/usr/local/mysql/mysqld_slow.log

 

MyISAM 相關選項

#用於索引的緩沖區大小,增加它可以提高索引處理性能,
#對於內存在4GB左右的服務器來說,該參數可設置為256MB或384MB。
#通過show variables like ‘%key_buffer_size%';
#通過 show global status like ‘%key_blocks_unused%' 查看是否還有剩余,如果剩余很多,就不需要再加大key_buffer_size了
#注意:
#1. 只用用於MyISAM表
#2. 可以設置為內存的30%-40%左右
#3. 即使你並不使用MyISAM 表, 最好也設置8-64M內存,由於它同樣會被內部臨時表使用
key_buffer_size = 2048M

 

#MySql讀入緩沖區大小。當對表進行全表掃描請求是,將MySql會為它分配一個讀入緩沖區
#如果對表的順序掃描請求非常頻繁,並且你認為頻繁掃描進行得太慢,可以通過增加該變量值以及內存緩沖區大小提高其性能。
#該參數對應的分配內存也是每個連接獨享。
read_buffer_size = 2M

 

#MySql的隨機讀(查詢操作)緩沖區大小。可以提高很多ORDER BY的性能,當需要時由每個線程分配。
#當進行排序查詢時,MySql會分配一個隨機讀緩存區。首先掃描一遍該緩沖,以避免磁盤搜索,提高查詢速度,
#如果需要排序大量數據,可適當調高該值。
#需要注意的是:MySql會為每個客戶連接發放該緩沖空間,所以應盡量適當設置該值,以避免內存開銷過大。
read_rnd_buffer_size = 16M

 

#批量插入數據緩存大小,可以有效提高批量插入效率,默認為8M
#注意:
# 1. 不要將此值設置大於 “key_buffer_size”.
# 2. 設置0會關閉此參數。
bulk_insert_buffer_size = 16M

 

#MyISAM表發生變化,重建索引時所需的緩沖
#注意:此參數每個線程中分配,不宜設置過大。
myisam_sort_buffer_size = 128M

 

#MySQL重建索引時所允許的臨時文件的大小 (當 REPAIR, ALTER TABLE 或者 LOAD DATA INFILE).
#如果臨時文件大於此值,索引會通過鍵值緩沖創建(更慢)
myisam_max_sort_file_size = 1G

 

#如果一個表擁有多個索引, MyISAM 會通過並行排序使用多個線程去修復他們。
#一般用於擁有多個CPU以及大量內存情況。
myisam_repair_threads = 1

 

# 自動檢查和修復沒有適當關閉的 MyISAM 表.
myisam_recover

 

INNODB相關選項

#如果你的MySQL服務包含InnoDB支持但是並不打算使用的話,
#使用此選項會節省內存以及磁盤空間,並且加速某些部分
#skip-innodb

#這對Innodb表來說非常重要,Innodb把所有的數據和索引都緩存起來,此參數設置越大,數據存取時所需要的磁盤I/O越少。
#Innodb比MyISAM表對緩沖更為敏感。MyISAM可以在默認的 key_buffer_size 設置下運行的可以,然而Innodb在默認的 innodb_buffer_pool_size 設置下卻跟蝸牛似的。
#注意:
#1. 當然如果你的數據量不大,並且不會暴增,也無需把 innodb_buffer_pool_size 設置的太大
#2. 如果在一個獨立使用的數據庫服務器上,你可以設置這個變量到服務器物理內存大小的80%
#3. 注意在32位系統上你每個進程可能被限制在 2-3.5G,
#屬重點優化參數
innodb_buffer_pool_size = 2048M

 

# InnoDB 將數據保存在一個或者多個數據文件中成為表空間
# 如果你只有單個邏輯驅動保存你的數據,一個單個的自增文件就足夠好了
# 其他情況下.每個設備一個文件一般都是個好的選擇
# 你也可以配置InnoDB來使用裸盤分區
innodb_data_file_path = ibdata1:1024M:autoextend

 

# 文件IO的線程數,一般為 4
# 此值在Unix下被硬編碼為4,但是在Windows下可以設置得較大.
innodb_file_io_threads = 4

 

# 允許線程數量。
# 服務器有幾個CPU就設置為幾,建議用默認設置。
# 過高的值可能導致線程的互斥。
innodb_thread_concurrency = 16

 

# 如果設置為1 ,InnoDB會在每次事務提交后將事務日志寫到磁盤上,
# 基於性能考慮,可以設置為0或2,但要承擔在發生故障時丟失數據的風險。
# 0代表日志只大約每秒寫入日志文件並且日志文件刷新到磁盤.
# 2代表每次提交后日志寫入日志文件,但是日志文件每秒刷新到磁盤上。
# 幾點說明:
# 1. 如果是游戲服務器,建議此值設置為2;如果是對數據安全要求極高的應用,建議設置為1;
# 2. 設置為0性能最高,但如果發生故障,數據可能會有丟失的危險!
# 3. 默認值1每一次事務提交都需要把日志寫到硬盤,這是很費時的。
# 4. 特別是使用電池供電緩存(Battery backed up cache)時。設成2對於很多運用,特別是從MyISAM表轉過來的是可以的,
# 5. 它的意思是不寫入硬盤而是寫入系統緩存。日志仍然會每秒flush到硬盤,所以你一般不會丟失超過1-2秒的更新。
# 6. 設成0會更快一點,但安全方面比較差,即使MySQL掛了也可能會丟失事務的數據。而值2只會在整個操作系統掛了時才可能丟數據
#屬重點優化參數
innodb_flush_log_at_trx_commit = 2


#此參數用於寫日志文件所用的內存大小,以M為單位。緩沖區更大能提高性能,但意外的故障將會丟失數據。
#當緩存大小達到設定值后, InnoDB會將這些數據寫到到磁盤上。
#由於基本上每秒都會刷新一次,所以沒有必要將此值設置的太大,MySQL開發人員建議設置為1-8M之間
innodb_log_buffer_size = 16M

#此參數用於確定日志文件的大小
#為避免在日志文件覆寫上不必要的緩沖池刷新
#一般設置為日志文件總合大小到你緩沖池大小的25%~100%
#但這同時也會增加恢復故障數據庫所需的時間
innodb_log_file_size = 1024M

 

#日志組中的文件總數. 為提高性能,MySQL會以循環方式將日志寫到多個文件中
#通常來說2~3是比較好的.
innodb_log_files_in_group = 3

# InnoDB的日志文件所在位置. 默認是MySQL的datadir.
# 你可以將其指定到一個獨立的硬盤上或者一個RAID1卷上來提高其性能
#innodb_log_group_home_dir

# 在InnoDB緩沖池中最大允許的臟頁面的比例.
# 如果達到限額, InnoDB會開始刷新他們防止他們妨礙到干凈數據頁面.
# 這是一個軟限制,不被保證絕對執行.
innodb_max_dirty_pages_pct = 90

# InnoDB用來刷新日志的方法.
# 表空間總是使用雙重寫入刷新方法
# 默認值是 “fdatasync”, 另一個是 “O_DSYNC”.
innodb_flush_method=O_DSYNC

# 在被回滾前,一個InnoDB的事務應該等待一個鎖被批准多久.
# InnoDB在其擁有的鎖表中自動檢測事務死鎖並且回滾事務.
# 如果你使用 LOCK TABLES 指令, 或者在同樣事務中使用除了InnoDB以外的其他事務安全的存儲引擎
# 那么一個死鎖可能發生而InnoDB無法注意到.
# 這種情況下這個timeout值對於解決這種問題就非常有幫助.
innodb_lock_wait_timeout = 30

[mysqldump]
# 不要在將內存中的整個結果寫入磁盤之前緩存. 在導出非常巨大的表時需要此項
quick
max_allowed_packet = 64M

[mysql]
no-auto-rehash

#指定一個請求的最大連接時間,對於4GB左右的內存服務器來說,可以將其設置為5-10。
wait_timeout = 10

#開啟該選可以徹底關閉MySQL的TCP/IP連接方式,如果WEB服務器是以遠程連接的方式訪問MYSQL數據庫服務器的,則不要開啟該選項,否則將無法正常連接。
skip_networking

#將沒有使用索引的查詢也記錄下來
log-queries-not-using-indexes

 

最后

以上就把my.cnf 配置參數介紹完了,有些是自己日常mysql 優化總結的結果,有些來源於網絡。僅供大家參考。

參考文檔:

https://dev.mysql.com/doc/refman/5.6/en/optimizing-myisam.html

https://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM