MySQL 命令速查表 - MySQL 数据库常用命令大全
面向要建库建表、优化慢查询、做备份的 MySQL 使用者。关键不在敲 CRUD,而在理解 WHERE 是否走索引、EXPLAIN 的 type 列含义、以及 DDL 与大批量操作可能锁表阻塞线上。读完能用 EXPLAIN 判断一条查询是否命中索引、定位 type=ALL 的全表扫描,安全地授予最小权限、用 mysqldump 做可恢复的备份,并理解主从复制的卡住点。
典型使用场景
数据库日常运维:连接、建库建表、用户与权限管理、备份与恢复、慢查询定位,以及排查连接数耗尽、主从延迟与锁等待。
连接与用户 Connection & User 7
mysql -u root -p -h 127.0.0.1 -P 3306mysql -u root -p db_name < dump.sqlmysqldump -u root -p --single-transaction db_name > backup.sqlCREATE USER 'app'@'%' IDENTIFIED BY 'password';GRANT SELECT, INSERT, UPDATE ON db.* TO 'app'@'%';ALTER USER 'app'@'%' IDENTIFIED BY 'new_password';SHOW GRANTS FOR CURRENT_USER;库表操作 Database & Table 8
SHOW DATABASES;USE db_name;SHOW TABLES;DESC table_name;SHOW CREATE TABLE table_name\GALTER TABLE t ADD COLUMN col INT DEFAULT 0 AFTER id;ALTER TABLE t ADD INDEX idx_name (col);TRUNCATE TABLE t;查询与索引 Query & Index 6
EXPLAIN SELECT * FROM t WHERE col = 1\GEXPLAIN FORMAT=JSON SELECT ...SHOW INDEX FROM t;SELECT COUNT(*) FROM t WHERE col IS NULL;SHOW STATUS LIKE "Slow_queries";SHOW VARIABLES LIKE 'slow_query%';进程与锁 Process & Lock 6
SHOW PROCESSLIST;SHOW FULL PROCESSLIST;KILL <id>;SELECT * FROM information_schema.INNODB_TRX;SELECT * FROM performance_schema.data_locks WHERE LOCK_STATUS='PENDING';SHOW ENGINE INNODB STATUS\G备份恢复 Backup & Recovery 5
mysqldump -u root -p --all-databases --routines --triggers > all.sqlmysqldump -u root -p --single-transaction --master-data=2 db > db.sqlmysqlbinlog --start-datetime="2026-01-01 00:00:00" mysql-bin.000123 | mysql -u root -pmysql -u root -p -e "SET GLOBAL read_only=1;"SHOW BINARY LOGS;主从复制 Replication 5
SHOW SLAVE STATUS\GSHOW REPLICA STATUS\GCHANGE REPLICATION SOURCE TO SOURCE_HOST='10.0.0.1', SOURCE_PORT=3306;START REPLICA; STOP REPLICA;SELECT * FROM performance_schema.replication_applier_status_by_worker;参数矩阵
| 参数 | 作用 | 示例 |
|---|---|---|
-u | 指定登录用户 | mysql -u root -p |
-h | 指定主机地址 | mysql -h 127.0.0.1 -u app |
-P | 指定端口(默认 3306) | mysql -h 127.0.0.1 -P 3307 |
--single-transaction | 一致性逻辑备份(InnoDB 不锁表) | mysqldump --single-transaction -u root -p db > db.sql |
--master-data | 备份中记录 binlog 位点,便于搭建从库 | mysqldump --master-data=2 -u root -p db > db.sql |
EXPLAIN | 查看查询执行计划,定位全表扫描 | EXPLAIN SELECT * FROM orders WHERE user_id=1; |
SHOW PROCESSLIST | 查看当前连接与正在执行的语句 | SHOW PROCESSLIST; |
innodb_buffer_pool_size | 缓冲池大小,影响命中率 | SET GLOBAL innodb_buffer_pool_size=2G; |
slow_query_log | 开启慢查询日志 | SET GLOBAL slow_query_log=ON; |
--quick | 流式导出,减少内存占用 | mysqldump --quick -u root -p db > db.sql |
易错点与避坑指南
现象连接报 Too many connections。
原因max_connections 过小、连接未释放,或应用连接池配置不当。
处置SHOW PROCESSLIST 看来源;调大 max_connections;应用侧用连接池并设超时;排查慢查询占住连接。
现象UPDATE/DELETE 忘记加 WHERE,误改全表。
原因SQL 未带条件,或误在错误环境执行。
处置危险操作前先 SELECT 确认影响行数;开启 SQL_SAFE_UPDATES;先 BEGIN 再提交,确认无误再 COMMIT。
现象主从延迟持续增大。
原因从库单线程回放、大事务、或从库硬件/网络瓶颈。
处置SHOW SLAVE STATUS 看 Seconds_Behind_Master 与延迟事务;拆大事务;升级从库或多线程复制(slave_parallel_workers)。
现象查询很慢,EXPLAIN 显示 ALL(全表扫描)。
原因缺少合适索引,或查询对索引列做了函数/隐式类型转换。
处置对 WHERE/JOIN/ORDER BY 列建索引;避免 WHERE DATE(created)=... 这类索引失效写法。
现象执行 DDL(加列)时锁全表,线上卡死。
原因MySQL 5.6 之前或特定 DDL 需要锁表复制。
处置优先用 Online DDL(MySQL 8 默认);大表用 gh-ost/pt-online-schema-change 无锁变更。
现象mysqldump 备份时锁表导致写入阻塞。
原因未加 --single-transaction,对非事务表加全局读锁。
处置对 InnoDB 加 --single-transaction;仅 MyISAM 才需 --lock-all-tables,并尽量在低峰期。
排障路径
1查看实时连接与来源
SHOW PROCESSLIST;定位是哪些主机/应用占满连接,区分慢查询与连接泄漏。
2定位慢查询
SELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 10;配合 slow_query_log 与 long_query_time 使用。
3查看主从复制状态
SHOW SLAVE STATUS\G关注 Seconds_Behind_Master 与 Last_Error,定位延迟与中断原因。
4从备份恢复单库
mysql -u root -p db < db.sql恢复前确认备份一致性;误删数据用 binlog 时间点恢复更精确。
命令示例
用 EXPLAIN 判断一条查询是否走索引
EXPLAIN SELECT * FROM orders WHERE user_id = 1001 ORDER BY created_at;type=ref 且 key=idx_user 说明命中索引;这里 Extra 里的 Using filesort 提示 ORDER BY 未走索引,若有性能压力可在 (user_id, created_at) 上建联合索引消除排序。
输出
id select_type table type key key_len rows Extra 1 SIMPLE orders ref idx_user 4 3 Using index condition; Using filesort
导出并恢复一个库的备份
mysqldump -u backup -p --single-transaction --routines --triggers mydb > mydb.sql
mysql -u root -p < mydb.sql--single-transaction 用 InnoDB 事务一致性快照导出,线上导备份不加锁;恢复时直接重定向 sql 文件到 mysql 客户端执行。
查看主从复制状态
SHOW SLAVE STATUS\GSQL 线程停住时先看 Last_SQL_Error 与 Last_Errno;若是可跳过的重复主键错误,定位后可用跳过或手动修复语句,再 START SLAVE SQL_THREAD 恢复。
输出
Slave_IO_Running: Yes Slave_SQL_Running: No Last_SQL_Error: Error 'Duplicate entry' for key 'PRIMARY' Seconds_Behind_Master: NULL
常见坑与注意事项
- 生产环境不要直接 ALTER 大表,会锁表阻塞 DML;改用 pt-online-schema-change 或 gh-ost 做在线变更。
- 秒杀/批量 UPDATE 或 DELETE 前先确认 WHERE 有索引,否则全表加锁范围大,容易把整个表写锁住。
- mysqldump 全量 + binlog 增量才是完整备份策略;只定期导出 dmp 而无 binlog,误删数据后最多恢复到上次备份点。
- 账号权限遵循最小化,别用 ALL PRIVILEGES ON *.*,更不要把 grant 权给到非管理账号。
- Seconds_Behind_Master=0 不代表无延迟,大事务切换时可能失真,结合 relay log 落点与 Last_SQL_Error 综合判断。
提示
- 生产环境加列加索引用 pt-online-schema-change 或 gh-ost,不要直接 ALTER 大表。
- 看到 Seconds_Behind_Master 为 0 不代表无延迟,大事务可能导致跳变,结合 relay log 大小判断。
- 慢查询排查先开 slow_query_log,再用 pt-query-digest 分析 TOP SQL,不要只看 EXPLAIN。
常见问题
MySQL 的 root 密码忘了,怎么优雅地重置?
先停掉 mysqld,再用 skip-grant-tables 跳过授权表启动(或在 init-file 里放一条 ALTER USER 语句让进程启动时执行),登录后用 ALTER USER 重新设密码,去掉该参数重启并使 FLUSH PRIVILEGES 生效。注意 skip-grant-tables 下服务完全没有鉴权,仅限维护窗口使用。
主键用自增 id 还是 UUID,怎么取舍?
自增主键占用小、写顺序友好,适合单库单表与日志型插入;UUID 适合需要全局唯一、多源合并或不想暴露明文整数主键时。若用 UUID 建议存二进制或转成有序 UUID,否则大表的索引空间和随机写都会膨胀。
EXPLAIN 结果里 type=ALL 是什么意思,要怎么优化?
type=ALL 表示全表扫描,通常意味着这条查询没有可用的索引,行数很多时性能极差。优化方向:为 WHERE 和 ORDER BY 涉及的列建合适的索引、用覆盖索引避免回表,必要时改写 SQL 或补 LIMIT。
用 mysqldump 备份 InnoDB 库,怎么保证一致性又不锁表?
对 InnoDB 表加 --single-transaction,用一致性快照导出,同时配 --master-data=2 记录二进制日志位点,这样备份过程几乎不阻塞写入。导出后可用 mysql < dump.sql 恢复;大库更建议用专门的逻辑备份或物理备份工具。
大表加列或改类型,为什么会让线上卡顿?
多数 ALTER 默认会重建表并持有元数据锁,处理大表时会复制数据、占用资源,可能阻塞读写并让复制滞后。现代版本可用 ALGORITHM=INPLACE 与 LOCK=NONE 尽量在线完成,但仍建议先在从库验证、挑低峰执行并评估长事务影响。
由 巧匠 维护
公开更新于 2026年7月21日,内容持续校对官方文档。