本文不是讲“什么是 MySQL”,而是整理一份在 Linux服务器 环境里真正能用的 MySQL 命令应用指南。重点放在日常开发、运维、排障、导入导出和权限管理上,尽量覆盖你在真实项目里会反复用到的命令。
说明:
- 这里的命令对 MariaDB 也大多适用,因为二者在客户端和 SQL 层面高度兼容
- 具体版本在 MySQL 8.0 和较新的 MariaDB 之间会有少量差异,尤其是权限、认证和系统表相关命令
- 如果你是在 Debian 上装的是 default-mysql-server,实际服务端很可能是 MariaDB,但日常 SQL 用法基本一致
适用场景
- 连接数据库并执行 SQL
- 创建数据库和账号
- 查询、修改、删除数据
- 导入和导出数据
- 查看表结构、索引和状态
- 排查连接、权限和性能问题
常用客户端命令
登录数据库
mysql -u root -p如果连接的是本机默认实例,也可以:
sudo mysql指定主机和端口:
mysql -h 127.0.0.1 -P 3306 -u root -p指定数据库:
mysql -u appuser -p appdb查看版本
mysql --version进入客户端后查看服务器版本:
SELECT VERSION();基础交互命令
进入 mysql 交互界面后,最常用的是这些:
SHOW DATABASES;
SHOW TABLES;
SHOW CREATE TABLE users;
DESCRIBE users;
EXPLAIN SELECT * FROM users WHERE id = 1;
STATUS;
SELECT VERSION();
SELECT DATABASE();退出客户端:
EXIT;数据库管理
创建数据库
CREATE DATABASE appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;查看数据库
SHOW DATABASES;切换数据库
USE appdb;删除数据库
DROP DATABASE appdb;注意:
- DROP DATABASE 会直接删除整个库及其中所有表,操作不可逆
- 生产环境执行前必须确认备份
用户与权限
创建用户
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'StrongPasswordHere';授权
给某个库的全部权限:
GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost';只授予常见写入权限:
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'appuser'@'localhost';刷新权限
FLUSH PRIVILEGES;查看授权
SHOW GRANTS FOR 'appuser'@'localhost';撤销权限
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'appuser'@'localhost';删除用户
DROP USER 'appuser'@'localhost';重要原则
- 不要长期用 root 跑业务
- 用户主机名要写清楚,'user'@'localhost' 和 'user'@'%' 不是一回事
- 生产环境尽量按最小权限授权
表结构操作
创建表示例
CREATE TABLE users (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
username VARCHAR(64) NOT NULL,
email VARCHAR(128) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uk_username (username),
UNIQUE KEY uk_email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;查看表结构
DESCRIBE users;
SHOW CREATE TABLE users\G修改表
添加列:
ALTER TABLE users ADD COLUMN status TINYINT NOT NULL DEFAULT 1;修改列类型:
ALTER TABLE users MODIFY COLUMN username VARCHAR(128) NOT NULL;重命名列:
ALTER TABLE users CHANGE COLUMN username login_name VARCHAR(128) NOT NULL;删除列:
ALTER TABLE users DROP COLUMN status;删除表
DROP TABLE users;基础增删改查
插入数据
INSERT INTO users (username, email) VALUES ('alice', 'alice@example.com');查询数据
SELECT * FROM users;
SELECT id, username FROM users WHERE id = 1;
SELECT * FROM users ORDER BY id DESC LIMIT 10;更新数据
UPDATE users SET email = 'new@example.com' WHERE id = 1;删除数据
DELETE FROM users WHERE id = 1;事务控制
START TRANSACTION;
UPDATE users SET email = 'a@example.com' WHERE id = 1;
INSERT INTO audit_log(action) VALUES ('update user');
COMMIT;回滚:
ROLLBACK;说明:
- 只有支持事务的引擎才真正有用,通常用 InnoDB
- 涉及多表一致性更新时,优先使用事务
查询分析
EXPLAIN
EXPLAIN SELECT * FROM users WHERE email = 'alice@example.com';EXPLAIN 用来查看查询计划,是排查慢查询的第一步。
查看索引
SHOW INDEX FROM users;创建索引
CREATE INDEX idx_users_email ON users(email);删除索引
DROP INDEX idx_users_email ON users;常见优化原则
- 经常出现在 WHERE、JOIN、ORDER BY 的列值得优先考虑索引
- 不要盲目给每一列都加索引
- 低选择性字段通常不适合单独建索引
导入导出
导出单个数据库
mysqldump -u root -p appdb > appdb.sql压缩导出:
mysqldump -u root -p appdb | gzip > appdb.sql.gz导入数据库
mysql -u root -p appdb < appdb.sql如果是压缩文件:
gunzip < appdb.sql.gz | mysql -u root -p appdb导出单表
mysqldump -u root -p appdb users > users.sql只导出结构不导出数据
mysqldump -u root -p --no-data appdb > schema.sql只导出数据不导出结构
mysqldump -u root -p --no-create-info appdb > data.sql导出多表或多库
mysqldump -u root -p appdb users orders > subset.sql
mysqldump -u root -p --databases appdb otherdb > multi.sql导入大文件建议
大文件导入时,优先确认:
- max_allowed_packet
- 字符集是否一致
- 服务端是否允许足够的连接时长
字符集与排序规则
建议新库新表默认使用:
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci查看当前字符集:
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';为什么要注意字符集:
- utf8mb4 才能完整支持 emoji 和更完整的 Unicode
- 只用 utf8 容易在四字节字符上出问题
账户登录排查
查看当前登录用户
SELECT CURRENT_USER();
SELECT USER();查看权限不足
常见表现:
- Access denied
- permission denied
- 可以登录但无法读写某个库
排查步骤:
- 确认用户主机匹配
- 确认密码正确
- 确认授权到正确数据库
- 确认是否需要 FLUSH PRIVILEGES
性能与状态
查看连接数
SHOW STATUS LIKE 'Threads_connected';
SHOW STATUS LIKE 'Connections';查看慢查询相关变量
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';查看当前运行中的线程
SHOW PROCESSLIST;如果需要更完整的情况:
SHOW FULL PROCESSLIST;查看服务器变量
SHOW VARIABLES LIKE 'max_connections';
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';常见运维命令
在服务器层面,你经常会配合这些命令:
sudo systemctl status mysql
sudo systemctl status mariadb
sudo journalctl -u mysql -xe
sudo journalctl -u mariadb -xe
mysqladmin -u root -p status
mysqladmin -u root -p processlist说明:
- 你的服务名可能是 mysql,也可能是 mariadb
- Debian 上常见是 MariaDB,因此服务名通常是 mariadb
常见问题
1. 连不上数据库
按顺序检查:
- 数据库服务是否启动
- 端口是否正确
- 用户名和密码是否正确
- 远程主机是否被允许
- 防火墙和安全组是否放行
2. Access denied
常见原因:
- 用户主机不匹配,例如只允许 'appuser'@'localhost'
- 密码错误
- 没有授权到目标库
3. 导入失败
常见原因:
- SQL 文件编码不一致
- 表已存在
- 字段长度或类型不兼容
- max_allowed_packet 太小
4. 中文乱码
优先检查:
- 数据库字符集
- 表字符集
- 客户端连接字符集
常见连接前设置:
SET NAMES utf8mb4;5. 查询很慢
先看:
- 是否有合适索引
- EXPLAIN 是否走索引
- 是否存在全表扫描
- 是否用了不合理的 LIKE '%xxx'
最小可用操作流程
如果你只是想快速完成一次数据库操作,常见顺序如下:
mysql -u root -p然后在客户端里执行:
CREATE DATABASE appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'StrongPasswordHere';
GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost';
FLUSH PRIVILEGES;
USE appdb;
CREATE TABLE users (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
username VARCHAR(64) NOT NULL,
email VARCHAR(128) NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO users (username, email) VALUES ('alice', 'alice@example.com');
SELECT * FROM users;结论
真正好用的 MySQL 命令集,不只是会 mysql -u root -p,而是要能覆盖:
- 登录和查看状态
- 建库、建表、授权
- 增删改查
- 索引和执行计划
- 备份与恢复
- 排障和性能观察