Mysql
Mysql入门系列
Mysql字典
Mysql安装部署
原有环境部署多个版本
从头部署多个版本
Mysql-5.6 二进制多实例部署
centos7部署二进制mysql-5.6
centos7部署mysql-5.7
Mysql原理说明
索引的数据结构及算法原理
千万的数据,你是怎么查询的?
分库分表方案
Mysql资料 视图
Mysql资料 查询条件
Mysql资料 存储索引
Mysql资料 数据类型
Mysql资料 主键
Mysql资料 索引
Mysql资料 锁机制
Mysql资料 查询SQL执行顺序
Mysql资料 用户权限详解
Mysql资料 慢查询
Mysql服务维护
shell脚本 mysql-binlog分析
shell脚本 binlog方式增量备份mysql
shell脚本 mysqldump方式全备份mysql
阿里云RDS备份 恢复到本地
xtra+binlog增量备份脚本
xtrabackup备份脚本
mysqldump备份容灾脚本
Mysql资料 xtrabackup
Mysql资料 mysqldump
数据恢复binlog2sql
数据备份类型简介
Mysql资料 Binlog
Mysql安全检查
Mysql配置文件
shell脚本 比较mysql配置文件
Mysql脚本 优化检测
Mysql配置文件 16c64g优化
Mysql配置文件 4c8g优化
Mysql配置文件 innodb引擎
Mysql配置文件 binlog和慢日志
Mysql配置文件 扩展详细配置
Mysql配置文件 基本设置
Mysql配置文件 客户端
show_slave_status参数详解
Mysql_SQL语句
Mysql状态信息查询
用户和密码管理操作
表和字段管理操作
库管理操作
基本操作
Mysql集群
Innodb Cluster集群部署配置
什么是mysql innodb cluster?
主从复制参数详解
Mysql配置 主主同步
Mysql配置 主从同步
Mysql新闻
Mysql使用案例
shell脚本 安全删除MySQL大表
shell脚本 检查mysql节点数据一致性
shell脚本 批量查看mysql表条目数
Mysql报错合集
Mysql一致性效验_pt工具
mysqlslap基准测试
Mysql实例 数据库优化
Mysql解决主从慢同步问题
Mysql实例 表设计
Mysql脚本 生成测试数据
本文档使用 MrDoc 发布
-
+
home page
Mysql配置文件 扩展详细配置
[TOC] ## 配置文件中有些特定参数 ON代表打开,OFF代表关闭 1代表打开,0代表关闭 TRUE代表打开,FALSE代表关闭 字母不区分大小写。比如ON和on都可以 ## 扩展配置 ### max_connections 允许最大连接数,默认100,最大16384。这个根据性能调节,如果3000连接就会导致mysql的资源不够,那就给3000.因为再给多了,就会导致其它连接的资源被抢占。 建议: 根据需求来看,一般2核4G机器填写1000,16核64G填写5000。 测试运行后,查询当前所有连接数和服务器负载情况。若连接数满了,但负载还不是很大,可以加大连接数。 查询配置:`status`Threads就是连接数 在线配置: 配置文件参数:`max_connections=5000` ### connect_timeout 建立三次握手的超时时间,可能是客户端和服务端网络问题导致的链接超时,单位秒。 查询配置: 在线配置: 配置文件参数:`connect_timeout=10` ### interactive_timeout|wait_timeout 控制连接最大空闲时长的参数。默认28800,也就是8小时,单位秒。 wait_timeout控制非交互,比如java程序的链接,interactive_timeout控制交互,比如mysql命令进行的操作。 建议: 通常情况下300秒就足够了,这样防止有些链接假死,不做操作单还占用链接。 查询:`show global variables like '%timeout%';` 在线配置:`set global wait_timeout=300;` | `set global interactive_timeout=300;` 配置文件:`interactive_timeout = 300` | `wait_timeout = 300` ### net_retry_count 如果读或写一个通信端口中断,mysql放弃前尝试连接的次数。在FreeBSD系统中此值应设置很高,因为FreeBSD内部中断被发送到所有线程去。 查询配置: 在线配置: 配置文件参数:`net_retry_count = 100` ### thread_concurrency 这个变量是针对Solaris系统的,设定为内核数的2倍。 如果设置这个变量的话,mysqld就会调用thr_setconcurrency()。这个函数使应用程序给同一时间运行的线程系统提供期望的线程数目。 查询配置: 在线配置: 配置文件参数:`thread_concurrency = 8` ### thread_cache_size|thread_stack 每一个客户端连接都会有一个与之对应的连接线程。在MySQL中实现了一个Thread Cache池,将空闲的连接线程存放其中,而不是完成请求后就销毁。 这样,当有新的连接请求时,MySQL首先会检查Thread Cache中是否存在空闲连接线程,如果存在则取出来直接使用,如果没有空闲连接线程,才创建新的连接线程。3G内存设置64个比较好 每个连接线程被创建时,MySQL给它分配的内存大小。当MySQL创建一个新的连接线程时,需要给它分配一定大小的内存堆栈空间,以便存放客户端的请求的Query及自身的各种状态和处理信息。thread_stack控制这个值。16G/32G机器设定512K,太小会有 Thread stack overrun 错误。 可以用sql语句`show global status like 'Thread%';`来查看参数 +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | Threads_cached | 1 | | Threads_connected | 1 | | Threads_created | 2 | | Threads_running | 1 | +-------------------+-------+ Threads_cached,如果太大,证明一直在创建新的线程,可以将thread_cache_size调大。 查询配置:`show variables like 'thread_%';` 在线配置: 配置文件参数:`thread_cache_size = 64` | `thread_stack = 1M` ### open_files_limit mysql可以打开的最大文件数,不能超过 `ulimt -n` 看到的数值 查询配置: 在线配置: 配置文件参数:`open_files_limit = 65535` ### max_connect_errors [实验参考](https://www.cnblogs.com/kerrycode/p/8405862.html "实验参考") 当客户端连接延迟超过**connect_timeout**定义的时间时,将会在**performance_schema**数据库下**host_cache**表中进行记录。 可以用`use performance_schema;select * from host_cache\G;`来查看**SUM_CONNECT_ERRORS**字段将会增加。 当超过的次数等于**max_connect_errors**定义的次数时,将会报错如下: ERROR 1129 (HY000): Host '10.10.10.101' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' 尽量去改善网络环境,或者将**max_connect_errors**值调大 查询配置:`show variables like '%max_connect_error%';` 在线配置:`set global max_connect_errors=3000;` 配置文件参数:`max_connect_errors = 3000` ### back_log 在MySQL的链接数达到max_connections时,当前无法处理新的请求,将存放到堆栈中,以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源。 back_log值不能超过TCP/IP连接的侦听队列的大小。若超过则无效,查看当前系统的TCP/IP连接的侦听队列的大小命令 `cat /proc/sys/net/ipv4/tcp_max_syn_backlog` 建议: 推荐设置为350 查询:`show variables like 'back_log';` 在线配置: 配置文件:`back_log= 350` ### max_allowed_packet mysql根据配置文件会限制server接收的数据包大小。 有时候大的插入和更新会被max_allowed_packet 参数限制掉,导致失败。 建议: 大部分情况下4M就足够了,如果还是不够慢慢加。 查询:`show VARIABLES like '%max_allowed_packet%';` 在线配置:`set global max_allowed_packet = 4*1024*1024*` 配置文件:`max_allowed_packet = 4M` ### ft_min_word_len 开启全文索引,默认关闭。根据需求开启,如果没使用全文索引,就不要开启。 查询: 在线配置: 配置文件:`ft_min_word_len = 1` ### auto_increment_increment|auto_increment_offset 这两个参数一般用在主主同步中,用来错开自增值, 防止键值冲突 查询:`show variables like 'auto_inc%';` 在线配置: 配置文件:`auto_increment_increment = 1` | `auto_increment_offset = 1` ### log_bin_trust_function_creators 如果开启了主从复制,要设置为0,禁止用户创建函数,触发器。因为存储函数有可能导致主从的数据不一致。 如果只开启Binlog,没主从,则设置为1。 查询: 在线配置: 配置文件:`log_bin_trust_function_creators = 1` ### read_buffer_size MySQL读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySQL会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。 如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能 建议: 8G机器可以设置此参数为1M 查询: 在线配置: 配置文件:`read_buffer_sizes = 4M` ### performance_schema 5.5版本以后默认打开,用于收集性能参数,在实例中也会有对应名称的一个库。 查询: 在线配置: 配置文件:`performance_schema = 1` ### skip-locking|skip-external-locking 避免MySQL的外部锁定,减少出错几率增强稳定性。 5以前版本skip-locking,新版本skip-external-locking 当外部锁定(external-locking)起作用时,每个进程若要访问数据表,则必须等待之前的进程完成操作并解除锁定。由于服务器访问数据表时经常需要等待解锁,因此在单服务器环境下external locking会让MySQL性能下降。 查询: 在线配置: 配置文件:`skip-locking` | `skip-external-locking` ### skip-name-resolve 禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求! 查询: 在线配置: 配置文件:`skip-name-resolve` ### table_cache 它的作用就是缓存表文件描述符,降低打开关闭表的频率 mysql只有一个全局锁来控制打开和关闭表,也就是说无论有多少个线程在并行执行,只有一个线程可以打开或关闭表,这也就会出现很多死锁,别的线程等待那个全局锁 相应地增加了cpu的消耗,延长了其他链接线程执行sql的时间,降低系统性能。所以在保证table_cache够用的情况下,尽量保持table_cache足够小 查询: 在线配置: 配置文件:`table_cache = 128K` ### init_connect init_connect是用户登录到数据库上之后,默认执行里面的内容,类似Linux系统的/etc/profile。在用户操作前,可以先进行设定字符集,或者初始化一些东西。 但内容里面语法有问题,会导致用户从mysql退出。init_connect 对具有super 权限的用户是无效的。 查询: 在线配置: `set global init_connect=set autocommit=0; set names gbk;'` 配置文件:`init_connect='set autocommit=0; set names gbk;'` ### explicit_defaults_for_timestamp [参考实验](https://www.jianshu.com/p/d7d364745173 "参考实验") 明确时间戳默认null方式。如果高于5.5.6版本,创建如下 ```c create table mytime ( id int, atime timestamp not null, ctime timestamp not null ); ``` 出现如下错误,将变量改为true即可 ERROR 1067 (42000): Invalid default value for 'ctime' =false时,按照如下规则"初始化": 未明确声明为NULL属性的TIMESTAMP列被分配为NOT NULL属性。 (其他数据类型的列,如果未显式声明为NOT NULL,则允许NULL值。)将此列设置为NULL将其设置为当前时间戳。 表中的第一个TIMESTAMP列(如果未声明为NULL属性或显式DEFAULT或ON UPDATE子句)将自动分配DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP属性。 第一个之后的TIMESTAMP列(如果未声明为NULL属性或显式DEFAULT子句)将自动分配DEFAULT'0000-00-00 00:00:00'(“零”时间戳)。 对于不指定此列的显式值的插入行,该列将分配“0000-00-00 00:00:00”,并且不会发生警告。 =true时,按照如下规则"初始化": 未明确声明为NOT NULL的TIMESTAMP列允许NULL值。 将此列设置为NULL将其设置为NULL,而不是当前时间戳。 没有TIMESTAMP列自动分配DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP属性。 必须明确指定这些属性。 声明为NOT NULL且没有显式DEFAULT子句的TIMESTAMP列被视为没有默认值。 对于不为此列指定显式值的插入行,结果取决于SQL模式。 如果启用了严格的SQL模式,则会发生错误。 如果未启用严格的SQL模式,则会为列分配隐式默认值“0000-00-00 00:00:00”,并发出警告。 这类似于MySQL如何处理其他时间类型,如DATETIME。 查询: 在线配置: 配置文件:`explicit_defaults_for_timestamp=false` ### transaction-isolation 修改事务隔离级别 可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE。默认REPEATABLE-READ 查询: 在线配置:`set global transaction isolation level read uncommitted;` 配置文件:`transaction-isolation = REPEATABLE-READ` ### key_buffer_size 指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。 用`show global status like 'key_read%';`命令获得的key_reads/key_read_requests,比例至少是1:100,1:1000更好。如果比例太小,可以调大key_buffer_size值。 key_buffer_size只对MyISAM表起作用。即使你不使用MyISAM表,但是内部的临时磁盘表是MyISAM表,也要使用该值。 对于1G内存的机器,如果不使用MyISAM表,推荐值是16M(8-64M) 对于64内存的机器,推荐256M。 查询:`SHOW VARIABLES LIKE '%key_buffer_size%';` 在线配置: 配置文件:`key_buffer_size = 16M` ### table_open_cache 指定表高速缓存的大小。每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。 可以用sql语句`SHOW variables LIKE '%table_open_cache%';`获得**table_open_cache**参数,这是缓存的表。 用`SHOW GLOBAL STATUS LIKE 'Open%tables';`获得**open_tables**参数。这是打开的表。 如果**open_tables**等于**table_open_cache**,并且**opened_tables**在不断增长,那么你就需要增加table_open_cache的值了。因为mysql正在将缓存的表释放以容纳新的表。 建议: Open_tables / Opened_tables >= 0.85 Open_tables / table_open_cache <= 0.95 64G内存8千到2万,2G内存512 查询:`SHOW variables LIKE '%table_open_cache%';` 在线配置: 配置文件:`table_open_cache = 8000` ### sort_buffer_size 系统中对数据进行排序的时候用到的Buffer。是针对单个线程的,所以当多个线程同时进行排序的时候,系统中就会出现多个sort buffer。默认256K 我们一般可以通过增大sort buffer的大小来提高order by或者group by的处理性能。Sort_Buffer_Size 并不是越大越好,由于是connection级的参数,过大的设置+高并发会耗尽系统内存资源。 查询:`show variables like '%sort_buffer_size%';` 在线配置: 配置文件:`sort_buffer_size = 8M` ### join_buffer_size 当使用join命令时,为了减少参与join的“被驱动表”的读取次数以提高性能,需要使用到join buffer来协助完成join操作 当join buffer 太小,MySQL不会将该buffer存入磁盘文件而是先将join buffer中的结果与需求join的表进行操作,然后清空join buffer中的数据,继续将剩余的结果集写入次buffer中,如此往复,这势必会造成被驱动表需要被多次读取,成倍增加IO访问,降低效率 查询: 在线配置: 配置文件:`join_buffer_size = 8M` ### read_rnd_buffer_size 这个变量用于读取MyISAM表,对于任何存储引擎用于Multi-Range Read optimization. 当读取行从一个MyISAM 表按排序顺序跟着一个key-sorting operation,记录从这个buffer读取,避免磁盘寻址See Section 8.2.1.15, “ORDER BY Optimization”. 如果你有很多order by 查询语句,增长这值能够提升性能。这个是一个buffer 分配给每个客户端,因此你不能设置全局变量为一个大的值。相反,只改变session 变量对那些客户端需要运行大的查询。 查询: 在线配置:`SET GLOBAL read_rnd_buffer_size = 8*1024*1024;` 配置文件:`read_rnd_buffer_size = 8M` ### myisam_sort_buffer_size 当对MyISAM表执行repair table或创建索引时,用以缓存排序索引 设置太小时可能会遇到” myisam_sort_buffer_size is too small” 查询: 在线配置: 配置文件:`myisam_sort_buffer_size = 64M` ### query_cache_size|query_cache_type [参考](https://www.cnblogs.com/hellohell/p/5718252.html "参考") MySQL查询缓存保存查询返回的完整结果。当查询命中该缓存,会立刻返回结果,跳过了解析,优化和执行阶段。 **query_cache_size**用于设置查询缓存的内存大小。如果写多读少的高并发情况下,就会频繁变更缓存。 查询缓存会跟踪查询中涉及的每个表,如果这写表发生变化,那么和这个表相关的所有缓存都将失效。 **query_cache_type**决定是否缓存查询结果。这个变量有三个取值:0,1,2,0时表示关闭,1时表示打开,2表示只要select 中明确指定SQL_CACHE才缓存 查询:`show variables like ‘thread_cache_size’;` 在线配置: 配置文件:`query_cache_size = 64M` | `query_cache_type = 0` ### innodb-file-per-table MySQL InnoDB引擎 默认会将所有的数据库InnoDB引擎的表数据存储在一个共享空间中:ibdata1,当增删数据库的时候,ibdata1文件不会自动收缩,单个数据库的备份也将成为问题。通常只能将数据使用mysqldump 导出,然后再导入解决这个问题。 如果启用了innodb_file_per_talbe参数,需要注意的是每张表的表空间内存放的只是数据、索引和插入缓冲Bitmap页,其他数据如:回滚信息、插入缓冲索引页、系统事物信息、二次写缓冲(Double write buffer)等还是放在原来的共享表空间内。同时说明了一个问题:即使启用了innodb_file_per_table参数共享表空间还是会不断的增加其大小的。 独立表空间优缺点: 优点: 1:每个表的数据、索引存放在自己单独的表空间中。 2:空间可以回收(drop/truncate table 方式操作表空间不能自动回收) 3:对于独立的表空间、碎片影响的性能要低于共享表空间 缺点: 单表增加比共享表空间方式更大 结论: 共享表空间在Insert操作上有一些优势,但在其它都没独立表空间表现好。 当启用独立表空间时,请合理调整一下 innodb_open_files 参数。 ### tmp_table_size|max_heap_table_size 它规定了内部内存临时表的最大值,每个线程都要分配。(实际起限制作用的是tmp_table_size和max_heap_table_size的最小值。)如果内存临时表超出了限制,MySQL就会自动地把它转化为基于磁盘的MyISAM表,存储在指定的tmpdir目录下。 优化查询语句的时候,要避免使用临时表,如果实在避免不了的话,要保证这些临时表是存在内存中的。 如果需要的话并且你有很多group by语句,并且你有很多内存,增大tmp_table_size(和max_heap_table_size)的值。这个变量不适用与用户创建的内存表(memory table). 建议尽量优化查询,要确保查询过程中生成的临时表在内存中,避免临时表过大导致生成基于硬盘的MyISAM表。 使用sql命令`show global status like 'created_tmp%';`来获得信息 +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | Created_tmp_disk_tables | 0 | | Created_tmp_files | 6 | | Created_tmp_tables | 12 | +-------------------------+-------+ 每次创建临时表,**Created_tmp_tables**增加,如果临时表大小超过**tmp_table_size**,则是在磁盘上创建临时表,**Created_tmp_disk_tables**也增加,**Created_tmp_files**表示MySQL服务创建的临时文件文件数,比较理想的配置是: Created_tmp_disk_tables / Created_tmp_tables * 100% <= 25%比如上面的服务器Created_tmp_disk_tables / Created_tmp_tables * 100% =1.20%,应该相当好了 默认为16M,可调到64-256最佳,线程独占,太大可能内存不够I/O堵塞。如果动态页面要调大点,100M以上,如果网站大部分都是静态内容,一般64M足够。 **max_heap_table_size**控制用户可以创建多大的内存表,防止创建一个特别多大的内存表而耗尽资源。 查询: 在线配置: 配置文件:`tmp_table_size = 256M` | `max_heap_table_size = 64M` ### bulk_insert_buffer_size 和key_buffer_size一样,这个参数同样也仅作用于使用 MyISAM存储引擎,用来缓存批量插入数据的时候临时缓存写入数据。当我们使用如下几种数据写入语句的时候,会使用这个内存区域来缓存批量结构的数据以帮助批量写入数据文件 查询: 在线配置: 配置文件:`bulk_insert_buffer_size = 4M`
日行一善
Dec. 10, 2020, 2:34 p.m.
Share documents
Collection documents
Last
Next
Scan wechat
Copy link
Scan your mobile phone to share
Copy link
关于 MrDoc
觅思文档MrDoc
是
州的先生
开发并开源的在线文档系统,其适合作为个人和小型团队的云笔记、文档和知识库管理工具。
如果觅思文档给你或你的团队带来了帮助,欢迎对作者进行一些打赏捐助,这将有力支持作者持续投入精力更新和维护觅思文档,感谢你的捐助!
>>>捐助鸣谢列表
微信
支付宝
QQ
PayPal
QQ粉丝交流群:882382311
Markdown文件
share
link
type
password
Update password