【问题标题】:Can not connect to local MySQL server thru Apps Script (JDBC)无法通过 Apps Script (JDBC) 连接到本地 MySQL 服务器
【发布时间】:2017-05-14 14:57:01
【问题描述】:

请参阅下面的修改,我将保留原始问题以帮助其他人。

我正在尝试通过 Apps Script 和 JDBC 连接到本地 MySQL 服务器,但我不断收到两个错误之一。这段代码:

function connectTest() {
  var conn = Jdbc.getConnection("jdbc:mysql://localhost", "root", "xxx");
}

给出Failed to establish a database connection. Check connection string, username and password.的错误

这段代码:

function connectTest() {
  var conn = Jdbc.getConnection("jdbc:mysql://localhost:3306", "xxx", "pass");
}

给出Invalid argument: url的错误。

我尝试了几十种组合,但都无法使用。从 Apps 脚本登录的尝试未显示在 MySQL 的访问日志中(即,如果我尝试使用错误信息在本地登录,我会看到 [Note] Access denied for user 'host'@'localhost' (using password: YES)。我已授予 root 适当的访问权限:

mysql> show grants for 'root'@'%';
+-------------------------------------------------------------+
| Grants for root@%                                           |
+-------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION |
+-------------------------------------------------------------+
1 row in set (0.00 sec)

我是否必须做其他事情才能将本地数据库暴露给互联网/Google Apps 脚本?

编辑:

我现在能够从 MySQL 日志(例如 Access denied for user 'root'@'12.123.12.123' (using password: YES))中获得拒绝访问的说明,但应用程序仍然无法连接。我尝试用我的公共 IP 添加bind-address,但 MySQL 无法启动,我得到 ([ERROR] Can't start server: Bind on TCP/IP port: Can't assign requested address)

function connectTest() {
  var conn = Jdbc.getConnection("jdbc:mysql://12.123.12.123:3306", "root", "xxx");
}

EDIT2:我更改了 bind-address=0.0.0.0 并且确实允许我在数据库日志中获得拒绝访问错误,但仍然没有运气连接。我已成功连接到 Internet 上其他开放的 MySQL 数据库(例如 ensembldb.ensembl.org:3306),但我仍然无法连接到我的本地数据库。

【问题讨论】:

  • 我认为您遇到了问题,因为 IP 地址超出了要列入白名单的给定 IP 范围。有关更多信息,请参阅文档 - Setup for other databases。希望这会有所帮助。
  • @Mr.Rebot 不应该 'root'@'%' 允许所有 IP 地址吗?
  • 请不要贴出自己服务器的公网IP,请不要用root账号连接!也不要将所有地址列入白名单'%',而仅将来自谷歌服务器的地址列入白名单(关注@Mr.Rebot 的链接)。这可能需要更多的工作,但你会更安全!
  • @mTorres 这不是我的 IP,只是 12 和 123。
  • 是的......我很傻。抱歉打扰了。

标签: mysql jdbc google-apps-script localhost


【解决方案1】:

终于搞定了,下面是我的工作方式:

  1. 用 my.cnf 编辑(这个文件可以位于几个不同的地方,甚至可能不存在,我把我的放在这里/usr/local/etc/

    [mysqld]
    bind-address=0.0.0.0
    skip-host-cache
    skip-name-resolve
    
  2. 打开端口 3306 到互联网(对于 Xfinity,这意味着转到 http://10.0.0.1/ > 点击左侧的“高级”>“端口转发”>底部的“添加设备”,找到运行 MySQL 的设备并点击添加)

  3. 在 MySQL 和 FLUSH PRIVILEGES; 中授予适当的权限。您可以使用GRANT ALL PRIVILEGES ON *.* TO <USER>@'%' IDENTIFIED BY '<PASSWORD>' 执行此操作,但这允许任何 IP,下面的 Python 脚本将授予 Google IP。您应该对照 Google 的 JDBC 文档检查此 IP 列表。

    from sqlalchemy import create_engine, MetaData
    
    conString = 'mysql+pymysql://<USER>:<PASSWORD>@localhost:3306/<DB>'
    mysql = create_engine(conString)
    
    ips = ['64.18.0.0 - 64.18.15.255',
    '64.233.160.0 - 64.233.191.255',
    '66.102.0.0 - 66.102.15.255',
    '66.249.80.0 - 66.249.95.255',
    '72.14.192.0 - 72.14.255.255',
    '74.125.0.0 - 74.125.255.255',
    '173.194.0.0 - 173.194.255.255',
    '207.126.144.0 - 207.126.159.255',
    '209.85.128.0 - 209.85.255.255',
    '216.239.32.0 - 216.239.63.255']
    
    for ip in ips:
        ip2 = ip.replace(' - ', '/')
        try:
            sql = "CREATE USER '<USER>'@'" + ip2 + "' identified by '<PASSWORD>';"
            mysql.execute(sql)
        except:
            print ip2
        sql = "GRANT ALL PRIVILEGES ON <DB>.* TO '<USER>'@'" + ip2 + "';"
        mysql.execute(sql)
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-12
    • 2019-07-03
    • 2017-01-21
    • 2013-03-04
    • 2020-11-14
    • 2017-10-07
    • 2013-02-17
    相关资源
    最近更新 更多