适用场景与准备工作
无论是给 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 只监听 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 查看)定位原因,再对照官方文档处理,不要盲目修改配置。数据库权限管理宁严勿宽,前期多花五分钟核对,胜过事后补救。












暂无评论内容