Linux

MySQL - 主機名問題

  • January 10, 2013

我的生產 mysql 伺服器遇到了一個不尋常的問題。目前我只有兩台生產伺服器,所以我/etc/hosts在每台伺服器的文件中都有所有伺服器主機名條目。幾天前,我設置了一個 DNS 區域,希望可以刪除 /etc/hosts文件中的手動條目。

由於我只有兩台生產伺服器,我設置了我的 DNS,以便每台伺服器都有一個真實的主機名,它也可以是別名,這樣我就可以通過簡單地更新 dns 記錄來控制連接。例如,server1 託管 httpd 和 mysql,因此在我的 DNS 區域中,server1 的 A 記錄為 4.4.4.2,store-ro 的別名為 server1。顯然 4.4.4.2 不是我的真實 ip,僅供參考。

經過一些配置後,我可以通過命令行連接到本地 mysql 實例,但我的應用程序不斷拋出Unknown MySQL server host 'store-ro'錯誤。我可以解決此問題的唯一方法是將以下內容添加回主機文件:

127.0.0.1 store-ro
# or
4.4.4.2 store-ro

(不確定是否重要,但我的應用程序正在使用 Zend_Db 連接到數據庫。)

因此,如果我輸入環回 ip 或實際 ip,應用程序可以連接到伺服器,但如果從 hosts 文件中刪除則無法正常工作,所以我認為這可能是 DNS 問題,但似乎伺服器可以解析主機名美好的:

$ -> nslookup store-ro

Server:   72.14.179.5
Address:  72.14.179.5#53

Non-authoritative answer:
store-ro.example.com    canonical name = server1.example.com.
Name:   server1.example.com
Address: 4.2.2.2

我確實啟用了 SELinux,粗略瀏覽一下相關的 httpd 連接設置似乎是正確的:

$ -> getsebool -a | ack httpd

httpd_can_network_connect_db --> on
httpd_can_network_connect --> on

另外,沒有條目顯示在/var/log/audit/audit.log.

我的主機名設置正確:

$ -> hostname

server1

MySQL 使用者權限:

mysql> select host, user from user;
+-----------+-------------+
| host      | user        |
+-----------+-------------+
| %         | ro_user_1   |
| %         | ro_user_2   |

並且/etc/resolve.conf

search example.com
nameserver 72.14.179.5
nameserver 72.14.188.5

並且/etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

4.4.4.2 server1 server1.example.com # This shouldn't be necessary with DNS setup?

我唯一能想到的是 cname 的別名是否可能導致問題,但我對此表示懷疑。任何幫助表示讚賞。

- 更新 -

忘記添加實際錯誤:SQLSTATE[HY000] [2005] Unknown MySQL server host 'store-ro'

這裡的每個請求是 mysql 表中的完整行:

mysql> select * from user where user like '%core%'\G
*************************** 1. row ***************************
Host: %
User: ro_ml_core
Password: *2B5FEA45B69826783FD6F8601A9AFB1CFE916D52
Select_priv: N
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Reload_priv: N
Shutdown_priv: N
Process_priv: N
File_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Show_db_priv: N
Super_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Execute_priv: N
Repl_slave_priv: N
Repl_client_priv: N
Create_view_priv: N
Show_view_priv: N
Create_routine_priv: N
Alter_routine_priv: N
Create_user_priv: N
Event_priv: N
Trigger_priv: N
Create_tablespace_priv: N
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin:
authentication_string: NULL
mysql> select User,Host from user where user like '%core%';
+------------+-----------+
| User       | Host      |
+------------+-----------+
| ro_ml_core | %         |
| ro_ml_core | localhost |
+------------+-----------+
2 rows in set (0.00 sec)

必須同時擁有 (%localhost) 帳戶ro_ml_core才能從任何地方連接ro_ml_core。如果沒有 localhost 帳戶,則在從 localhost 連接時,由 localhost 創建的匿名使用者帳戶 mysql_install_db將優先ro_ml_core。結果,ro_ml_core將被視為匿名使用者。原因是匿名使用者帳戶比帳戶具有更具體的主機列值'ro_ml_core'@'%',因此在使用者表排序順序中排在前面。

關於排序順序:

伺服器使用排序規則,首先對具有最特定主機值的行進行排序。文字主機名和 IP 地址是最具體的。(文字 IP 地址的特殊性不受它是否具有網路遮罩的影響,因此192.168.1.13192.168.1.0/255.255.255.0認為是同樣特殊的。)模式'%'意味著"any host"並且是最不特殊的。空字元串 ''也意味著"any host"但在 之後排序'%'。具有相同 Host 值的行首先按最具體的 User 值排序(空白 User 值表示"any user"最不具體)。

發生這種情況是因為在您的 resolv.conf 中您沒有

search foo.com

當 mysql 正在查找store-ro, 時foo.com不會附加到它。另一種方法是使用 fqdn。用於store-ro.foo.com連接。

手冊頁片段。resolv.conf(5)

搜尋 主機名查找的搜尋列表。搜尋列表一般由本地域名確定;預設情況下,它只包含本地域名。這可以通過在搜尋關鍵字之後列出所需的域搜尋路徑來更改,其中空格或製表符分隔名稱。解析器查詢中的點數少於 ndots(預設為 1)將依次嘗試使用搜尋路徑的每個組件,直到找到匹配項。對於具有多個子域的環境,請閱讀下面的選項 ndots:n 以避免中間人攻擊和 root-dns-servers 的不必要流量。請注意,如果列出的域的伺服器不是本地的,此過程可能會很慢並且會產生大量網路流量,並且如果其中一個域沒有可用的伺服器,則查詢將超時。

引用自:https://serverfault.com/questions/465626