MySQL常見錯誤碼

自建MySQL環境主機html

主機:iZbp1e*****krn92qrx0Zmysql

內網ip: 10.26.254.217sql

客戶端ecs主機數據庫

主機:iZbp1e6*****zkrn92qrwzZ安全

內網ip: 10.24.236.231服務器

說明session

說明:mysql的account的組成爲’user’@’host數據結構

 

ERROR 1045 (28000)併發

 

現象描述app

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

可能1:password錯誤

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

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

       可是並無建立'testconcon'@'10.24.236.231',而是建立的爲testcon@’%’,因此account驗證失敗,即便使用正確的密碼也沒法登陸,當建立一個'testconcon'@'%'的時候,使用正確密碼則登陸正常,以下:

可能3:account錯誤

與第二種相比,這次建立的帳號和密碼有以下對應:

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解析異常

同ping來獲取ip,沒法獲取到,故mysql命令行進行鏈接時就出錯了,此時須要經過ping來觀察dns的解析,

並檢查系統dns配置

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

以下爲測試結果:

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高安全模式特有)

  • 解決辦法:緣由是該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),以下:

2.4 ERROR 2003 (HY000)

現象描述:

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

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

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

可能2:端口錯誤

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

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

先關掉自建mysql數據庫

而後進行鏈接

一樣表現爲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的白名單未配置

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

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

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

2,按照以下操做確認公網出口ip

 

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作了限制

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

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

可能2:mysql沒有可用內存

  •  解決辦法(先確認內存是否已經不足):增長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名稱

       從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的白名單中

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

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

2.8 ERROR 5 (HY000)

現象描述:

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

可能1:mysql沒有可用內存

最近又遇到了這個問題,這個問題出現的緣由歸納以下(感謝內核同窗):

執行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的值

上面經過3次telnet,而後進行第四次時提示ERROR 1129 (HY000): Host '10.24.236.231' is blocked because of many connectionerrors; unblock with 'mysqladmin flush-hosts',緣由是已經超過了max_connect_errors=3的值,

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

須要注意的是,當進行屢次登陸失敗時,是沒有影響的:

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大小

當使用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大小

使用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的限制

當併發鏈接大於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,須要升級實例規格來提高鏈接數

 

 

常見錯誤碼

1) Error code 1064: Syntax error

假設有一個sql語句

select LastName, FirstName,from Person

執行的時候會包錯誤

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from Person' at line 2.

  • 1064錯誤說明你的sql語句有語法錯誤,單看這個錯誤碼,咱們沒法判斷出具體是哪的錯誤。

  • 仔細看報錯信息的最後,有一段用單引號標識的對源sql語句的引用'from Person',這表示的是這段sql語句沒法被解析,可是對於咱們這個例子,這個報錯引用並沒什麼卵用。咱們再注意觀察,這個引用的信息前面多了一個逗號,這個逗號後面應該接的是個表中的列名,而不是from關鍵字。

  • 1064的錯誤信息通常最後會有個... near '...'格式的信息,near後面的引用就是sql語句開始沒法被解析的地方,當遇到這個錯誤,多觀察這段沒法解析的sql語句先後的字符。

  • 有時候,你獲得的錯誤信息是... near '',near後面的引用是空的,這表示出錯的地方位於sql語句的開頭或者第一個字符,一般狀況是單引號、引號、括號沒有成對出現或者是結尾處沒有正確的字符,如中文分號。

  • 若是發現了1064錯誤,注意查看報錯信息裏引用的sql語句,多查看這個錯誤的sql語句先後部分。

  • 若是有人向你詢問1064的sql錯誤,你最好讓他給你提供完整的sql語句和報錯信息。

 

2) Error code 1175: Safe Update

這個錯誤是因爲你執行update或者delete語句時,沒有指定where條件,若是想忽略這個錯誤,則修改配置

SET SQL_SAFE_UPDATES = 0;

從新打開錯誤提醒

SET SQL_SAFE_UPDATES = 1;

 

3)1067, 1292, 1366, 1411 - Bad Value for number, date, default, etc.

  • 1067這個錯誤和TINESTAMP默認值有關,需查看官方文檔

  • 1292/1366 double和integer類型錯誤,檢查語法和數值類型

  • 1292 detatime錯誤,檢查插入的時間數據格式,是否超出範圍,帶時區格式的時間字符串格式是否有問題

  • 1292 VARIABLE 檢查你設置的VARIABLE屬性

  • 1292 LOAD DATA 檢查轉義字符,檢查數據類型

  • 1411 STR_TO_DATE 檢查時間字符串格式

 

4)1045 Access denied

權限錯誤,檢查用戶名密碼是否正確,檢查當前用戶是否有權限訪問數據。

5)1236 "impossible position" in Replication

  • 一般狀況下,這是因爲mysql主節點掛掉了而且sync_binlog=OFF,解決方法是在從節點設置 POS=0。

  • 當sync_binlog=OFF時,主節點會在把數據先發給從節點,而後寫binlog。當主節點在寫binlog以前掛掉了,這時候因爲已經把數據發給從節點了,因此從節點在寫完數據後,binlog被更新,致使主節點和從節點binlog指針位置不一致。因此,當主節點從新啓動後,會開啓一個新的binlog,因此這時候把從節點的binlog指針位置設置爲0,從頭從新開始。

  • 最好的解決方法設置sync_binlog=ON,這樣基於binlog同步,但會帶來較多的i/o開銷。

 

6)24 Can't open file (Too many open files)

open_files_limit是個系統的設置,table_open_cache必須比系統的這個配置小

7)1062 - Duplicate Entry

這個錯誤一般有如下幾個緣由 1. 主鍵約束,Error Code: 1062. Duplicate entry ‘12’ for key ‘PRIMARY’,主鍵約束的數據必須是惟一的,解決的方法之一是設置主鍵是自增的,這樣,插入數據時,設置主鍵的數據爲NULL。 2. 惟一屬性約束,Error Code: 1062. Duplicate entry ‘A’ for key ‘code’,這是你設置了數據是惟一的,但插入的數據和表中數據重複了,解決的方法是使用INSERT IGNORE代替INSERT,INSERT IGNORE插入數據的時候,若是重複了,就不作任何操做,也不報錯,若是不重複,就和INSERT行爲一致,插入數據。

8)126, 127, 134, 144, 145

當你訪問數據時,可能會遇到這些錯誤。這是錯誤是因爲mysql數據庫內部錯誤引發的。好比:

 

MySQL error code 126 = Index file is crashed MySQL error code 127 = Record-file is crashed MySQL error code 134 = Record was already deleted (or record file crashed) MySQL error code 144 = Table is crashed and last repair failed MySQL error code 145 = Table was marked as crashed and should be repaired

mysql的bug,被攻擊了,服務掛了,不正確的關閉mysql,損壞的數據都有可能形成這些問題。當這些錯誤發生時,數據就沒法訪問了,而且一直永久的沒法訪問。因此,最好把數據作好備份,若是你沒有備份,能夠嘗試去修復mysql。若是存儲引擎是MyISAM,使用CHECK TABLE和REPAIR TABLE命令(mysql>=5.7)。

 

CHECK TABLE <table name> ////To check the extent of database corruption REPAIR TABLE <table name> ////To repair table

 

9)1366

這一般意味着客戶端和服務器之間的字符集處理不一致。

10)139

錯誤139可能意味着表定義中字段的數量和大小超過了一些限制。檢查sql語句中異常長的字符串,異常大的整數等等

11)2002, 2003 Cannot connect

沒法鏈接,若是服務正常啓動,檢查如下可能的項目 一、是否是防火牆的問題,關閉防火牆試試 二、檢查mysql服務監聽的IP 三、檢查skip-name-resolve 四、檢查socket文件路徑

12)2014 Commands out of sync; you can't run this command now

這個是因爲你運行sql查詢語句的序列不正確形成的,官方的解釋

 

This can happen, for example, if you are using mysql_use_result() and try to execute a new query before you have called     mysql_free_result(). It can also happen if you try to execute two queries that return data without calling mysql_use_result() or mysql_store_result() in between.

總結起來意思就是你查詢告終果,可是卻沒有把結果獲取下來。形成mysql server一直在等你把結果取走。

13)1215: Cannot add foreign key constraint

添加外鍵錯誤,檢查外鍵關聯的兩個字段數據類型是否一致。

 

MySQL 常見錯誤 ERROR 3009

在測試備份還原時,使用XtraBackup還原數據庫後,建立一個測試帳號時遇到了下面錯誤: 

mysql> grant all on house.* to test@'192.168.%' identified by 'test1249';

 

ERROR 3009 (HY000): Column count of mysql.user is wrong. Expected 45, found 43. Created with MySQL 50620, now running 50721. Please use mysql_upgrade to fix this error.

mysql>

由於備份的數據庫版本爲MySQL 5.6.20,目標數據庫的MySQL版本爲5.7.21,由於兩個數據庫版本不一致,在還原事後,忘記升級數據庫(還原後沒有使用mysql_upgrade升級數據結構)。其實從錯誤信息也能看出一二,須要執行mysql_upgrade命令會檢查全部數據庫中的全部表與當前版本的MySQL服務器是否不兼容。 mysql_upgrade還會升級系統表,以便你可使用一些新特性或功能。

# mysql_upgrade -u root -p

Enter password: 

Checking if update is needed.

Checking server version.

Running queries to upgrade MySQL server.

Checking system database.

mysql.columns_priv OK

mysql.db OK

mysql.db_database_info OK

mysql.db_instance_info OK

mysql.db_server_info OK

mysql.engine_cost OK

......................................................

......................................................

Upgrade process completed successfully.

Checking if update is needed.

 

Mysql常見的13個錯誤碼講解

做者:笨熊

原文連接:http://www.bugcode.cn/mysqlerrorcodes.html

連接:https://yq.aliyun.com/articles/158321?spm=5176.8091938.0.0.pdvaeq

MySQL 常見錯誤 ERROR 3009 : https://mp.weixin.qq.com/s/owAKeCQJ3fVIgkZfF0J_XA

相關文章
相關標籤/搜索