##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关闭,可能形成从未清除文件中读取中继日志