16 KiB
16 KiB
MySQL 常用命令
连接数据库
# 查看版本
mysql --version
# 或
mysql -V
# 连接数据库
mysql -u root -p -h 127.0.0.1 -P 3306
# 连接指定数据库
mysql -u root -p -h 127.0.0.1 -P 3306 database_name
# 使用密码连接(不安全,仅用于脚本)
mysql -u root -p'password' -h 127.0.0.1 -P 3306
# 执行 SQL 文件
mysql -u root -p -h 127.0.0.1 -P 3306 database_name < query.sql
# 执行 SQL 命令
mysql -u root -p -h 127.0.0.1 -P 3306 -e "SHOW DATABASES;"
# 退出交互界面
exit
# 或
\q
# 或
quit
数据库管理
-- 列出所有数据库
SHOW DATABASES;
-- 创建数据库
CREATE DATABASE database_name;
CREATE DATABASE IF NOT EXISTS database_name;
-- 创建数据库并指定字符集
CREATE DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 删除数据库
DROP DATABASE database_name;
DROP DATABASE IF EXISTS database_name;
-- 切换数据库
USE database_name;
-- 查看当前数据库
SELECT DATABASE();
-- 查看数据库字符集
SHOW CREATE DATABASE database_name;
-- 修改数据库字符集
ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 查看数据库大小
SELECT
table_schema AS 'Database',
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)'
FROM information_schema.tables
WHERE table_schema = 'database_name'
GROUP BY table_schema;
-- 查看所有数据库大小
SELECT
table_schema AS 'Database',
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)'
FROM information_schema.tables
GROUP BY table_schema
ORDER BY SUM(data_length + index_length) DESC;
用户和权限管理
-- 列出所有用户
SELECT user, host FROM mysql.user;
-- 查看当前用户
SELECT USER();
SELECT CURRENT_USER();
-- 创建用户
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
CREATE USER 'username'@'%' IDENTIFIED BY 'password'; -- 允许任意主机
-- 修改用户密码
ALTER USER 'username'@'localhost' IDENTIFIED BY 'new_password';
SET PASSWORD FOR 'username'@'localhost' = PASSWORD('new_password'); -- MySQL 5.7
SET PASSWORD FOR 'username'@'localhost' = 'new_password'; -- MySQL 8.0+
-- 删除用户
DROP USER 'username'@'localhost';
DROP USER IF EXISTS 'username'@'localhost';
-- 授予权限
GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON database_name.* TO 'username'@'localhost';
GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION; -- 所有数据库
-- 授予特定表权限
GRANT SELECT, INSERT ON database_name.table_name TO 'username'@'localhost';
-- 撤销权限
REVOKE ALL PRIVILEGES ON database_name.* FROM 'username'@'localhost';
-- 查看用户权限
SHOW GRANTS FOR 'username'@'localhost';
-- 刷新权限(修改权限后必须执行)
FLUSH PRIVILEGES;
表管理
-- 列出所有表
SHOW TABLES;
SHOW TABLES FROM database_name;
-- 查看表结构
DESCRIBE table_name;
DESC table_name;
SHOW COLUMNS FROM table_name;
SHOW CREATE TABLE table_name; -- 查看建表语句
-- 查看表状态
SHOW TABLE STATUS LIKE 'table_name';
SHOW TABLE STATUS FROM database_name;
-- 查看表大小
SELECT
table_name AS 'Table',
ROUND(((data_length + index_length) / 1024 / 1024), 2) AS 'Size (MB)',
table_rows AS 'Rows'
FROM information_schema.tables
WHERE table_schema = 'database_name'
AND table_name = 'table_name';
-- 查看所有表大小
SELECT
table_schema AS 'Database',
table_name AS 'Table',
ROUND(((data_length + index_length) / 1024 / 1024), 2) AS 'Size (MB)',
table_rows AS 'Rows'
FROM information_schema.tables
WHERE table_schema = 'database_name'
ORDER BY (data_length + index_length) DESC;
-- 查看表行数
SELECT COUNT(*) FROM table_name;
-- 查看表引擎
SHOW TABLE STATUS WHERE Name = 'table_name';
-- 修改表引擎
ALTER TABLE table_name ENGINE = InnoDB;
-- 修改表字符集
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 重命名表
RENAME TABLE old_table_name TO new_table_name;
ALTER TABLE old_table_name RENAME TO new_table_name;
-- 清空表数据
TRUNCATE TABLE table_name;
-- 删除表
DROP TABLE table_name;
DROP TABLE IF EXISTS table_name;
索引管理
-- 列出所有索引
SHOW INDEX FROM table_name;
SHOW INDEXES FROM table_name;
SHOW KEYS FROM table_name;
-- 查看索引详细信息
SELECT
TABLE_NAME,
INDEX_NAME,
COLUMN_NAME,
SEQ_IN_INDEX,
INDEX_TYPE
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'database_name'
AND TABLE_NAME = 'table_name';
-- 创建索引
CREATE INDEX idx_name ON table_name(column_name);
-- 创建唯一索引
CREATE UNIQUE INDEX idx_name ON table_name(column_name);
-- 创建复合索引
CREATE INDEX idx_name ON table_name(column1, column2);
-- 创建全文索引(MyISAM 或 InnoDB 5.6+)
CREATE FULLTEXT INDEX idx_name ON table_name(column_name);
-- 创建前缀索引
CREATE INDEX idx_name ON table_name(column_name(10));
-- 删除索引
DROP INDEX idx_name ON table_name;
ALTER TABLE table_name DROP INDEX idx_name;
-- 查看索引使用情况(需要启用 performance_schema)
SELECT
object_schema,
object_name,
index_name,
count_star,
sum_timer_wait / 1000000000000 AS sum_timer_wait_sec
FROM performance_schema.table_io_waits_summary_by_index_usage
WHERE object_schema = 'database_name'
ORDER BY sum_timer_wait DESC;
创建全文索引 ngram
CREATE TABLE table_name(
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR (200),
content TEXT,
-- # 建立全文索引,同时使用ngram全文分析器
FULLTEXT (title) WITH PARSER ngram
) ENGINE = INNODB;
-- # 通过 alter table 的方式来添加
ALTER TABLE table_name ADD FULLTEXT INDEX full_index_title(title) WITH PARSER ngram;
-- # 为title创建全文索引并且使用ngram全文解析器进行分词
CREATE FULLTEXT INDEX full_index_title ON table_name(title) WITH PARSER `ngram`;
-- # 使用双引号把要搜素的词括起来,效果类似于like '%高性能%'
select * ,(MATCH ( `title` ) AGAINST ( '"高性能"' ) )AS score
from table_name
where MATCH(title) AGAINST('"高性能"' IN BOOLEAN MODE) order by score Desc;
SELECT * FROM table_name WHERE MATCH(`title`) AGAINST('高性能' IN BOOLEAN MODE);
-- # 优化全文索引,减少索引碎片
REPAIR TABLE table_name
-- 或更轻量的优化(不锁表)
OPTIMIZE TABLE table_name;
-- 若需匹配单字(如 “微”“信”)
-- 临时设置(会话级)
SET SESSION ngram_token_size = 1;
-- 永久设置(修改 my.cnf 后重启 MySQL)
-- ngram_token_size = 1
查询和分析
-- 查看执行计划
EXPLAIN SELECT * FROM table_name WHERE condition;
EXPLAIN FORMAT=JSON SELECT * FROM table_name WHERE condition;
EXPLAIN FORMAT=TREE SELECT * FROM table_name WHERE condition; -- MySQL 8.0+
-- 分析表(更新统计信息)
ANALYZE TABLE table_name;
-- 查看慢查询日志(需要启用)
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';
-- 查看当前正在执行的查询
SHOW PROCESSLIST;
SHOW FULL PROCESSLIST; -- 显示完整 SQL
-- 查看等待锁的查询
SELECT
r.trx_id waiting_trx_id,
r.trx_mysql_thread_id waiting_thread,
r.trx_query waiting_query,
b.trx_id blocking_trx_id,
b.trx_mysql_thread_id blocking_thread,
b.trx_query blocking_query
FROM information_schema.innodb_lock_waits w
INNER JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id
INNER JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id;
-- 终止查询
KILL process_id;
KILL QUERY process_id; -- 只终止查询,不断开连接
备份和恢复
# 备份数据库(SQL格式)
mysqldump -u root -p -h 127.0.0.1 -P 3306 database_name > backup.sql
# 备份所有数据库
mysqldump -u root -p -h 127.0.0.1 -P 3306 --all-databases > all_databases.sql
# 备份单个表
mysqldump -u root -p -h 127.0.0.1 -P 3306 database_name table_name > table_backup.sql
# 仅备份结构(不包含数据)
mysqldump -u root -p -h 127.0.0.1 -P 3306 --no-data database_name > schema.sql
# 仅备份数据(不包含结构)
mysqldump -u root -p -h 127.0.0.1 -P 3306 --no-create-info database_name > data.sql
# 备份并压缩
mysqldump -u root -p -h 127.0.0.1 -P 3306 database_name | gzip > backup.sql.gz
# 恢复数据库(从SQL文件)
mysql -u root -p -h 127.0.0.1 -P 3306 database_name < backup.sql
# 恢复压缩的备份
gunzip < backup.sql.gz | mysql -u root -p -h 127.0.0.1 -P 3306 database_name
# 备份时排除某些表
mysqldump -u root -p -h 127.0.0.1 -P 3306 database_name --ignore-table=database_name.table1 --ignore-table=database_name.table2 > backup.sql
# 备份时添加锁表选项
mysqldump -u root -p -h 127.0.0.1 -P 3306 --single-transaction --routines --triggers database_name > backup.sql
性能监控
-- 查看数据库连接数
SHOW STATUS LIKE 'Threads_connected';
SHOW STATUS LIKE 'Max_used_connections';
-- 查看最大连接数
SHOW VARIABLES LIKE 'max_connections';
-- 查看当前配置
SHOW VARIABLES;
-- 查看服务器状态
SHOW STATUS;
-- 查看 InnoDB 状态
SHOW ENGINE INNODB STATUS;
-- 查看表统计信息
SELECT
table_schema,
table_name,
table_rows,
ROUND(((data_length + index_length) / 1024 / 1024), 2) AS size_mb
FROM information_schema.tables
WHERE table_schema = 'database_name'
ORDER BY table_rows DESC;
-- 查看缓存命中率
SHOW STATUS LIKE 'Qcache%';
SHOW VARIABLES LIKE 'query_cache%';
-- 查看慢查询统计
SHOW STATUS LIKE 'Slow_queries';
-- 查看当前连接信息
SHOW STATUS LIKE 'Threads%';
-- 查看 InnoDB 缓冲池状态
SHOW STATUS LIKE 'Innodb_buffer_pool%';
-- 查看锁等待情况
SELECT
r.trx_id waiting_trx_id,
r.trx_mysql_thread_id waiting_thread,
TIMESTAMPDIFF(SECOND, r.trx_wait_started, NOW()) wait_time,
r.trx_query waiting_query,
l.lock_table,
l.lock_mode,
l.lock_type,
b.trx_id blocking_trx_id,
b.trx_mysql_thread_id blocking_thread,
b.trx_query blocking_query
FROM information_schema.innodb_lock_waits w
INNER JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id
INNER JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id
INNER JOIN information_schema.innodb_locks l ON l.lock_id = w.requested_lock_id;
维护操作
-- 分析表(更新统计信息)
ANALYZE TABLE table_name;
-- 优化表(整理碎片,回收空间)
OPTIMIZE TABLE table_name;
-- 检查表
CHECK TABLE table_name;
-- 修复表(仅 MyISAM)
REPAIR TABLE table_name;
-- 查看表碎片情况
SELECT
table_schema,
table_name,
ROUND(data_free / 1024 / 1024, 2) AS data_free_mb,
ROUND((data_length + index_length) / 1024 / 1024, 2) AS total_size_mb,
ROUND(data_free / (data_length + index_length) * 100, 2) AS fragmentation_percent
FROM information_schema.tables
WHERE table_schema = 'database_name'
AND data_free > 0
ORDER BY data_free DESC;
-- 刷新表缓存
FLUSH TABLES;
-- 刷新日志
FLUSH LOGS;
实用命令
-- 查看当前时间
SELECT NOW();
SELECT CURRENT_TIMESTAMP();
-- 查看时区
SELECT @@global.time_zone, @@session.time_zone;
SHOW VARIABLES LIKE '%time_zone%';
-- 设置时区
SET time_zone = '+08:00';
SET GLOBAL time_zone = '+08:00';
-- 查看当前用户
SELECT USER();
SELECT CURRENT_USER();
-- 查看当前数据库
SELECT DATABASE();
-- 查看 MySQL 版本
SELECT VERSION();
SHOW VARIABLES LIKE 'version%';
-- 查看服务器配置
SHOW VARIABLES LIKE 'datadir'; -- 数据目录
SHOW VARIABLES LIKE 'basedir'; -- 安装目录
-- 复制表结构
CREATE TABLE new_table LIKE old_table;
-- 复制表数据
INSERT INTO new_table SELECT * FROM old_table;
-- 复制表结构和数据
CREATE TABLE new_table AS SELECT * FROM old_table;
-- 查看自增 ID 当前值
SHOW TABLE STATUS WHERE Name = 'table_name';
SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_schema = 'database_name' AND table_name = 'table_name';
-- 重置自增 ID
ALTER TABLE table_name AUTO_INCREMENT = 1;
-- 查看字符集和排序规则
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
事务管理
-- 开启事务
START TRANSACTION;
BEGIN;
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;
-- 设置自动提交
SET autocommit = 0; -- 关闭自动提交
SET autocommit = 1; -- 开启自动提交
-- 查看事务隔离级别
SELECT @@transaction_isolation; -- MySQL 8.0+
SELECT @@tx_isolation; -- MySQL 5.7
-- 设置事务隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
-- 查看当前事务状态
SELECT * FROM information_schema.innodb_trx;
常用 mysql 命令
# 在 mysql 交互界面中
SHOW DATABASES; # 列出所有数据库
USE dbname; # 切换到数据库
SHOW TABLES; # 列出当前数据库的所有表
DESC table; # 显示表结构
SHOW CREATE TABLE table; # 显示建表语句
SHOW INDEX FROM table; # 显示索引
SHOW PROCESSLIST; # 显示当前连接
SHOW STATUS; # 显示服务器状态
SHOW VARIABLES; # 显示系统变量
SOURCE file.sql; # 执行 SQL 文件
\. file.sql # 执行 SQL 文件(另一种方式)
exit # 退出
quit # 退出
\q # 退出
\c # 清除当前输入
\G # 垂直显示结果
\g # 执行命令(等同于 ;)
\s # 显示状态信息
\T # 开始记录日志
\t # 停止记录日志
\W # 显示警告
\w # 不显示警告
导入/导出
-- 导出查询结果到文件(需要 FILE 权限)
SELECT * FROM table_name
INTO OUTFILE '/path/to/file.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
-- 从文件导入数据(需要 FILE 权限)
LOAD DATA INFILE '/path/to/file.csv'
INTO TABLE table_name
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS; -- 忽略第一行(标题行)
# 使用 mysql 命令导出 CSV
mysql -u root -p -h 127.0.0.1 -P 3306 database_name -e "SELECT * FROM table_name" > output.csv
# 使用 mysql 命令导出 CSV(带表头)
mysql -u root -p -h 127.0.0.1 -P 3306 database_name -e "SELECT * FROM table_name" | sed 's/\t/,/g' > output.csv
# 使用 mysql 命令导入 CSV
mysql -u root -p -h 127.0.0.1 -P 3306 database_name -e "LOAD DATA LOCAL INFILE '/path/to/file.csv' INTO TABLE table_name FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 ROWS"
日志管理
-- 查看日志相关配置
SHOW VARIABLES LIKE 'log%';
-- 查看二进制日志
SHOW BINARY LOGS;
SHOW MASTER STATUS;
-- 查看错误日志位置
SHOW VARIABLES LIKE 'log_error';
-- 查看慢查询日志配置
SHOW VARIABLES LIKE 'slow_query%';
SHOW VARIABLES LIKE 'long_query_time';
-- 启用慢查询日志
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2; -- 设置慢查询阈值(秒)
-- 查看通用查询日志
SHOW VARIABLES LIKE 'general_log%';
SET GLOBAL general_log = 'ON';
主从复制
-- 查看主从状态
SHOW MASTER STATUS;
SHOW SLAVE STATUS; -- MySQL 8.0+ 使用 SHOW REPLICA STATUS
-- 查看从库状态
SHOW REPLICA STATUS; -- MySQL 8.0+
SHOW SLAVE STATUS\G; -- MySQL 5.7
-- 停止从库复制
STOP SLAVE; -- MySQL 5.7
STOP REPLICA; -- MySQL 8.0+
-- 启动从库复制
START SLAVE; -- MySQL 5.7
START REPLICA; -- MySQL 8.0+
-- 跳过错误(谨慎使用)
SET GLOBAL sql_slave_skip_counter = 1; -- MySQL 5.7
SET GLOBAL sql_replica_skip_counter = 1; -- MySQL 8.0+