mysql 5.7配置項最詳細的解釋

配置樣例

首先提供一個我使用的配置樣例mysql

[client]  
#password=88888888  
socket=/data/var/mysql/mysql.sock  
  
[mysqld_safe]  
pid-file=/data/var/mysql/mysqld.pid  
log-error = /data/local/mysql-5.7.19/log/mysql-error.log  
  
[mysql]  
socket=/data/var/mysql/mysql.sock  
  
[mysqld]  
user = mysql  
port = 31306  
datadir = /data/var/mysql  
socket=/data/var/mysql/mysql.sock  
symbolic-links=0  
########basic settings########  
server-id = 11  
#bind_address = 10.166.224.32  
autocommit = 1  
character_set_server=utf8mb4  
skip_name_resolve = 1  
max_connections = 800  
max_connect_errors = 100  
transaction_isolation = READ-COMMITTED  
explicit_defaults_for_timestamp = 1  
join_buffer_size = 128M  
tmp_table_size = 128M  
tmpdir = /dev/shm  
max_allowed_packet = 16M  
sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER"  
interactive_timeout = 60  
wait_timeout = 60  
read_buffer_size = 16M  
read_rnd_buffer_size = 32M  
sort_buffer_size = 32M  
########log settings########  
#log_error = /data/local/mysql-5.7.19/log/mysql-error.log  
slow_query_log = 1  
slow_query_log_file = /data/local/mysql-5.7.19/log/mysql-slow.log  
log_queries_not_using_indexes = 1  
log_slow_admin_statements = 1  
log_slow_slave_statements = 1  
log_throttle_queries_not_using_indexes = 10  
expire_logs_days = 90  
long_query_time = 1  
min_examined_row_limit = 100  
########replication settings########  
#master_info_repository = TABLE  
#relay_log_info_repository = TABLE  
log_bin = /data/local/mysql-5.7.19/log/mysql-bin  
#sync_binlog = 4  
gtid_mode = on  
enforce_gtid_consistency = 1  
#log_slave_updates  
binlog_format = row  
#relay_log = /data/local/mysql-5.7.19/log/mysql-relay.log  
#relay_log_recovery = 1  
#binlog_gtid_simple_recovery = 1  
#slave_skip_errors = ddl_exist_errors  
########innodb settings########  
innodb_page_size = 16K  
innodb_buffer_pool_size = 4G  
#innodb_buffer_pool_instances = 8  
#innodb_buffer_pool_load_at_startup = 1  
#innodb_buffer_pool_dump_at_shutdown = 1  
#innodb_lru_scan_depth = 2000  
innodb_lock_wait_timeout = 5  
#innodb_io_capacity = 4000  
#innodb_io_capacity_max = 8000  
#innodb_flush_method = O_DIRECT  
#innodb_log_group_home_dir = /data/local/mysql-5.7.19/log/redolog/  
#innodb_undo_directory = /data/local/mysql-5.7.19/log/undolog/  
#innodb_undo_logs = 128  
#innodb_undo_tablespaces = 0  
#innodb_flush_neighbors = 1  
#innodb_log_file_size = 4G  
#innodb_log_buffer_size = 16M  
#innodb_purge_threads = 4  
innodb_large_prefix = 1  
innodb_thread_concurrency = 64  
#innodb_print_all_deadlocks = 1  
#innodb_strict_mode = 1  
innodb_sort_buffer_size = 64M  
########semi sync replication settings########  
#plugin_dir=/data/local/mysql-5.7.19/lib/plugin  
#plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"  
#loose_rpl_semi_sync_master_enabled = 1  
#loose_rpl_semi_sync_slave_enabled = 1  
#loose_rpl_semi_sync_master_timeout = 5000  
  
[mysqld-5.7]  
#innodb_buffer_pool_dump_pct = 40  
innodb_page_cleaners = 4  
#innodb_undo_log_truncate = 1  
#innodb_max_undo_log_size = 2G  
#innodb_purge_rseg_truncate_frequency = 128  
#binlog_gtid_simple_recovery=1  
log_timestamps=system  
#transaction_write_set_extraction=MURMUR32  
#show_compatibility_56=on  

詳細解釋

[client]

#password=88888888

mysql默認密碼

socket=/data/var/mysql/mysql.sock

mysql以socket方式運行的sock文件位置
 
[mysqld_safe]

log-error=/var/log/mysqld.log

錯誤日誌位置

pid-file=/var/run/mysqld/mysqld.pid

進程id文件
 
[mysql]

socket=/data/var/mysql/mysql.sock

mysql以socket方式運行的sock文件位置
 
[mysqld]

user = mysql

mysql以什麼用戶運行

port = 31306

mysql運行在哪一個端口

datadir = /data/var/mysql/

mysql的數據目錄

socket=/data/var/mysql/mysql.sock

mysql以socket方式運行的sock文件位置

symbolic-links=0

是否支持符號連接,即數據庫或表能夠存儲在my.cnf中指定datadir以外的分區或目錄,爲0不開啓
 
########basic settings########

server-id = 11

mysql的服務器分配id,在啓用主從和集羣的時候必須指定,每一個節點必須不一樣

#bind_address = 10.166.224.32

mysql監聽的ip地址,若是是127.0.0.1,表示僅本機訪問

autocommit = 1

數據修改是否自動提交,爲0不自動提交

character_set_server=utf8mb4

服務器使用的字符集

skip_name_resolve = 1

禁用DNS主機名查找,啓用之後用內網地址向mysqlslap請求響應快了一半

max_connections = 800

mysql最大鏈接數

max_connect_errors = 1000

某臺host鏈接錯誤次數等於max_connect_errors(默認10) ,主機'host_name'再次嘗試時被屏蔽。可有效反的防止dos攻擊

transaction_isolation = READ-COMMITTED

數據庫事務隔離級別
1.READ-UNCOMMITTED(讀取未提交內容)級別
2. READ-COMMITTED(讀取提交內容)
3. REPEATABLE-READ(可重讀)
4.SERIERLIZED(可串行化)
默認級別REPEATABLE-READ

explicit_defaults_for_timestamp = 1

mysql中TIMESTAMP類型和其餘的類型有點不同(在沒有設置explicit_defaults_for_timestamp=1的狀況下)

join_buffer_size = 128M

當咱們的join是ALL,index,rang或者Index_merge的時候使用的buffer。 實際上這種join被稱爲FULL JOIN

tmp_table_size = 128M

規定了內部內存臨時表的最大值,每一個線程都要分配。(實際起限制做用的是tmp_table_size和max_heap_table_size的最小值。)若是內存臨時表超出了限制,MySQL就會自動地把它轉化爲基於磁盤的MyISAM表,存儲在指定的tmpdir目錄下

tmpdir = /dev/shm/mysql-tmp/

保存臨時文件的目錄

max_allowed_packet = 16M

mysql最大接受的數據包大小

sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER"

sql_mode 模式,定義了你MySQL應該支持的sql語法,對數據的校驗等等,限制一些所謂的‘不合法’的操做

interactive_timeout = 60

服務器關閉交互式鏈接前等待活動的秒數。交互式客戶端定義爲在mysql_real_connect()中使用CLIENT_INTERACTIVE選項的客戶端

wait_timeout = 60

服務器關閉非交互鏈接以前等待活動的秒數,在線程啓動時,根據全局wait_timeout值或全局interactive_timeout值初始化會話wait_timeout值,取決於客戶端類型(由mysql_real_connect()的鏈接選項CLIENT_INTERACTIVE定義)

read_buffer_size = 16M

讀入緩衝區的大小,將對錶進行順序掃描的請求將分配一個讀入緩衝區,MySQL會爲它分配一段內存緩衝區

read_rnd_buffer_size = 32M

隨機讀緩衝區大小,當按任意順序讀取行時(列如按照排序順序)將分配一個隨機讀取緩衝區,進行排序查詢時,MySQL會首先掃描一遍該緩衝,以免磁盤搜索,提升查詢速度

sort_buffer_size = 32M

是一個connection級參數,在每一個connection第一次須要使用這個buffer的時候,一次性分配設置的內存
 
########log settings########

#log_error = /data/local/mysql-5.7.19/log/mysql-error.log

錯誤日誌位置

slow_query_log = 1

是否開啓慢查詢日誌收集

slow_query_log_file = /data/local/mysql-5.7.19/log/mysql-slow.log

慢查詢日誌位置

log_queries_not_using_indexes = 1

是否記錄未使用索引的語句

log_slow_admin_statements = 1

慢查詢也記錄那些慢的optimize table,analyze table和alter table語句

log_slow_slave_statements = 1

記錄由Slave所產生的慢查詢

log_throttle_queries_not_using_indexes = 10

設定每分鐘記錄到日誌的未使用索引的語句數目,超過這個數目後只記錄語句數量和花費的總時間

expire_logs_days = 90

日誌自動過時清理天數

long_query_time = 1

設置記錄慢查詢超時時間

min_examined_row_limit = 100

查詢檢查返回少於該參數指定行的SQL不被記錄到慢查詢日誌
 
########replication settings########

#master_info_repository = TABLE

從機保存主節點信息方式,設成file時 會生成master.info 和 relay-log.info2個文件,設成table,信息就會存在mysql.master_slave_info表中。無論是設置的哪一種值,都不要移動或者編輯相關的文件和表

#relay_log_info_repository = TABLE

用於保存slave讀取relay log的位置信息,可選值爲「FILE」、「TABLE」,以便crash重啓後繼續恢復

log_bin = /data/local/mysql-5.7.19/log/mysql-bin

binlog的保存位置,不能指定肯定的文件名如mysql-bin.log,只能指定位置和前綴,會生成之前綴爲開頭的一系列文件

#sync_binlog = 4

這個參數是對於MySQL系統來講是相當重要的,他不只影響到Binlog對MySQL所帶來的性能損耗,並且還影響到MySQL中數據的完整性。對於「sync_binlog」參數的各類設置的說明以下:
sync_binlog=0,當事務提交以後,MySQL不作fsync之類的磁盤同步指令刷新binlog_cache中的信息到磁盤,而讓Filesystem自行決定何時來作同步,或者cache滿了以後才同步到磁盤。
sync_binlog=n,當每進行n次事務提交以後,MySQL將進行一次fsync之類的磁盤同步指令來將binlog_cache中的數據強制寫入磁盤。
在MySQL中系統默認的設置是sync_binlog=0,也就是不作任何強制性的磁盤刷新指令,這時候的性能是最好的,可是風險也是最大的。由於一旦系統Crash,在binlog_cache中的全部binlog信息都會被丟失。而當設置爲「1」的時候,是最安全可是性能損耗最大的設置。由於當設置爲1的時候,即便系統Crash,也最多丟失binlog_cache中未完成的一個事務,對實際數據沒有任何實質性影響。從以往經驗和相關測試來看,對於高併發事務的系統來講,「sync_binlog」設置爲0和設置爲1的系統寫入性能差距可能高達5倍甚至更多。

gtid_mode = on

啓用gtid類型,不然就是普通的複製架構

enforce_gtid_consistency = 1

強制GTID的一致性

#log_slave_updates

slave更新是否記入日誌,在作雙主架構時異常重要,影響到雙主架構是否能互相同步

binlog_format = row

binlog日誌格式,可選值「MIXED」、「ROW」、「STATEMENT」,在5.6版本以前默認爲「STATEMENT」,5.6以後默認爲「MIXED」;由於「STATEMENT」方式在處理一些「不肯定」性的方法時會形成數據不一致問題,咱們建議使用「MIXED」或者「ROW」

#relay_log = /data/local/mysql-5.7.19/log/mysql-relay.log

從機保存同步中繼日誌的位置

#relay_log_recovery = 1

當slave從庫宕機後,假如relay-log損壞了,致使一部分中繼日誌沒有處理,則自動放棄全部未執行的relay-log,而且從新從master上獲取日誌,這樣就保證了relay-log的完整性

#binlog_gtid_simple_recovery = 1

這個參數控制了當mysql啓動或重啓時,mysql在搜尋GTIDs時是如何迭代使用binlog文件的。 這個選項設置爲真,會提高mysql執行恢復的性能。由於這樣mysql-server啓動和binlog日誌清理更快

#slave_skip_errors = ddl_exist_errors

跳過指定error no類型的錯誤,設成all 跳過全部錯誤
 
########innodb settings########

innodb_page_size = 16K

innodb每一個數據頁大小,這個參數在一開始初始化時就要加入my.cnf裏,若是已經建立了表,再修改,啓動MySQL會報錯

innodb_buffer_pool_size = 4G

緩存innodb表的索引,數據,插入數據時的緩衝,專用mysql服務器設置的大小: 操做系統內存的70%-80%最佳

#innodb_buffer_pool_instances = 8

能夠開啓多個內存緩衝池,把須要緩衝的數據hash到不一樣的緩衝池中,這樣能夠並行的內存讀寫

#innodb_buffer_pool_load_at_startup = 1

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

#innodb_buffer_pool_dump_at_shutdown = 1

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

#innodb_lru_scan_depth = 2000

根據 官方文檔 描述,它會影響page cleaner線程每次刷髒頁的數量, 這是一個每1秒 loop一次的線程

innodb_lock_wait_timeout = 5

事務等待獲取資源等待的最長時間,超過這個時間還未分配到資源則會返回應用失敗;參數的時間單位是秒

#innodb_io_capacity = 4000
#innodb_io_capacity_max = 8000

這兩個設置會影響InnoDB每秒在後臺執行多少操做. 大多數寫IO(除了寫InnoDB日誌)是後臺操做的. 若是你深度瞭解硬件性能(如每秒能夠執行多少次IO操做),則使用這些功能是很可取的,而不是讓它閒着

#innodb_flush_method = O_DIRECT

默認值爲 fdatasync. 若是使用 硬件RAID磁盤控制器, 可能須要設置爲 O_DIRECT. 這在讀取InnoDB緩衝池時可防止「雙緩衝(double buffering)」效應,不然會在文件系統緩存與InnoDB緩存間造成2個副本(copy). 若是不使用硬件RAID控制器,或者使用SAN存儲時, O_DIRECT 可能會致使性能降低

#innodb_log_group_home_dir = /data/local/mysql-5.7.19/log/redolog/

innodb重作日誌保存目錄

#innodb_undo_directory = /data/local/mysql-5.7.19/log/undolog/

innodb回滾日誌保存目錄

#innodb_undo_logs = 128

undo回滾段的數量, 至少大於等於35,默認128

#innodb_undo_tablespaces = 0

用於設定建立的undo表空間的個數,在mysql_install_db時初始化後,就不再能被改動了;默認值爲0,表示不獨立設置undo的tablespace,默認記錄到ibdata中;不然,則在undo目錄下建立這麼多個undo文件,例如假定設置該值爲4,那麼就會建立命名爲undo001~undo004的undo tablespace文件,每一個文件的默認大小爲10M。修改該值會致使Innodb沒法完成初始化,數據庫沒法啓動,可是另兩個參數能夠修改

#innodb_flush_neighbors = 1

InnoDB存儲引擎在刷新一個髒頁時,會檢測該頁所在區(extent)的全部頁,若是是髒頁,那麼一塊兒刷新。這樣作的好處是經過AIO能夠將多個IO寫操做合併爲一個IO操做。對於傳統機械硬盤建議使用,而對於固態硬盤能夠關閉。

#innodb_log_file_size = 4G

這個值定義了日誌文件的大小,innodb日誌文件的做用是用來保存redo日誌。一個事務對於數據或索引的修改每每對應到表空間中的隨機的位置,所以當刷新這些修改到磁盤中就會引發隨機的I/O,而隨機的I/O每每比順序的I/O更加昂貴的開銷,由於隨機的I/O須要更多的開銷來定位到指定的位置。innodb使用日誌來將隨機的I/O轉爲順序的I/O,只要日誌文件是安全的,那麼事務就是永久的,儘管這些改變尚未寫到數據文件中,若是出現了當機或服務器斷電的狀況,那麼innodb也能夠經過日誌文件來恢復以及提交的事務。可是日誌文件是有必定的大小的,因此必需要把日誌文件記錄的改變寫到數據文件中,innodb對於日誌文件的操做是循環的,即當日志文件寫滿後,會將指針從新移動到文件開始的地方從新寫,可是它不會覆蓋那些尚未寫到數據文件中的日誌,由於這是惟一記錄了事務持久化的記錄
若是對 Innodb 數據表有大量的寫入操做,那麼選擇合適的 innodb_log_file_size 值對提高MySQL性能很重要。然而設置太大了,就會增長恢復的時間,所以在MySQL崩潰或者忽然斷電等狀況會令MySQL服務器花很長時間來恢復

#innodb_log_buffer_size = 16M

事務在內存中的緩衝。 分配原 則:控制在2-8M.這個值不用太多的。他裏面的內存通常一秒鐘寫到磁盤一次

#innodb_purge_threads = 4

控制是否使用,使用幾個獨立purge線程(清除二進制日誌)

innodb_large_prefix = 1

mysql在5.6以前一直都是單列索引限制767,原由是256×3-1。這個3是字符最大佔用空間(utf8)。可是在5.6之後,開始支持4個字節的uutf8。255×4>767, 因而增長了這個參數。這個參數默認值是OFF。當改成ON時,容許列索引最大達到3072

innodb_thread_concurrency = 64

InnoDB kernel併發最大的線程數。 1) 最少設置爲(num_disks+num_cpus)*2。 2) 能夠經過設置成1000來禁止這個限制

#innodb_print_all_deadlocks = 1

是否將死鎖相關信息保存到MySQL 錯誤日誌中

#innodb_strict_mode = 1

開啓InnoDB嚴格檢查模式,尤爲採用了頁數據壓縮功能後,最好是開啓該功能。開啓此功能後,當建立表(CREATE TABLE)、更改表(ALTER TABLE)和建立索引(CREATE INDEX)語句時,若是寫法有錯誤,不會有警告信息,而是直接拋出錯誤,這樣就可直接將問題扼殺在搖籃裏

innodb_sort_buffer_size = 64M

ORDER BY 或者GROUP BY 操做的buffer緩存大小

########semi sync replication settings########

#plugin_dir=/data/local/mysql-5.7.19/lib/plugin

指定mysql的插件目錄

#plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"

指定載入哪些插件

#loose_rpl_semi_sync_master_enabled = 1

控制主庫上是否開啓semisync

#loose_rpl_semi_sync_slave_enabled = 1

控制備庫是否開啓semisync

#loose_rpl_semi_sync_master_timeout = 5000

單位毫秒,防止半同步複製在沒有收到確認的狀況下,發送堵塞。master在超時以前沒有收到確認,將恢復到異步複製,繼續執行半同步沒有進行的操做
 
[mysqld-5.7]

#innodb_buffer_pool_dump_pct = 40

表示轉儲每一個bp instance LRU上最熱的page的百分比。經過設置該參數能夠減小轉儲的page數

innodb_page_cleaners = 4

爲了提高擴展性和刷髒效率,在5.7.4版本里引入了多個page cleaner線程。從而達到並行刷髒的效果
在該版本中,Page cleaner並未和buffer pool綁定,其模型爲一個協調線程 + 多個工做線程,協調線程自己也是工做線程。所以若是innodb_page_cleaners設置爲8,那麼就是一個協調線程,加7個工做線程

#innodb_undo_log_truncate = 1

是否開啓在線回收(收縮)undo log日誌文件,支持動態設置

#innodb_max_undo_log_size = 2G

當超過這個閥值(默認是1G),會觸發truncate回收(收縮)動做,truncate後空間縮小到10M

#innodb_purge_rseg_truncate_frequency = 128

控制回收(收縮)undo log的頻率。undo log空間在它的回滾段沒有獲得釋放以前不會收縮, 想要增長釋放回滾區間的頻率,就得下降設定值

#binlog_gtid_simple_recovery=1

這個參數控制了當mysql啓動或重啓時,mysql在搜尋GTIDs時是如何迭代使用binlog文件的。 這個選項設置爲真,會提高mysql執行恢復的性能。由於這樣mysql-server啓動和binlog日誌清理更快。該參數爲真時,mysql-server只需打開最老的和最新的這2個binlog文件

log_timestamps=system

在MySQL 5.7.2 新增了 log_timestamps 這個參數,該參數主要是控制 error log、genera log,等等記錄日誌的顯示時間參數。 在 5.7.2 以後改參數爲默認 UTC 這樣會致使日誌中記錄的時間比中國這邊的慢,致使查看日誌不方便。修改成 SYSTEM 就能解決問題

#transaction_write_set_extraction=MURMUR32

這個神奇的參數5.7.6版本引入,用於定義一個記錄事務的算法,這個算法使用hash標識來記錄事務。若是使用MGR,那麼這個hash值須要用於分佈式衝突檢測何處理,在64位的系統,官網建議設置該參數使用 XXHASH64 算法。若是線上並無使用該功能,應該設爲off

#show_compatibility_56=on

從mysql5.7.6開始information_schema.global_status已經開始被捨棄,爲了兼容性,此時須要打開 show_compatibility_56
 
#table_open_cache = 512
table_open_cache指定表高速緩存的大小。每當MySQL訪問一個表時,若是在表緩衝區中還有空間,該表就被打開並放入其中,這樣能夠更快地訪問表內容。
經過檢查峯值時間的狀態值Open_tables和Opened_tables,能夠決定是否須要增長table_open_cache的值。
可經過 SHOW GLOBAL STATUS LIKE 'Open%tables'; 得到

 

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

相關文章
相關標籤/搜索