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