如何设置数据库远程访问|本地连接线上数据库(权限开放教程)

发布时间:2026-07-23 17:42

许多开发者在将项目部署到服务器后,会遇到一个常见需求:希望在自己的本地电脑上,直接通过数据库管理工具(如Navicat、DBeaver、DataGrip)连接到线上服务器的数据库,以便快速调试数据或执行查询。但默认情况下,数据库为了安全考虑,只允许本机(localhost)访问。如果你直接尝试用服务器的公网IP去连接,通常会报错“Host ‘xxx’ is not allowed to connect to this MySQL server”。这篇教程将手把手教你如何安全地开放数据库的远程访问权限,让你能在本地顺利连接线上数据库。

### 前言介绍

本教程的核心目标是:让你从本地电脑成功连接到远程服务器上的MySQL或MariaDB数据库。我们将通过修改服务器端数据库的配置文件和用户权限来实现。整个过程分为三个主要阶段:首先登录服务器,修改数据库的绑定地址配置;然后进入数据库系统,为你的本地IP或所有IP授权访问权限;最后在本地测试连接并处理可能遇到的防火墙问题。整个流程预计耗时10-15分钟,适用于Linux服务器环境(如Ubuntu、CentOS),数据库版本为MySQL 5.7+或MariaDB 10.x+。

### 前置准备

在开始操作之前,请确保你已经具备以下条件:

1. **服务器SSH登录信息**:你需要拥有服务器的root权限或sudo权限,并且知道服务器的公网IP地址、SSH端口(默认22)、用户名和密码或密钥。

2. **数据库root账号密码**:你需要知道服务器上MySQL或MariaDB数据库的root用户密码。如果忘记,需要先通过SSH进入服务器重置。

3. **本地数据库客户端工具**:在你的本地电脑上安装好数据库管理工具,推荐使用Navicat、DBeaver或MySQL Workbench。

4. **本地公网IP地址**:如果你只想让特定的本地电脑连接,需要知道这台电脑的公网IP。可以在浏览器中搜索“IP”查看。如果不想限制IP,可以跳过这一步。

5. **服务器防火墙规则**:确认服务器上的防火墙(如iptables、firewalld或云服务商的安全组)是否放行了数据库端口(默认3306)。

### 分步操作步骤

#### 步骤1:登录服务器并修改数据库绑定地址

数据库默认只监听本地回环地址(127.0.0.1),导致外部无法访问。我们需要修改配置文件,让数据库监听所有网络接口。

1. 使用SSH客户端(如Terminal、Putty、Xshell)登录你的服务器。

```bash

ssh root@你的服务器公网IP

```

输入密码或使用密钥登录。

2. 找到MySQL或MariaDB的配置文件。通常位于`/etc/mysql/mysql.conf.d/mysqld.cnf`或`/etc/my.cnf`。使用vim或nano打开它。

```bash

# 对于MySQL 5.7+ / Ubuntu系统

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

# 对于CentOS / MariaDB 或老版本MySQL

sudo nano /etc/my.cnf

```

3. 在文件中找到`[mysqld]`部分,查找`bind-address`这一行。默认情况下,它被设置为`127.0.0.1`。将其修改为`0.0.0.0`,表示允许所有IP地址连接。如果这一行前面有`#`注释符,请去掉`#`。

```ini

[mysqld]

# 修改前:bind-address = 127.0.0.1

# 修改后:

bind-address = 0.0.0.0

```

**注意**:如果你只想让特定的IP连接,可以将`0.0.0.0`替换为那个具体的IP地址。但通常为了灵活性,设置为`0.0.0.0`,然后通过数据库用户权限来控制具体IP。

4. 保存文件并退出编辑器(在nano中按`Ctrl+X`,然后按`Y`确认,再按`Enter`)。

5. 重启数据库服务,使配置生效。

```bash

# 对于使用systemd的系统(Ubuntu 16+, CentOS 7+)

sudo systemctl restart mysql

# 或者

sudo systemctl restart mariadb

# 对于使用init.d的系统

sudo service mysql restart

```

#### 步骤2:创建或修改数据库用户并授权远程访问

仅仅修改绑定地址还不够,数据库用户默认也只有`localhost`的访问权限。我们需要为你的本地电脑IP创建一个专门的用户,或者修改现有用户,授予从任何主机或指定IP连接的权限。

1. 在SSH终端中,使用root用户登录MySQL数据库。

```bash

mysql -u root -p

```

系统会提示你输入数据库root密码。输入正确密码后,你会进入MySQL命令行界面(提示符变为`mysql>`)。

2. 首先,查看当前有哪些用户及其允许连接的主机。

```sql

SELECT user, host FROM mysql.user;

```

你会看到类似`root | localhost`的记录。我们需要添加一条`root | %`的记录(%表示所有主机),或者为你的本地IP创建专用用户。

3. **方法A(推荐):为你的本地IP创建专用用户**。这样更安全,只允许你指定的IP连接。

```sql

-- 创建一个新用户 'myuser',密码为 'mypassword',允许从 '你的本地公网IP' 连接

-- 请将 '你的本地公网IP' 替换为你电脑的真实公网IP,例如 '123.123.123.123'

-- 请将 'mypassword' 替换成一个强密码

CREATE USER 'myuser'@'你的本地公网IP' IDENTIFIED BY 'mypassword';

-- 授予该用户对 'your_database_name' 数据库的所有权限

-- 如果你想授予所有数据库的权限,可以将 'your_database_name.*' 替换为 '*.*'

GRANT ALL PRIVILEGES ON your_database_name.* TO 'myuser'@'你的本地公网IP';

-- 刷新权限,使设置立即生效

FLUSH PRIVILEGES;

```

**示例**:如果你的本地公网IP是`218.75.100.50`,你想操作数据库`testdb`,用户名为`devuser`,密码为`Dev@2024#`,则命令为:

```sql

CREATE USER 'devuser'@'218.75.100.50' IDENTIFIED BY 'Dev@2024#';

GRANT ALL PRIVILEGES ON testdb.* TO 'devuser'@'218.75.100.50';

FLUSH PRIVILEGES;

```

4. **方法B(快速但危险):直接修改root用户允许从任何主机连接**。此方法风险较高,不建议在生产环境中使用,仅用于测试环境。

```sql

-- 更新root用户,允许从任何主机连接(% 代表任意主机)

UPDATE mysql.user SET host = '%' WHERE user = 'root' AND host = 'localhost';

-- 或者直接授权(如果root用户已存在)

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '你的root密码' WITH GRANT OPTION;

-- 刷新权限

FLUSH PRIVILEGES;

```

5. 操作完成后,输入`exit`退出MySQL命令行。

#### 步骤3:配置服务器防火墙开放3306端口

即使数据库配置好了,如果服务器的防火墙(包括云服务商的安全组)阻止了3306端口的入站流量,你依然无法连接。

1. **检查云服务商安全组(非常重要)**:如果你使用的是阿里云、腾讯云、华为云、AWS等云服务器,必须登录到云服务商的控制台。

- 找到你的实例,进入“安全组”或“防火墙”设置。

- 添加入站规则:协议选择`TCP`,端口范围填写`3306`,授权对象填写`0.0.0.0/0`(允许所有IP)或`你的本地公网IP/32`(仅允许你的电脑)。建议填写你的本地IP,更安全。

2. **配置服务器内部防火墙**:以CentOS 7+的firewalld和Ubuntu的ufw为例。

- **CentOS 7+ (firewalld)**:

```bash

# 开放3306端口

sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent

# 重新加载防火墙规则

sudo firewall-cmd --reload

# 验证规则是否添加成功

sudo firewall-cmd --list-all

```

- **Ubuntu (ufw)**:

```bash

# 开放3306端口

sudo ufw allow 3306/tcp

# 重新加载防火墙

sudo ufw reload

# 查看状态

sudo ufw status

```

3. **检查iptables(如果使用)**:

```bash

# 查看当前规则

sudo iptables -L -n

# 如果发现3306端口被DROP,添加允许规则

sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT

# 保存规则(不同系统命令不同,CentOS使用service iptables save)

```

#### 步骤4:在本地测试远程连接

现在,你可以在本地电脑上使用数据库客户端工具进行连接测试了。

1. 打开你的数据库管理工具(以Navicat为例)。

2. 点击“连接” -> “MySQL”。

3. 在弹出的窗口中填写以下信息:

- **连接名**:随意填写,例如“线上数据库”。

- **主机名或IP地址**:填写你的**服务器公网IP**。

- **端口**:保持默认`3306`。

- **用户名**:填写你在步骤2中创建的用户名(例如`devuser`),或者`root`(如果你修改了root权限)。

- **密码**:填写对应的密码。

4. 点击“测试连接”。如果出现“连接成功”的提示,则大功告成。如果失败,请检查以下常见问题。

### 常见问题

**问题1:测试连接时提示“Can't connect to MySQL server on 'xxx.xxx.xxx.xxx' (10060)”**

- **原因**:通常是因为防火墙(云安全组或服务器内部防火墙)没有放行3306端口,或者MySQL服务没有正常运行。

- **解决**:

1. 在服务器上执行`sudo netstat -tlnp | grep 3306`,确认MySQL是否在监听`0.0.0.0:3306`。如果只显示`127.0.0.1:3306`,说明步骤1的`bind-address`没有配置成功,请重新检查配置文件并重启服务。

2. 检查云服务商安全组的入站规则,确保`3306`端口已添加。

3. 检查服务器内部防火墙是否已开放3306端口。

**问题2:测试连接时提示“Host 'your_local_ip' is not allowed to connect to this MySQL server”**

- **原因**:数据库用户权限没有配置正确,你的IP没有被授权。

- **解决**:

1. 重新进入MySQL命令行,执行`SELECT user, host FROM mysql.user;`,查看你的用户对应的`host`是什么。

2. 如果你是用`%`授权的,理论上任何IP都可以。如果依然报错,可能是你修改了`root`的`host`但未刷新权限。执行`FLUSH PRIVILEGES;`。

3. 如果你是用具体IP授权的,请确认你的本地公网IP是否发生了变化(例如重启了路由器)。如果变了,需要重新授权新的IP。

**问题3:连接成功,但看不到任何数据库?**

- **原因**:你当前登录的用户没有对任何数据库的访问权限,或者你只被授权了某个特定数据库。

- **解决**:在步骤2授权时,确认你使用了`GRANT ALL PRIVILEGES ON *.* TO ...`(所有数据库)还是`GRANT ALL PRIVILEGES ON 某库.* TO ...`。如果是后者,你需要在客户端工具中手动刷新或切换到该数据库。

**问题4:连接速度非常慢,甚至超时?**

- **原因**:MySQL默认会尝试反向DNS解析客户端的IP,如果DNS解析慢或失败,会导致连接延迟。

- **解决**:在MySQL配置文件`/etc/mysql/mysql.conf.d/mysqld.cnf`的`[mysqld]`部分添加一行`skip-name-resolve`,然后重启MySQL服务。注意:添加此配置后,用户授权时`host`字段必须使用IP地址或`%`,不能再使用域名。

### 收尾总结

至此,你已经成功完成了数据库远程访问的配置。我们通过三步核心操作实现了目标:修改`bind-address`让数据库监听所有网络接口,创建或修改数据库用户并授予从指定IP连接的权限,最后确保防火墙没有拦截3306端口。请务必牢记,开放数据库远程访问会带来安全风险,建议遵循最小权限原则:只授权需要的IP、只授予必要的数据库权限、使用强密码。操作完成后,如果不再需要远程访问,建议及时将配置改回`bind-address = 127.0.0.1`并删除远程用户,以降低被攻击的风险。现在,你可以愉快地在本地管理你的线上数据库了。