努力
加油

Ubuntu服务器安装MySQL并配置远程访问的方法?

在 Ubuntu 上安装 MySQL 并开启远程访问,这几乎是每个后端开发者或运维人员都会遇到的“第一课”。虽然听起来简单,但坑不少,尤其是权限配置和防火墙拦截这块。

下面我按照生产环境的标准流程,给你梳理一套最稳妥的操作方案。我们默认使用当前主流的 MySQL 8.0 版本(Ubuntu 22.04/20.04 默认源通常包含此版本)。

第一步:安装 MySQL

不要自己去官网下载 deb 包折腾,直接用 apt 源最省心。

# 更新软件源索引
sudo apt update

# 安装 mysql-server
sudo apt install mysql-server -y

安装完成后,MySQL 服务通常会自动启动。你可以检查一下状态:

sudo systemctl status mysql

如果看到 active (running),说明服务正常。如果没有,手动启动一下:sudo systemctl start mysql。

注意:MySQL 8.0 默认采用 auth_socket 或 caching_sha2_password 认证插件。对于本地 root 用户,很多时候你不需要密码直接 sudo mysql 就能登录。但这不影响远程连接,远程连接我们需要专门创建用户。

第二步:配置允许远程访问(核心步骤)

很多新手装完 MySQL 发现连不上,90% 的原因在这里。Ubuntu 默认安装的 MySQL 监听的是 127.0.0.1(localhost),只允许本机访问。

1. 修改绑定地址

打开 MySQL 的配置文件。不同版本的 Ubuntu 路径可能略有差异,通常在 /etc/mysql/mysql.conf.d/mysqld.cnf。

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

找到 bind-address 这一行:

# 默认情况下是这样
bind-address = 127.0.0.1

将其修改为:

# 允许所有 IP 访问(如果你只想允许特定 IP,可以填那个 IP)
bind-address = 0.0.0.0

保存退出(Nano 编辑器按 Ctrl+O 回车保存,Ctrl+X 退出)。

2. 重启 MySQL 服务

修改配置后必须重启生效:

sudo systemctl restart mysql

3. 验证监听端口

你可以用 netstat 或 ss 命令看看 MySQL 是否在监听 3306 端口且绑定了 0.0.0.0:

sudo ss -tlnp | grep 3306

输出应该类似:
LISTEN 0 80 [::]:3306 [::]:* users:(("mysqld",pid=...,fd=...))
或者
LISTEN 0 80 0.0.0.0:3306 0.0.0.0:* ...

如果还是显示 127.0.0.1:3306,说明配置没改对,回去检查文件。

第三步:创建远程访问用户并授权

强烈建议不要直接使用 root 账号进行远程连接! 这是安全大忌。我们应该创建一个专用的数据库用户。

登录 MySQL:

sudo mysql

进入命令行界面后,执行以下 SQL 语句:

1. 创建新用户(假设用户名为 myuser,密码为 mypassword,允许从任意主机 % 连接)

-- MySQL 8.0 推荐使用 CREATE USER + GRANT 分离语法
CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypassword';

关于 '%' 的解释:这里表示允许该用户从任何 IP 地址连接。出于安全考虑,生产环境中最好替换为具体的客户端 IP,例如 '192.168.1.100'。

2. 授予权限

-- 授予所有数据库的所有权限(如果是开发测试环境,这样方便;生产环境请遵循最小权限原则)
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' WITH GRANT OPTION;

-- 刷新权限表,使立即生效
FLUSH PRIVILEGES;

3. 验证用户是否创建成功

SELECT user, host FROM mysql.user WHERE user='myuser';

你应该能看到一行记录:myuser | %

然后输入 exit 退出 MySQL 命令行。

第四步:配置防火墙(云服务器必看)

这一步经常被忽略。即使 MySQL 配置好了,如果云厂商的安全组或系统防火墙挡住了 3306 端口,你也连不上。

情况 A:如果你使用的是 Ubuntu 自带的 UFW 防火墙

查看状态:

sudo ufw status

如果处于 active 状态,需要放行 3306 端口:

# 推荐:只允许特定 IP 访问,更安全
sudo ufw allow from <你的客户端IP> to any port 3306

# 或者:开放所有 IP 访问(不推荐生产环境)
sudo ufw allow 3306/tcp

启用防火墙(如果未启用):

sudo ufw enable

情况 B:如果你使用的是阿里云、腾讯云、AWS 等云服务器

这一步至关重要! 云厂商的控制台里有一个“安全组”(Security Group)的概念,它是在网络层面隔离流量的。

  1. 登录云厂商控制台。
  2. 找到你的 ECS/CVM 实例所在的安全组。
  3. 添加一条入方向(Inbound)规则:
    • 协议:TCP
    • 端口范围:3306
    • 授权对象:0.0.0.0/0(测试用)或你的固定 IP
    • 策略:允许

如果不加这条规则,你在本地用 Navicat 或 DBeaver 连接时,会一直提示 Connection timed out 或 Network error,而不是 Access denied。

第五步:测试连接

在你的本地电脑(Windows/Mac/Linux)上使用数据库管理工具(如 Navicat, DBeaver, MySQL Workbench)或命令行尝试连接:

mysql -h <服务器公网IP> -P 3306 -u myuser -p

输入你设置的密码 mypassword。

如果成功进入 MySQL 命令行,说明整个链路打通了。


💡 常见避坑指南 & 最佳实践

  1. 字符集问题:
    默认安装的 MySQL 字符集可能是 utf8mb4,这是好的。但如果遇到中文乱码,建议在 /etc/mysql/mysql.conf.d/mysqld.cnf 的 [mysqld] 部分显式指定:

    character-set-server = utf8mb4
    collation-server = utf8mb4_unicode_ci

    修改后记得重启 MySQL。

  2. 最大连接数:
    高并发场景下,默认的 max_connections (通常是 151) 可能不够。可以在配置文件中调整:

    max_connections = 1000

    同时确保操作系统的文件描述符限制 (ulimit -n) 足够大,否则 MySQL 起不来或报错。

  3. 安全性提醒:

    • 永远不要在生产环境对公网开放 MySQL 的 3306 端口,除非你有极强的安全防护措施(如仅允许特定 IP、使用 SSH 隧道、或者通过应用层XX访问)。
    • 推荐使用 SSH 隧道 进行远程管理。即在本地建立 SSH 隧道映射到服务器的 3306 端口,这样无需开放公网端口,既安全又稳定。
      • 本地终端命令:ssh -L 3307:localhost:3306 user@server_ip
      • 然后本地连接 localhost:3307 即可,相当于直连服务器 MySQL。
  4. MySQL 8.0 的认证插件:
    有些旧的客户端工具(如老版 Navicat)可能不支持 MySQL 8 默认的 caching_sha2_password。如果遇到连接报错 Authentication plugin 'caching_sha2_password' cannot be loaded,可以将用户认证方式改回旧版:

    ALTER USER 'myuser'@'%' IDENTIFIED WITH mysql_native_password BY 'mypassword';
    FLUSH PRIVILEGES;

按照以上步骤操作,你就能得到一个可远程访问的 MySQL 服务了。如果有具体的报错信息,欢迎贴出来继续分析。