2017-05-14 94 views
6

請參閱下面的編輯,我將離開原始問題以幫助其他人。無法通過應用腳本(JDBC)連接到本地MySQL服務器

我試圖通過Apps腳本和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 [email protected]%           | 
+-------------------------------------------------------------+ 
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION | 
+-------------------------------------------------------------+ 
1 row in set (0.00 sec) 

我必須做別的事情揭露本地數據庫到互聯網/谷歌Apps腳本

編輯:

我現在能夠得到從MySQL日誌訪問被拒絕的說明(如Access denied for user 'root'@'12.123.12.123' (using password: YES) ),但該應用程序仍然無法連接。我嘗試添加bind-address與我的公共IP,但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:我改變了綁定地址= 0.0.0.0,這確實讓我在數據庫日誌獲取拒絕訪問錯誤,但仍然沒有運氣連接。我已成功連接到互聯網上的其他開放式MySQL數據庫(例如ensembldb.ensembl.org:3306),但我仍無法連接到本地數據庫。

+0

我覺得你有麻煩,因爲IP地址超出給定的IP範圍範圍列入白名單。有關其他信息,請參閱文檔 - [爲其他數據庫設置](https://developers.google.com/apps-script/guides/jdbc#setup_for_other_databases)。希望這可以幫助。 –

+0

@Mr。Rebot不應'root'@'%''允許所有IP地址? – howMuchCheeseIsTooMuchCheese

+1

請不要發佈您自己的服務器的公共IP,請請不要使用root帳戶連接到它!也不要將所有地址列入白名單,只有那些來自谷歌服務器的地址(遵循@Rebot先生的鏈接)。這可能會多一點工作,但你會更安全! – mTorres

回答

6

終於得到了它,這裏就是我得到了它的工作:

  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正在運行的設備和點擊添加) open port

  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) 
    
相關問題