MySQL – 主机名问题

我正在遇到我的生产MySQL服务器的一个不寻常的问题。 目前我只有两台生产服务器,所以我在每台服务器上的/etc/hosts文件中都有所有的服务器主机名。 几天前,我设置了一个DNS区域,希望能删除/etc/hosts文件中的手动条目。

由于我只有两台生产服务器,所以我安装了DNS,这样每台服务器都有一个真实的主机名,这个主机名也可以是别名,这样我就可以通过更新DNSlogging来控制连接。 例如,server1托pipehttpd和mysql,所以在我的DNS区域中,server1的Alogging是4.4.4.2,而store-ro的是server1的别名。 4.4.4.2显然不是我的真实IP,只是说明性的。

经过一些configuration,我可以通过命令行连接到本地mysql实例,但是我的应用程序一直在抛出Unknown MySQL server host 'store-ro'错误。 我可以解决这个问题的唯一方法是如果我将以下内容添加回主机文件:

 127.0.0.1 store-ro # or 4.4.4.2 store-ro 

(不知道是否重要,但我的应用程序正在使用Zend_Db连接到数据库。)

所以应用程序可以连接到服务器,如果我input回环IP或实际IP,但不会工作,如果从主机文件中删除,所以我想也许这是一个DNS问题,但似乎服务器可以parsing主机名精细:

 $ -> 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的别名可能导致问题,但我怀疑它。 任何帮助表示赞赏。

–Update–

忘了添加实际的错误: 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) 

必须让ro_ml_core%localhost )帐户都能够从ro_ml_core任何位置进行连接。 如果没有本地主机帐户,当由本地主机连接ro_ml_core时,由mysql_install_db创build的localhost的匿名用户帐户将优先。 因此, ro_ml_core将被视为匿名用户。 原因是匿名用户帐户具有比'ro_ml_core'@'%'帐户更具体的主机列值,因此在用户表sorting顺序中更早。

关于sorting顺序:

服务器使用sorting规则,首先排列具有最特定主机值的行。 文字主机名和IP地址是最具体的。 (文字IP地址的特异性不受它是否有networking掩码的影响,所以192.168.1.13192.168.1.0/255.255.255.0被认为同样具体。)模式'%'表示"any host"并且是最不具体的。 空string''也意味着"any host"但在'%'之后sorting。 具有相同主机值的行首先与最具体的用户值sorting(空白用户值意味着"any user"并且是最不具体的)。

这是因为你的resolv.conf中没有

search foo.com

当mysql正在查找store-rofoo.com不会附加到它。 另一种方法是使用fqdn。 使用store-ro.foo.com进行连接。

Manpage的片段。 resolv.conf(5)

search主机名称查找的search列表。 search列表通常由本地域名确定; 默认情况下,它只包含本地域名。 这可以通过在search关键字之后用空格或制表符分隔名称来列出所需的域searchpath来改变。 parsing器查询中有less于ndots点(默认值为1)的查询会依次使用searchpath的每个组件,直到find匹配。 对于具有多个子域的环境,请阅读下面的选项ndots:n以避免man-in-the-the-middle攻击和root-dns-servers的不必要通信。 请注意,如果列出的域的服务器不是本地的,那么这个过程可能会很慢,并且会产生大量的networkingstream量,如果其中一个域没有可用的服务器,则查询将超时。 search列表目前仅限于六个域,总共有256个字符。

所以我终于能够通过应用程序连接到MySQL服务器。 实施Suku的build议后,我重新启动了MySQL服务,但仍然没有工作。 所以我想我会重新启动httpd服务,中提琴应用程序能够再次连接。 看来,如果我删除/ etc / hosts中的条目,而不重新启动httpd服务,它有连接问题,但如果我删除条目,并重新启动它的作品。 即使将条目添加回/ etc / hosts也不起作用,直到我重新启动httpd。