权限和网络
无论使用哪种方法,要成功远程执行 MySQL 命令,都必须满足以下两个核心条件:

-
MySQL 服务器允许远程连接:
- 登录到 MySQL 服务器所在的主机。
- 执行以下 SQL 命令,为你的用户授予从任何主机(或特定 IP)连接的权限。注意:在生产环境中,不要轻易使用 ,应该指定具体的客户端 IP 地址以提高安全性。
-- 创建一个允许从任何 IP 连接的用户 'remote_user',密码为 'your_password' CREATE USER 'remote_user'@'%' IDENTIFIED BY 'your_password';
-- 或者,只允许从特定 IP (192.168.1.100) 连接 CREATE USER 'remote_user'@'192.168.1.100' IDENTIFIED BY 'your_password';
-- 授予该用户对所有数据库的所有权限 (GRANT ALL PRIVILEGES) GRANT ALL PRIVILEGES ON TO 'remote_user'@'%';
-- 或者,更安全的做法是只授予特定数据库的权限 GRANT ALL PRIVILEGES ON
your_database.* TO 'remote_user'@'%';
(图片来源网络,侵删)-- 刷新权限使更改生效 FLUSH PRIVILEGES;
-
网络防火墙开放 MySQL 端口:
- MySQL 默认使用
3306端口。 - 你需要在 MySQL 服务器上配置防火墙(如
ufw,firewalld,iptables或云服务商的安全组),允许来自客户端 IP 地址的3306端入连接。 - Ubuntu (ufw):
sudo ufw allow from <客户端IP地址> to any port 3306
- CentOS/RHEL (firewalld):
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="<客户端IP地址>" port protocol="tcp" port="3306" accept' sudo firewall-cmd --reload
- MySQL 默认使用
使用 mysql 命令行客户端(基础方法)
这是最直接、最原始的方法,你需要一个 MySQL 客户端(比如你自己的电脑上已经安装了 MySQL),然后通过命令行连接到远程服务器。
命令格式:

mysql -h <远程服务器IP> -P <端口号> -u <用户名> -p -e "<SQL语句>"
-h(host): MySQL 服务器的 IP 地址或域名。-P(Port): MySQL 服务器的端口号,默认是3306。注意是大写 P。-u(user): 连接使用的用户名。-p(password): 提示输入密码,为了安全,不要在命令行中直接写密码,而是在执行后手动输入。-e(execute): 执行指定的 SQL 语句,执行完后客户端会自动退出。
示例:
假设远程服务器 IP 是 168.1.10,用户是 remote_user,密码是 your_password,你想查询 test_db 库中的 users 表。
# 连接并执行查询 mysql -h 192.168.1.10 -P 3306 -u remote_user -p -e "SELECT * FROM test_db.users LIMIT 5;" # 系统会提示你输入密码: # Enter password: # 输入正确密码后,会直接显示查询结果,然后命令行退出。
优点:
- 简单直接,无需额外安装复杂工具。
- 所有安装了 MySQL 客户端的系统都支持。
缺点:
- 交互性差,不适合复杂的、多步骤的数据库操作。
- 在自动化脚本中,每次都需要手动输入密码,不够方便(虽然可以通过配置
.my.cnf文件来解决)。
使用 mysql -e 结合 SSH(安全推荐)
这是强烈推荐的远程执行方式,尤其是在生产环境中,它不需要直接开放 MySQL 的 3306 端口到公网,而是通过 SSH 隧道进行连接,安全性极高。
原理: 你首先通过 SSH 登录到 MySQL 服务器,然后在那个服务器内部执行 mysql 命令,由于是本地执行,所以不受防火墙限制,也更安全。
命令格式:
ssh <用户名>@<远程服务器IP> "mysql -u <mysql用户名> -p -e \"<SQL语句>\""
示例:
假设你的 SSH 登录用户是 ssh_user,MySQL 用户是 remote_user。
# 通过 SSH 连接到服务器,并在服务器上执行 MySQL 命令 ssh ssh_user@192.168.1.10 "mysql -u remote_user -p -e \"SELECT * FROM test_db.users LIMIT 5;\"" # 同样,系统会提示你输入 SSH 密码(或使用 SSH 密钥免密登录), # 然后提示你输入 MySQL 的密码。
优点:
- 安全性极高:无需开放 MySQL 的
3306端口,只需要开放 SSH 的22端口。 - 利用 SSH 密钥:可以配置 SSH 免密登录,使整个过程完全自动化,非常适合在脚本中使用。
- 灵活:可以结合任何在服务器上可用的工具。
缺点:
- 需要客户端有 SSH 客户端,并且知道服务器的 SSH 登录凭据。
使用 MySQL Shell(现代、功能强大)
MySQL Shell 是 Oracle 官方推出的下一代客户端和编程 API,支持 JavaScript 和 Python,功能非常强大,是 mysql 命令行的现代化替代品。
安装: 通常需要单独安装,或者集成在 MySQL 产品包中。
连接并执行:
MySQL Shell 的连接语法与 mysql 客户端类似。
# 连接到远程服务器 mysqlsh -h <远程服务器IP> -P <端口号> -u <用户名> -p
连接成功后,你会进入一个交互式 shell(如 JS> 或 py> 模式)。
在交互式 Shell 中执行:
// JS> 模式下 \sql // 切换到 SQL 模式 SELECT * FROM test_db.users LIMIT 5; \ // 执行命令 // 或者直接执行单条语句 \sql SELECT COUNT(*) FROM test_db.users;
非交互式执行(在命令行中直接执行):
mysqlsh -h 192.168.1.10 -P 3306 -u remote_user -p --execute "SELECT * FROM test_db.users LIMIT 5;"
优点:
- 功能丰富,支持 SQL, JavaScript, Python。
- 提供了更友好的开发体验和强大的 API。
- 支持会话管理和工作模式切换。
缺点:
- 需要额外安装 MySQL Shell。
使用编程语言(自动化首选)
在自动化脚本、应用程序或 CI/CD 流程中,最常见的方式是使用编程语言来连接和执行 MySQL 命令。
这里以 Python 为例,使用 mysql-connector-python 库。
安装库:
pip install mysql-connector-python
编写 Python 脚本 (query_remote.py):
import mysql.connector
from mysql.connector import Error
def query_remote_mysql():
try:
# 建立数据库连接
# 注意:如果通过 SSH 隧道,连接 host 会是 '127.0.0.1',并且需要配置 SSH 端口转发
connection = mysql.connector.connect(
host='192.168.1.10', # MySQL 服务器 IP
database='test_db',
user='remote_user',
password='your_password'
)
if connection.is_connected():
db_info = connection.get_server_info()
print(f"成功连接到 MySQL 服务器,版本: {db_info}")
cursor = connection.cursor(dictionary=True) # dictionary=True 可以让结果以字典形式返回
# 执行 SQL 查询
cursor.execute("SELECT * FROM users LIMIT 5;")
# 获取所有查询结果
records = cursor.fetchall()
print("查询结果:")
for row in records:
print(row)
except Error as e:
print(f"连接或查询 MySQL 时出错: {e}")
finally:
# 关闭连接
if 'connection' in locals() and connection.is_connected():
cursor.close()
connection.close()
print("MySQL 连接已关闭")
if __name__ == "__main__":
query_remote_mysql()
优点:
- 自动化和集成:完美融入各种应用程序和自动化流程。
- 逻辑处理:可以轻松地对查询结果进行复杂的处理和业务逻辑判断。
- 灵活性和可扩展性:代码结构清晰,易于维护和扩展。
缺点:
- 需要编写代码,对非程序员不友好。
总结与推荐
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
mysql -e |
简单、无需额外安装 | 交互性差,安全性依赖网络 | 快速、临时的单次查询或简单操作 |
mysql -e + SSH |
安全性极高、适合自动化 | 需要 SSH 访问权限 | 生产环境、自动化脚本、安全要求高的场景 |
| MySQL Shell | 功能强大、现代化 | 需要额外安装 | 开发者、需要复杂脚本和 API 的场景 |
| 编程语言 | 自动化首选、灵活、可扩展 | 需要编写代码 | 应用程序集成、CI/CD、复杂的自动化任务 |
给你的建议:
- 日常临时查询:使用 方法一 (
mysql -e)。 - 生产环境或自动化脚本:强烈推荐方法二 (
mysql -e+ SSH),因为它最安全。 - 开发新功能或复杂脚本:使用 方法三 (MySQL Shell) 或 方法四 (编程语言),对于长期维护的项目,Python (方法四) 是一个非常稳健和强大的选择。
