雲計算

我遇到的十二種Mysql連接錯誤實例

作者:手辨


實為吾之愚見,望諸君酌之!聞過則喜,與君共勉!諸君有其他案例煩請留言提供,以幫助更多人!

更新20180205:增加:對ERROR 5 (HY000): Out of memory (Needed 260400 bytes)問題原因進行說明

 

第一節 環境準備

1.1 自建mysql環境主機

主機:iZbp1e*krn92qrx0Z

內網ip: 10.26.254.217

1.2 客戶端ecs主機

主機:iZbp1e6*zkrn92qrwzZ

內網ip: 10.24.236.231

1.3  說明

說明:mysql的account的組成為’user’@’host’

第二節  常見問題復現

2.1 ERROR 1045 (28000)


要區分這種錯誤:ERROR 1142 (42000) command denied to user 'testcon'@'10.24.236.231' for table/database '**'

這種不是連接問題,這種是已經連上了,出現權限問題導致,錯誤碼也不一樣

現象描述:

ERROR 1045 (28000): Access denied for user
'testcon'@'10.24.236.231' (using password: YES)

可能1:password錯誤

37c9fdaab6b2b671eee895ef90450966ced26c53

f03f3466af6c3103beabf0ef9bd0ddbf1bf79a15

當使用'testcon'@'10.24.236.231'的account錯誤的password時,登錄失敗,因為創建了testcon@’%’,

所以account驗證可以通過,但是密碼不對

可能2:user錯誤(account錯誤)

37c9fdaab6b2b671eee895ef90450966ced26c53

b2e5337ed3c5cf37166f0ab4544d626b23ef4808

當使用錯誤的user時,登錄失敗,按照之前的account的構成,實際的進行驗證的account是: 'testconcon'@'10.24.236.231',

但是並沒有創建'testconcon'@'10.24.236.231',而是創建的為testcon@’%’,所以account驗證失敗,即使使用正確的密

碼也無法登錄,當創建一個'testconcon'@'%'的時候,使用正確密碼則登錄正常,如下:

502e0c1f754b995fc5130771b9891e13fc5ef800

cef972b80f17cc5af0bc033a9834ae68429c0115

可能3:account錯誤

f749283b95edc4402d9e23f2eb6f642048747674

e0787e128eee9ed23684d00754b8625acf75e89c

d15744f6ac724e91b8e0037520a18797479fbce5

與第二種相比,此次創建的賬號和密碼有如下對應:

Account

Password

testcon@'10.24.236.231'

123

testcon@'1.1.1.1'

12

當使用testcon@'10.24.236.231'以及密碼12登錄時,登錄失敗,因為testcon@'10.24.236.231'的

password為123,所以使用password為123可以正常登錄

解決辦法:

1,如果確認密碼正確,檢查mysql.user(rds
for mysql分為高權限賬號和普通賬號管理,高權限賬

號的實例可以查詢mysql.user_view表)表裡面的account信息(主要是user,host列),確認連接的account

符合user裡面的匹配項

2,如果通過mysql.user(rds
for mysql分為高權限賬號和普通賬號管理,高權限賬號的實例可以查

詢mysql.user_view表)account正常,可以嘗試更改一下密碼再進行測試

3,最快速簡單的方法是重新創建一個賬號,授予相關的權限

2.2 ERROR 2005 (HY000)

現象描述:

ERROR 2005 (HY000): Unknown MySQL server
host 'rm-XXXXXXXXXXXX.mysql.rds.aliyuncs.com' (110)

可能1:DNS解析異常

59a8469a7633bcacb29d1f782f8864fc5c61c77b

同ping來獲取ip,無法獲取到,故mysql命令行進行連接時就出錯了,此時需要通過ping來觀察dns的解析,

並檢查系統dns配置

20170809補充:當使用阿里雲的ECS設置的安全組為如下時,會導致dns解析異常:

96fe9c80ee5f57b56cb0a377688237a1c89d4f9d

如下為測試結果:

752eadd4fc035e301bac0982d6ad648fe4ee8b95

2.3 ERROR 1449 (HY000)

現象描述:

ERROR 1449 (HY000): The user specified as a
definer ('testcon'@'10.24.236.231') does not exist

或者

ERROR 1045 (28000): user not exist

可能1:account不存在(阿里雲rds高安全模式特有)

af8dc9293b59e1c25271b9bdf2b1d6740f8a3f24

0d9546b0d7a49d4bcf11687e19f3d5b55552b508

解決辦法:原因是該account不存在,檢查mysql.user(rds for mysql分為高權限賬號和普通賬號管理,高權限賬

號的實例可以查詢mysql.user_view表)表裡面的account信息(主要是user,host列),確認連接的account

符合user裡面的匹配項

當把高安全模式切換到標準模式是,再次進行測試則變成ERROR 1045 (28000): Access denied for user 'contest'@'10.24.236.231'

 (using password: YES),如下:

4d4a632939241bbe3bd61458d7279385327d5d67

18dc5281ca699d64f14b18393bdc9253da495d54 

2.4 ERROR 2003 (HY000)

現象描述:

ERROR 2003 (HY000): Can't connect to MySQL
server on 'test.mysql.rds.aliyuncs.com' (110)

可能1:client側安全限制,不允許訪問

ace865cee84d835533da963fa393bae99a84b2dd

一般表現為telnet特定特定端口不通,解決辦法:檢查應用所在主機的安全規則是否有攔截

可能2:端口錯誤

f447ae3a930be14e2e18bcb3e1d5ffe9799beae2

端口錯誤,即使沒有安全限制也無法連接,telnet 特定端口也不會通,解決辦法:確認連接mysql的端口是否正確

可能3:mysql服務未正確運行

先關掉自建mysql數據庫

8540337152dda839d4cd553c23fbafb7b699645c

然後進行連接

e16e83ab5f246c647911fe60918ff2381decca1f

同樣表現為telnet 特定斷開不通,解決辦法(自建mysql的情況適用,rds不適用如下方法):

1,執行netstat -apn | grep 3306,檢查下3306端口的進程信息

2,執行ps -ef | grep mysql,檢查下進程信息

3,如果1和2沒有輸出,可能mysql server未在主機正確運行

可能4:如果是rds  for mysql,且訪問模式為標準模式,原因為客戶端的ip地址在rds的白名單未配置

f87560fcdb16c8b8e5173493b1a39417f42e8cef

990e9f18594778c02d66580c493956c428f96566

當加上白名單後(等待任務運行完成):

c666c99f4a8f182dbb7892cf5ecb15156c80e50b

cd2d73e37856ed29d86204ef78906a66b3885979

ps:確認自己本地主機的公網出口ip的方式我常用的是使用dms的實例管理-授權訪問地址來查看,比較準確,具體如下:

1,用客戶端主機訪問dms控制檯:https://dms.console.aliyun.com/

2,按照如下操作確認公網出口ip

155088e8432dd73dcab5dc2f5e6542591cbbc2c1

219156cdb9fbf9813fe7927a1e90d7c3de6533f3

2.5 ERROR 1135 (HY000)

現象描述:

ERROR 1135 (HY000): Can't create a new
thread (errno 11); if you are not out of available memory, you can consult the

 manual for a possible OS-dependent bug

可能1:limits.conf文件對max user processes做了限制

9dff97f93203e5cb27457642e7d54b6da1540911

2e4cdb90fa8165df74efab6488fd65528a8d2251

5799551cfc02dd5a8f90e7b1341a1a8fa9f70b95

解決辦法(自建mysql的情況適用,rds不適用如下方法):

檢查和修改系統的內核參數

可能2:mysql沒有可用內存

018c3a66648cd99725b95bce85aa11b6296755ce

a153ec0f3ea525008edc2c19e0a24728c9cc6151

 解決辦法(先確認內存是否已經不足):增加mysql的內存,如果是rds,可以考慮升級RDS的實例規格

2.6 ERROR 1130 (HY000)

現象描述:

ERROR 1130 (HY000): Host '192.168.1.3' is
not allowed to connect to this MySQL server

可能1:mysql.user表裡沒有匹配的host名稱

be311ec27ec4204fe6fec37908cd7f8080ab6bab

147beaec6ea6d6636a3c35c0ac19dba1802a65a5

從mysql server的mysql.user表裡查看user為testcon的host,只有兩個:127.0.0.1以及izbp1e6df2sbzkrn92qrwzz,當使用另一個客戶端(ip為10.24.236.231,主機名為iZbp1e6df2sbzkrn92qrwzZ)使用user為testcon登錄時提示ERROR 1130 (HY000): Host '10.24.236.231' is not allowed to connect to this MySQL server,因為mysql server的mysql.user表裡沒有ip為10.24.236.231的host,這裡要說一點,mysql是把mysql.user裡的信息放到內存中排序好之後進行匹配的,先按host排序,host相同排序user(上面的這個問題如果創建一個testcon1@'10.24.236.231'的account,再次連接就會出現ERROR 1045 (28000): Access denied for user 'testcon'@'10.24.236.231' (using password: YES)  因為host匹配到了,user沒有,account錯誤)

解決辦法:檢查mysql.user(rds for mysql分為高權限賬號和普通賬號管理,高權限賬號的實例可以查詢mysql.user_view表)表裡面的account信息(主要是user,host列),確認連接的account符合user裡面的匹配項

2.7 ERROR 1045 (HY000)

現象描述:

ERROR 1045 (HY000): #28000ip not in
whitelist

可能1:rds for mysql的提示,且訪問模式為高安全模式才會出現,原因是ip地址沒有在rds的白名單中

a7b237c41c49c41d4f818f8fefbae922e8033dd6

c47622db62b54577e4a586c267b12f2a8c897b00

feb6aca2af711296abe83edaac98555291e9aa2d

當添加白名單後(等待任務運行完成):

bbaf1bc39792ca633cf7bd4d0cd6e71180c90ade

 3a4bde225109cdcea0fde04e145f44a51fbdca44

解決辦法:檢查RDS的白名單設置是否正確

2.8 ERROR 5 (HY000)

現象描述:

ERROR 5 (HY000): Out of memory (Needed
260400 bytes)

可能1:mysql沒有可用內存

018c3a66648cd99725b95bce85aa11b6296755ce

75cbb28d21bfcff8b18637210c7f016f86e42fe2

最近又遇到了這個問題,這個問題出現的原因概括如下(感謝內核同學):

執行sql的時候,mysql server需要申請內存,會先判斷當時可用內存是否滿足,如果不滿足,則直接拋錯,不會進行內存申請

解決辦法(先確認內存是否已經不足):增加mysql的內存,如果是rds,可以考慮升級RDS的實例規格

2.9 ERROR 1129 (HY000)

現象描述:

ERROR 1129 (HY000): Host '10.24.236.231' is
blocked because of many connection errors; unblock with 'mysqladmin
flush-hosts'

關於max_connect_errors可以參考另一篇:https://yq.aliyun.com/articles/159612?spm=5176.100240.searchblog.8.CZzMGt

可能1:達到了mysql服務器設置的max_connect_errors的值

3c1c1716d03a192dbd022cfd403092e44d81a4b1

4ea50cc2f39c2461a10c55e5fc70348036fa42c6

上面通過3次telnet,然後進行第四次時提示ERROR 1129 (HY000): Host '10.24.236.231' is blocked because of many
connection

 errors; unblock with 'mysqladmin flush-hosts',原因是已經超過了max_connect_errors=3的值,

解決方法(只適用於自己mysql,rds目前不支持):系統命令行下執行mysqladmin
flush-hosts或者mysql命令行裡執行flush hosts

ab14441c0acdafbf5c04b1c8db24f9bca787002f

14f3e166c9531737342084f7d2842da8adacefa1

需要注意的是,當進行多次登錄失敗時,是沒有影響的:

53b49f8f5e8bae2ab3352bd0c0a844b82fc3b8bd

 

2.10 ERROR 1226 (42000)

現象描述:

ERROR 1226 (42000): User 'testcon' has
exceeded the 'max_user_connections' resource (current value: 2)

可能1:達到了該account設定的max_user_connections大小

0748484714de85a8424ea0cf31426b4ff7f4e291

5f945fa8466c659d3d4f0b060d70124298b03d4d

當使用grant設定了testcon@’%’的max_user_connections為2時,併發連接超過2就會提示ERROR 1226 (42000): 

User 'testcon' has exceeded the
'max_user_connections' resource (current value: 2),如果沒有手動grant指定,會

用系統參數max_user_connections的值來設定,

解決辦法:重新grant為0或者調整系統變量max_user_connections,如果沒有權限,也可以刪除賬號重新創建

2.11 ERROR 1226 (42000)

現象描述:

ERROR 1226 (42000): User 'testcon' has
exceeded the 'max_connections_per_hour' resource (current value: 2)

可能1:達到了該account設定的max_connections_per_hour大小

599f003c2e807f7d4c990aed1b63b10c50880086

f2e1dca9d8ee6f0d894b9b5ae0d960048c372ef5

使用testcon一小時內登錄2次後就會提示ERROR 1226 (42000): User 'testcon' has exceeded the 

'max_connections_per_hour' resource (current value: 2)

解決辦法:重新grant該賬號max_connections_per_hour為0,如果沒有權限,也可以刪除賬號重新創建

2.12 ERROR 1040 (HY000)

現象描述:

ERROR 1040 (HY000): Too many connections

可能1:達到了mysql系統參數max_connections的限制

68dfd7bb414c9687c049df9f0debf417c2c663c2

226f3b431ea739043958f8149ab0cbdeceeac8b0

當併發連接大於max_connections的值時,就會出現ERROR 1040 (HY000): Too many connections

解決辦法:

1,檢查mysql server的CPU,IO,內存等狀態的變化,是否有明顯的升高現象,如果有明顯的升高,實時的通過show processlist獲取session信息,通過獲取到的session信息分析cpu,io以及內存跑高的原因,綜合分析(是否是遇到了阻塞或者慢查詢)kill掉相關會話來解決

2,檢查mysql server的CPU,IO,內存等狀態的變化,是否有明顯的升高現象,如果沒有明顯的升高,實時的通過show processlist獲取session信息,通過獲取到的session信息找到會話來源(看下是否是sleep連接較多),嘗試調整來源主機的應用行為

3,如果無法手動干預,嘗試調整mysql的max_connections的值,如果是rds for mysql,需要升級實例規格來提升連接數

Leave a Reply

Your email address will not be published. Required fields are marked *