运维管理24 分钟阅读
MySQL 运维命令 100 条
MySQL DBA 真正需要掌握的,并不是背诵大量零散命令,而是在数据库出现连接暴增、CPU 飙高、SQL 卡顿、锁等待、复制延迟等问题时,能够迅速找到正确的排查入口。
2026年7月17日阅读—点赞—收藏—
dba100墨力计划mysql
在知识库中专注阅读,并随时返回相关工具与课程
MySQL DBA 真正需要掌握的,并不是背诵大量零散命令,而是在数据库出现连接暴增、CPU 飙高、SQL 卡顿、锁等待、复制延迟等问题时,能够迅速找到正确的排查入口。
MySQL DBA 真正需要掌握的,并不是背诵大量零散命令,而是在数据库出现连接暴增、CPU 飙高、SQL 卡顿、锁等待、复制延迟等问题时,能够迅速找到正确的排查入口。
下面整理了 100 条 MySQL DBA 常用命令,主要面向 MySQL 8.0 和 MySQL 8.4 LTS。部分命令在生产环境中具有修改或终止操作的风险,执行前应确认影响范围。
1SELECT VERSION();用于确认数据库版本,例如 MySQL 5.7、8.0 或 8.4。很多参数、系统视图和 SQL 语法都与版本相关,因此排查问题前应先确认版本。
1SELECT2 @@hostname AS hostname,3 @@port AS port,4 @@server_uuid AS server_uuid,5 @@server_id AS server_id,6 @@version AS version;在多实例、主从复制或 MGR 环境中,这条命令可以快速确认当前连接的是哪台服务器。
1SELECT2 NOW() AS current_time,3 NOW() - INTERVAL VARIABLE_VALUE SECOND AS startup_time,4 VARIABLE_VALUE AS uptime_seconds5FROM performance_schema.global_status6WHERE VARIABLE_NAME = 'Uptime';可用于判断实例是否刚刚发生过重启。
1SELECT NOW(), CURRENT_TIMESTAMP, UTC_TIMESTAMP();排查日志时间、复制延迟和定时任务问题时,需要确认数据库本地时间和 UTC 时间是否一致。
1SELECT @@global.time_zone, @@session.time_zone, @@system_time_zone;应用写入时间异常、定时任务提前或延后时,应首先检查时区设置。
1SELECT @@global.sql_mode, @@session.sql_mode;ONLY_FULL_GROUP_BY、STRICT_TRANS_TABLES、NO_ZERO_DATE 等模式会影响 SQL 执行行为。
1SELECT2 @@character_set_server,3 @@character_set_database,4 @@character_set_connection,5 @@character_set_client,6 @@character_set_results;用于排查乱码、字符转换和索引长度问题。
1SELECT2 @@collation_server,3 @@collation_database,4 @@collation_connection;不同排序规则会影响字符串比较、排序和索引使用。
1SELECT @@datadir;确认 MySQL 数据文件所在目录。
1SELECT2 @@log_error,3 @@pid_file,4 @@socket,5 @@tmpdir,6 @@secure_file_priv;用于定位错误日志、PID 文件、Socket 文件、临时目录以及文件导入导出限制目录。
1SHOW DATABASES;1SELECT DATABASE();1SHOW CREATE DATABASE db_name;可以确认数据库字符集和排序规则。
1SELECT2 table_schema,3 ROUND(SUM(data_length + index_length) / 1024 / 1024 / 1024, 2) AS size_gb4FROM information_schema.tables5GROUP BY table_schema6ORDER BY size_gb DESC;1SHOW FULL TABLES FROM db_name;除了普通表,还可以识别视图。
1DESC db_name.table_name;或:
1SHOW COLUMNS FROM db_name.table_name;1SHOW CREATE TABLE db_name.table_name\G排查字段类型、索引、分区、字符集和存储引擎问题时,SHOW CREATE TABLE 比 DESC 更完整。
1SHOW TABLE STATUS FROM db_name LIKE 'table_name'\G可查看存储引擎、估算行数、数据大小、索引大小和自增值。
1SELECT2 table_schema,3 table_name,4 table_rows,5 ROUND(data_length / 1024 / 1024, 2) AS data_mb,6 ROUND(index_length / 1024 / 1024, 2) AS index_mb,7 ROUND((data_length + index_length) / 1024 / 1024, 2) AS total_mb8FROM information_schema.tables9WHERE table_schema = 'db_name'10ORDER BY data_length + index_length DESC;1SELECT2 table_schema,3 table_name,4 engine5FROM information_schema.tables6WHERE table_schema NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys')7 AND engine <> 'InnoDB';生产业务表通常建议统一使用 InnoDB。
1SHOW PROCESSLIST;1SHOW FULL PROCESSLIST;普通 SHOW PROCESSLIST 会截断 SQL 文本,排查长 SQL 时应使用 FULL。
1SELECT2 id,3 user,4 host,5 db,6 command,7 time,8 state,9 info10FROM information_schema.processlist11ORDER BY time DESC;1SHOW GLOBAL STATUS LIKE 'Threads_connected';1SHOW GLOBAL STATUS LIKE 'Threads_running';Threads_connected 高不一定代表数据库繁忙,真正需要重点关注的是 Threads_running。
1SHOW VARIABLES LIKE 'max_connections';1SHOW GLOBAL STATUS LIKE 'Max_used_connections';1SELECT2 VARIABLE_VALUE AS current_connections,3 @@max_connections AS max_connections,4 ROUND(VARIABLE_VALUE / @@max_connections * 100, 2) AS usage_percent5FROM performance_schema.global_status6WHERE VARIABLE_NAME = 'Threads_connected';1SELECT2 user,3 COUNT(*) AS connection_count4FROM information_schema.processlist5GROUP BY user6ORDER BY connection_count DESC;1SELECT2 SUBSTRING_INDEX(host, ':', 1) AS client_ip,3 COUNT(*) AS connection_count4FROM information_schema.processlist5GROUP BY SUBSTRING_INDEX(host, ':', 1)6ORDER BY connection_count DESC;1SELECT2 id,3 user,4 host,5 db,6 command,7 time,8 state,9 info10FROM information_schema.processlist11WHERE command <> 'Sleep'12 AND time > 6013ORDER BY time DESC;1SELECT2 id,3 user,4 host,5 db,6 time7FROM information_schema.processlist8WHERE command = 'Sleep'9 AND time > 60010ORDER BY time DESC;1KILL CONNECTION 12345;该命令会断开整个连接,并回滚连接中的未提交事务。
1KILL QUERY 12345;只终止正在执行的语句,不主动断开客户端连接。
1SELECT CONCAT('KILL CONNECTION ', id, ';')2FROM information_schema.processlist3WHERE command = 'Sleep'4 AND time > 36005 AND user NOT IN ('system user', 'event_scheduler');建议先生成命令并人工核对,不要直接拼接后自动执行。
1SELECT *2FROM information_schema.innodb_trx\G1SELECT2 trx_id,3 trx_mysql_thread_id,4 trx_state,5 trx_started,6 TIMESTAMPDIFF(SECOND, trx_started, NOW()) AS trx_seconds,7 trx_rows_locked,8 trx_rows_modified,9 trx_query10FROM information_schema.innodb_trx11ORDER BY trx_started;1SELECT2 trx_id,3 trx_mysql_thread_id,4 trx_started,5 TIMESTAMPDIFF(SECOND, trx_started, NOW()) AS trx_seconds,6 trx_rows_locked,7 trx_rows_modified,8 trx_query9FROM information_schema.innodb_trx10WHERE trx_started < NOW() - INTERVAL 60 SECOND11ORDER BY trx_started;1SELECT *2FROM performance_schema.data_lock_waits;1SELECT *2FROM performance_schema.data_locks;1SELECT *2FROM sys.innodb_lock_waits\G该视图已经把阻塞会话、等待会话、SQL 和锁信息进行了关联,通常比直接查询 Performance Schema 更方便。
1SELECT *2FROM performance_schema.metadata_locks3WHERE LOCK_STATUS = 'PENDING';当 ALTER TABLE、TRUNCATE TABLE、DROP TABLE 长时间卡住时,应重点检查元数据锁。
1SELECT2 ml.object_schema,3 ml.object_name,4 ml.lock_type,5 ml.lock_duration,6 ml.lock_status,7 t.processlist_id,8 t.processlist_user,9 t.processlist_host,10 t.processlist_time,11 t.processlist_info12FROM performance_schema.metadata_locks ml13JOIN performance_schema.threads t14 ON ml.owner_thread_id = t.thread_id15WHERE ml.lock_status = 'PENDING';1SELECT2 trx.trx_id,3 trx.trx_started,4 trx.trx_mysql_thread_id,5 p.user,6 p.host,7 p.db,8 p.command,9 p.time,10 p.state,11 p.info12FROM information_schema.innodb_trx trx13LEFT JOIN information_schema.processlist p14 ON trx.trx_mysql_thread_id = p.id15ORDER BY trx.trx_started;1SHOW ENGINE INNODB STATUS\G这是排查死锁、事务、锁等待、Buffer Pool、I/O 和后台线程状态的核心命令。
1SHOW ENGINE INNODB STATUS\G在输出中搜索:
1LATEST DETECTED DEADLOCK1SET GLOBAL innodb_print_all_deadlocks = ON;开启后,所有检测到的死锁都会写入 MySQL 错误日志。该参数会增加少量日志量。
1SELECT2 @@global.transaction_isolation,3 @@session.transaction_isolation;1SELECT @@global.autocommit, @@session.autocommit;1COMMIT;1ROLLBACK;生产中出现长事务时,经常不是 SQL 执行慢,而是应用开启事务后长时间没有提交。
1EXPLAIN2SELECT *3FROM db_name.table_name4WHERE id = 100;1EXPLAIN FORMAT=JSON2SELECT *3FROM db_name.table_name4WHERE id = 100;JSON 格式可以看到成本估算、条件过滤和访问路径等详细信息。
1EXPLAIN ANALYZE2SELECT *3FROM db_name.table_name4WHERE id = 100;EXPLAIN ANALYZE 会真正执行 SQL。对于更新、删除或资源消耗较大的 SQL,必须谨慎使用。
1SET optimizer_trace = 'enabled=on';23SELECT *4FROM db_name.table_name5WHERE id = 100;67SELECT trace8FROM information_schema.optimizer_trace\G适用于分析优化器为何选择某个索引或执行计划。
1SELECT2 processlist_id,3 processlist_user,4 processlist_host,5 processlist_db,6 processlist_time,7 processlist_state,8 processlist_info9FROM performance_schema.threads10WHERE type = 'FOREGROUND'11 AND processlist_command <> 'Sleep'12ORDER BY processlist_time DESC;1SELECT2 digest_text,3 count_star,4 ROUND(sum_timer_wait / 1000000000000, 2) AS total_seconds,5 ROUND(avg_timer_wait / 1000000000000, 6) AS avg_seconds,6 sum_rows_examined,7 sum_rows_sent8FROM performance_schema.events_statements_summary_by_digest9WHERE digest_text IS NOT NULL10ORDER BY sum_timer_wait DESC11LIMIT 20;1SELECT2 digest_text,3 count_star,4 ROUND(avg_timer_wait / 1000000000000, 6) AS avg_seconds,5 ROUND(max_timer_wait / 1000000000000, 6) AS max_seconds,6 sum_rows_examined,7 sum_rows_sent8FROM performance_schema.events_statements_summary_by_digest9WHERE count_star >= 1010ORDER BY avg_timer_wait DESC11LIMIT 20;1SELECT2 digest_text,3 count_star,4 sum_rows_examined,5 sum_rows_sent,6 ROUND(sum_rows_examined / NULLIF(sum_rows_sent, 0), 2) AS examine_send_ratio7FROM performance_schema.events_statements_summary_by_digest8ORDER BY sum_rows_examined DESC9LIMIT 20;1SELECT2 digest_text,3 count_star,4 sum_no_index_used,5 sum_no_good_index_used,6 sum_rows_examined7FROM performance_schema.events_statements_summary_by_digest8WHERE sum_no_index_used > 09 OR sum_no_good_index_used > 010ORDER BY sum_no_index_used DESC11LIMIT 20;这里的“未使用索引”不一定代表 SQL 必须优化,小表全表扫描有时比走索引更合理。
1SELECT2 digest_text,3 count_star,4 sum_created_tmp_tables,5 sum_created_tmp_disk_tables6FROM performance_schema.events_statements_summary_by_digest7WHERE sum_created_tmp_tables > 08ORDER BY sum_created_tmp_disk_tables DESC9LIMIT 20;1SELECT2 digest_text,3 count_star,4 sum_sort_rows,5 sum_sort_scan,6 sum_sort_range,7 sum_sort_merge_passes8FROM performance_schema.events_statements_summary_by_digest9WHERE sum_sort_rows > 010ORDER BY sum_sort_rows DESC11LIMIT 20;1SELECT *2FROM sys.schema_tables_with_full_table_scans3ORDER BY rows_full_scanned DESC4LIMIT 20;1SELECT *2FROM sys.statement_analysis3ORDER BY total_latency DESC4LIMIT 20;1SELECT2 event_id,3 sql_text,4 rows_examined,5 rows_sent,6 timer_wait7FROM performance_schema.events_statements_history8WHERE thread_id = PS_CURRENT_THREAD_ID()9ORDER BY event_id DESC;1TRUNCATE TABLE performance_schema.events_statements_summary_by_digest;该操作不会清除业务数据,但会重置 SQL 聚合统计。执行前应确认是否还需要保留历史性能数据。
1SHOW INDEX FROM db_name.table_name;1SELECT2 index_name,3 non_unique,4 seq_in_index,5 column_name,6 cardinality,7 nullable8FROM information_schema.statistics9WHERE table_schema = 'db_name'10 AND table_name = 'table_name'11ORDER BY index_name, seq_in_index;1SELECT2 t.table_schema,3 t.table_name4FROM information_schema.tables t5LEFT JOIN information_schema.table_constraints c6 ON t.table_schema = c.table_schema7 AND t.table_name = c.table_name8 AND c.constraint_type = 'PRIMARY KEY'9WHERE t.table_type = 'BASE TABLE'10 AND t.engine = 'InnoDB'11 AND t.table_schema NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys')12 AND c.constraint_name IS NULL;1SELECT *2FROM sys.schema_redundant_indexes;删除冗余索引前,应结合 SQL 使用情况和业务特征确认,不能仅凭系统视图直接删除。
1SELECT *2FROM sys.schema_unused_indexes;该视图的数据来源于实例启动后的统计。实例刚重启时,结果通常不具备参考价值。
1SELECT *2FROM sys.schema_index_statistics3WHERE table_schema = 'db_name'4 AND table_name = 'table_name'5ORDER BY rows_selected DESC;1ANALYZE TABLE db_name.table_name;当表数据发生大规模变化,执行计划明显异常时,可以考虑重新收集统计信息。
1CHECK TABLE db_name.table_name;1OPTIMIZE TABLE db_name.table_name;对于 InnoDB,通常会重建表。大表执行可能占用大量 I/O、临时空间,并造成元数据锁影响。
1SELECT2 table_schema,3 table_name,4 engine,5 ROUND(data_length / 1024 / 1024, 2) AS data_mb,6 ROUND(data_free / 1024 / 1024, 2) AS data_free_mb7FROM information_schema.tables8WHERE table_schema NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys')9 AND data_free > 010ORDER BY data_free DESC;data_free 不能简单等同于真实可回收碎片,尤其在共享表空间和分区表环境中需要谨慎解释。
1SHOW VARIABLES LIKE 'innodb_buffer_pool_size';1SHOW VARIABLES LIKE 'innodb_buffer_pool_instances';部分新版本中该参数的行为和可配置性可能发生变化,应结合实际版本确认。
1SHOW GLOBAL STATUS2WHERE Variable_name IN (3 'Innodb_buffer_pool_read_requests',4 'Innodb_buffer_pool_reads'5);逻辑读请求与物理读次数的比例可以用于估算 Buffer Pool 命中率。
1SELECT2 ROUND(3 (4 1 -5 reads.variable_value /6 NULLIF(requests.variable_value, 0)7 ) * 100,8 49 ) AS buffer_pool_hit_percent10FROM performance_schema.global_status reads11JOIN performance_schema.global_status requests12WHERE reads.variable_name = 'Innodb_buffer_pool_reads'13 AND requests.variable_name = 'Innodb_buffer_pool_read_requests';命中率高并不代表数据库一定没有 I/O 问题,还需要结合工作集大小、随机读延迟和 SQL 访问模式判断。
1SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';1SHOW GLOBAL STATUS2WHERE Variable_name IN (3 'Innodb_buffer_pool_pages_total',4 'Innodb_buffer_pool_pages_free',5 'Innodb_buffer_pool_pages_data',6 'Innodb_buffer_pool_pages_dirty'7);1SHOW VARIABLES2WHERE Variable_name IN (3 'innodb_redo_log_capacity',4 'innodb_log_buffer_size',5 'innodb_flush_log_at_trx_commit',6 'sync_binlog'7);innodb_flush_log_at_trx_commit 与 sync_binlog 直接影响事务持久性和写入性能。
1SHOW GLOBAL STATUS2WHERE Variable_name IN (3 'Innodb_data_reads',4 'Innodb_data_writes',5 'Innodb_data_read',6 'Innodb_data_written',7 'Innodb_os_log_written'8);1SHOW GLOBAL STATUS2WHERE Variable_name IN (3 'Innodb_rows_read',4 'Innodb_rows_inserted',5 'Innodb_rows_updated',6 'Innodb_rows_deleted'7);1SHOW GLOBAL STATUS2WHERE Variable_name IN (3 'Created_tmp_tables',4 'Created_tmp_disk_tables',5 'Created_tmp_files'6);磁盘临时表比例过高时,应检查 SQL、tmp_table_size、max_heap_table_size 和 TempTable 引擎配置。
1SHOW VARIABLES2WHERE Variable_name IN (3 'slow_query_log',4 'slow_query_log_file',5 'long_query_time',6 'log_queries_not_using_indexes',7 'min_examined_row_limit'8);1SET GLOBAL slow_query_log = ON;1SET GLOBAL long_query_time = 1;该设置只对新连接生效。已有会话可能仍使用原来的会话级参数。
1SHOW VARIABLES2WHERE Variable_name IN (3 'log_bin',4 'log_bin_basename',5 'binlog_format',6 'binlog_row_image',7 'binlog_expire_logs_seconds'8);1SHOW MASTER STATUS;在部分较新的 MySQL 版本中,推荐使用兼容的新命令:
1SHOW BINARY LOG STATUS;1SHOW BINARY LOGS;1SHOW BINLOG EVENTS2IN 'mysql-bin.000001'3LIMIT 100;对于 Row 格式的完整行数据解析,通常需要使用 mysqlbinlog。
1mysqlbinlog \2 --base64-output=DECODE-ROWS \3 -vv \4 mysql-bin.0000011mysqlbinlog \2 --start-datetime='2026-07-16 10:00:00' \3 --stop-datetime='2026-07-16 11:00:00' \4 --base64-output=DECODE-ROWS \5 -vv \6 mysql-bin.000001该命令常用于误操作恢复和数据审计。
传统术语环境:
1SHOW SLAVE STATUS\GMySQL 8.0 推荐使用:
1SHOW REPLICA STATUS\G重点关注以下字段:
1Replica_IO_Running2Replica_SQL_Running3Seconds_Behind_Source4Last_IO_Error5Last_SQL_Error6Retrieved_Gtid_Set7Executed_Gtid_Set1SELECT *2FROM performance_schema.replication_connection_status\G1SELECT *2FROM performance_schema.replication_applier_status\G1SELECT2 channel_name,3 worker_id,4 thread_id,5 service_state,6 last_error_number,7 last_error_message,8 last_error_timestamp9FROM performance_schema.replication_applier_status_by_worker;并行复制环境中,某一个 Worker 报错可能导致整个 SQL 线程停止。
1STOP REPLICA;1START REPLICA;只控制 I/O 线程或 SQL 线程:
1STOP REPLICA IO_THREAD;2START REPLICA IO_THREAD;1STOP REPLICA SQL_THREAD;2START REPLICA SQL_THREAD;1SELECT2 @@global.gtid_executed,3 @@global.gtid_purged,4 @@global.enforce_gtid_consistency,5 @@global.gtid_mode;GTID 环境中,恢复、搭建复制和主从切换都需要重点确认这几个值。
1mysqldump \2 -h 127.0.0.1 \3 -P 3306 \4 -u backup_user \5 -p \6 --single-transaction \7 --routines \8 --events \9 --triggers \10 --set-gtid-purged=OFF \11 --databases db_name \12 > db_name_$(date +%F).sql其中:
--single-transaction:对 InnoDB 表执行一致性备份,避免长时间锁表;--routines:备份存储过程和函数;--events:备份 Event Scheduler 事件;--triggers:备份触发器;--set-gtid-purged=OFF:避免导出文件自动写入 GTID 相关语句。恢复命令:
1mysql \2 -h 127.0.0.1 \3 -P 3306 \4 -u root \5 -p \6 < db_name_2026-07-16.sql在生产环境中,mysqldump 更适合中小规模数据库。对于数百 GB 或 TB 级数据库,应优先考虑 MySQL Enterprise Backup、Percona XtraBackup、存储快照或云数据库物理备份能力。
虽然前面已经列满 100 条,但权限排查同样是日常工作的高频场景,下面几条建议单独保留。
查看用户:
1SELECT2 user,3 host,4 plugin,5 account_locked,6 password_expired7FROM mysql.user;查看用户权限:
1SHOW GRANTS FOR 'app_user'@'%';创建用户:
1CREATE USER 'app_user'@'10.%'2IDENTIFIED BY 'StrongPassword';授权:
1GRANT SELECT, INSERT, UPDATE, DELETE2ON db_name.*3TO 'app_user'@'10.%';回收权限:
1REVOKE DELETE2ON db_name.*3FROM 'app_user'@'10.%';修改密码:
1ALTER USER 'app_user'@'10.%'2IDENTIFIED BY 'NewStrongPassword';锁定用户:
1ALTER USER 'app_user'@'10.%' ACCOUNT LOCK;解锁用户:
1ALTER USER 'app_user'@'10.%' ACCOUNT UNLOCK;删除用户:
1DROP USER 'app_user'@'10.%';对于 MySQL DBA 来说,这 100 条命令真正需要形成的不是记忆,而是一套排查顺序。
当数据库出现故障时,可以按照下面的路径进行判断:
很多线上事故之所以处理时间长,并不是因为 DBA 不会执行命令,而是一开始就把排查方向选错了。CPU 高只是现象,连接数高只是现象,复制延迟同样只是现象。真正有效的排查,始终要回到会话、事务、等待、SQL 和资源消耗之间的因果关系。