MySQL 基础操作:数据库初始化、用户授权与连接排查

3549 字
MySQL 基础操作:数据库初始化、用户授权与连接排查

MySQL 是常见的关系型数据库。很多 Web 系统、管理后台、业务平台都会把用户、订单、配置、日志索引等结构化数据存放在 MySQL 中。

在服务器部署场景中,MySQL 的基础操作通常围绕几个问题展开:

数据库服务是否运行
能否登录数据库
业务库是否创建
业务用户是否存在
用户权限是否正确
初始化 SQL 是否导入
后端服务能否连接数据库

本文整理 MySQL 的基础使用方法,重点放在初始化、授权、导入导出和连接排查。

MySQL、数据库、表和用户#

先区分几个概念:

概念含义
MySQL Server数据库服务进程
Database数据库,一个项目通常对应一个或多个库
Table表,用来保存具体数据
User数据库用户,用来控制访问权限
Privilege权限,例如查询、写入、建表、删除

可以简单理解为:

MySQL Server
└── database
└── table
└── row

部署业务系统时,通常不要直接使用 root 用户给应用连接数据库,而是创建一个专用业务用户,只授权它访问指定数据库。

登录 MySQL#

使用 root 用户登录:

Terminal window
mysql -u root -p

参数含义:

参数含义
-u root指定用户名为 root
-p使用密码登录

执行后会提示输入密码。密码输入时通常不会显示字符,这是正常现象。

登录成功后会进入 MySQL 命令行:

mysql>

退出 MySQL:

exit;

或者:

quit;

查看已有数据库和用户#

查看数据库:

SHOW DATABASES;

切换数据库:

USE app_db;

查看当前数据库中的表:

SHOW TABLES;

查看用户:

SELECT user, host FROM mysql.user;

user 表示用户名,host 表示允许从哪里连接。

常见 host 写法:

host含义
localhost只允许本机连接
%允许任意主机连接
192.168.1.%允许指定网段连接

如果后端服务和 MySQL 在同一台服务器,可以优先使用 localhost。如果后端和数据库分开部署,则需要根据实际网络设置 host

创建数据库#

创建数据库:

CREATE DATABASE app_db;

推荐指定字符集:

CREATE DATABASE app_db
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_unicode_ci;

utf8mb4utf8 更完整,可以保存 emoji 和更多 Unicode 字符。

查看数据库创建语句:

SHOW CREATE DATABASE app_db;

删除数据库:

DROP DATABASE app_db;

删除数据库会清空其中所有表和数据,执行前必须确认是否有备份。

创建业务用户#

创建用户:

CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'StrongPassword';

如果需要允许远程连接:

CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongPassword';

实际生产环境不建议随意使用 %,除非已经通过防火墙、安全组或内网访问做了限制。

修改用户密码:

ALTER USER 'app_user'@'localhost' IDENTIFIED BY 'NewPassword';

删除用户:

DROP USER 'app_user'@'localhost';

授权与刷新权限#

给用户授权访问指定数据库:

GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'localhost';

刷新权限:

FLUSH PRIVILEGES;

查看用户权限:

SHOW GRANTS FOR 'app_user'@'localhost';

如果只需要基本读写权限,可以更细一些:

GRANT SELECT, INSERT, UPDATE, DELETE
ON app_db.*
TO 'app_user'@'localhost';

常见权限含义:

权限作用
SELECT查询数据
INSERT插入数据
UPDATE更新数据
DELETE删除数据
CREATE创建表
DROP删除表
ALTER修改表结构
INDEX创建索引

开发环境可以临时使用较宽权限,正式环境应按应用需要收紧权限。

导入 SQL 文件#

很多系统会提供初始化 SQL,用于创建表结构和基础数据。

导入 SQL:

Terminal window
mysql -u app_user -p app_db < init.sql

含义是:

用 app_user 登录
把 init.sql 导入 app_db 数据库

如果 SQL 文件中已经包含 CREATE DATABASEUSE database,也可以不指定数据库:

Terminal window
mysql -u root -p < init.sql

导入后进入数据库检查:

USE app_db;
SHOW TABLES;

如果导入失败,常见原因包括:

  • 数据库不存在;
  • 用户没有建表权限;
  • SQL 文件编码异常;
  • SQL 文件中使用了当前 MySQL 不支持的语法;
  • 表已经存在,重复导入冲突。

导出 SQL 备份#

导出整个数据库:

Terminal window
mysqldump -u root -p app_db > app_db.sql

导出时带上时间更容易管理:

Terminal window
mysqldump -u root -p app_db > app_db_2026-07-29.sql

只导出表结构,不导出数据:

Terminal window
mysqldump -u root -p --no-data app_db > app_db_schema.sql

只导出数据,不导出建表语句:

Terminal window
mysqldump -u root -p --no-create-info app_db > app_db_data.sql

备份文件可以压缩:

Terminal window
gzip app_db_2026-07-29.sql

恢复压缩备份时:

Terminal window
gunzip app_db_2026-07-29.sql.gz
mysql -u root -p app_db < app_db_2026-07-29.sql

查看连接与监听端口#

查看 MySQL 服务状态:

Terminal window
systemctl status mysql

有些系统服务名可能是:

Terminal window
systemctl status mysqld

查看端口监听:

Terminal window
ss -lntp | grep 3306

MySQL 默认端口是:

3306

如果后端连接数据库失败,先确认:

MySQL 服务是否运行
3306 是否监听
后端配置中的 host 是否正确
用户名密码是否正确
用户 host 是否允许当前来源连接

常见连接配置#

后端项目里常见的数据库配置类似:

spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/app_db?useUnicode=true&characterEncoding=utf8
username: app_user
password: StrongPassword

或者 .env

DB_HOST=127.0.0.1
DB_PORT=3306
DB_NAME=app_db
DB_USER=app_user
DB_PASSWORD=StrongPassword

需要重点检查:

配置项检查内容
Host数据库地址是否正确
Port端口是否正确,默认 3306
Database数据库是否存在
Username用户是否存在
Password密码是否正确
Charset字符集是否符合项目要求

如果后端和 MySQL 在同一个 Docker Compose 网络中,数据库地址通常不是 127.0.0.1,而是服务名,例如:

DB_HOST=mysql

这是因为容器里的 127.0.0.1 指向容器自身,不是宿主机,也不是另一个数据库容器。

SQL 在 MySQL 中的大致执行过程#

一条查询语句进入 MySQL 后,不是直接去磁盘里找数据。它通常会经过几个步骤:

客户端连接
连接器校验账号和权限
解析 SQL 语法
优化器选择执行方案
执行器调用存储引擎读取数据
返回查询结果

例如:

SELECT id, username
FROM users
WHERE username = 'tiancheng';

排查 SQL 问题时,可以从几个角度判断:

问题可能位置
登录失败连接器、账号、密码、host 权限
SQL 语法错误解析阶段
查询很慢索引、执行计划、数据量、锁等待
没有权限用户授权
数据不一致事务、隔离级别、提交状态

这也是为什么排查数据库问题不能只看一条报错,而要同时看账号、权限、表结构、索引和 SQL 写法。

存储引擎与 InnoDB#

MySQL 支持不同存储引擎。实际使用中最常见的是 InnoDB

查看表使用的存储引擎:

SHOW TABLE STATUS FROM app_demo LIKE 'users'\G

也可以查看建表语句:

SHOW CREATE TABLE users\G

常见存储引擎对比:

存储引擎特点
InnoDB支持事务、行级锁、崩溃恢复,是 MySQL 常用默认引擎
MyISAM不支持事务,历史项目中可能会见到
Memory数据放在内存中,服务重启后数据会丢失

新项目一般优先使用 InnoDB。如果遇到老系统,需要留意表是否仍在使用 MyISAM,因为它在事务和并发控制方面与 InnoDB 不同。

索引的基础作用#

索引可以理解为数据库为某些字段建立的“查找目录”。没有索引时,MySQL 可能需要从头到尾扫描整张表;有合适索引时,可以更快定位数据。

查看表索引:

SHOW INDEX FROM users;

username 字段创建索引:

CREATE INDEX idx_users_username ON users(username);

再次查看:

SHOW INDEX FROM users;

删除索引:

DROP INDEX idx_users_username ON users;

常见索引类型:

索引说明
主键索引PRIMARY KEY,每张表通常有一个
普通索引加快查询,没有唯一性限制
唯一索引加快查询,同时要求字段值不能重复
联合索引多个字段组合成一个索引

索引不是越多越好。索引会提高查询速度,但也会增加写入成本,因为插入、更新、删除数据时,索引也要维护。

使用 EXPLAIN 查看查询计划#

判断 SQL 是否用到索引,可以使用 EXPLAIN

EXPLAIN SELECT id, username
FROM users
WHERE username = 'tiancheng';

常看几个字段:

字段含义
type访问类型,通常越接近 constref 越好
key实际使用的索引
rows预计扫描的行数
Extra额外信息,例如是否使用临时表、文件排序

如果 keyNULL,通常说明没有使用索引。此时要检查:

查询条件字段是否有索引
SQL 写法是否导致索引失效
数据量是否已经大到需要优化

常见导致索引效果变差的写法包括:

WHERE username LIKE '%cheng';
WHERE LOWER(username) = 'tiancheng';

第一种前面带 %,索引很难从开头定位;第二种对字段使用函数,也可能导致索引无法正常利用。

事务的基本概念#

事务用于保证一组数据库操作要么全部成功,要么全部失败。典型场景是转账、下单、库存扣减等。

手动开启事务:

START TRANSACTION;

执行修改:

UPDATE users
SET email = 'new@example.com'
WHERE username = 'tiancheng';

确认提交:

COMMIT;

如果发现操作有问题,可以回滚:

ROLLBACK;

事务有四个常见特性,通常称为 ACID:

特性含义
Atomicity原子性,一组操作要么都成功,要么都失败
Consistency一致性,事务前后数据规则保持正确
Isolation隔离性,并发事务之间互相隔离
Durability持久性,提交后的数据应该持久保存

排查数据异常时,要确认修改是否真的执行了 COMMIT。如果事务没有提交,另一个连接可能看不到这次修改。

事务隔离级别#

多个连接同时操作数据库时,事务之间可能互相影响。MySQL 通过隔离级别控制这种影响。

查看当前隔离级别:

SELECT @@transaction_isolation;

MySQL 常见隔离级别:

隔离级别特点
READ UNCOMMITTED可以读到未提交数据,较少使用
READ COMMITTED只能读到已提交数据
REPEATABLE READMySQL InnoDB 默认隔离级别,同一事务内多次读取结果相对稳定
SERIALIZABLE隔离最强,并发能力最低

如果遇到“一个连接改了数据,另一个连接暂时看不到”的情况,不一定是数据没写入,也可能和事务是否提交、隔离级别有关。

MySQL 常见日志#

MySQL 排查问题时经常会接触几类日志:

日志作用
Error Log记录 MySQL 启动、停止、崩溃、严重错误
Slow Query Log记录执行较慢的 SQL
General Log记录客户端执行过的 SQL,通常不长期打开
Binary Log记录数据变更,可用于主从复制和数据恢复
Redo LogInnoDB 用于崩溃恢复
Undo Log用于事务回滚和一致性读

查看日志相关配置:

SHOW VARIABLES LIKE 'log_error';
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';
SHOW VARIABLES LIKE 'log_bin';

如果要排查慢 SQL,可以关注慢查询日志是否开启:

SHOW VARIABLES LIKE 'slow_query_log';

如果结果是 OFF,说明当前没有记录慢查询日志。实际环境是否开启,需要根据性能、磁盘和排查需求决定。

锁等待与正在执行的 SQL#

当 SQL 卡住不返回时,可能不是数据库宕机,而是出现锁等待或长事务。

查看当前连接:

SHOW PROCESSLIST;

常见关注字段:

字段含义
Id连接 ID
User当前连接用户
Host来源地址
db当前数据库
Command当前命令
Time当前状态持续时间
State当前状态
Info正在执行的 SQL

如果看到某条 SQL 执行时间很长,需要结合业务情况判断是否可以终止。终止连接可以使用:

KILL 连接ID;

生产环境不要随意 KILL,需要先确认这条 SQL 是否属于关键业务操作。

常见报错与排查#

Access denied#

报错类似:

Access denied for user 'app_user'@'localhost'

常见原因:

  • 密码错误;
  • 用户不存在;
  • 用户存在但 host 不匹配;
  • 用户没有对应数据库权限。

排查命令:

SELECT user, host FROM mysql.user;
SHOW GRANTS FOR 'app_user'@'localhost';

Unknown database#

报错类似:

Unknown database 'app_db'

表示数据库不存在或名称写错。

检查:

SHOW DATABASES;

这类报错通常说明后端无法连接到 MySQL。

常见原因:

  • MySQL 没启动;
  • 数据库地址写错;
  • 端口不通;
  • 防火墙或安全组未放行;
  • Docker 网络配置错误;
  • MySQL 只监听本地地址。

排查:

Terminal window
systemctl status mysql
ss -lntp | grep 3306

如果是远程连接,还需要从后端所在机器测试端口:

Terminal window
nc -vz 数据库IP 3306

Table already exists#

导入 SQL 时可能出现:

Table 'users' already exists

说明表已经存在,重复执行建表语句。

处理方式取决于场景:

  • 如果是全新初始化,可以先清空数据库;
  • 如果是已有数据环境,不应随意删除表;
  • 如果只是导入数据,需要确认 SQL 是否包含重复建表语句。

推荐初始化流程#

部署新系统时,可以按这个顺序处理 MySQL:

1. 确认 MySQL 服务正在运行
2. 登录 root 用户
3. 创建业务数据库
4. 创建业务用户
5. 授权业务用户访问指定数据库
6. 导入初始化 SQL
7. 检查表是否创建成功
8. 修改后端数据库连接配置
9. 启动后端服务
10. 查看后端日志确认连接是否成功

对应命令示例:

CREATE DATABASE app_db
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_unicode_ci;
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'StrongPassword';
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'localhost';
FLUSH PRIVILEGES;

导入:

Terminal window
mysql -u app_user -p app_db < init.sql

验证:

USE app_db;
SHOW TABLES;

总结#

MySQL 基础操作可以归纳为五件事:

建库
建用户
授权
导入导出
连接排查

数据库问题排查时,不要只看后端报错,而要同时检查:

MySQL 服务状态
端口监听
数据库是否存在
用户是否存在
用户 host 是否匹配
用户权限是否正确
后端连接配置是否正确

对于多数 Web 系统来说,MySQL 是否配置正确,直接决定后端服务能否正常启动和处理业务请求。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

MySQL 基础操作:数据库初始化、用户授权与连接排查
https://tiancheng-blog.com/posts/mysql-basic-deployment-and-troubleshooting/
作者
TianCheng
发布于
2026-07-29
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
TianCheng
Hello, I'm TianCheng.
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
分类
标签
站点统计
文章
15
分类
6
标签
44
总字数
37,448
运行时长
0
最后活动
0 天前
站点信息
部署平台
Tencent Cloud Lighthouse
主题版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录