MySQL 数据库应用指南

本文不是讲“什么是 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
  • 可以登录但无法读写某个库

排查步骤:

  1. 确认用户主机匹配
  2. 确认密码正确
  3. 确认授权到正确数据库
  4. 确认是否需要 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,而是要能覆盖:

  • 登录和查看状态
  • 建库、建表、授权
  • 增删改查
  • 索引和执行计划
  • 备份与恢复
  • 排障和性能观察
本文地址: https://www.vvcms.cn/blog/mysql-guid
版权所有 © admin 未经授权不得转载

相关推荐