1. mysql超时参数详解
目录- 1. mysql超时参数详解
1.1. 分类
1.1.1. 连接、网络类超时
共有如下几个:
1.1.2. connect_timeout:默认为10S
连接响应超时时间。服务器端在这个时间内如未连接成功,则会返回连接失败。
1.1.3. wait_timeout:默认是8小时,即28800秒
连接空闲超时时间。与服务器端无交互状态的连接,直到被服务器端强制关闭而等待的时间。可以认为是服务器端连接空闲的时间,空闲超过这个时间将自动关闭。
1.1.4. interactive_timeout:默认是8小时,即28800秒
interactive_timeout和wait_timeoutu意义虽然相同,但是有使用对象有本质的区别。interactive_timeout针对交互式连接(比如通过mysql客户端连接数据库),wait_timeout针对非交互式连接(比如一般在PHP中使用PDO连接数据库,当然你可以设置CLIENT_INTERACTIVE选项来改变)。所谓的交互式连接,即在mysql_real_connect()函数中使用了CLIENT_INTERACTIVE选项
在连接空闲阶段(sleep)起作用
即使没有网络问题,也不能允许客户端一直占用连接。对于保持sleep状态超过了wait_timeout(或interactive_timeout,取决于client_interactive标志)的客户端,MySQL会主动断开连接。
1.2. net_read_timeout:默认是30S
数据读取超时时间。在终止读之前,从一个连接获得数据而等待的时间秒数;当服务正在从客户端读取数据时
1.2.1. net_write_timeout:默认是60S
net_read_timeout控制何时超时。即客户端执行数据读取,等待多少秒仍未执行成功时自动断开连接。
1.2.2. 锁类超时
1.2.3. lock_wait_timeout
lock_wait_timeout是控制server层的锁超时
可以适当调小
不宜随便修改该值大小, 过多锁等待容易造成死锁和系统压力过大
1.2.4. innodb_lock_wait_timeout
innodb_lock_wait_timeout是控制InnoDB引擎层的锁超时
The length of time in seconds an InnoDB transaction waits for a row lock before giving up
innodb使用这个参数能够有效避免在资源有限的情况下产生太多的锁等待;指的是事务等待获取资源时等待的最长时间,超过这个时间还未分配到资源则会返回应用失败;参数的时间单位是秒,最小可设置为1s(一般不会设置得这么小),最大可设置1073741824秒(34年,一条语句锁等待超过30分钟估计业务该有反馈了),默认安装时这个值是50s,超过这个时间会报 ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
1.3. innodb_rollback_on_timeout
从上面的结果中可以看到,DDL语句的超时时间是受lock_wait_timeout参数控制的
PS:注意,凡是需要获取MDL锁的操作都受到这个超时参数的影响,不单单是DDL语句,包含在表上的DML、DDL操作,以及视图、存储过程、存储函数、lock table,flush table with read lock语句等。但不适用于隐式访问系统表的语句,如:grant和revok
1.4. 复制类超时
1.4.1. delayed_insert_timeout
官方描述:
How many seconds an INSERT DELAYED handler thread should wait for INSERT statements beforeterminating.
为MyISAM INSERT DELAY设计的超时参数,表示INSERT DELAY handler线程在INSERT DELAY语句终止前等待这个INSERT语句的时间,注意是表示insert delay延迟插入的超时时间,不是insert语句。默认值是300S,从5.6.7开始被弃用(因为delayed insert功能被弃用)后续版本将移除。
1.4.2. rpl_semi_sync_master_timeout
官方描述:
A value in milliseconds that controls how long the master waits on a commit for acknowledgment from a slave before timing out and reverting to asynchronous replication. The default value is 10000 (10 seconds).
This variable is available only if the master-side semisynchronous replication plugin is installed.
为semi-sync复制时,主库在某次事务提交时,如果等待超过rpl_semi_sync_master_timeout多秒之后仍然没有接收到任何从库做回包响应,那么主库自动降级为异步复制模式,当主库探测到有备库恢复回包时,主库自动恢复到semi-sync复制模式。默认值为10000毫秒=10秒
1.4.3. rpl_stop_slave_timeout
官方描述:
In MySQL 5.6.13 and later, you can control the length of time (in seconds) that STOP SLAVE waits before timing out by setting this variable. This can be used to avoid deadlocks between STOP SLAVE and other slave SQL statements using different client connections to the slave. The maximum and default value of rpl_stop_slave_timeout is 31536000 seconds (1 year). The minimum is 2 seconds.
5.6.13之后引入的参数,控制stop slave 的执行时间,在重放一个大的事务的时候,突然执行stop slave,命令 stop slave会执行很久,这个时候可能产生死锁或阻塞,严重影响性能,可以通过rpl_stop_slave_timeout参数控制stop slave 的执行时间。默认值是31536000秒=1年
1.4.4. slave_net_timeout
官方描述:
The number of seconds to wait for more data from a master/slave connection before aborting the read.
Slave判断主库是否挂掉的超时设置,在设定时间内依然没有获取到Master的回应就认为Master已经挂掉了,后续根据超时重连参数设置进行重连主库的操作。默认值:3600S
1.5. IO类超时
1.5.1. innodb_flush_log_at_timeout
官方描述:
Write and flush the logs every N seconds. innodb_flush_log_at_timeout was introduced in MySQL 5.6.6. It allows the timeout period between flushes to be increased in order to reduce flushing and avoid impacting performance of binary log group commit. Prior to MySQL 5.6.6, flushing frequency was once per second. The default setting for innodb_flush_log_at_timeout is also once per second.
5.6.6引入,参数innodb_flush_log_at_trx_commit=1时,此超时参数不起作用,当innodb_flush_log_at_trx_commit=0/2时才起作用。5.6.6之后表示每innodb_flush_log_at_timeout秒一次的频率刷新redo log(在5.6.6之前是固定每秒一次刷新redo log,5.6.6之后刷新频率可以通过这个参数设置,当然,这个参数本身默认值也是1S)。
1.6. 总结:
MySQL命令行客户端下:global级别的interactive_timeout修改对当前连接不生效,但能影响新的连接的globa interactive_timeout、session interactive_timeout、session wait_timeout数值
MySQL命令行客户端下:session级别的interactive_timeout的修改除了能使session interactive_timeout数值改变之外没有什么作用
MySQL命令行客户端下:global级别的wait_timeout的修改除了能使global wait_timeout数值改变之外没有什么作用
MySQL命令行客户端下:session级别的wait_timeout能改变session wait_timeout数值其对当前连接生效。
python MySQL driver:修改global wait_timeout对当前连接不生效,但能影响新的连接的global wait_timeout、session wait_timeout
python MySQL driver:修改session wait_timeout只对当前连接生效
python MySQL driver:修改global interactive_timeout对当前连接不生效,能影响新的连接的global interactive_timeout、session interactive_timeout
python MySQL driver:修改session interactive_timeout除了能使session interactive_timeout数值改变之外没有什么作用