MySQL-信息查询常用SQL

总结摘要
MySQL Common SQL for Information Query

基本配置信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
-- 切换数据库
USE test;

-- 查询数据库版本
SELECT VERSION();

-- 查询当前数据库
SELECT DATABASE();

-- 查询当前用户
SELECT USER();

-- 查询对象名称大小写敏感性
-- 0 Linux 敏感
-- 1 Windows 不敏感
-- 2 Mac
SHOW VARIABLES LIKE '%lower_case_table_names%';
SELECT @@SESSION.lower_case_table_names;

-- 查询字符集与排序规则
SHOW VARIABLES LIKE '%character%';
SHOW VARIABLES LIKE '%collation%';

-- 查询严格模式
SHOW VARIABLES LIKE '%innodb_strict_mode%';

-- 查询 SQL 模式
SHOW VARIABLES LIKE '%sql_mode%';
SHOW VARIABLES LIKE '%mode%';
SELECT @@SESSION.sql_mode;

-- 默认存储引擎
SHOW VARIABLES LIKE 'default_storage_engine';
-- InnoDB 状态
SHOW ENGINE INNODB STATUS;

-- 系统时区
SHOW VARIABLES LIKE 'system_time_zone';
-- 当前时区
SHOW VARIABLES LIKE 'time_zone';

事务与锁相关

事务

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
-- 查询自动提交模式
SHOW VARIABLES LIKE '%autocommit%';
SELECT @@SESSION.autocommit;

-- 查询事务 ID
SELECT trx_id FROM information_schema.innodb_trx WHERE trx_mysql_thread_id = CONNECTION_ID();

-- 查看全局和会话隔离级别
SELECT @@GLOBAL.transaction_isolation, @@SESSION.transaction_isolation;

-- 查看所有支持的隔离级别
SHOW VARIABLES LIKE 'transaction_isolation';

-- 查看隔离级别相关统计
SELECT * FROM performance_schema.events_transactions_summary_global_by_event_name;

-- InnoDB 重做日志(Redo Log)刷新控制
-- 0: 每秒写入并刷新日志到磁盘(性能最好,安全性最低)
-- 1: 每次事务提交都写入并刷新日志(默认值,最安全,性能较差)
-- 2: 每次事务提交写入日志,但每秒刷新一次到磁盘(折中方案)
SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit%';

-- 二进制日志(Binlog)刷新控制
-- 0: 依赖操作系统刷新(性能最好,安全性最低)
-- 1: 每次事务提交都同步(默认值,最安全)
-- N: 每N次事务提交同步一次
SHOW VARIABLES LIKE 'sync_binlog%';

锁检测与死锁

锁超时

1
2
3
4
5
-- 查看锁等待超时时间
SHOW VARIABLES LIKE 'innodb_lock_wait_timeout';

-- 查看死锁检测设置
SHOW VARIABLES LIKE 'innodb_deadlock_detect';

锁等待

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
-- 查看当前所有锁等待(不仅限于InnoDB)
SELECT * FROM performance_schema.events_waits_current 
WHERE EVENT_NAME LIKE '%lock%';

-- 查看InnoDB锁等待
SELECT * FROM sys.innodb_lock_waits;

-- 查看当前InnoDB行锁
-- 查看InnoDB行级锁信息,显示当前持有的锁
SELECT * FROM performance_schema.data_locks;
-- 查看InnoDB行级锁信息,显示锁等待关系
SELECT * FROM performance_schema.data_lock_waits;

-- 查看锁等待时间,查看锁相关的性能指标
SELECT * FROM sys.metrics WHERE variable_name LIKE '%lock%';

-- 查看表锁等待,查看元数据锁(MDL)信息
SELECT * FROM performance_schema.metadata_locks;

死锁

1
2
3
4
5
6
-- 查看最近死锁信息
SHOW ENGINE INNODB STATUS;

-- 查看死锁日志,仅查询用户执行 SQL 主动加锁的 SQL 日志
SELECT * FROM performance_schema.events_statements_history 
WHERE SQL_TEXT LIKE '%FOR UPDATE%' OR SQL_TEXT LIKE '%LOCK IN SHARE MODE%';

线程状态

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
-- 查看当前连接线程
SHOW PROCESSLIST;
SELECT * FROM performance_schema.threads;

-- 查看线程状态
SELECT * FROM sys.session;

-- 查看活跃事务
SELECT * FROM information_schema.innodb_trx;

-- 查看某个线程的完整信息替换CONNECTION_ID()
SELECT * FROM performance_schema.threads WHERE PROCESSLIST_ID = CONNECTION_ID();

性能优化

会话连接

1
2
3
4
5
6
-- 最大连接数
SHOW VARIABLES LIKE 'max_connections';
-- 当前连接数
SHOW STATUS LIKE 'Threads_connected';
-- 连接超时时间
SHOW VARIABLES LIKE '%timeout%';

缓存

1
2
3
4
5
6
-- 排序缓冲区大小
SHOW VARIABLES LIKE 'sort_buffer_size';
-- 连接缓冲区大小
SHOW VARIABLES LIKE 'join_buffer_size';
-- InnoDB 缓冲池大小
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';

日志与数据复制

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
-- 二进制日志
SHOW VARIABLES LIKE 'log_bin';
-- 慢查询日志
SHOW VARIABLES LIKE 'slow_query_log';
-- 错误日志路径
SHOW VARIABLES LIKE 'log_error';

-- 复制相关参数
-- 服务器ID
SHOW VARIABLES LIKE 'server_id';
-- 复制模式
SHOW VARIABLES LIKE 'binlog_format';

问题排查

查询超时 SQL

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
SELECT 
    p.ID AS thread_id,
    p.USER AS user,
    p.HOST AS host,
    p.DB AS `database`,
    p.COMMAND AS command,
    p.TIME AS time_seconds,
    p.STATE AS state,
    p.INFO AS query
FROM 
    information_schema.PROCESSLIST p
WHERE 
    p.TIME > 60  -- 运行超过60秒的线程
    AND p.COMMAND NOT IN ('Sleep', 'Binlog Dump')
    AND p.USER NOT IN ('system user', 'event_scheduler')
ORDER BY 
    p.TIME DESC;

kill query <thread_id>;

SELECT 
    waiting_trx_id,
    waiting_pid AS waiting_thread,
    waiting_query,
    blocking_trx_id,
    blocking_pid AS blocking_thread,
    blocking_query,
    wait_age_secs AS wait_time_sec,
    sql_kill_blocking_connection AS kill_command
FROM 
    sys.innodb_lock_waits
WHERE 
    wait_age_secs > 60  -- 只显示阻塞超过60秒的情况
ORDER BY 
    wait_age_secs DESC;

kill query <waiting_thread>;

终止问题线程

1
2
-- 终止特定线程(替换thread_id)
KILL thread_id; 

END