解決本地鏈接外部MySQL數(shù)據(jù)庫(kù)時(shí)慢的問(wèn)題

2022-07-08    分類: 網(wǎng)站建設(shè)

服務(wù)器放在局域網(wǎng)內(nèi)進(jìn)行測(cè)試時(shí),MySQL數(shù)據(jù)庫(kù)的訪問(wèn)速度還是很快。但當(dāng)服務(wù)器托管放到IDC數(shù)據(jù)中心機(jī)房時(shí)要訪問(wèn)外網(wǎng)后,MySQL數(shù)據(jù)庫(kù)的訪問(wèn)速度就變得非常慢。

后來(lái)在問(wèn)下了網(wǎng)絡(luò)運(yùn)維的老同事,給出了解決方法。在MySQL配置文件中my.cnf里面添加
[mysqld]
skip-name-resolve    #跳過(guò)名稱解析
skip-grant-tables      #跳過(guò)授權(quán)表

這樣速度就快了

skip-name-resolve

選項(xiàng)就能禁用DNS解析,連接速度會(huì)快很多。不過(guò),這樣的話就不能在MySQL的授權(quán)表中使用主機(jī)名了而只能用ip格式。

還有權(quán)限的問(wèn)題,當(dāng)用戶設(shè)置限制只能訪問(wèn)某個(gè)數(shù)據(jù)庫(kù),如果這個(gè)數(shù)據(jù)庫(kù)被刪了,再重建這個(gè)指定數(shù)據(jù)庫(kù),限制用戶還是不能訪問(wèn)這個(gè)數(shù)據(jù),大概是刪除數(shù)據(jù)庫(kù)的時(shí)間,把該用戶的訪問(wèn)權(quán)限也級(jí)聯(lián)刪除了,詳細(xì)可以查看mysql.db的記錄

若使用–skip-grant-tables系統(tǒng)將對(duì)任何用戶的訪問(wèn)不做任何訪問(wèn)控制,但可以用 mysqladmin flush-privileges或mysqladmin reload來(lái)開(kāi)啟訪問(wèn)控制;默認(rèn)情況是show databases語(yǔ)句對(duì)所有用戶開(kāi)放。

如果mysql服務(wù)器沒(méi)有開(kāi)遠(yuǎn)程帳戶,就在my.cnf里面加上skip-grant-tables

排除網(wǎng)絡(luò)問(wèn)題。

就MySQL本身而言,問(wèn)題出在在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

發(fā)現(xiàn)有非常多的 unauthenticated user 嘗試做登入使用 mysql 的情況 ,當(dāng)這種情況無(wú)限制發(fā)生時(shí)就會(huì)造成系統(tǒng)十分緩慢。

查閱mysql官方網(wǎng)站得知,這屬于官方一個(gè)系統(tǒng)上的特殊設(shè)定,就把他當(dāng)成mysql的一個(gè)bug算了,不管鏈接的的方式是經(jīng)過(guò) hosts 或是 IP 的模式,他都會(huì)對(duì) DNS 做反查。mysqld 會(huì)嘗試去反查 IP -> dns ,由于反查解析過(guò)慢,就會(huì)無(wú)法應(yīng)付過(guò)量的查詢。

解決辦法:

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

加 --skip-name-resolve 這么一個(gè)參數(shù)就可以,關(guān)閉mysql的dns反查功能。

或者修改mysql配置文件。

編輯/etc/my.cnf

在[mysqld]段中加入

skip-name-resolve

重啟mysql

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

下面加上這句
skip-name-resolve

#注意有些文章中寫(xiě)道加入–skip-name-resolve,經(jīng)驗(yàn)證,在CentOS5下加入–skip-name-resolve會(huì)導(dǎo)致mysql守護(hù)進(jìn)程無(wú)法啟動(dòng)。估計(jì)在其他linux系統(tǒng)下是一樣的,windows下沒(méi)有測(cè)試,skip-name-resolve應(yīng)該就可以。

**************************************

問(wèn)題現(xiàn)象是這樣的:

我在一臺(tái)機(jī)器上(61.183.23.23)啟動(dòng)了一個(gè)mysql,然后開(kāi)通一個(gè)賬號(hào)可以從127.0.0.1或者從61.183.23.23訪問(wèn)。但是遇到一個(gè)問(wèn)題就是使用下面兩個(gè)命令行訪問(wèn)的時(shí)候,速度差別非常大:

mysql –h 127.0.0.1 –u user
mysql –h 61.183.23.23 –u user

然后我使用ping,判斷兩個(gè)IP的速度差不多。

使用127.0.0.1的IP速度比另一個(gè)快太多了。雖然說(shuō)這里的61.183.23.23需要去外網(wǎng)走一圈,但是速度差別怎么會(huì)差這么多。

解決辦法:

mysql使用skip-name-resolve禁止掉DNS的查詢。
mysql會(huì)在用戶登錄過(guò)程中對(duì)客戶端IP進(jìn)行DNS反查,不管你是使用IP登錄還是域名登錄,這個(gè)反查的過(guò)程都是在的。所以如果你的mysql所在的服務(wù)器的DNS有問(wèn)題或者質(zhì)量不好,那么就有可能造成我遇到的這個(gè)問(wèn)題,DNS解析出現(xiàn)問(wèn)題。

修改mysql配置文件

[mysqld]
skip-name-resolve

補(bǔ)充:

做個(gè)提醒,增加skip-name-resolve有可能導(dǎo)致賬號(hào)失效,比如我原先的賬號(hào)是yejianfeng@localhost,然后其實(shí)我使用mysql -h127.0.0.1 -uyejianfeng 是可以登錄的。但是一旦加上了skip-name-resolve,就不能登錄的了。需要加上賬號(hào)yejianfeng@127.0.0.1

官方解釋信息如下:

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.

翻譯

MySQL如何使用DNS

當(dāng)一個(gè)線程連接到mysqld,mysqld將產(chǎn)生新的線程來(lái)處理請(qǐng)求。這個(gè)帖子會(huì)先檢查你的名字是在服務(wù)器緩存。如果沒(méi)有線程將調(diào)用gethostbyaddr_r()和gethostbyname_r()來(lái)解析主機(jī)名。

如果操作系統(tǒng)不支持上述線程安全調(diào)用,螺紋鎖互斥調(diào)用()和gethostbyname()相反。請(qǐng)注意,在這種情況下,沒(méi)有其他線程可以解決其他主機(jī)不在服務(wù)器緩存直到第一個(gè)線程已經(jīng)準(zhǔn)備好。

你可以從–跳過(guò)名字mysqld解決禁用DNS主機(jī)查找。在這種情況下,您只能在MySQL特權(quán)表中使用IP名稱。

如果你有一個(gè)非常緩慢的DNS和許多主機(jī),你可以獲得更多的性能通過(guò)禁用DNS名稱解析lookop與–跳過(guò)或增加host_cache_size定義(默認(rèn)值:128)和編譯mysqld。

您可以禁用服務(wù)器與–跳過(guò)主機(jī)緩存。你可以用沖洗主機(jī)或mysqladmin沖洗主機(jī)清除服務(wù)器緩存。

如果你不想讓連接在TCP / IP,你可以通過(guò)從–跳過(guò)網(wǎng)絡(luò)mysqld。

網(wǎng)站標(biāo)題:解決本地鏈接外部MySQL數(shù)據(jù)庫(kù)時(shí)慢的問(wèn)題
瀏覽地址:http://www.bm7419.com/news25/175875.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站手機(jī)網(wǎng)站建設(shè)、定制開(kāi)發(fā)、網(wǎng)站導(dǎo)航、定制網(wǎng)站、外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開(kāi)發(fā)