2012年11月15日 星期四

遠端存取 MySQL

預設的情況下 root 帳號是沒有辦法從遠端登入存取 MySQL 資料庫。

平常開發網頁程式,大多是在伺服器本機端使用帳號密碼登入做處理,所以比較不會有甚麼問題,但是因為自己需要用到 Android 透過 JDBC 遠端登入 MySQL 伺服器的需求,結果出現了錯誤訊息。


先以 root 身分登入 MySQL 伺服器:


# mysql -u root -p


新增一個遠端 ( % ) 使用者 admin 密碼為 pw1234,並且設定權限給它,我這裡只開放 db 這個資料庫底下所有的資料表 ( db.* ) 的所有權限(ALL)給這個使用者使用:


mysql> CREATE USER 'admin'@'%' IDENTIFIED BY 'pw1234';

mysql> GRANT ALL PRIVILEGES ON db.* TO 'admin'@'%';
mysql> FLUSH PRIVILEGES;



--

要注意的是,我們這裡只有設定給遠端登入專用的使用者 admin,如果我們使用 admin 帳號在本機端登入,是看不到任何資料庫的,而且任何操作都是 Access denied(拒絕存取)

若有需要在本機端也進行操作,那就必須將以上指令為「%」的地方修改為 localhost,然後再重複執行以上指令。



mysql> CREATE USER 'admin'@'localhost' IDENTIFIED BY 'pw1234';

mysql> GRANT ALL PRIVILEGES ON db.* TO 'admin'@'localhost';
mysql> FLUSH PRIVILEGES;
--

最後,我們還要設定一下防火牆的設定,把 MySQL 再使用的連接埠 3306 打開給外面的連線進來使用:


# vi /etc/sysconfig/iptables

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

新增上面對 3306 連接埠的監聽的那一行,然後重新啟動防火牆:
# /etc/init.d/iptables restart

這樣就可以從外部連入 MySQL 了!可以使用 WorkBench 或者其他遠端軟體登入試試看吧!

3 則留言:

  1. mysql> CREATE USER 'admin'localhost'%' IDENTIFIED BY 'pw1234';
    mysql> GRANT ALL PRIVILEGES ON db.* TO 'admin'@'localhost';
    mysql> FLUSH PRIVILEGES;

    若有需要在本機端也進行操作,那就必須將以上指令為「%」的地方修改為 localhost,然後再重複執行以上指令。

    此語法是否有錯
    CREATE USER 'admin'localhost'%' IDENTIFIED BY 'pw1234';
    謝謝
    mail:taikey.taiwan@msa.hinet.net

    回覆刪除
    回覆
    1. 不好意思,最近比較忙沒沒有上來看到留言。
      應該是 CREATE USER 'admin'@'localhost' IDENTIFIED BY 'pw1234';
      感謝回報^^

      刪除
  2. 好好的文章 ,謝謝 la

    回覆刪除