MySQL遠端訪問時,非常慢,甚至出現連不上的情況

dbasdk發表於2014-09-25

MySQL遠端訪問時,非常慢,甚至出現連不上的情況


許可權已賦,防火牆等已關閉

解決方法,my.cnf裡面新增
[mysqld]
skip-name-resolve

skip-name-resolve 
選項就能禁用DNS解析,連線速度會快很多。不過,這樣的話就不能在MySQL的授權表中使用主機名了而只能用ip格式。

還有許可權的問題,當使用者設定限制只能訪問某個資料庫,如果這個資料庫被刪了,再重建這個指定資料庫,限制使用者還是不能訪問這個資料,大概是刪除資料庫的時間,把該使用者的訪問許可權也級聯刪除了,詳細可以檢視mysql.db的記錄

若使用–skip-grant-tables系統將對任何使用者的訪問不做任何訪問控制,但可以用 mysqladmin flush-privileges或mysqladmin reload來開啟訪問控制;預設情況是show databases語句對所有使用者開放,

如果mysql伺服器沒有開遠端帳戶,就在my.cnf裡面加上skip-grant-tables

 
實在不行:直接關閉系統的dns服務chkconfig name off

排除網路問題........

就MySQL本身而言,問題出在在mysql dns反解析

mysql>show processlist;

| 20681949 | unauthenticated user | 10.10.4.193:52497 | NULL | Connect |        | Reading from net                 | NULL                                                                                                 | 
| 20681948 | unauthenticated user | 10.10.4.193:52495 | NULL | Connect |        | Reading from net                 | NULL

發現有非常多的 unauthenticated user 嘗試做登入使用 mysql 的情況 ,當這種情況無限制發生時就會造成系統十分緩慢。

查閱mysql官方網站得知,這屬於官方一個系統上的特殊設定,就把他當成mysql的一個bug算了
不管連結的的方式是經過 hosts 或是 IP 的模式,他都會對 DNS 做反查 
mysqld 會嘗試去反查 IP -> dns ,由於反查解析過慢,就會無法應付過量的查詢。

 

解決辦法:

/usr/local/mysql/bin/mysqld_safe --skip-name-resolve --user=mysql&

加 --skip-name-resolve 這麼一個引數就可以,關閉mysql的dns反查功能。

或者修改mysql配置檔案。

編輯/etc/my.cnf

在[mysqld]段中加入

skip-name-resolve

重啟mysql

 

/etc/my.cnf 的配置檔案中加入如下一句,禁用DNS反響解析,就能大大加快MySQL連線的速度。
[mysqld]

下面加上這句
skip-name-resolve

#注意有些文章中寫道加入–skip-name-resolve,經驗證,在CentOS5下加入–skip-name-resolve會導致mysql守護程式無法啟動。估計在其他linux系統下是一樣的,windows下沒有測試,skip-name-resolve應該就可以。

附錄:( How MySQL uses DNS )

When a new thread connects to mysqld, mysqld will spawn a new thread to handle the request. This thread will first check if the hostname is in the hostname cache. If not the thread will call gethostbyaddr_r() and gethostbyname_r() to resolve the hostname.

If the operating system doesn’t support the above thread-safe calls, the thread will lock a mutex and call gethostbyaddr() and gethostbyname() instead. Note that in this case no other thread can resolve other hostnames that is not in the hostname cache until the first thread is ready.

You can disable DNS host lookup by starting mysqld with –skip-name-resolve. In this case you can however only use IP names in the MySQL privilege tables.

If you have a very slow DNS and many hosts, you can get more performance by either disabling DNS lookop with –skip-name-resolve or by increasing the HOST_CACHE_SIZE define (default: 128) and recompile mysqld.

You can disable the hostname cache with –skip-host-cache. You can clear the hostname cache with FLUSH HOSTS or mysqladmin flush-hosts.

If you don’t want to allow connections over TCP/IP, you can do this by starting mysqld with –skip-networking.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29734436/viewspace-1280688/,如需轉載,請註明出處,否則將追究法律責任。

相關文章