SQL命令行临时设置操作
#查看mysql数据库的线程连接数:
mysql> show global status like 'Thread%';
参数解释:
Threads_connected表示当前连接数。
Threads_running是代表当前并发数。
Threads_created表示创建过的线程数。
Threads_cached :代表当前此时此刻线程缓存中有多少空闲线程。
Tips:
如果我们在MySQL服务器配置文件中设置了thread_cache_size,当客户端断开之后,服务器处理此客户的线程将会缓存起来以响应下一个客户而不是销毁(前提是缓存数未达上限)。
如果发现Threads_created值过大的话,表明MySQL服务器一直在创建线程,这也是比较耗资源,可以适当增加配置文件中thread_cache_size值,查询服务器。
#数据库线程池缓存大小查询 mysql> show variables like 'thread_cache_size'; #数据库线程池缓存大小设置 mysql> set global thread_cache_size=64; #查看全局wait_timeout值 mysql> show global variables like 'wait_timeout'; #修改全局wait_timeout值 mysql> set global wait_timeout=28800; #查看最大连接数 mysql> show variables like '%connect%';
最大连接数max_connections这个参数的大小要综合很多因素来考虑。
比如使用的平台所支持的线程库数量(windows只能支持到2048)、服务器的配置(特别 是内存大小)、每个连接占用资源(内存和负载)的多少、系统需要的响应时间等。
一般Linux系统支持到几百并发是没有任何问题的。可以在global或 session范围内修改这个参数:
#重新设置最大连接数: mysql> set global max_connections=151;
#查询数据库服务器响应的最大连接数: mysql> show global status like 'Max_used_connections';
对于mysql服务器最大连接数值的设置范围比较理想的是:服务器响应的最大连接数值占服务器上限连接数值的比例值在10%以上,如果在10%以下,说明mysql服务器最大连接上限值设置过高。
如:Max_used_connections / max_connections * 100% = 2/100 *100% ≈ 2%
可以看到占比远低于10%
Tips:连接数的增加会带来很多连锁反应,需要在实际中避免由此产生的负面影响。
命令查看对应的配置参数: show status like '%下面变量%';
Aborted_clients 由于客户没有正确关闭连接已经死掉,已经放弃的连接数量。 Aborted_connects 尝试已经失败的MySQL服务器的连接的次数。 Connections 试图连接MySQL服务器的次数。 Created_tmp_tables 当执行语句时,已经被创造了的隐含临时表的数量。 Delayed_insert_threads 正在使用的延迟插入处理器线程的数量。 Delayed_writes 用INSERT DELAYED写入的行数。 Delayed_errors 用INSERT DELAYED写入的发生某些错误(可能重复键值)的行数。 Flush_commands 执行FLUSH命令的次数。 Handler_delete 请求从一张表中删除行的次数。 Handler_read_first 请求读入表中第一行的次数。 Handler_read_key 请求数字基于键读行。 Handler_read_next 请求读入基于一个键的一行的次数。 Handler_read_rnd 请求读入基于一个固定位置的一行的次数。 Handler_update 请求更新表中一行的次数。 Handler_write 请求向表中插入一行的次数。 Key_blocks_used 用于关键字缓存的块的数量。 Key_read_requests 请求从缓存读入一个键值的次数。 Key_reads 从磁盘物理读入一个键值的次数。 Key_write_requests 请求将一个关键字块写入缓存次数。 Key_writes 将一个键值块物理写入磁盘的次数。 Max_used_connections 同时使用的连接的最大数目。 Not_flushed_key_blocks 在键缓存中已经改变但是还没被清空到磁盘上的键块。 Not_flushed_delayed_rows 在INSERT DELAY队列中等待写入的行的数量。 Open_tables 打开表的数量。 Open_files 打开文件的数量。 Open_streams 打开流的数量(主要用于日志记载) Opened_tables 已经打开的表的数量。 Questions 发往服务器的查询的数量。 Slow_queries 要花超过long_query_time时间的查询数量。 Threads_connected 当前打开的连接的数量。 Threads_running 不在睡眠的线程数量。 Uptime 服务器工作了多少秒。
Tips:
#查看可同时打开的表的数量和要使用的文件描述符 mysql> show variables like 'table_open%'; table_open_cache(所有mysql线程一共可以打开的表个数)、max_tmp_tables和open_files_limit.
因为MySQL是多线程的系统,几个不同 的并发连接可能打开同一个表,这就需要为不同的连接session分配独立的内存空间来存储这些信息以避免冲突。
因此连接数的增加会导致MySQL需要的 文件描述符数目的增加。
对于MyISAM表,还会建立一个共享的索引文件描述符。
mysql> show status like 'open%'; | Variable_name | Value | | Open_files | 3 | | Open_streams | 2 | | Open_table_definitions | 8 | | Open_tables() | 10 |当前打开表的数目可通过flush tables命令,关闭,这个值如果过大,并且如果没有经常的执行,可以考虑增加table_open_cache参数的大小。 | Opened_files | 91768 | | Opened_table_definitions | 0 | | Opened_tables | 0 |历史累计值 +----------------+-------+
#单个客户端连接能打开的临时表数 mysql> show variables like 'max_tmp%'; | Variable_name | Value | | max_tmp_tables | 32 |
mysql> show global status like '%tmp%table%'; +-------------------------+-------+ | Variable_name | Value | | Created_tmp_disk_tables | 10478 | | Created_tmp_tables | 25860 | 也可以对比这两个值来判断临时表的创建位置,一般选取BLOB和TEXT列、Group by 和 Distinct语句的数据量超过512 bytes, 或者union的时候select某列的数据超过512 bytes的时候,就直接在磁盘上创建临时表了,另外内存中的临时表变大的时候, 也可能被MySQL自动转移到磁盘上(由tmp_table_size和 max_heap_table_size参数决定)。 增加table_open_cache或 max_tmp_tables 参数的大小后,从操作系统的角度看,mysqld进程需要使用的文件描述符的个数就要相应的增加,这个是由 open_files_limit参数控制的。 但是这个参数是OS限制的,所以我们设定的值并不一定总是生效。 如果OS限制MySQL不能修改这个值,那 么置为0。 如果是专用的MySQL服务器上,这个值一般要设置的尽量大,就是没有报Too many open files错误的最大值,这样就能一劳永逸了。 当操作系统无法分配足够的文件描述符的时候,mysqld进程会在错误日志里记录警告信息。
#查看打开的文件 mysql> show variables like 'open_files%'; +------------------+-------+| Variable_name | Value open_files_limit | 7048 |+------------------+-------+1
mysql> show global status like '%open%file%';
+-----------------------+-------+
| Variable_name | Value |
| Innodb_num_open_files | 60 |
| Open_files | 17 |
| Opened_files | 573 |
+-----------------------+-------+
#MySQL为每个连接分配线程来处理,查看当前分配的线程数量:
mysql> show status like '%thread%';
+------------------------------------------+-------+
| Variable_name | Value |
+------------------------------------------+-------+
| Delayed_insert_threads | 0 |
| Performance_schema_thread_classes_lost | 0 |
| Performance_schema_thread_instances_lost | 0 |
| Slow_launch_threads | 0 |
| Threads_cached | 1 |
| Threads_connected | 2 |
| Threads_created | 3 |
| Threads_running | 1 |
+------------------------------------------+-------+
#查看每个thread的更详细的信息,可以使用processlist命令(需要有Process_priv权限): mysql> show processlist;
+----+------+-----------------+----------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------------+----------+---------+------+----------+------------------+
| 8 | root | localhost:59403 | activiti | Query | 0 | starting | show processlist |
| 9 | root | localhost:59404 | activiti | Sleep | 8838 | | NULL |
+----+------+-----------------+----------+---------+------+----------+------------------+
kill connection|query threadid的命令可以关闭线程。