菜鸟科技网

如何远程执行MySQL命令?

权限和网络

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

如何远程执行MySQL命令?-图1
(图片来源网络,侵删)
  1. 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'@'%';

    如何远程执行MySQL命令?-图2
    (图片来源网络,侵删)

    -- 刷新权限使更改生效 FLUSH PRIVILEGES;

  2. 网络防火墙开放 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命令?-图3
(图片来源网络,侵删)
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 (方法四) 是一个非常稳健和强大的选择。
分享:
扫描分享到社交APP
上一篇
下一篇