# MySQL 常用命令 ## 连接数据库 ```bash # 查看版本 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 ``` ## 数据库管理 ```sql -- 列出所有数据库 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; ``` ## 用户和权限管理 ```sql -- 列出所有用户 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; ``` ## 表管理 ```sql -- 列出所有表 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; ``` ## 索引管理 ```sql -- 列出所有索引 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 ```sql 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 ``` ## 查询和分析 ```sql -- 查看执行计划 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; -- 只终止查询,不断开连接 ``` ## 备份和恢复 ```bash # 备份数据库(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 ``` ## 性能监控 ```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; ``` ## 维护操作 ```sql -- 分析表(更新统计信息) 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; ``` ## 实用命令 ```sql -- 查看当前时间 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%'; ``` ## 事务管理 ```sql -- 开启事务 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 命令 ```bash # 在 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 # 不显示警告 ``` ## 导入/导出 ```sql -- 导出查询结果到文件(需要 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; -- 忽略第一行(标题行) ``` ```bash # 使用 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" ``` ## 日志管理 ```sql -- 查看日志相关配置 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'; ``` ## 主从复制 ```sql -- 查看主从状态 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+ ```