MySQL查看系统状态和系统变量

[TOC]

查看MySQL状态

show status是查看系统状态, 系统状态是系统的状态不可更改

show variables 事务查看系统变量及其值即MySQL服务器的配置信息。可以通过 set global var_name/set session var_name 语句动态修改 全局/会话 变量.

服务器启动时,将所有全局变量初始化为默认值。可以在选项文件或命令行中指定的选项来更改这些默认值。
服务器启动后,通过连接服务器并执行SET GLOBAL var_name语句可以更改动态全局变量。要想更改全局变量,必须具有SUPER权限。
服务器还为每个客户端连接维护会话变量。连接时使用相应全局变量的当前值对客户端会话变量进行初始化。
客户可以通过SET SESSION var_name语句来更改动态会话变量。
设置会话变量不需要特殊权限,但客户可以只更改自己的会话变量,而不更改其它客户的会话变量。
任何访问全局变量的客户端都可以看见对全局变量的更改。
但是,它只影响在更改后连接的从该全局变量初始化相应会话变量的客户端。
它不会影响已经连接上的客户端的会话变量(甚至是执行SET GLOBAL语句的客户端)。

查看MySQL系统状态

要查看MySQL运行状态,要优化MySQL运行效率都少不了要运行show status查看各种状态,下面是参考官方文档及网上资料整理出来的中文详细解释,不管你是初学mysql还是你是mysql专业级的dba,这都是值得看的.

状态名作用域详细解释
Aborted_clientsGlobal由于客户端没有正确关闭连接导致客户端终止而中断的连接数
Aborted_connectsGlobal试图连接到MySQL服务器而失败的连接数
Binlog_cache_disk_useGlobal使用临时二进制日志缓存但超过binlog_cache_size值并使用临时文件来保存事务中的语句的事务数量
Binlog_cache_useGlobal使用临时二进制日志缓存的事务数量
Bytes_receivedBoth从所有客户端接收到的字节数。
Bytes_sentBoth发送给所有客户端的字节数。
com*各种数据库操作的数量
CompressionSession客户端与服务器之间只否启用压缩协议
ConnectionsGlobal试图连接到(不管是否成功)MySQL服务器的连接数
Created_tmp_disk_tablesBoth服务器执行语句时在硬盘上自动创建的临时表的数量
Created_tmp_filesGlobalmysqld已经创建的临时文件的数量
Created_tmp_tablesBoth服务器执行语句时自动创建的内存中的临时表的数量。如果Created_tmp_disk_tables较大,你可能要增加tmp_table_size值使临时 表基于内存而不基于硬盘
Delayed_errorsGlobal用INSERT DELAYED写的出现错误的行数(可能为duplicate key)。
Delayed_insert_threadsGlobal使用的INSERT DELAYED处理器线程数。
Delayed_writesGlobal写入的INSERT DELAYED行数
Flush_commandsGlobal执行的FLUSH语句数。
Handler_commitBoth内部提交语句数
Handler_deleteBoth行从表中删除的次数。
Handler_discoverBothMySQL服务器可以问NDB CLUSTER存储引擎是否知道某一名字的表。这被称作发现。Handler_discover说明通过该方法发现的次数。
Handler_prepareBothA counter for the prepare phase of two-phase commit operations.
Handler_read_firstBoth索引中第一条被读的次数。如果较高,它建议服务器正执行大量全索引扫描;例如,SELECT col1 FROM foo,假定col1有索引。
Handler_read_keyBoth根据键读一行的请求数。如果较高,说明查询和表的索引正确。
Handler_read_nextBoth按照键顺序读下一行的请求数。如果你用范围约束或如果执行索引扫描来查询索引列,该值增加。
Handler_read_prevBoth按照键顺序读前一行的请求数。该读方法主要用于优化ORDER BY ... DESC。
Handler_read_rndBoth根据固定位置读一行的请求数。如果你正执行大量查询并需要对结果进行排序该值较高。你可能使用了大量需要MySQL扫描整个表的查询或你的连接没有正确使用键。
Handler_read_rnd_nextBoth在数据文件中读下一行的请求数。如果你正进行大量的表扫描,该值较高。通常说明你的表索引不正确或写入的查询没有利用索引。
Handler_rollbackBoth内部ROLLBACK语句的数量。
Handler_savepointBoth在一个存储引擎放置一个保存点的请求数量。
Handler_savepoint_rollbackBoth在一个存储引擎的要求回滚到一个保存点数目。
Handler_updateBoth在表内更新一行的请求数。
Handler_writeBoth在表内插入一行的请求数。
Innodb_buffer_pool_pages_dataGlobal包含数据的页数(脏或干净)。
Innodb_buffer_pool_pages_dirtyGlobal当前的脏页数。
Innodb_buffer_pool_pages_flushedGlobal要求清空的缓冲池页数
Innodb_buffer_pool_pages_freeGlobal空页数。
Innodb_buffer_pool_pages_latchedGlobal在InnoDB缓冲池中锁定的页数。这是当前正读或写或由于其它原因不能清空或删除的页数。
Innodb_buffer_pool_pages_miscGlobal忙的页数,因为它们已经被分配优先用作管理,例如行锁定或适用的哈希索引。该值还可以计算为Innodb_buffer_pool_pages_total - Innodb_buffer_pool_pages_free - Innodb_buffer_pool_pages_data。
Innodb_buffer_pool_pages_totalGlobal缓冲池总大小(页数)。
Innodb_buffer_pool_read_ahead_rndGlobalInnoDB初始化的“随机”read-aheads数。当查询以随机顺序扫描表的一大部分时发生。
Innodb_buffer_pool_read_ahead_seqGlobalInnoDB初始化的顺序read-aheads数。当InnoDB执行顺序全表扫描时发生。
Innodb_buffer_pool_read_requestsGlobalInnoDB已经完成的逻辑读请求数。
Innodb_buffer_pool_readsGlobal不能满足InnoDB必须单页读取的缓冲池中的逻辑读数量。
Innodb_buffer_pool_wait_freeGlobal一般情况,通过后台向InnoDB缓冲池写。但是,如果需要读或创建页,并且没有干净的页可用,则它还需要先等待页面清空。该计数器对等待实例进行记数。如果已经适当设置缓冲池大小,该值应小。
Innodb_buffer_pool_write_requestsGlobal向InnoDB缓冲池的写数量。
Innodb_data_fsyncsGlobalfsync()操作数。
Innodb_data_pending_fsyncsGlobal当前挂起的fsync()操作数。
Innodb_data_pending_readsGlobal当前挂起的读数。
Innodb_data_pending_writesGlobal当前挂起的写数。
Innodb_data_readGlobal至此已经读取的数据数量(字节)。
Innodb_data_readsGlobal数据读总数量。
Innodb_data_writesGlobal数据写总数量。
Innodb_data_writtenGlobal至此已经写入的数据量(字节)。
Innodb_dblwr_pages_writtenGlobal已经执行的双写操作数量
Innodb_dblwr_writesGlobal双写操作已经写好的页数
Innodb_log_waitsGlobal我们必须等待的时间,因为日志缓冲区太小,我们在继续前必须先等待对它清空
Innodb_log_write_requestsGlobal日志写请求数。
Innodb_log_writesGlobal向日志文件的物理写数量。
Innodb_os_log_fsyncsGlobal向日志文件完成的fsync()写数量。
Innodb_os_log_pending_fsyncsGlobal挂起的日志文件fsync()操作数量。
Innodb_os_log_pending_writesGlobal挂起的日志文件写操作
Innodb_os_log_writtenGlobal写入日志文件的字节数。
Innodb_page_sizeGlobal编译的InnoDB页大小(默认16KB)。许多值用页来记数;页的大小很容易转换为字节。
Innodb_pages_createdGlobal创建的页数。
Innodb_pages_readGlobal读取的页数。
Innodb_pages_writtenGlobal写入的页数。
Innodb_row_lock_current_waitsGlobal当前等待的待锁定的行数。
Innodb_row_lock_timeGlobal行锁定花费的总时间,单位毫秒。
Innodb_row_lock_time_avgGlobal行锁定的平均时间,单位毫秒。
Innodb_row_lock_time_maxGlobal行锁定的最长时间,单位毫秒。
Innodb_row_lock_waitsGlobal一行锁定必须等待的时间数。
Innodb_rows_deletedGlobal从InnoDB表删除的行数。
Innodb_rows_insertedGlobal插入到InnoDB表的行数。
Innodb_rows_readGlobal从InnoDB表读取的行数。
Innodb_rows_updatedGlobalInnoDB表内更新的行数。
Key_blocks_not_flushedGlobal键缓存内已经更改但还没有清空到硬盘上的键的数据块数量。
Key_blocks_unusedGlobal键缓存内未使用的块数量。你可以使用该值来确定使用了多少键缓存
Key_blocks_usedGlobal键缓存内使用的块数量。该值为高水平线标记,说明已经同时最多使用了多少块。
Key_read_requestsGlobal从缓存读键的数据块的请求数。
Key_readsGlobal从硬盘读取键的数据块的次数。如果Key_reads较大,则Key_buffer_size值可能太小。可以用Key_reads/Key_read_requests计算缓存损失率。
Key_write_requestsGlobal将键的数据块写入缓存的请求数。
Key_writesGlobal向硬盘写入将键的数据块的物理写操作的次数。
Last_query_costSession用查询优化器计算的最后编译的查询的总成本。用于对比同一查询的不同查询方案的成本。默认值0表示还没有编译查询。 默认值是0。Last_query_cost具有会话范围。
Max_used_connectionsGlobal服务器启动后已经同时使用的连接的最大数量。
ndb*ndb集群相关
Not_flushed_delayed_rowsGlobal等待写入INSERT DELAY队列的行数。
Open_filesGlobal打开的文件的数目。
Open_streamsGlobal打开的流的数量(主要用于记录)。
Open_table_definitionsGlobal缓存的.frm文件数量
Open_tablesBoth当前打开的表的数量。
Opened_filesGlobal文件打开的数量。不包括诸如套接字或管道其他类型的文件。 也不包括存储引擎用来做自己的内部功能的文件。
Opened_table_definitionsBoth已经缓存的.frm文件数量
Opened_tablesBoth已经打开的表的数量。如果Opened_tables较大,table_cache 值可能太小。
Prepared_stmt_countGlobal当前的预处理语句的数量。 (最大数为系统变量: max_prepared_stmt_count)
Qcache_free_blocksGlobal查询缓存内自由内存块的数量。
Qcache_free_memoryGlobal用于查询缓存的自由内存的数量。
Qcache_hitsGlobal查询缓存被访问的次数。
Qcache_insertsGlobal加入到缓存的查询数量。
Qcache_lowmem_prunesGlobal由于内存较少从缓存删除的查询数量。
Qcache_not_cachedGlobal非缓存查询数(不可缓存,或由于query_cache_type设定值未缓存)。
Qcache_queries_in_cacheGlobal登记到缓存内的查询的数量。
Qcache_total_blocksGlobal查询缓存内的总块数。
QueriesBoth服务器执行的请求个数,包含存储过程中的请求。
QuestionsBoth已经发送给服务器的查询的个数。
Rpl_statusGlobal失败安全复制状态(还未使用)。
Select_full_joinBoth没有使用索引的联接的数量。如果该值不为0,你应仔细检查表的索引
Select_full_range_joinBoth在引用的表中使用范围搜索的联接的数量。
Select_rangeBoth在第一个表中使用范围的联接的数量。一般情况不是关键问题,即使该值相当大。
Select_range_checkBoth在每一行数据后对键值进行检查的不带键值的联接的数量。如果不为0,你应仔细检查表的索引。
Select_scanBoth对第一个表进行完全扫描的联接的数量。
Slave_heartbeat_periodGlobal复制的心跳间隔
Slave_open_temp_tablesGlobal从服务器打开的临时表数量
Slave_received_heartbeatsGlobal从服务器心跳数
Slave_retried_transactionsGlobal本次启动以来从服务器复制线程重试次数
Slave_runningGlobal如果该服务器是连接到主服务器的从服务器,则该值为ON。
Slow_launch_threadsBoth创建时间超过slow_launch_time秒的线程数。
Slow_queriesBoth查询时间超过long_query_time秒的查询的个数。
Sort_merge_passesBoth排序算法已经执行的合并的数量。如果这个变量值较大,应考虑增加sort_buffer_size系统变量的值。
Sort_rangeBoth在范围内执行的排序的数量。
Sort_rowsBoth已经排序的行数。
Sort_scanBoth通过扫描表完成的排序的数量。
ssl*ssl连接相关
Table_locks_immediateGlobal立即获得的表的锁的次数。
Table_locks_waitedGlobal不能立即获得的表的锁的次数。如果该值较高,并且有性能问题,你应首先优化查询,然后拆分表或使用复制。
Threads_cachedGlobal线程缓存内的线程的数量。
Threads_connectedGlobal当前打开的连接的数量。
Threads_createdGlobal创建用来处理连接的线程数。如果Threads_created较大,你可能要增加thread_cache_size值。缓存访问率的计算方法Threads_created/Connections。
Threads_runningGlobal激活的(非睡眠状态)线程数。
UptimeGlobal服务器已经运行的时间(以秒为单位)。
Uptime_since_flush_statusGlobal最近一次使用FLUSH STATUS 的时间(以秒为单位)。

当我们执行show status语句时,MySQL将会列出多达300多条的状态信息记录,其中包括了供我们查看了解的各种信息。不过,如果直接使用show status指令得到300多条记录,会让我们看得眼花缭乱,因此我们希望能够「按需查看」一部分状态信息。这个时候,我们可以在show status语句后加上对应的like子句。例如,我们想要查看当前MySQL启动后的运行时间,我们可以执行如下语句:

--查询当前MySQL本次启动后的运行统计时间
show status like 'uptime';

此时,我们就可以看到如下结果:

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Uptime        | 5667  |
+---------------+-------+
1 row in set (0.00 sec)
--------------------- 

同样的,如果我们要本次MySQL启动后执行的SELECT语句的次数,我们可以执行如下语句:

show status like 'com_select';

对应输出结果如下:

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_select    | 1     |
+---------------+-------+
1 row in set (0.00 sec)

此外,与WHERE子句中的LIKE类似,show status后的LIKE关键字也可以使用'_' 或'%'等通配符来进行模糊匹配。例如我们可以执行如下语句来查看MySQL服务器的线程信息:

show status like 'Thread_%';

对应输出结果如下:

+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 0     |
| Threads_connected | 1     |
| Threads_created   | 1     |
| Threads_running   | 1     |
+-------------------+-------+
4 rows in set (0.00 sec)

值得注意的是,在上述show status like 'com_select'指令的执行示例中,显示的SELECT语句统计信息仅仅表示当前会话连接执行的SELECT语句数量。 因为,show status指令的完整语法如下:

SHOW [统计范围] STATUS [LIKE '状态项名称']
--统计范围分为GLOBAL和SESSION(或LOCAL)两种。

在show status的完整语法中,"[]"中的部分是可选的,如果我们的show status语句中不包含统计范围,则默认统计范围为SESSION,也就是只统计当前连接的状态信息。如果我们需要查询自当前MySQL启动后所有连接执行的SELECT语句总数,我们可以执行如下语句:

show global status like 'com_select';

以上即是show status的详细用法。 由于show status的状态统计项较多,我们就不再一一解释每个统计项的具体含义,在这里,我们仅列出部分常用的状态信息查看语句:

--查看MySQL本次启动后的运行时间(单位:秒)
show status like 'uptime';

--查看select语句的执行数
show [global] status like 'com_select';

--查看insert语句的执行数
show [global] status like 'com_insert';

--查看update语句的执行数
show [global] status like 'com_update';

--查看delete语句的执行数
show [] status like 'com_delete';

--查看试图连接到MySQL(不管是否连接成功)的连接数
show status like 'connections';

--查看线程缓存内的线程的数量。
show status like 'threads_cached';

--查看当前打开的连接的数量。
show status like 'threads_connected';

--查看创建用来处理连接的线程数。如果Threads_created较大,你可能要增加thread_cache_size值。
show status like 'threads_created';

--查看激活的(非睡眠状态)线程数。
show status like 'threads_running';

--查看立即获得的表的锁的次数。
show status like 'table_locks_immediate';

--查看不能立即获得的表的锁的次数。如果该值较高,并且有性能问题,你应首先优化查询,然后拆分表或使用复制。
show status like 'table_locks_waited';

--查看创建时间超过slow_launch_time秒的线程数。
show status like 'slow_launch_threads';

--查看查询时间超过long_query_time秒的查询的个数。
show  like 'slow_queries';

查看MySQL环境变量的配置

下面这些都可以在配置文件中看到

查看配置文件所在地,然后查看结果路径,如果路径中没有配置文件.
mysql --help | grep 'cnf'

/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf

一般的启动信息可以通过启动进程看得到,比如命令路径,配置文件,数据存储地,日志位置等.但有的时候可能没有配置文件.

root      1186     1  0 1月27 ?       00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
mysql     1452  1186  0 1月27 ?       00:01:07 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
vagrant  27614  4951  0 16:25 pts/0    00:00:00 mysql -u root -p

什么是系统变量

系统变量实际上用于控制数据库的一些行为和方式的参数。 比如我们启动数据库的时候设定多大的内存,使用什么样的隔离级别,日志文件的大小,存放位置等等一系列的东东。 当然我们数据库系统启动后,有些系统变量(参数)也可以通过动态修改来及时调整数据库。 这个系统变量在Oracle里边是通过pfile或者spfile来控制,称之为参数,是一个意思。

  1. 系统变量取值:都有默认值,可以在启动时及启动后修改。
  2. 设置范围:全局与回话级别,全局级别需要super权限,会话级别只影响自身会话。
  3. 设置方法:启动前可以通过配置文件以及启动选项来修改,启动后通过SET子句来设置。
  4. 生效周期:全局变量全局可见,但只影响在更改后连接的从该全局变量初始化相应会话变量的客户端。当前会话及已登录的会话不受影响。

对于有关涉及到size的设置值,可以使用后缀K、M或G分别表示千字节、兆字节或gigabytes,不区分大小写。

操作系统变量

a、设置系统变量的方法

要想设置一个GLOBAL变量的值,使用下面的语法:

  1. mysql> SET GLOBAL sort_buffer_size=value;
  2. mysql> SET @@global.sort_buffer_size=value;

要想设置一个SESSION变量的值,使用下面的语法:

  1. mysql> SET SESSION sort_buffer_size=value;
  2. mysql> SET @@session.sort_buffer_size=value;
  3. mysql> SET sort_buffer_size=value;
  4. LOCAL是SESSION的同义词。

如果设置变量时不指定GLOBAL、SESSION或者LOCAL,默认使用SESSION。

如果不知道设置的值是什么的话, 可以先show一下,看看默认是On/Off还是1/0或者是一个路径

b、检索设置

要想检索一个GLOBAL变量的值,使用下面的语法:

  1. mysql> SELECT @@global.sort_buffer_size;
  2. mysql> SHOW GLOBAL VARIABLES like 'sort_buffer_size';

要想检索一个SESSION变量的值,使用下面的语法:

  1. mysql> SELECT @@sort_buffer_size;
  2. mysql> SELECT @@session.sort_buffer_size;
  3. mysql> SHOW SESSION VARIABLES like 'sort_buffer_size';

这里,LOCAL也是SESSION的同义词。

c、其他注意事项

  • 当你用SELECT @@var_name搜索一个变量时(也就是说,不指定global.、session.或者local.),

  • MySQL返回SESSION值(如果存在),否则返回GLOBAL值。

  • 对于SHOW VARIABLES,如果不指定GLOBAL、SESSION或者LOCAL,MySQL返回SESSION值。

MySQL系统常用变量的操作

下面所有的show都只查看了当前session的要看全局要加show global

variables 变量都可以通过 set [global] OO=XX 来直接设置

如果不知道设置的值是什么的话, 可以先show一下,看看默认是On/Off还是1/0或者是一个路径

获取有关set的帮助
help set
查看全部变量 variables
show variables;
查看data保存的位置 datadir
show variables like 'datadir'; 
查看MySQL主程序所在路径 basedir
show variables like 'basedir'; 
查看当前版本 version
show variables like 'version%';
查看SQL分析工具 profiling

show profiles 是5.0.37之后添加的

查看是否开启SQL分析工具

show variables like "%profiling%";

查看分析工具支持查看的类型

help profile;

Name: 'SHOW PROFILE'  
Description:  
Syntax:  
SHOW PROFILE [type [, type] ... ]  
    [FOR QUERY n]  
    [LIMIT row_count [OFFSET offset]]  
  
type:  
    ALL                --显示所有的开销信息  
  | BLOCK IO           --显示块IO相关开销  
  | CONTEXT SWITCHES   --上下文切换相关开销  
  | CPU                --显示CPU相关开销信息  
  | IPC                --显示发送和接收相关开销信息  
  | MEMORY             --显示内存相关开销信息  
  | PAGE FAULTS        --显示页面错误相关开销信息  
  | SOURCE             --显示和Source_function,Source_file,Source_line相关的开销信息  
  | SWAPS              --显示交换次数相关开销的信息   

使用案例

# 可以看到 profiling 默认是OFF的。
show variables like "%profiling%";
# 开启分析工具
set profiling=1;
# 执行SQL
select * from user limit 1000;
select * from user_finance limit 1000;
# 查看执行过的sql记录,可以看到里面有Query_ID等字段
show profiles;
# 查看上一条SQL的开销信息
show profile; 
# 根据Query_ID来查看SQL的开销信息
show profile for query 2;
# 根据Query_ID来查看SQL的具体的CPU和IO开销
show profile cpu,block io for query 2;
# 查看支持查看的开销统计具体的类型
help profile;
# 开启profiling后,我们可以通过show profile等方式查看,其实这些开销信息被记录到 `information_schema.profiling` 表
select * from information_schema.profiling limit 100;

停止 profile 可以设置 set profiling=off;

或者在 session 退出之后, profiling 会被自动关闭

查看操作日志 log

这三个参数general_log、 general_log_file、 log_output都是动态参数,可以随时动态修改。

show variables like '%general_log%';        //为On开启
show variables like 'log_output';           //指定保存类型是文件还是MySQL的表中
show variables like '%general_log_file%';   //如果是保存到文件, 这里指定保存路径

如果保存在MySQL中,可以通过select * from mysql.general_log;查看所有日志
查看是否开启慢查询日志和保存路径 slow_query_log
show variables  like '%slow_query_log%';
查看慢查询时间限制 long_query_time
show variables like 'long_query_time%';
查看是否开启 binlog
show variables like '%log_bin%';
或者
show variables where variable_name in ('log_bin','log_bin_basename','log_bin_index');
查看最大连接数 max_connect_errors
show variables like '%max_connect_errors%';
查看索引缓冲区大小 key_buffer_size
show variables like '%key_buffer_size%';
查看查询缓冲区大小 query_cache_size
show variables like '%query_cache_size%';
查看MySQL采用的默认引擎 storage_engine
show variables like '%storage_engine%';
查看MySQL默认采用的字符集 character

只要保证统采用的编码方式一致,就可以避免乱码的产生

show variables like 'character%';

mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

character_set_client 为客户端编码方式
character_set_connection 为建立连接使用的编码
character_set_database 数据库的编码
character_set_results 结果集的编码
character_set_server 数据库服务器的编码
加锁超时是否回滚整个事务 innodb_rollback_on_timeout

该变量默认值为OFF,如果事务因为加锁超时,会回滚上一条语句执行的操作。如果设置ON,则整个事务都会回滚。

InnoDB在执行每条SQL语句之前,都会创建一个保存点.

此参数是只读参数,需在my.cnf中配置,并且重启生效;

注意:回滚后不自动commit或rollback事务;坑

show variables like '%innodb_rollback_on_timeout%';
查看是否开启自动提交 autocommit
show variables like '%autocommit%';
查看当前会话InnoDB锁等待超时时间限制,默认为50S,注意元数据锁和Innodb锁的区别

InnoDB关于在出现锁等待的时候,会根据参数innodb_lock_wait_timeout的配置,判断是否需要进行timeout的操作

show variables like 'innodb_lock_wait_timeout';
sql语句请求元数据锁的最长等待时间,默认为一年.注意元数据锁和Innodb锁的区别

此锁超时对于隐式访问Mysql库中系统表的sql语句无效,但是对于使用select,update语句直接访问mysql库中标的sql语句有效。

简单说来lock_wait_timeout是元数据锁等待超时,任意锁元数据的语句都会用到这个超时参数,默认为一年。

元数据锁可以参加mysql metadata lock,为了保证事务可串行化,不管是myisam还是innodb引擎的表,只要是开始一个事务,就会获取操作表的元数据锁,这时候如果另一个事务要对表的元数据进行修改,则会阻塞直到超时。

show variables like 'lock_wait_timeout';
查看连接超时,在获取连接阶段(authenticate)起作用

mysql客户端在尝试与mysql服务器建立连接时,mysql服务器返回错误握手协议前等待客户端数据包的最大时限。默认10秒。

该参数没有session级别,是一个global级别变量

MySQL客户端与服务端的连接阶段(authenticate)的超时由参数connect_timeout控制。

获取MySQL连接是多次握手的结果,除了用户名和密码的匹配校验外,还有IP->HOST->DNS->IP验证,任何一步都可能因为网络问题导致线程阻塞。

为了防止线程浪费在不必要的校验等待上,超过connect_timeout的连接请求将会被拒绝。

由于mysql客户端不是很好模拟连接阶段(authenticate)的超时,所以使用telnet来发包给mysql,因为telnet的包并不遵循mysql的通讯协议可以在设置的时间短一点,然后通过time telnet 127.0.0.1 3306来测试

show variables like 'connect_timeout';
mysql关闭交互/非交互连接前等待的最大时限。默认28800秒。

在连接空闲阶段(sleep)起作用

即使没有网络问题,也不能允许客户端一直占用连接。

对于保持sleep状态超过了wait_timeout(或interactive_timeout,取决于client_interactive标志)的客户端,MySQL会主动断开连接。

show variables like 'wait_timeout';

show variables like 'interactive_timeout';
mysql服务器端等待从客户端读取数据/向客户端写入数据的最大时限,默认30秒。

即使连接没有处于sleep状态,即客户端忙于计算或者存储数据,MySQL也选择了有条件的等待。

在数据包的分发过程中,客户端可能来不及响应(发送、接收、或者处理数据包太慢)。

为了保证连接不被浪费在无尽的等待中,MySQL也会选择有条件(net_read_timeout和net_write_timeout)地主动断开连接。

这个参数只对TCP/IP链接有效,只针对在Activity状态下的线程有效

show variables like 'net_read_timeout';

show variables like 'net_write_timeout';
mysql从复制连结等待读取数据的最大时限,默认3600秒 slave_net_timeout
show variables like 'slave_net_timeout';
服务器发送和接受的最大包长度 max_allowed_packet
show variables like 'max_allowed_packet'

转载于:https://my.oschina.net/chinaliuhan/blog/3065291

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值