mysql的my.cnf文件詳解


一、緣由

  最近要接手數據庫的維護工作,公司首選MySQL。對於MySQL的理解,我認為很多性能優化工作、主從主主復制都是在調整參數,來適應不同時期不同數量級的數據。
故,理解透徹my.cnf里的參數是永恆的話題;只有理解透徹了參數設置,才能在某些方面對數據庫進行調優。
 

二、參數詳解(補充ing...)

[client]                   #客戶端設置,即客戶端默認的連接參數
port = 3307                 #默認連接端口
socket = /data/mysqldata/3307/mysql.sock   #用於本地連接的socket套接字
default-character-set = utf8mb4       #編碼

[mysqld]                   #服務端基本設置
port = 3307 MySQL監聽端口
socket = /data/mysqldata/3307/mysql.sock   #為MySQL客戶端程序和服務器之間的本地通訊指定一個套接字文件
pid-file = /data/mysqldata/3307/mysql.pid  #pid文件所在目錄
basedir = /usr/local/mysql-5.7.11      #使用該目錄作為根目錄(安裝目錄)
datadir = /data/mysqldata/3307/data     #數據文件存放的目錄
tmpdir = /data/mysqldata/3307/tmp       #MySQL存放臨時文件的目錄
character_set_server = utf8mb4        #服務端默認編碼(數據庫級別)
collation_server = utf8mb4_bin        #服務端默認的比對規則,排序規則
user = mysql                 #MySQL啟動用戶

log_bin_trust_function_creators = 1      #This variable applies when binary logging is enabled. It controls whether stored function creators can be trusted not to create stored functions that will cause                        #unsafe events to be written to the binary log. If set to 0 (the default), users are not permitted to create or alter stored functions unless they have the SUPER                        #privilege in addition to the CREATE ROUTINE or ALTER ROUTINE privilege. 開啟了binlog后,必須設置這個值為1.主要是考慮binlog安全

performance_schema = 0            #性能優化的引擎,默認關閉

secure_auth = 1               #secure_auth 為了防止低版本的MySQL客戶端(<4.1)使用舊的密碼認證方式訪問高版本的服務器。MySQL 5.6.7開始secure_auth 默認為啟用值1

#ft_min_word_len = 1             #開啟全文索引

#myisam_recover                #自動修復MySQL的myisam表

explicit_defaults_for_timestamp        #明確時間戳默認null方式

event_scheduler                #計划任務(事件調度器)
skip-external-locking            #跳過外部鎖定;External-locking用於多進程條件下為MyISAM數據表進行鎖定

skip-name-resolve              #跳過客戶端域名解析;當新的客戶連接mysqld時,mysqld創建一個新的線程來處理請求。該線程先檢查是否主機名在主機名緩存中。如果不在,線程試圖解析主機名。

                      #使用這一選項以消除MySQL進行DNS解析的時間。但需要注意,如果開啟該選項,則所有遠程主機連接授權都要使用IP地址方式,否則MySQL將無法正常處理連接請求!

#bind-address = 127.0.0.1          #MySQL綁定IP

skip-slave-start               #為了安全起見,復制環境的數據庫還是設置--skip-slave-start參數,防止復制隨着mysql啟動而自動啟動

slave_net_timeout = 30            #The number of seconds to wait for more data from a master/slave connection before aborting the read. MySQL主從復制的時候,

                       #當Master和Slave之間的網絡中斷,但是Master和Slave無法察覺的情況下(比如防火牆或者路由問題)。

                       #Slave會等待slave_net_timeout設置的秒數后,才能認為網絡出現故障,然后才會重連並且追趕這段時間主庫的數據。

                       #1.用這三個參數來判斷主從是否延遲是不准確的Slave_IO_Running,Slave_SQL_Running,Seconds_Behind_Master.還是用pt-heartbeat吧。
                       #2.slave_net_timeout不要用默認值,設置一個你能接受的延時時間。

local-infile = 0               #設定是否支持命令load data local infile。如果指定local關鍵詞,則表明支持從客戶主機讀文件

back_log = 1024               #指定MySQL可能的連接數量。當MySQL主線程在很短的時間內得到非常多的連接請求,該參數就起作用,之后主線程花些時間(盡管很短)檢查連接並且啟動一個新線程。

                       #back_log參數的值指出在MySQL暫時停止響應新請求之前的短時間內多少個請求可以被存在堆棧中。

#sql_mode = 'PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

sql_mode = NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER  #sql_mode,定義了mysql應該支持的sql語法,數據校驗等!  NO_AUTO_CREATE_USER:禁止GRANT創建密碼為空的用戶。

                             #NO_ENGINE_SUBSTITUTION 如果需要的存儲引擎被禁用或未編譯,可以防止自動替換存儲引擎

key_buffer_size = 32M            #索引塊的緩沖區大小,對MyISAM表性能影響最大的一個參數.決定索引處理的速度,尤其是索引讀的速度。默認值是16M,通過檢查狀態值Key_read_requests

                       #和Key_reads,可以知道key_buffer_size設置是否合理

max_allowed_packet = 512M          #一個查詢語句包的最大尺寸。消息緩沖區被初始化為net_buffer_length字節,但是可在需要時增加到max_allowed_packet個字節。

                       #該值太小則會在處理大包時產生錯誤。如果使用大的BLOB列,必須增加該值。
                       #這個值來限制server接受的數據包大小。有時候大的插入和更新會受max_allowed_packet 參數限制,導致寫入或者更新失敗。

thread_stack = 256K             #線程緩存;主要用來存放每一個線程自身的標識信息,如線程id,線程運行時基本信息等等,我們可以通過 thread_stack 參數來設置為每一個線程棧分配多大的內存。

sort_buffer_size = 16M            #是MySQL執行排序使用的緩沖大小。如果想要增加ORDER BY的速度,首先看是否可以讓MySQL使用索引而不是額外的排序階段。

                       #如果不能,可以嘗試增加sort_buffer_size變量的大小。

read_buffer_size = 16M            #是MySQL讀入緩沖區大小。對表進行順序掃描的請求將分配一個讀入緩沖區,MySQL會為它分配一段內存緩沖區。read_buffer_size變量控制這一緩沖區的大小。

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

join_buffer_size = 16M           #應用程序經常會出現一些兩表(或多表)Join的操作需求,MySQL在完成某些 Join 需求的時候(all/index join),為了減少參與Join的“被驅動表”的

                      #讀取次數以提高性能,需要使用到 Join Buffer 來協助完成 Join操作。當 Join Buffer 太小,MySQL 不會將該 Buffer 存入磁盤文件,

                      #而是先將Join Buffer中的結果集與需要 Join 的表進行 Join 操作,

                      #然后清空 Join Buffer 中的數據,繼續將剩余的結果集寫入此 Buffer 中,如此往復。這勢必會造成被驅動表需要被多次讀取,成倍增加 IO 訪問,降低效率。

read_rnd_buffer_size = 32M         #是MySQL的隨機讀緩沖區大小。當按任意順序讀取行時(例如,按照排序順序),將分配一個隨機讀緩存區。進行排序查詢時,MySQL會首先掃描一遍該緩沖,以避免磁盤搜索,

                      #提高查詢速度,如果需要排序大量數據,可適當調高該值。但MySQL會為每個客戶連接發放該緩沖空間,所以應盡量適當設置該值,以避免內存開銷過大。

net_buffer_length = 16K           #通信緩沖區在查詢期間被重置到該大小。通常不要改變該參數值,但是如果內存不足,可以將它設置為查詢期望的大小。

                       #(即,客戶發出的SQL語句期望的長度。如果語句超過這個長度,緩沖區自動地被擴大,直到max_allowed_packet個字節。)

myisam_sort_buffer_size = 128M        #當對MyISAM表執行repair table或創建索引時,用以緩存排序索引;設置太小時可能會遇到” myisam_sort_buffer_size is too small”

bulk_insert_buffer_size = 32M        #默認8M,當對MyISAM非空表執行insert … select/ insert … values(…),(…)或者load data infile時,使用樹狀cache緩存數據,每個thread分配一個;
                       #注:當對MyISAM表load 大文件時,調大bulk_insert_buffer_size/myisam_sort_buffer_size/key_buffer_size會極大提升速度

thread_cache_size = 384           #thread_cahe_size線程池,線程緩存。用來緩存空閑的線程,以至於不被銷毀,如果線程緩存在的空閑線程,需要重新建立新連接,

                      #則會優先調用線程池中的緩存,很快就能響應連接請求。每建立一個連接,都需要一個線程與之匹配。

query_cache_size = 0             #工作原理: 一個SELECT查詢在DB中工作后,DB會把該語句緩存下來,當同樣的一個SQL再次來到DB里調用時,DB在該表沒發生變化的情況下把結果從緩存中返回給Client。
                       #在數據庫寫入量或是更新量也比較大的系統,該參數不適合分配過大。而且在高並發,寫入量大的系統,建系把該功能禁掉。

query_cache_type = 0             #決定是否緩存查詢結果。這個變量有三個取值:0,1,2,分別代表了off、on、demand。       

tmp_table_size = 1024M          #它規定了內部內存臨時表的最大值,每個線程都要分配。(實際起限制作用的是tmp_table_size和max_heap_table_size的最小值。)

                     #如果內存臨時表超出了限制,MySQL就會自動地把它轉化為基於磁盤的MyISAM表,存儲在指定的tmpdir目錄下

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

open_files_limit = 10240          #mysql打開最大文件數

max_connections = 2000           #MySQL無論如何都會保留一個用於管理員(SUPER)登陸的連接,用於管理員連接數據庫進行維護操作,即使當前連接數已經達到了max_connections。

                      #因此MySQL的實際最大可連接數為max_connections+1;
                      #這個參數實際起作用的最大值(實際最大可連接數)為16384,即該參數最大值不能超過16384,即使超過也以16384為准;
                      #增加max_connections參數的值,不會占用太多系統資源。系統資源(CPU、內存)的占用主要取決於查詢的密度、效率等;
                      #該參數設置過小的最明顯特征是出現”Too many connections”錯誤;

max-user-connections = 0          #用來限制用戶資源的,0不限制;對整個服務器的用戶限制

max_connect_errors = 100000         #max_connect_errors是一個MySQL中與安全有關的計數器值,它負責阻止過多嘗試失敗的客戶端以防止暴力破解密碼的情況。max_connect_errors的值與性能並無太大關系。
                      #當此值設置為10時,意味着如果某一客戶端嘗試連接此MySQL服務器,但是失敗(如密碼錯誤等等)10次,則MySQL會無條件強制阻止此客戶端連接。

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

interactive_timeout = 86400        #interactive_time -- 指的是mysql在關閉一個交互的連接之前所要等待的秒數(交互連接如mysql gui tool中的連接
wait_timeout = 86400            #wait_timeout -- 指的是MySQL在關閉一個非交互的連接之前所要等待的秒數

binlog_cache_size = 16M          #二進制日志緩沖大小
                      #我們知道InnoDB存儲引擎是支持事務的,實現事務需要依賴於日志技術,為了性能,日志編碼采用二進制格式。那么,我們如何記日志呢?有日志的時候,就直接寫磁盤?

                     #可是磁盤的效率是很低的,如果你用過Nginx,,一般Nginx輸出access log都是要緩沖輸出的。因此,記錄二進制日志的時候,我們是否也需要考慮Cache呢?

                     #答案是肯定的,但是Cache不是直接持久化,於是面臨安全性的問題——因為系統宕機時,Cache中可能有殘余的數據沒來得及寫入磁盤。因此,Cache要權衡,要恰到好處:

                     #既減少磁盤I/O,滿足性能要求;又保證Cache無殘留,及時持久化,滿足安全要求。

slow_query_log = 1             #開啟慢查詢
long_query_time = 1            #超過的時間為1s;MySQL能夠記錄執行時間超過參數 long_query_time 設置值的SQL語句,默認是不記錄的。

log-slow-admin-statements
log-queries-not-using-indexes       #記錄管理語句和沒有使用index的查詢記錄

# *** Replication related settings ***
binlog_format = ROW            #在復制方面的改進就是引進了新的復制技術:基於行的復制。簡言之,這種新技術就是關注表中發生變化的記錄,而非以前的照抄 binlog 模式。

                      #從 MySQL 5.1.12 開始,可以用以下三種模式來實現:基於SQL語句的復制(statement-based replication, SBR),基於行的復制(row-based replication, RBR),

                      混合模式復制(mixed-based replication, MBR)。相應地,binlog的格式也有三種:STATEMENT,ROW,MIXED。MBR 模式中,SBR 模式是默認的。

#max_binlog_cache_size = 102400                 # 為每個session 最大可分配的內存,在事務過程中用來存儲二進制日志的緩存。
log-bin = /data/mysqldata/3307/binlog/mysql-bin        #開啟二進制日志功能,binlog數據位置
log-bin-index = /data/mysqldata/3307/binlog/mysql-bin.index
relay-log = /data/mysqldata/3307/relay/mysql-relay-bin     #relay-log日志記錄的是從服務器I/O線程將主服務器的二進制日志讀取過來記錄到從服務器本地文件,

                               #然后SQL線程會讀取relay-log日志的內容並應用到從服務器
relay-log-index = /data/mysqldata/3307/relay/mysql-relay-bin.index #binlog傳到備機被寫道relaylog里,備機的slave sql線程從relaylog里讀取然后應用到本地。

server_id = 100              #服務端ID,用來高可用時做區分
log_slave_updates = 1           #log_slave_updates是將從服務器從主服務器收到的更新記入到從服務器自己的二進制日志文件中。
expire-logs-days = 15           #二進制日志自動刪除的天數。默認值為0,表示“沒有自動刪除”。啟動時和二進制日志循環時可能刪除。
max_binlog_size = 512M           #如果二進制日志寫入的內容超出給定值,日志就會發生滾動。你不能將該變量設置為大於1GB或小於4096字節。 默認值是1GB。

replicate-wild-ignore-table = mysql.%  #replicate-wild-ignore-table參數能同步所有跨數據庫的更新,比如replicate-do-db或者replicate-ignore-db不會同步類似
#replicate-wild-do-table = db_name.%   #設定需要復制的Table

#slave-skip-errors = 1062,1053,1146    #復制時跳過一些錯誤;不要胡亂使用這些跳過錯誤的參數,除非你非常確定你在做什么。當你使用這些參數時候,MYSQL會忽略那些錯誤,

                     #這樣會導致你的主從服務器數據不一致。

auto_increment_offset = 1
auto_increment_increment = 2        #這兩個參數一般用在主主同步中,用來錯開自增值, 防止鍵值沖突

 

relay_log_info_repository = TABLE     #將中繼日志的信息寫入表:mysql.slave_realy_log_info
master_info_repository = TABLE       #將master的連接信息寫入表:mysql.salve_master_info
relay_log_recovery = on          #中繼日志自我修復;當slave從庫宕機后,假如relay-log損壞了,導致一部分中繼日志沒有處理,則自動放棄所有未執行的relay-log,

                     #並且重新從master上獲取日志,這樣就保證了relay-log的完整性

 

 

# *** innodb setting ***
innodb_buffer_pool_size = 4G        #InnoDB 用來高速緩沖數據和索引內存緩沖大小。 更大的設置可以使訪問數據時減少磁盤 I/O。

innodb_data_file_path = ibdata1:1G:autoextend  #單獨指定數據文件的路徑與大小

innodb_flush_log_at_trx_commit = 0      #每次commit 日志緩存中的數據刷到磁盤中。通常設置為 1,意味着在事務提交前日志已被寫入磁盤, 事務可以運行更長以及服務崩潰后的修復能力。

                       #如果你願意減弱這個安全,或你運行的是比較小的事務處理,可以將它設置為 0 ,以減少寫日志文件的磁盤 I/O。這個選項默認設置為 0。

#sync_binlog = 1000            #sync_binlog=n,當每進行n次事務提交之后,MySQL將進行一次fsync之類的磁盤同步指令來將binlog_cache中的數據強制寫入磁盤。

innodb_read_io_threads = 8  
innodb_write_io_threads = 8        #對於多核的CPU機器,可以修改innodb_read_io_threads和innodb_write_io_threads來增加IO線程,來充分利用多核的性能

innodb_file_format = Barracuda      #Innodb Plugin引擎開始引入多種格式的行存儲機制,目前支持:Antelope、Barracuda兩種。其中Barracuda兼容Antelope格式。

innodb_open_files = 65536         #限制Innodb能打開的表的數量
innodb_purge_threads = 1         #開始碎片回收線程。這個應該能讓碎片回收得更及時而且不影響其他線程的操作
innodb_support_xa = FALSE        #分布式事務
innodb_log_buffer_size = 256M      #InnoDB 將日志寫入日志磁盤文件前的緩沖大小。理想值為 1M 至 8M。大的日志緩沖允許事務運行時不需要將日志保存入磁盤而只到事務被提交(commit)。

                     #因此,如果有大的事務處理,設置大的日志緩沖可以減少磁盤I/O。

innodb_log_file_size = 1G        #日志組中的每個日志文件的大小(單位 MB)。如果 n 是日志組中日志文件的數目,那么理想的數值為 1M 至下面設置的緩沖池(buffer pool)大小的 1/n。較大的值,

                    #可以減少刷新緩沖池的次數,從而減少磁盤 I/O。但是大的日志文件意味着在崩潰時需要更長的時間來恢復數據。

innodb_log_files_in_group = 3      #指定有三個日志組

#innodb_lock_wait_timeout = 120     #在回滾(rooled back)之前,InnoDB 事務將等待超時的時間(單位 秒)

innodb_max_dirty_pages_pct = 75     #innodb_max_dirty_pages_pct作用:控制Innodb的臟頁在緩沖中在那個百分比之下,值在范圍1-100,默認為90.這個參數的另一個用處:

                    #當Innodb的內存分配過大,致使swap占用嚴重時,可以適當的減小調整這個值,使達到swap空間釋放出來。建義:這個值最大在90%,最小在15%。

                    #太大,緩存中每次更新需要致換數據頁太多,太小,放的數據頁太小,更新操作太慢。

innodb_buffer_pool_instances = 4     #innodb_buffer_pool_size 一致 可以開啟多個內存緩沖池,把需要緩沖的數據hash到不同的緩沖池中,這樣可以並行的內存讀寫。

innodb_io_capacity = 500        #這個參數據控制Innodb checkpoint時的IO能力

innodb_file_per_table = 1        #作用:使每個Innodb的表,有自已獨立的表空間。如刪除文件后可以回收那部分空間。
                     #分配原則:只有使用不使用。但DB還需要有一個公共的表空間。

innodb_change_buffering = inserts    #當更新/插入的非聚集索引的數據所對應的頁不在內存中時(對非聚集索引的更新操作通常會帶來隨機IO),會將其放到一個insert buffer中,

                     #當隨后頁面被讀到內存中時,會將這些變化的記錄merge到頁中。當服務器比較空閑時,后台線程也會做merge操作

innodb_adaptive_flushing = 1      #該值影響每秒刷新臟頁的操作,開啟此配置后,刷新臟頁會通過判斷產生重做日志的速度來判斷最合適的刷新臟頁的數量;

transaction-isolation = READ-COMMITTED  #數據庫事務隔離級別 ,讀取提交內容

innodb_flush_method = O_DIRECT      #innodb_flush_method這個參數控制着innodb數據文件及redo log的打開、刷寫模式
                        #InnoDB使用O_DIRECT模式打開數據文件,用fsync()函數去更新日志和數據文件。

#innodb_use_sys_malloc = 1        #默認設置值為1.設置為0:表示Innodb使用自帶的內存分配程序;設置為1:表示InnoDB使用操作系統的內存分配程序。

 

[mysqldump]
quick                 #它強制 mysqldump 從服務器查詢取得記錄直接輸出而不是取得所有記錄后將它們緩存到內存中

max_allowed_packet = 512M        #限制server接受的數據包大小;指代mysql服務器端和客戶端在一次傳送數據包的過程當中數據包的大小
net_buffer_length = 16384        #TCP/IP和套接字通信緩沖區大小,創建長度達net_buffer_length的行

[mysql]
auto-rehash              #auto-rehash是自動補全的意思

[isamchk]                #isamchk數據檢測恢復工具
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M

 

[myisamchk]              #使用myisamchk實用程序來獲得有關你的數據庫桌表的信息、檢查和修復他們或優化他們
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout #mysqlhotcopy使用lock tables、flush tables和cp或scp來快速備份數據庫.它是備份數據庫或單個表最快的途徑,完全屬於物理備份,但只能用於備份MyISAM存儲引擎和運行在數據庫目錄所在的機器上.

          #與mysqldump備份不同,mysqldump屬於邏輯備份,備份時是執行的sql語句.使用mysqlhotcopy命令前需要要安裝相應的軟件依賴包.


免責聲明!

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



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