MySQL 创建数据库与用户授权教程:新建库、赋予权限、远程连接配置与常见问题

适用场景与准备工作

无论是给 WordPress、Discuz 等建站程序配置数据库,还是新项目上线、开发同事需要远程连库排查数据,第一步都是在 MySQL 里创建数据库、创建用户并完成授权。很多新手图省事直接用 root 账号连接,不仅密码泄露风险大,误操作时也没有挽回余地。本文以 CentOS/Ubuntu 上常见的 MySQL 5.7/8.0 为例,完整演示从建库、建用户、授权到开放远程访问的全过程,并附常见报错的解决办法。

开始前请确认:你拥有服务器的 root 或 sudo 权限,知道 MySQL root 密码;操作属于线上环境时,建议先在测试库演练一遍。授权和远程访问配置会直接影响数据安全,切忌把生产库权限随意开放给他人。

第一步:登录 MySQL 并创建数据库

通过 SSH 登录服务器后,使用 root 账号进入 MySQL 命令行:

mysql -u root -p

输入密码后看到 mysql> 提示符即登录成功。建议先执行 SELECT VERSION(); 确认版本,MySQL 8.0 与 5.7 在用户创建的认证方式上略有差异,下文会分别说明。

创建数据库时务必指定字符集为 utf8mb4,否则 emoji 字符和部分生僻字无法存储:

CREATE DATABASE myblog DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

执行后用 SHOW DATABASES; 可以看到新建的库。数据库名建议只用小写字母、数字和下划线,避免使用连字符,否则授权语句需要加反引号,平添麻烦。

第二步:创建用户并授权

MySQL 的账号由"用户名@主机"两部分组成,主机部分决定了这个账号能从哪些地址连接。如果只给本机程序使用,创建 localhost 账号最安全:

CREATE USER 'myblog'@'localhost' IDENTIFIED BY '你的强密码';

MySQL 8.0 默认使用 caching_sha2_password 认证插件,部分旧版客户端(如老版本 Navicat、低版本 PHP 的 mysql 扩展)可能连不上,可指定旧版认证方式:

CREATE USER 'myblog'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的强密码';

接着给该用户授予目标数据库的权限。生产环境按需授权,只给这个库、只给必要的操作:

GRANT ALL PRIVILEGES ON myblog.* TO 'myblog'@'localhost';
FLUSH PRIVILEGES;

如果遵循最小权限原则,只给网站程序需要的增删改查,可以把 ALL PRIVILEGES 换成 SELECT, INSERT, UPDATE, DELETE。授权完成后用 SHOW GRANTS FOR 'myblog'@'localhost'; 核对权限列表,确认与预期一致。

MySQL 数据库服务器与数据存储
数据库账号权限应按最小化原则分配

第三步:开放远程访问

默认情况下 MySQL 只监听 127.0.0.1,外部无法连接,需要改两处:创建通配主机账号,并修改绑定地址。先创建一个允许任意来源连接的用户(% 表示任意 IP):

CREATE USER 'myblog'@'%' IDENTIFIED BY '你的强密码';
GRANT ALL PRIVILEGES ON myblog.* TO 'myblog'@'%';
FLUSH PRIVILEGES;

% 通配符意味着任何能到达 3306 端口的人都可以尝试登录,密码强度就是最后一道防线。如果对方 IP 固定,建议把 % 换成具体 IP,例如 'myblog'@'123.45.67.89',安全性高得多。

然后修改 MySQL 的绑定地址。Ubuntu/Debian 系统编辑 /etc/mysql/mysql.conf.d/mysqld.cnf,CentOS 编辑 /etc/my.cnf,找到 bind-address 一行:

[mysqld]
bind-address = 0.0.0.0

保存后执行 systemctl restart mysqld(Ubuntu 上服务名为 mysql,即 systemctl restart mysql)重启服务。注意:重启数据库会短暂中断线上连接,请选择业务低峰期操作,并提前确认没有长事务在执行。

最后在防火墙放行 3306 端口。CentOS 使用 firewalld:

firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload

Ubuntu 使用 ufw,建议只放行指定来源 IP 而不是全网开放:

ufw allow from 123.45.67.89 to any port 3306

如果服务器在阿里云、腾讯云等云平台,别忘了在控制台安全组里同步放行 3306,只改系统防火墙是不够的。

第四步:验证连接

在服务器本机测试远程路径(用 127.0.0.1 而非 localhost,可强制走 TCP 协议):

mysql -h 127.0.0.1 -P 3306 -u myblog -p

再在另一台机器上测试真实远程连接:

mysql -h 服务器公网IP -u myblog -p

连接成功后可以用 SHOW DATABASES; 确认该账号只能看到自己的库,再用 SHOW GRANTS FOR 'myblog'@'%'; 核对远程账号权限。如果只想先确认网络层是否畅通,也可以用 telnet 服务器IP 3306 或 nc -zv 服务器IP 3306 测试端口,连通之后再排查账号权限问题。

常见问题

1. 提示 ERROR 1045 (28000): Access denied for user?多数是密码错误或主机不匹配。注意 'myblog'@'localhost' 和 'myblog'@'%' 是两个独立账号,本地登录不会自动用到远程账号。可以执行 SELECT user, host FROM mysql.user; 查看账号实际创建到了哪个主机范围上。

2. 提示 ERROR 1130: Host is not allowed to connect?说明该用户没有对应主机范围的账号,或 MySQL 仍只监听 127.0.0.1。检查是否创建了 '%' 账号、bind-address 是否改为 0.0.0.0,以及配置修改后是否真正重启了服务。

3. 授权后权限不生效?确认数据库名和用户名没有拼写错误(MySQL 的数据库名在部分系统上区分大小写),授权后执行 FLUSH PRIVILEGES。另外 GRANT ON myblog.* 只对该库生效,若程序还要访问其他库,需要补充授权。

4. 能远程连接但看不到业务库?用 SHOW GRANTS 检查授权对象的库名是否拼写正确,或是否连错了账号。权限只对授权时指定的库生效,后新建的库同样需要再次授权。

安全建议与总结

本文完整走了一遍 MySQL 建库、建用户、授权和开放远程访问的流程:创建数据库时选 utf8mb4 字符集,账号按"用户名@主机"精确控制来源,权限遵循最小化原则,远程访问只开放必要 IP 并及时收敛。日常还有几个习惯值得保持:不要给网站程序使用 root 账号;密码定期更换;项目下线后用 DROP USER 'myblog'@'%'; 清理账号;有条件的数据库不要直接暴露公网,通过 SSH 隧道或内网访问更稳妥。

如果你在操作中遇到本文未覆盖的报错,建议先查看 MySQL 错误日志(常见路径为 /var/log/mysql/error.log,或用 journalctl -u mysqld 查看)定位原因,再对照官方文档处理,不要盲目修改配置。数据库权限管理宁严勿宽,前期多花五分钟核对,胜过事后补救。

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容