1.前言
在本节没有出来以前,我看过很多的关于Mysql的配置文件参数,网上也有很多模板,这里我想将之前看到的一些有用的配置参数(可以用到生产环境)的给重新整理一份分享出来,如有错误或者不足还请后来的读者可以指出。
2.my.cnf配置参数
#[client]
待补充。。。该选项组一般是客户端程序读取的配置块。可以不写
[mysql]
prompt="u@mysqldb R:m:s [d]> " ##这个是mysql的命令提示符,该参数有时候可能在单实例的配置中可能不会生效,有时候我们可以将它放到全局配置文件/etc/my.cnf中
no-auto-rehash ##这个是不启用自动补全功能
[mysqld] ########basic settings########
user = mysql server-id = 11 port = xx bind_address = xx.xx.xx.xx #根据实际情况修改 character_set_server=utf8mb4 skip_name_resolve = 1 max_connections = 800 max_connect_errors = 1000 datadir = /data/mysql_data #根据实际情况修改,建议和程序分离存放 #transaction_isolation = READ-COMMITTED ##5.7和8.0默认隔离级别 explicit_defaults_for_timestamp = 1 #join_buffer_size = 134217728 #tmp_table_size = 67108864 tmpdir = /tmp 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 = 1800 wait_timeout = 1800 #read_buffer_size = 16777216 #read_rnd_buffer_size = 33554432 #sort_buffer_size = 33554432 ########log settings######## log_error = xxxxxx ##根据自己路径进行修改 slow_query_log = 1 slow_query_log_file = 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 long_query_time = 2 min_examined_row_limit = 100
expire_logs_days = 90 ##binlog二进制保存有效期。
########replication settings######## master_info_repository = TABLE relay_log_info_repository = TABLE log_bin = bin.log ##根据自己的路径进行修改 sync_binlog = 1 ##双一之一 gtid_mode = on enforce_gtid_consistency = 1 log_slave_updates ##该参数是开启slave的binlog日志功能(常用与高可用架构中) binlog_format = row relay_log = relay.log relay_log_recovery = 1 binlog_gtid_simple_recovery = 1 slave_skip_errors = ddl_exist_errors
#####并行复制(主要指从库上的SQL线程进行并行回放)##########
slave_parallel_type=LOGICAL_CLOCK ##该参数要求主备两库上面都需要进行配置,而下面两个参数只需要在从库上配置即可
slave_perserve_commit_order=1
slave_parallel_workers=N ##开启N个worker线程进行并行回放
########innodb settings######## innodb_page_size = 8192 ##数据页的大小 innodb_buffer_pool_size = 6G #根据实际情况修改,很重要,一般会配置为物理机内存的70% 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 ##这里是磁盘iops的能力,一般不会限制它的一下,填写磁盘的最大的iops即可 innodb_io_capacity_max = 8000 ##这可以个人可以填写磁盘顺序读的io(带宽能力) innodb_flush_method = O_DIRECT innodb_file_format = Barracuda innodb_file_format_max = Barracuda
innodb_log_files_in_group = 4 ##这个是配置redo log日志的个数 innodb_log_group_home_dir = /redolog/ #根据实际情况修改 innodb_undo_directory = /undolog/ #根据实际情况修改 innodb_undo_logs = 128 innodb_undo_tablespaces = 3 innodb_flush_neighbors = 0 ##指定是否冲洗从一个页面InnoDB 缓冲池也可以清空其他脏页在相同的程度。设置为0将禁用 innodb_flush_neighbors。处于相同程度的脏页不会被刷新
innodb_log_file_size = 4G #根据实际情况修改,生产环境一般都会配置4G innodb_log_buffer_size = 16777216
innodb_data_file_path = ibdata1:1G:autoextend ###按我理解是当系统表空间(ibdata1)达到阈值时,它会按照1G的容量进行自动扩容
innodb_open_files = 65535 innodb_max_dirty_pages_pct = 50 ##这个是脏页的刷新占比,默认是75%
innodb_write_io_threads = 8 innodb_read_io_threads = 8 innodb_purge_threads = 4 innodb_page_cleaners = 4
innodb_large_prefix = 1 innodb_thread_concurrency = 64 ##并发数,一般填写服务器逻辑CPU的个数 #innodb_print_all_deadlocks = 1 #innodb_strict_mode = 1 innodb_sort_buffer_size = 67108864
innodb_file_per_table = 1 ##开启独立表空间
innodb_online_alter_log_max_size = 4G ##这个是在线ddl存储的最大日志量(也就就是ddl中的row log日志)
#innodb_status_output = 0 ## 这个是是否开启innodb锁的信息 #innodb_status_output_locks = 0 ##这个是是否打开锁信息输出功能
########semi sync replication settings######## plugin_dir=/usr/local/mysql/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
[mysqldump]
quick
max_allowed_packet = 32M ##mysql根据配置文件会限制server接受的数据包的大小
参看知数堂的参考

1 ##########服务器物理内存是64G,该实例有512个数据表,该实例最大并发连接数是512,binlog只保存7天################## 2 ##以下默认值都是基于5,7.26版本 3 ## my.cnf for MySQL 5.7/8.0 4 ## autoor: yejr(yejinrong@zhishutang.com, http://imysql.com, QQ: 4700963) 5 ## 6 ## 叶金荣(yejr) 7 ## 靠谱优质的在线培训品牌知数堂培训(http://zhishuedu.com)联合创始人 8 ## 新浪微博: @叶金荣, 微信公众:老叶茶馆(imysql_wx) 9 ## QQ群: 650149401 10 ## 注意:个别建议可能需要根据实际情况作调整,请自行判断或联系我,本人不对这些建议结果负相应责任 11 ## 本配置文件主要适用于MySQL 5.7/8.0版本 12 # 13 [client] 14 port = 3306 15 socket = /data/mysql/mysql.sock 16 17 [mysql] 18 prompt="u@mysqldb R:m:s [d]> " 19 no-auto-rehash ##这个是不启用自动补全功能 20 21 [mysqld] 22 user = mysql 23 port = 3306 24 basedir = /usr/local/mysql 25 datadir = /data/mysql 26 socket = /data/mysql/mysql.sock 27 pid-file = mysqldb.pid 28 character-set-server = utf8mb4 ##这个是设置mysql服务器中的字符集 29 skip_name_resolve = 1 ## 30 31 #若你的MySQL数据库主要运行在境外,请务必根据实际情况调整本参数 32 log_timestamps=system ##这个是设置mysql日志文件的时间和系统时间保持一致 33 open_files_limit = 65535 ###默认值是5000 34 back_log = 1024 ##mysql能暂存的连接数量,默认是80 35 max_connections = 512 ##mysql最大连接数,这里是自身mysql服务器并发请求量的情况而定。默认是151,如果该值过小,会报ERROR 1040 (HY000): Too many connections 36 max_connect_errors = 1000000 ##默认是100,可以适当提高该值 37 table_open_cache = 1024 38 table_definition_cache = 1024 39 table_open_cache_instances = 64 40 thread_stack = 512K 41 external-locking = FALSE 42 max_allowed_packet = 32M 43 sort_buffer_size = 4M ##默认256k,每个需要进行排序的线程分配该大小的一个缓冲区(针对order by/group by/distinct/union) 44 join_buffer_size = 4M ##默认是256k,这个用户表间关联缓存的大小,该参数对应的分配内存也是每个连接独享。一般我们会通过建索引的方式提高join关联的查询。 45 thread_cache_size = 768 ##服务器线程缓存,默认是9个,该值可以重新利用保存在缓存中线程的数量,当断开连接时,那么客户端的线程将被放到缓存中响应下一个客户端而不是销毁(前提是缓存数未达上限),如果线程重新被请求,那么请求将从缓存中读取,如果缓存中是空的或者是新的请求,那么这个线程将被重新创建,如果有很多新的线程,增加这个值可以改善系统性能.) 46 interactive_timeout = 600 ##默认是8小时,表示关闭一个交互式连接要等待的秒数,这个一般针对的是应用程序,此值会设置的比较大一些 47 wait_timeout = 600 ##默认是8小时,表示关闭一个非交互的连接之前要等待的秒数,该值一般会设置小一点。 48 tmp_table_size = 32M ##默认是16M 49 max_heap_table_size = 32M 50 slow_query_log = 1 51 slow_query_log_file = /data/mysql/slow.log 52 log-error = /data/mysql/error.log 53 long_query_time = 0.1 该值是情况而定 ##设定慢查询的阀值,超出次设定值的SQL即被记录到慢查询日志,缺省值为10s.所有的使用了比这个时间(以秒为单位)更多的查询会被认为是慢速查询.不要在这里使用”1″, 否则会导致所有的查询,甚至非常快的查询页被记录下来(由于MySQL 目前时间的精确度只能达到秒的级别). 54 log_queries_not_using_indexes =1 ##这个是记录没有走索引的sql语句 55 log_throttle_queries_not_using_indexes = 60 ###设定每分钟记录到日志的未使用索引的语句数目,超过这个数目后只记录语句数量和花费的总时间 56 min_examined_row_limit = 100 ###表示扫描的行数大于100行看,如果没有大于100行,即使这个语句执行时间超过了long_query_time的阈值也不会被记录。 57 log_slow_admin_statements = 1 #记录执行缓慢的管理SQL,如alter table,analyze table, check table, create index, drop index, optimize table, repair table等 58 log_slow_slave_statements = 1 ##记录从库上执行的慢查询语句 59 server-id = 3306 60 log-bin = /data/mysql/mybinlog 61 sync_binlog = 1 62 binlog_cache_size = 4M 63 max_binlog_cache_size = 2G 64 max_binlog_size = 1G 65 66 #注意:MySQL 8.0开始,binlog_expire_logs_seconds选项也存在的话,会忽略expire_logs_days选项 67 expire_logs_days = 7 68 69 master_info_repository = TABLE ##这个不能保证io线程的高可用性 70 relay_log_info_repository = TABLE ##这个是保证sql线程的高可用性 71 relay_log_recovery = 1 ###这个参数是保证IO线程的高可用性 72 gtid_mode = on ##gtid设置 73 enforce_gtid_consistency = 1 ##gtid设置 74 log_slave_updates ##如果当前的库还有从库的话,这个参数也必须要打开 75 slave-rows-search-algorithms = 'INDEX_SCAN,HASH_SCAN' 76 binlog_format = row 77 binlog_checksum = 1 78 79 relay-log-purge = 1 ##这个默认是打开的,表示是否自动清空不再需要的中继日志。 80 key_buffer_size = 32M ##表示索引(Myisam)缓冲区大小,它决定索引处理的速度,特别是读的速度。默认是8M 81 read_buffer_size = 8M ##mysql读入缓冲区大小,对表进行顺序扫描的请求将分配一个读入缓冲区,mysql会为它分配一段内存缓冲区。如果对表的扫描请求很频繁,可以调大该值。 82 read_rnd_buffer_size = 4M ##MySql的随机读(查询操作)缓冲区大小 83 bulk_insert_buffer_size = 64M 84 myisam_sort_buffer_size = 128M 85 myisam_max_sort_file_size = 10G 86 myisam_repair_threads = 1 87 lock_wait_timeout = 3600 ##此变量指定尝试获取元数据锁定的超时(以秒为单位)。允许的值范围是1到31536000(1年)。默认值为31536000 88 explicit_defaults_for_timestamp = 1 89 innodb_thread_concurrency = 0 ##此参数用来设置innodb线程的并发数量,默认值为0表示不限制 90 #innodb_sync_spin_loops = 100 91 #innodb_spin_wait_delay = 30 92 93 transaction_isolation = REPEATABLE-READ 94 #innodb_additional_mem_pool_size = 16M 95 innodb_buffer_pool_size = 45875M ##这个参数很重要,默认是128M 96 innodb_buffer_pool_instances = 4 97 innodb_buffer_pool_load_at_startup = 1 ###指定在MySQL服务器启动时,通过加载先前保存的相同页面来自动预热InnoDB 缓冲池 98 innodb_buffer_pool_dump_at_shutdown = 1 ###指定在关闭MySQL服务器时是否记录InnoDB 缓冲池中缓存的页面 ,以缩短下次重启时的 预热过程。通常与结合使用 innodb_buffer_pool_load_at_startup。该 innodb_buffer_pool_dump_pct 选项定义要转储的最近使用的缓冲池页面的百分比 99 innodb_data_file_path = ibdata1:1G:autoextend ###按我理解是当系统表空间(ibdata1)达到阈值时,它会按照1G的容量进行自动扩容。 100 innodb_flush_log_at_trx_commit = 1 101 innodb_log_buffer_size = 32M ##这个是设置日志缓冲区的大小,默认是16M 102 innodb_log_file_size = 2G ##这个主要是redo log 日志的大小,默认是48M 103 innodb_log_files_in_group = 3 ##为提高性能,MySQL可以以循环方式将日志文件写到多个文件。推荐设置为3 104 innodb_max_undo_log_size = 4G ##这个表示每个undo日志的最大容量,默认是1G 105 innodb_undo_directory = /data/mysql/undolog ##这个是undo日志放置的位置 106 innodb_undo_tablespaces = 95 107 108 # 根据您的服务器IOPS能力适当调整 109 # 一般配普通SSD盘的话,可以调整到 10000 - 20000 110 # 配置高端PCIe SSD卡的话,则可以调整的更高,比如 50000 - 80000 111 innodb_io_capacity = 4000 ###该innodb_io_capacity变量定义提供给整体的I / O容量 InnoDB。应该将其设置为大约系统每秒可以执行的I / O操作数(IOPS),默认是200 112 innodb_io_capacity_max = 8000 113 innodb_flush_sync = 0 ##默认是禁止 114 innodb_flush_neighbors = 0 ##指定是否冲洗从一个页面InnoDB 缓冲池也可以清空其他脏页在相同的程度。设置为0将禁用 innodb_flush_neighbors。处于相同程度的脏页不会被刷新 115 innodb_write_io_threads = 8 116 innodb_read_io_threads = 8 117 innodb_purge_threads = 4 118 innodb_page_cleaners = 4 119 innodb_open_files = 65535 120 innodb_max_dirty_pages_pct = 50 ##这个是脏页的刷新占比,默认是75% 121 innodb_flush_method = O_DIRECT ##这个表示数据页和redo log做持久化时用到的一个刷盘策略。 122 innodb_lru_scan_depth = 4000 ##默认是1024, 123 innodb_checksum_algorithm = crc32 124 innodb_lock_wait_timeout = 10 ##InnoDB 事务在被回滚之前可以等待一个锁定的超时秒数。InnoDB 在它自己的 锁定表中自动检测事务死锁并且回滚事务。 InnoDB 用 LOCK TABLES 语句注意到锁定设置。默认值是 50 秒 125 innodb_rollback_on_timeout = 1 ##InnoDB 默认情况下,仅回滚事务超时上的最后一条语句。如果 --innodb-rollback-on-timeout指定,则事务超时导致 InnoDB中止并回滚整个事务。 126 innodb_print_all_deadlocks = 1 #当启用该选项,所有信息死锁在 InnoDB用户交易被记录在 mysqld 错误日志 127 innodb_file_per_table = 1 ##这里启用独立空间 128 innodb_online_alter_log_max_size = 4G 129 innodb_stats_on_metadata = 0 #禁用优化器统计信息或使用创建或更改单个表时,优化器统计信息不会保留在磁盘 上 130 innodb_undo_log_truncate = 1 131 132 #注意:MySQL 8.0.16开始删除该选项 133 internal_tmp_disk_storage_engine = InnoDB 134 135 # some var for MySQL 5.7 136 innodb_checksums = 1 137 #innodb_file_format = Barracuda 138 #innodb_file_format_max = Barracuda 139 query_cache_size = 0 ##关闭查询缓冲 140 query_cache_type = 0 141 innodb_undo_logs = 128 142 143 innodb_status_file = 1 144 #注意: 开启 innodb_status_output & innodb_status_output_locks 后, 可能会导致log-error文件增长较快 145 innodb_status_output = 0 146 innodb_status_output_locks = 1 147 148 innodb_sort_buffer_size = 67108864 149 innodb_autoinc_lock_mode = 1 150 151 #performance_schema 152 performance_schema = 1 153 #performance_schema_instrument = '%memory%=on' 154 #performance_schema_instrument = '%lock%=on' 155 156 #innodb monitor 157 innodb_monitor_enable="module_innodb" 158 innodb_monitor_enable="module_server" 159 innodb_monitor_enable="module_dml" 160 innodb_monitor_enable="module_ddl" 161 innodb_monitor_enable="module_trx" 162 innodb_monitor_enable="module_os" 163 innodb_monitor_enable="module_purge" 164 innodb_monitor_enable="module_log" 165 innodb_monitor_enable="module_lock" 166 innodb_monitor_enable="module_buffer" 167 innodb_monitor_enable="module_index" 168 innodb_monitor_enable="module_ibuf_system" 169 innodb_monitor_enable="module_buffer_page" 170 innodb_monitor_enable="module_adaptive_hash" 171 172 [mysqldump] 173 quick 174 max_allowed_packet = 32M ##mysql根据配置文件会限制server接受的数据包的大小