Mysql—參數設置

參照:https://github.com/jdaaaaaavid/mysql_best_configuration

 

 

mysql的參數設置,要根據資源做具體設置,以姜老師的參數設置爲例,做個參數的解釋而已。

 

  • 32 CPU core
  • 256G Memory
  • SSD storage with 20000 IOPS in 16K page size

服務器資源如上,mysql的參數設置參考如下:

[mysqld]
# basic settings #

user = 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模式#

autocommit = 1
#默認自動提交,建議保持。select 也算事務,不是自動提交 可能造成undo超大的情況。#

server-id = 8888
#服務器id,每個服務器需要不同#

character_set_server=utf8mb4
#字符集,真正的utf8#

datadir=/mysql_data/data
#數據目錄#

transaction_isolation = READ-COMMITTED
#隔離級別 默認RR, 建議RC 讀提交#

explicit_defaults_for_timestamp = 1
# 如果一行數據中某些列被更新了,如果這一行中有timestamp類型的列,那這個timestamp列的數據也會被自動更新到 當時的時間#

max_allowed_packet = 64M
#服務器接受包和發送包的大小#

event_scheduler = 1
#時間調度器,定時任務的調度#



# connection #
interactive_timeout = 1800
#交互式連接(mysql客戶端等)超時自動斷開 單位:秒#

wait_timeout = 1800
#非交互式連接(jdbc等)超時自動斷開 單位:秒#

lock_wait_timeout = 1800
#MDL元數據鎖等待超過該時間就報錯 單位:秒#

skip_name_resolve = 1
#禁用DNS解析  開啓後host必須是ip連接 不能用主機名#

max_connections = 1024
#最大併發連接數。  show processlist 可看當前連接#

max_user_connections = 256
#每個用戶的最大連接數#

max_connect_errors = 1000000
#連接不成功的最大嘗試數  默認100   建議 10萬以上#

# table cache performance settings #
table_open_cache = 4096
#緩存打開表的數量,靜態參數Opened_tables比table_open_cache大時,需要調整增大;還需要注意操作系統的打開文件數量大小#

table_definition_cache = 4096
#緩存.frm的打開數量#

table_open_cache_instances = 64
#實際可保持的table_cache的值爲table_definition_cache/table_open_cache_instances   todo.....#



# session memory settings #
read_buffer_size = 16M
#表的順序掃描,每個線程分配的緩衝區大小#

read_rnd_buffer_size = 32M
#表的隨機讀buffer緩存,每個線程分配的緩衝區大小。用於把隨機讀IO的數據排序,作爲順序讀IO輸出,參考MRR原理和order by的<sort_key, rowid> 排序方式#

sort_buffer_size = 32M
#在order by或group by排序時 ,排序的字段無索引時,爲了提高using filesort性能,每個線程分配的緩衝區大小(需要排序時 不論需求內存多少 都是一次性的分配該參數指定大小的全部內存)#

tmp_table_size = 64M
#內存臨時表大小,有大量group by操作時 可調大該參數,不夠時需要調用臨時磁盤空間#

join_buffer_size = 128M
#表連接,關聯了字段無索引時,爲了提高using join buffer性能,每個線程分配的緩衝區大小#

thread_cache_size = 64
#線程緩存 緩存空閒線程 不必要創建新線程#




# log settings #
general_log_file = general.log
#一般日誌文件#

log_error = error.log
#錯誤日誌#

log_error_verbosity = 2
#錯誤日誌記錄內容 1:Error messages;2:Error and warning messages;3:Error, warning, and information messages#

slow_query_log_file = slow.log
#慢日誌文件#

slow_query_log = 1
#是否開啓慢日誌#


long_query_time = 2
#執行查詢超過多少秒的sql 加入慢日誌中 單位:秒#

log_queries_not_using_indexes = 1
#沒有用到索引的sql 是否加入慢日誌中#

log_throttle_queries_not_using_indexes = 10
#每分鐘沒有使用索引的sql的記錄條數限制;默認0 無限制#

log_slow_admin_statements = 1
#開啓不是查詢的慢sql(include ALTER TABLE, ANALYZE TABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE, and REPAIR TABLE.);默認關閉#

min_examined_row_limit = 100
#查詢少於該指定的行 不寫到慢日誌中;默認0#

log_slow_slave_statements = 1
#記錄從服務器的慢sql日誌#

log_bin = binlog
#二進制日誌#

expire_logs_days = 90
#過期自動清除二進制日誌文件的天數#

log_bin_trust_function_creators = 1
#當二進制日誌啓用後,這個變量就會啓用。它控制是否可以信任存儲函數創建者,不會創建寫入二進制日誌引起不安全事件的存儲函數。如果設置爲0(默認值),用戶不得創建或修改存儲函數,除非它們具有除CREATE ROUTINE#
#或ALTER ROUTINE特權之外的SUPER權限。 設置爲0還強制使用DETERMINISTIC特性或READS SQL DATA或NO SQL特性聲明函數的限制。 如果變量設置爲1,MySQL不會對創建存儲函數實施這些限制。 此變量也適用於觸發器的創建。#






# innodb settings #
innodb_data_home_dir = /mysqlData/data
#文件目錄#

innodb_log_group_home_dir = /mysqlLog/logs
#redo log 目錄#

innodb_data_file_path = ibdata1:2G:autoextend
#共享表空間#

innodb_page_size = 16384
#頁大小 16k#

innodb_buffer_pool_size = 160G
#數據緩存池 佔比總內存60%-70%#

innodb_buffer_pool_instances = 16
#數據緩存池分實例數量#

innodb_buffer_pool_load_at_startup = 1
#啓動MySQL服務時,MySQL將本地熱數據加載到InnoDB緩衝池中 預熱#
innodb_buffer_pool_dump_at_shutdown = 1
#停止MySQL服務時,InnoDB將InnoDB緩衝池中的熱數據保存到本地硬盤#

innodb_lru_scan_depth = 4096
#控制LRU列表中可用頁的數量#

innodb_lock_wait_timeout = 5
#鎖掛起等待超過該時間就報錯 單位:秒#


innodb_io_capacity = 10000
#I/O吞吐量,從緩衝區刷新髒頁時,每秒刷新的頁的數量#

innodb_io_capacity_max = 20000
#I/O吞吐量,從緩衝區刷新髒頁時,每秒刷新的頁的最大數量#

innodb_flush_method = O_DIRECT
#打開和刷新日誌及數據文件的方式,默認爲 fsync方式,建議設置 O_DIRECT方式  並有寫緩存的raid卡 且設置爲wirte-back策略#

innodb_undo_logs = 128
#回滾段,默認128個,每個段支持在線事物1024#

innodb_undo_tablespaces = 3
#undo表空間個數,如果需要回收表空間 至少2個#

innodb_flush_neighbors = 0
#預寫。刷新buffer pool相同extend區的相鄰髒頁,機械盤建議開啓,ssd盤 高性能iops建議關閉此特性 因對於頻繁寫的表 刷新後又髒了 還需要刷新#

innodb_log_file_size = 16G
#redo日誌文件大小#

innodb_log_files_in_group = 2
#redo日誌組 個數#

innodb_log_buffer_size = 64M
#redo緩存大小#

innodb_purge_threads = 4
#事物提交後,回收已使用並分配的undo頁 的線程數量#

innodb_large_prefix = 1
#單列索引限制767 bytes,開啓後限制爲3072 bytes, 注意要生效需要加row_format=compressed或者dynamic#

innodb_thread_concurrency = 32
#一次有多少線程進入內核,併發查詢限制。默認0 表示不限制, 64以下線程設置 可設置爲0、以上設置接近或小於虛擬cpu的個數#
#併發查詢高 會影響CPU性能。   遇到進程進入鎖等待的情況時,實際不消耗cpu 所以將併發線程的計數減1,防止把併發查詢佔滿#
#show processlist 看的是併發連接,是max_connections參數限制的#

innodb_print_all_deadlocks = 1
#是否保存死鎖日誌到錯誤日誌(error.log)文件中#

innodb_strict_mode = 1
#是否開啓嚴格檢查,這樣的話就不會有告警信息 而是 直接拋出錯誤#
#The innodb_strict_mode setting affects the handling of syntax errors for CREATE TABLE, ALTER TABLE, CREATE INDEX, and OPTIMIZE TABLE statements. innodb_strict_mode also enables a record size check, so that an INSERT or UPDATE never fails due to the record being too large for the selected page size#

innodb_sort_buffer_size = 64M
#創建索引時 排序數據需要的內存空間#

innodb_write_io_threads = 16
#寫線程數量#

innodb_read_io_threads = 16
#讀線程數量#

innodb_file_per_table = 1
#每個表 獨立表空間#

innodb_stats_persistent = 1
#統計信息是否持久化保存在數據庫的表中,默認 開啓#

innodb_stats_persistent_sample_pages = 64
#收集統計信息時 隨機抽取的索引頁數 ,增加innodb_stats_persistent_sample_pages會使得收集時間變長 增加IO,默認20, 需要innodb_stats_persistent參數開啓才生效#

innodb_autoinc_lock_mode = 2
#向有auto_increment 列的表插入數據時,相關鎖的行爲,row複製時,可將innodb_autoinc_lock_mode設置爲2,這時可在所有insert情況下表獲得最大併發度  todo......#

innodb_online_alter_log_max_size=1G
#在線ddl時,會將insert、update、delete等dml操作放到緩存中,待ddl完成後 再重做應用到表上  到達數據一致性,默認128M, 但緩存的dml操作空間不夠時會報錯 error1799  建議1G#

#一次性可打開的.ibd文件數量#
innodb_open_files=4096






# replication settings #
sync_binlog = 1
#兩次刷新二進制日誌到磁盤 之間間隔了多少次二進制日誌寫操作,建議1#

log_slave_updates = 1
#把relay-log裏的日誌內容再記錄到slave本地的binlog裏#

binlog_format = ROW
#二進制複製 方式,建議行方式 row#

binlog_rows_query_log_events = 1
#在row模式下 開啓該參數,將把sql語句打印到binlog日誌裏面,默認 關閉#

relay_log = relay.log
#中繼日誌文件#

master_info_repository = TABLE
#從服務器上記錄master信息,可以有file(master.info)和table(mysql.slave_master_info)兩種記錄形式,如果使用5.7多通道複製技術必須設置爲table#

relay_log_info_repository = TABLE
#從服務器上記錄中繼日誌的偏移量,可以有file(relay-log.info)和table(mysql.slave_relay_log_info)兩種記錄形式,如果使用多通道複製技術必須設置爲table#
#建議table,因爲在file方式 刷盤宕機時,事務已提交 但relay-log.info沒有寫入  這樣重啓mysql服務後 就又從上次的偏移量執行一遍相同的sql#
#設置成table後,事務完成會更新mysql.slave_relay_log_info表,當宕機時 事務會回滾 mysql.slave_relay_log_info表不會記錄,這樣重啓mysql服務後 就又從上次的偏移量執行一遍相同的sql#

relay_log_recovery = 1
#當slave重啓之後會根據mysql.slave_relay_log_info重新創建一個文件,SQL線程會根據這個文件進行恢復複製,IO線程會讀取SQL線程的POS點,根據這個POS點向主庫申請拉取數據#
#建議開啓,保障了relay-log的完整性#

slave_skip_errors = ddl_exist_errors
#跳過忽略一些ddl的錯誤#

slave_rows_search_algorithms = 'INDEX_SCAN,HASH_SCAN'
#從庫複製的算法 選項 ,參考 Mysql源碼_ 主從的參數01_slave_rows_search_algorithms 章節#




# 5.7 parallel replication #
slave_parallel_type = LOGICAL_CLOCK
#並行複製,兩種方式,5.6是根據庫區分通道  database方式,5.7可以根據組提交的通道 LOGICAL_CLOCK方式#

slave_parallel_workers = 16
#並行複製的通道數 根據cpu設置#

slave_preserve_commit_order = 1
#在slave上 保證事務是按照relay log中記錄的順序來執行#

slave_transaction_retries = 128
#當線程執行失敗 重複的次數 而不是直接返回錯誤#




# password plugin #
validate_password_policy = STRONG
validate-password = FORCE_PLUS_PERMANENT



# perforamnce_schema settings #
performance-schema-instrument='memory/%=COUNTED'
performance_schema_digests_size = 40000
performance_schema_max_table_handles = 40000
performance_schema_max_table_instances = 40000
performance_schema_max_sql_text_length = 4096
performance_schema_max_digest_length = 4096




[mysqld-5.6]
# metalock performance settings #
metadata_locks_hash_instances = 64




[mysqld-5.7]
# new innodb settings #
loose_innodb_numa_interleave = 1

innodb_buffer_pool_dump_pct = 40
#關閉mysql服務時,轉儲活躍使用的innodb buffer pages的比例,默認25%;配合innodb_buffer_pool_load_at_startup和innodb_buffer_pool_dump_at_shutdown 兩個參數同時使用#
#如果啓用新的參數比如40 ,每個innodb buffer pool instance中有100個 ,每次轉儲每個innodb buffer 實例中的40個pages#

innodb_page_cleaners = 16

innodb_undo_log_truncate = 1
#是否回收undo表空間的空間,默認關閉,建議開啓#

innodb_max_undo_log_size = 2G
#達到最大值後,回收undo表空間,默認1G#

innodb_purge_rseg_truncate_frequency = 128





# other change settings #
binlog_gtid_simple_recovery = 1
#在啓動或者清除binlog二進制日誌時,僅僅需要掃描第一個binlog和最後一個binlog 這兩個binlog即可#
#在第一個binlog查找 第一個event事件:PREVIOUS_GTIDS_LOG_EVENT, 可以取得上一個binlog最後一個gtid。 可以記做lost 的binlog#
#在最後一個binlog查找 最近的event事件,可以找到binlog包含的所有的GTID#
#>= 5.7.7版本 默認開啓,建議開啓#

log_timestamps = system
show_compatibility_56 = on





# gtid settings #
gtid_mode = on
#是否開啓gtid#

enforce_gtid_consistency = 1
#更安全的設置,開啓gtid複製時 此參數必須設置爲on: the server enforces GTID consistency by allowing execution of only statements that can be safely logged using a GTID. You must set this variable to ON before enabling GTID based replication.#





# semisynchronous replication settings 半同步複製#
#主服務器參數配置 my.cnf#
rpl_semi_sync_master_enabled=1
#開啓半同步#

rpl_semi_sync_master_timeout=1000
#超時(rpl-semi-sync-master-timeout 參數默認 10000毫秒 =10秒)情況時,主服務器會切換到異步複製模式,直到有一臺從服務器追上進度#

#是否每個事務提交都都要等待slave的返回型號,如果slave掉隊 追趕上master日誌時 可自動的開啓半同步方式。參數默認開啓#
rpl_semi_sync_master_wait_no_slave=1

rpl_semi_sync_master_wait_point= AFTER_SYNC
#5.7新增 設置傳輸binlog時的 事務提交方式  默認after_sync,參考 最後的“附1:兩階段提交 2pc 內部xa”#
#AFTER_SYNC(the default):即在主服務器的執行一次sync 提交binlog後 等待從服務器的relay log寫入並應用後反饋,之後再commit存儲引擎事務(innodb的redo log),最後返回會話操作完成#
#AFTER_COMMIT:即在主服務器的commit存儲引擎事務(innodb的redo log)後,等待從服務器的relay log寫入並應用後反饋,最後返回會話操作完成#

rpl_semi_sync_master_trace_level=32
#調試級別 默認32#

#從服務器參數配置  my.cnf#
rpl_semi_sync_slave_enabled=1
#開啓半同步#

rpl_semi_sync_slave_trace_level=32
#調試級別 默認32#





# group replication settings 組複製#
plugin-load = "group_replication.so;validate_password.so;semisync_master.so;semisync_slave.so"
transaction-write-set-extraction = XXHASH64
# report_host = 127.0.0.1 # optional for group replication
# binlog_checksum = NONE # only for group replication
loose_group_replication = FORCE_PLUS_PERMANENT
loose_group_replication_group_name = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose_group_replication_compression_threshold = 100
loose_group_replication_flow_control_mode = 0
loose_group_replication_single_primary_mode = 0
loose_group_replication_enforce_update_everywhere_checks = 1
loose_group_replication_transaction_size_limit = 10485760
loose_group_replication_unreachable_majority_timeout = 120
loose_group_replication_start_on_boot = 0

 

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