##introduce ## This my.cnf for MySQL 5.7 ## Server configure is CPU 40C,MEM 256G ,Disk SSD + HHD. U should modify this cnf according to your configure. ## By aijie@jd.com #適用於全部客戶端程序讀取 [client] port = 3306 socket = /ssd_data/mysql/data/mysql.sock #適用於mysql客戶端程序 [mysql] no_auto_rehash # 當表多時,自動避免收集不少元數據信息,不能自動補全 prompt = "\\R:\\m:\\s\\d>" #H:M:S:DB pager = "more" default-character-set = utf8mb4 [mysqld_safe] malloc-lib=tcmalloc # 使用tcmalloc的內存管理機制避免表多致使的information_schema庫引發的OOM問題 [mysqldump] quick #備份時逐行讀取表而非一次所有行後緩衝在內存中,大表有效 single-transaction # 一致性備份 #適用於 mysqld 服務器 [mysqld] ##BASE_SETTING## port = 3306 socket = /ssd_data/mysql/data/mysql.sock server-id = 171109 report_host = 10.17.1.109 # show slave status 中主機IP basedir = /ssd_data/mysql datadir = /ssd_data/mysql/data tmpdir = /data/mysql/mysql_tmp user = mysql # 爲避免用戶--user=root向my.cnf文件添加選項 ssl-mode = disabled innodb_file_per_table = 1 # 獨立表空間 lower_case_table_names = 1 # 不區分大小寫,庫名、表名、表別名、變量名將以小寫處理 skip_external_locking = 1 # 默認禁用外部(系統)鎖,隻影響MyiSAM表訪問,不然容易死鎖 character_set_server = utf8mb4 collation_server = utf8mb4_bin transaction-isolation = READ-COMMITTED # 設置RC隔離級別 sysdate-is-now # SYSDATE()默認狀況下返回它執行的時間,而不是它開始執行的語句的時間。 sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION" # 老業務就按之前的配 #sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER" #explicit_defaults_for_timestamp = 1 # 明確timestamp默認值,新業務啓用,老業務繼承 #optimizer_switch = 'index_merge= off' ##CONNECTION## interactive_timeout = 1800 # 影響 wait_timeout參數 wait_timeout = 1800 # 服務器在關閉以前等待非交互式鏈接上的活動的秒數,默認28800 lock_wait_timeout = 1800 # 指定嘗試獲取元數據鎖定的超時時間 skip_name_resolve = 1 # 不解析客戶端鏈接主機名,,受權表只用IP地址或localhost max_connections = 1500 # 最大鏈接數 max_allowed_packet = 64M # 數據包最大大小 #max_user_connections = 256 # 同一用戶最大鏈接數,適合於so的多源從庫 max_connect_errors = 1000000 ##ENGINE## default_storage_engine = InnoDB # 默認存儲引擎,默認innodb disabled_storage_engines = ARCHIVE,BLACKHOLE,EXAMPLE,FEDERATED,MEMORY,MERGE,NDB #禁用其餘存儲引擎 innodb_page_size = 16384 innodb_buffer_pool_size = 160G # buffer pool大小 innodb_buffer_pool_instances = 16 # 將緩衝池劃分區域,較少池內爭用 innodb_buffer_pool_load_at_startup = 1 # MySQL服務器關閉時記錄InnoDB 緩衝池中緩存的頁面 innodb_buffer_pool_dump_at_shutdown = 1 # MySQL服務器啓動時加載緩存的Innodb頁面 innodb_flush_log_at_trx_commit = 1 # 默認1,0提交時不寫日誌,每秒寫日誌且刷盤,1提交時寫日誌並刷盤,2提交時寫日誌,每秒刷盤 innodb_max_dirty_pages_pct = 75 # 髒頁比例 innodb_lru_scan_depth = 4096 # lru掃描力度 innodb_lock_wait_timeout = 5 # 行鎖等待時間,默認50s,等待超時當前語句回滾而事務不會滾 innodb_data_file_path = ibdata1:1G:autoextend # 共享表空間數目和大小 innodb_undo_tablespaces = 3 # 5.7.21棄用 innodb_undo_logs = 128 # undo 段 innodb_undo_log_truncate = 1 # 開啓undo清理 innodb_max_undo_log_size = 3G # undo清理閾值 innodb_purge_rseg_truncate_frequency= 128 # 默認128,清理undo log頻率 innodb_log_files_in_group = 3 # redo log文件個數 innodb_log_file_size = 8G # redo log文件大小 innodb_log_buffer_size = 64M # 日誌緩衝區 innodb_io_capacity = 4000 # IO性能,SSD raid10在2w innodb_io_capacity_max = 8000 # IO 最大性能 innodb_flush_method = O_DIRECT # 默認null,使用O_DIRECT打開數據文件,並fsync刷新數據 innodb_large_prefix = 1 # InnoDB使用DYNAMIC 或 COMPRESSED 行格式的表 ,索引鍵前綴長度超過767個字節 innodb_print_all_deadlocks = 1 # 默認1,將死鎖信息打印到error log innodb_sort_buffer_size = 32M # 用於在建立InnoDB索引期間對數據進行排序的排序緩衝區的大小 innodb_thread_concurrency = 48 # Innodb嘗試保持小於此值得線程數,超過將處於擱置等待狀態 innodb_purge_threads = 4 # purge線程數目,默認4,減小內部徵用,提升多表DML操做效率 innodb_read_io_threads = 20 # 讀線程數目 innodb-write-io-threads = 20 # 寫線程數目 innodb_stats_persistent_sample_pages= 64 # 默認20,統計信息抽樣的索引頁的數量,增大提升explain準確性 innodb_autoinc_lock_mode = 2 # 自增鎖鎖定模式,默認1對於insert bluk持有讀取執行釋放,2持有讀取釋放執行sql innodb_online_alter_log_max_size = 1G # 默認128M,DDL期間臨時日誌文件大小 innodb_open_files = 4096 # 一次能夠保持打開最大ibd文件數量 innodb_stats_on_metadata = 0 # 默認0,保持禁用提升具備大量數據表或索引的訪問速度 loose_innodb_numa_interleave = 1 #V5.7.9需在numa開啓的linux編譯MySQL innodb_buffer_pool_dump_pct = 40 innodb_page_cleaners = 20 #innodb_strict_mode = 1 # 啓用Innodb嚴格模式,返回錯誤而不是警告,新業務開啓 ##REPLICATION## relay_log_info_repository = TABLE # 將複製信息存於表中,更安全和容易讀取 master_info_repository = TABLE sync_binlog = 1 relay_log = /data/mysql/mysql_relay # 設置relay log名稱,放在HHD,刷盤不影響SSD性能 relay_log_recovery = 1 # 開啓新中繼日誌,從SQL執行位置從新拉取,清理老relay log sync_relay_log = 1 # relay log的刷盤方式,0依賴OS,n,n個事件寫入relay log後刷盤 relay_log_purge = 1 # relay log 的清理,否則relay_log_recovery不生效 read_only = 0 skip_slave_start = 1 # 避免從庫slave線程自動啓動 slave_net_timeout = 3600 # 主從斷開後,從庫從新鏈接主庫等待事件 #slave-rows-search-algorithms = 'INDEX_SCAN,HASH_SCAN' ##parallel## slave_parallel_type = LOGICAL_CLOCK #基於組提交的並行複製方式 slave_parallel_workers = 16 # 16個併發線程 #slave_preserve_commit_order = 1 #和主句的提交順序相同 #slave_transaction_retries = 128 #並行意味着有鎖的問題,鎖超時以後,事物回滾前,嘗試再次執行128次 ##GTID## #gtid_mode = ON # 開啓GTID #enforce_gtid_consistency = 1 # GTID強一致 #binlog_gtid_simple_recovery = 1 # 5.7.7 以後默認值爲on,只從最新的最老的binlogflie中計算獲得gtid_purged and gtid_executed的值。 #gtid-executed-compression-period = 1000 #默認1000,gtid_execute壓縮週期 ##SEMISYNC## #plugin_load = "rpl_semi_sync_master= semisync_master.so;rpl_semi_sync_slave= #semisync_slave.so" #rpl_semi_sync_master_wait_point = AFTER_SYNC #5.7默認模式,5.6AFTER_COMMIT #rpl_semi_sync_master_enabled = 1 # 啓用主庫半同步插件 #rpl_semi_sync_slave_enabled = 0 # 啓用從庫半同步插件 #rpl_semi_sync_master_timeout = 300000 # 從半同步轉爲異步超時時間,單位ms5min #rpl_semi_sync_master_wait_no_slave = 1 # 默認1,表示從庫數目低於rpl_semi_sync_master_wait_for_slave_count 主庫不等待 #rpl_semi_sync_master_wait_for_slave_count = 1 # N個slave接收到relay log 發回ack的個數 ##REPLICATION_FILTER## replicate-do-db = so1 # 複製過濾,只複製哪一個DB,多庫寫多條 replicate-do-db = so2 replicate-do-db = so3 replicate-do-db = so4 replicate-do-db = so5 replicate-do-db = so6 replicate-ignore-table = so1.so_item_history_bak # 複製過濾,複製忽略哪一個表,多表多條 replicate-ignore-table = so1.so_history_bak replicate-ignore-table = so1.so_item_history_bak replicate-ignore-table = so1.so_history_bak replicate-ignore-table = so1.so_item_history_bak replicate-ignore-table = so1.so_history_bak replicate-ignore-table = so1.so_item_history_bak replicate-ignore-table = so1.so_history_bak replicate-ignore-table = so1.so_item_history_bak replicate-ignore-table = so1.so_history_bak replicate-ignore-table = so1.so_item_history_bak replicate-ignore-table = so1.so_history_bak ##新增PS參數## #配置一個mem計數工具,控制PS庫使用的內存上線以及SQL的顯示寬度# performance-schema-instrument ='memory/%=COUNTED' performance_schema_digests_size = 40000 performance_schema_max_table_instances = 40000 performance_schema_max_sql_text_length = 4096 performance_schema_max_digest_length = 4096 ##CACHE## key_buffer_size = 1G # MyiSAM索引塊緩衝,全部線程共享 myisam_sort_buffer_size = 128M # MyiSAM表:REPAIR TABLE對索引排序、Create index、Alter index時的緩衝區 max_heap_table_size = 64M # 新建MEMORY表容許增加的最大大小 ##TABLE_CACHE_PERFORMANCE_SETTINGS## open_files_limit = 65535 # 操做系統容許mysqld打開的文件數量 table_open_cache = 4096 # 默認2000,全部線程的打開表的數量 # 若是值Opened_tables較大,應增長此值,參考值max_connections*查詢用到表數 table_definition_cache = 4096 # frm表可被緩存數量。400+(table_open_cache / 2),上限2000 table_open_cache_instances = 64 # 打開表緩存實例的數量,減小爭用 # session memory settings # read_buffer_size = 16M # 線程爲順序掃描的MyiSAM表分配的緩衝區 read_rnd_buffer_size = 32M # MyiSAM表讀取數據緩衝區 sort_buffer_size = 32M # 會話級別排序緩衝區 tmp_table_size = 64M # 內存臨時表的大小tmp_table_size和max_heap_table_size中較小決定 join_buffer_size = 128M # 會話級別錶鏈接的空間 thread_cache_size = 64 # 應緩存多少線程複用,當線程數小於此值就會被緩存 # log settings # ##Error log## log_error = error.log log_error_verbosity = 2 # 5.7.2 添加優先於log-warnings,記錄錯誤一、警告二、註釋3 ##binlog## log-bin = /ssd_data/mysql/arch/mysql-bin binlog_rows_query_log_events = 1 # 在binlog中記錄原生SQL log_bin_trust_function_creators = 1 # 默認關閉,將function寫入binlog,避免默認狀況下回阻止function的建立 binlog_format = row # 行模式複製 max_binlog_size = 1G # binlog文件大小 binlog_error_action = ABORT_SERVER # 默認ABORT_SERVER,當沒法寫入刷新同步二進制日誌時,關閉二進制日誌,建議support_xa開啓 #expire_logs_days = 90 # 使用腳本進行刪除 #log_slave_updates = 1 # 執行relay log,並生成binlog,用於級聯 ##log format## log-output = TABLE,FILE # slow log 和general log 的輸出方式, 須要啓用general_log_file和 slow_query_log_file general_log_file = general.log log_timestamps = system # 默認UTC,控制寫入錯誤日誌的消息中的時間戳的時區 ##Slow log## slow_query_log = 1 # 開啓慢查詢 slow_query_log_file = slow.log # 慢查詢日誌名稱 log_throttle_queries_not_using_indexes = 10 # 限制每分鐘10條not_using_indexes log_queries_not_using_indexes = 1 # 記錄不使用索引的SQL到慢日誌 long_query_time = 2 # 慢查詢時間閾值 log_slow_admin_statements = 1 # 記錄管理性慢語句 log_slow_slave_statements = 1 # 在slave記錄超過long_query_time到從庫慢日誌 min_examined_row_limit = 100 # 檢查少於此行數的查詢不會記錄到慢速查詢日誌中。 #CLIENT_DEPRECATE_EOF session_track_schema = 1 # 是否跟蹤當前會話中對默認模式(數據庫)名稱的更改,並在發生更改時使此信息可供客戶端使用 session_track_state_change = 1 # 控制服務器是否跟蹤對當前會話狀態的更改,並在更改時通知客戶端 #session_track_system_variables = '*' # 控制服務器是否跟蹤對會話系統變量的更改,並在發生更改時將此信息提供給客戶端 ##MGR_Setting## #plugin-load = "group_replication.so;" # validate_password.so #loose_group_replication_start_on_boot = 0 # 在mysqld啓動時不自動啓動組複製 #group_replication_single_primary_mode = off # 默認單主模式,單主仍是多主模式 #binlog_checksum = NONE # 默認CRC32,only for group replication, #transaction-write-set-extraction = XXHASH64 # MGR中開啓主鍵信息採集功能 #loose_group_replication = FORCE_PLUS_PERMANENT #loose_group_replication_group_name = "aaaa-aaaa-aaaa-aaaa-aaaa" # 此服務器實例所屬的組的名稱。必須是有效的UUID #loose-group_replication_local_address = 'node2:33061' # 本地成員的地址,node2+port,節點之間經過這個端口號進行通訊 #loose-group_replication_group_seeds = "127.0.0.1:24901,127.0.0.1:24902,127.0.0.1:24903" #loose_group_replication_compression_threshold = 100 #loose_group_replication_flow_control_mode = 0 #loose_group_replication_single_primary_mode = 0 #loose_group_replication_transaction_size_limit = 10485760 #loose_group_replication_enforce_update_everywhere_checks = 1 #單主關閉,多主開啓,多主模式限制檢測 #loose_group_replication_unreachable_majority_timeout = 120 ## 棄用## #innodb_locks_unsafe_for_binlog # 5.6.3棄用 #metadata_locks_cache_size # 5.7.4 MDL鎖定實現變化棄用 #metadata_locks_hash_instances = 64 # 5.7.4棄用 #innodb_support_xa # 5.7.10 棄用 #query_cache_size = 0 # 查詢緩存大小 #query_cache_type = 0 # MySQL 5.7.20棄用。0不緩存結果,關閉查詢緩存,1全開,2部分開 #MyISAM表維護實用程序 [myisamchk] key_buffer_size = 20M sort_buffer_size = 20M read_buffer = 2M write_buffer = 2M
部分選項詳細解釋node
binlog_error_action= ABORT_SERVER -- 在MySQL 5.7.7和更高版本中,這個變量默認爲 ABORT_SERVER,這會使服務器中止日誌記錄,並在二進制日誌遇到這樣的錯誤時關閉。在服務器從新啓動時,全部先前準備好的和二進制記錄的事務都被提交,而任何已準備好但沒有因爲錯誤而被二進制記錄的事務被停止。 -- 應該配合xa參數 binlog_rows_query_log_events= 1 --將原生SQL以註釋方式寫入 master-info-repository=TABLE relay-log-info-repository=TABLE 當從庫意外中止後,從新啓動須要一些信息:I/O線程接收到多少事務,SQL線程執行了哪些事務,默認這些信息存儲在file中,但這樣有由於從庫執行事務不一樣階段失去和主機同步的風險,甚至文件損壞等狀況。 設置 relay_log_info_repository和 master_info_repository到 TABLE。 服務器將在mysql.slave_master_info表中恢復I / O線程所需的信息以及在mysql.slave_relay_log_info表中恢復SQL線程所需的信息 sync_binlog=1 relay_log_recovery=1 --當服務器啓動當即自動恢復中繼日誌,過程是:1建立新中繼日誌,SQL線程位置初始化爲此中繼日誌(Relay_Log_File + Relay_Log_Pos ),2IO線程初始化爲SQL線程位置並開始拉取日誌。 --當revovery啓動,relay_log_purge關閉,可能形成從未清除文件中讀取中繼日誌