少女祈祷中...
NEKO
知识库

mysql 常用命令

一、连接与基础信息

-- 连接
mysql -h host -P 3306 -u user -p
mysql -h host -u user -p dbname

-- 版本
SELECT VERSION();
SHOW VARIABLES LIKE 'version%';

-- 当前连接信息
SHOW PROCESSLIST;
SHOW FULL PROCESSLIST;   -- 显示完整 SQL

-- 当前库/用户
SELECT DATABASE();
SELECT USER(), CURRENT_USER();

-- 查看所有库
SHOW DATABASES;

-- 查看表
SHOW TABLES;
SHOW TABLES LIKE 't%';

二、状态与监控

-- 全局状态
SHOW GLOBAL STATUS;
SHOW GLOBAL STATUS LIKE 'Threads%';
SHOW GLOBAL STATUS LIKE 'Questions';
SHOW GLOBAL STATUS LIKE 'Uptime';

-- 关键指标
SHOW GLOBAL STATUS LIKE 'Connections';        -- 总连接数
SHOW GLOBAL STATUS LIKE 'Max_used_connections'; -- 峰值连接
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%'; -- 缓冲池
SHOW GLOBAL STATUS LIKE 'Innodb_rows%';        -- 行操作
SHOW GLOBAL STATUS LIKE 'Com_select';          -- 查询数
SHOW GLOBAL STATUS LIKE 'Slow_queries';        -- 慢查询数

-- 引擎状态
SHOW ENGINE INNODB STATUS\G   -- 死锁、锁等待、事务

-- 主从状态
SHOW MASTER STATUS;
SHOW SLAVE STATUS\G
SHOW REPLICA STATUS\G         -- 8.0.22+

三、变量与参数

-- 查看变量
SHOW VARIABLES LIKE 'max_connections';
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SELECT @@max_connections;

-- 会话级设置
SET SESSION max_connections = 1000;

-- 全局设置(重启失效)
SET GLOBAL max_connections = 1000;

-- 持久化设置(8.0+,重启保留)
SET PERSIST max_connections = 1000;
SET PERSIST_ONLY max_connections = 1000;

-- 查看连接相关
SHOW VARIABLES LIKE 'max_connections';
SHOW VARIABLES LIKE 'wait_timeout';
SHOW VARIABLES LIKE 'interactive_timeout';

四、连接与进程管理

-- 查看进程
SHOW PROCESSLIST;

-- 从 information_schema 查(更详细)
SELECT * FROM information_schema.PROCESSLIST;

-- 按时间排序找长事务
SELECT id, user, host, db, command, time, state, info
FROM information_schema.PROCESSLIST
WHERE command != 'Sleep'
ORDER BY time DESC;

-- 杀连接
KILL <id>;
KILL QUERY <id>;   -- 只杀查询,不断连接

-- 批量杀 Sleep 连接
SELECT CONCAT('KILL ', id, ';')
FROM information_schema.PROCESSLIST
WHERE command = 'Sleep' AND time > 300;

五、事务与锁

-- 当前运行的事务
SELECT * FROM information_schema.INNODB_TRX;

-- 当前锁
SELECT * FROM information_schema.INNODB_LOCKS;      -- 8.0 前
SELECT * FROM performance_schema.data_locks;         -- 8.0+

-- 锁等待
SELECT * FROM information_schema.INNODB_LOCK_WAITS; -- 8.0 前
SELECT * FROM performance_schema.data_lock_waits;   -- 8.0+

-- 死锁信息
SHOW ENGINE INNODB STATUS\G
-- 开启死锁日志
SET GLOBAL innodb_print_all_deadlocks = ON;

-- 事务隔离级别
SELECT @@transaction_isolation;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

六、慢查询与性能

-- 慢查询开关
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';
SHOW VARIABLES LIKE 'slow_query_log_file';

-- 动态开启
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 1;
SET GLOBAL log_queries_not_using_indexes = ON;

-- 查看慢查询数量
SHOW GLOBAL STATUS LIKE 'Slow_queries';

-- 慢查询日志内容
SHOW GLOBAL VARIABLES LIKE 'slow_query_log_file';
-- 命令行分析
-- mysqldumpslow -s t /var/log/mysql/slow.log
-- pt-query-digest /var/log/mysql/slow.log

七、执行计划与索引

-- 执行计划
EXPLAIN SELECT * FROM t WHERE a = 1;
EXPLAIN FORMAT=JSON SELECT ...;
EXPLAIN ANALYZE SELECT ...;   -- 8.0.18+ 实际执行

-- 查看索引
SHOW INDEX FROM t;
SHOW CREATE TABLE t;

-- 索引基数
SHOW INDEX FROM t;
ANALYZE TABLE t;   -- 更新统计信息

-- 强制索引
SELECT * FROM t FORCE INDEX(idx_a) WHERE a = 1;

八、表与库管理

-- 表状态
SHOW TABLE STATUS LIKE 't'\G
SHOW TABLE STATUS FROM dbname;

-- 表大小
SELECT table_name,
       ROUND(data_length/1024/1024, 2) AS data_mb,
       ROUND(index_length/1024/1024, 2) AS index_mb,
       ROUND((data_length+index_length)/1024/1024, 2) AS total_mb
FROM information_schema.TABLES
WHERE table_schema = 'dbname'
ORDER BY total_mb DESC;

-- 库大小
SELECT table_schema,
       ROUND(SUM(data_length+index_length)/1024/1024, 2) AS total_mb
FROM information_schema.TABLES
GROUP BY table_schema;

-- 修改表
ALTER TABLE t ADD COLUMN c INT;
ALTER TABLE t ADD INDEX idx_c(c);
ALTER TABLE t ENGINE=InnoDB;

-- 在线 DDL
ALTER TABLE t ADD COLUMN c INT, ALGORITHM=INPLACE, LOCK=NONE;

九、用户与权限

-- 查看用户
SELECT user, host FROM mysql.user;

-- 创建用户
CREATE USER 'u'@'%' IDENTIFIED BY 'pwd';

-- 授权
GRANT SELECT, INSERT ON db.* TO 'u'@'%';
GRANT ALL PRIVILEGES ON *.* TO 'u'@'%';
FLUSH PRIVILEGES;

-- 查看权限
SHOW GRANTS FOR 'u'@'%';

-- 回收权限
REVOKE INSERT ON db.* FROM 'u'@'%';

-- 改密码
ALTER USER 'u'@'%' IDENTIFIED BY 'newpwd';

-- 删除用户
DROP USER 'u'@'%';

十、备份与恢复

# 逻辑备份
mysqldump -u root -p dbname > db.sql
mysqldump -u root -p --all-databases > all.sql
mysqldump -u root -p --single-transaction --routines --triggers dbname > db.sql

# 恢复
mysql -u root -p dbname < db.sql
source db.sql;

# 物理备份(XtraBackup)
xtrabackup --backup --target-dir=/backup
xtrabackup --prepare --target-dir=/backup
xtrabackup --copy-back --target-dir=/backup

sql

-- 导入导出
SELECT * FROM t INTO OUTFILE '/tmp/t.csv' FIELDS TERMINATED BY ',';
LOAD DATA INFILE '/tmp/t.csv' INTO TABLE t FIELDS TERMINATED BY ',';

-- binlog 恢复
SHOW BINARY LOGS;
SHOW BINLOG EVENTS IN 'mysql-bin.000001';
-- mysqlbinlog mysql-bin.000001 | mysql -u root -p

十一、主从复制运维

-- 主库
SHOW MASTER STATUS;
SHOW BINARY LOGS;
PURGE BINARY LOGS TO 'mysql-bin.000010';
PURGE BINARY LOGS BEFORE '2024-01-01';

-- 从库
SHOW SLAVE STATUS\G
SHOW REPLICA STATUS\G

-- 启动/停止
START SLAVE;
STOP SLAVE;
START REPLICA;
STOP REPLICA;

-- 跳过错误
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;

-- 重设复制
STOP SLAVE;
RESET SLAVE ALL;
CHANGE MASTER TO
  MASTER_HOST='host',
  MASTER_USER='user',
  MASTER_PASSWORD='pwd',
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=154;
START SLAVE;

-- 并行复制
SET GLOBAL slave_parallel_workers = 4;
SET GLOBAL slave_parallel_type = 'LOGICAL_CLOCK';

-- 只读
SET GLOBAL read_only = ON;
SET GLOBAL super_read_only = ON;

十二、日志与诊断

-- 错误日志位置
SHOW VARIABLES LIKE 'log_error';

-- binlog
SHOW VARIABLES LIKE 'log_bin';
SHOW VARIABLES LIKE 'binlog_format';
SHOW VARIABLES LIKE 'sync_binlog';

-- redo log
SHOW VARIABLES LIKE 'innodb_log%';
SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';

-- 通用日志
SET GLOBAL general_log = ON;
SET GLOBAL general_log_file = '/tmp/general.log';

十三、常用 Shell 运维命令

# 连接
mysql -h host -u user -p

# 执行 SQL
mysql -e "SHOW PROCESSLIST;"

# 导入
mysql dbname < db.sql

# 导出
mysqldump -u root -p dbname > db.sql

# 慢日志分析
mysqldumpslow -s t -t 10 slow.log
pt-query-digest slow.log

# 检查大表
mysql -e "SELECT ..."

# 监控
mysqladmin -u root -p status
mysqladmin -u root -p extended-status
mysqladmin -u root -p processlist
mysqladmin -u root -p kill <id>
mysqladmin -u root -p shutdown

# 主从
mysql -e "SHOW SLAVE STATUS\G"

十四、故障排查常用组合

1. 连接数满

SHOW VARIABLES LIKE 'max_connections';
SHOW GLOBAL STATUS LIKE 'Max_used_connections';
SHOW PROCESSLIST;

2. 慢查询

SHOW GLOBAL STATUS LIKE 'Slow_queries';
SHOW VARIABLES LIKE 'slow_query_log%';
EXPLAIN SELECT ...;

3. 锁等待/死锁

SHOW ENGINE INNODB STATUS\G
SELECT * FROM information_schema.INNODB_TRX;
SELECT * FROM performance_schema.data_lock_waits;

4. 主从延迟

SHOW SLAVE STATUS\G   -- 看 Seconds_Behind_Master
SHOW PROCESSLIST;     -- 看 SQL 线程状态

5. 内存/缓冲池

SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%';

评论