自建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能夠正常登陸
現象描述:
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解析異常:
以下爲測試結果:
可能1:account不存在(阿里雲rds高安全模式特有)
現象描述:
可能1:client側安全限制,不容許訪問
通常表現爲telnet特定特定端口不通,解決辦法:檢查應用所在主機的安全規則是否有攔截
可能2:端口錯誤
端口錯誤,即便沒有安全限制也沒法鏈接,telnet 特定端口也不會通,解決辦法:確認鏈接mysql的端口是否正確
可能3:mysql服務未正確運行
先關掉自建mysql數據庫
而後進行鏈接
一樣表現爲telnet 特定斷開不通,解決辦法(自建mysql的狀況適用,rds不適用以下方法):
當加上白名單後(等待任務運行完成):
ps:確認本身本地主機的公網出口ip的方式我經常使用的是使用dms的實例管理-受權訪問地址來查看,比較準確,具體以下:
1,用客戶端主機訪問dms控制檯:https://dms.console.aliyun.com/
2,按照以下操做確認公網出口ip
現象描述:
可能1:limits.conf文件對max user processes作了限制
解決辦法(自建mysql的狀況適用,rds不適用以下方法):
檢查和修改系統的內核參數
可能2:mysql沒有可用內存
現象描述:
可能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錯誤)
現象描述:
可能1:rds for mysql的提示,且訪問模式爲高安全模式纔會出現,緣由是ip地址沒有在rds的白名單中
當添加白名單後(等待任務運行完成):
現象描述:
可能1:mysql沒有可用內存
最近又遇到了這個問題,這個問題出現的緣由歸納以下(感謝內核同窗):
執行sql的時候,mysql server須要申請內存,會先判斷當時可用內存是否知足,若是不知足,則直接拋錯,不會進行內存申請
解決辦法(先確認內存是否已經不足):增長mysql的內存,若是是rds,能夠考慮升級RDS的實例規格
現象描述:
關於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的值,
須要注意的是,當進行屢次登陸失敗時,是沒有影響的:
現象描述:
可能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的值來設定,
現象描述:
可能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,若是沒有權限,也能夠刪除帳號從新建立
現象描述:
ERROR 1040 (HY000): Too many connections
可能1:達到了mysql系統參數max_connections的限制
當併發鏈接大於max_connections的值時,就會出現ERROR 1040 (HY000): Too many connections
解決辦法:
假設有一個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語句和報錯信息。
這個錯誤是因爲你執行update或者delete語句時,沒有指定where條件,若是想忽略這個錯誤,則修改配置
SET SQL_SAFE_UPDATES = 0;
從新打開錯誤提醒
SET SQL_SAFE_UPDATES = 1;
1067這個錯誤和TINESTAMP默認值有關,需查看官方文檔
1292/1366 double和integer類型錯誤,檢查語法和數值類型
1292 detatime錯誤,檢查插入的時間數據格式,是否超出範圍,帶時區格式的時間字符串格式是否有問題
1292 VARIABLE 檢查你設置的VARIABLE屬性
1292 LOAD DATA 檢查轉義字符,檢查數據類型
1411 STR_TO_DATE 檢查時間字符串格式
權限錯誤,檢查用戶名密碼是否正確,檢查當前用戶是否有權限訪問數據。
一般狀況下,這是因爲mysql主節點掛掉了而且sync_binlog=OFF,解決方法是在從節點設置 POS=0。
當sync_binlog=OFF時,主節點會在把數據先發給從節點,而後寫binlog。當主節點在寫binlog以前掛掉了,這時候因爲已經把數據發給從節點了,因此從節點在寫完數據後,binlog被更新,致使主節點和從節點binlog指針位置不一致。因此,當主節點從新啓動後,會開啓一個新的binlog,因此這時候把從節點的binlog指針位置設置爲0,從頭從新開始。
最好的解決方法設置sync_binlog=ON,這樣基於binlog同步,但會帶來較多的i/o開銷。
open_files_limit是個系統的設置,table_open_cache必須比系統的這個配置小
這個錯誤一般有如下幾個緣由 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行爲一致,插入數據。
當你訪問數據時,可能會遇到這些錯誤。這是錯誤是因爲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
這一般意味着客戶端和服務器之間的字符集處理不一致。
錯誤139可能意味着表定義中字段的數量和大小超過了一些限制。檢查sql語句中異常長的字符串,異常大的整數等等
沒法鏈接,若是服務正常啓動,檢查如下可能的項目 一、是否是防火牆的問題,關閉防火牆試試 二、檢查mysql服務監聽的IP 三、檢查skip-name-resolve 四、檢查socket文件路徑
這個是因爲你運行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一直在等你把結果取走。
添加外鍵錯誤,檢查外鍵關聯的兩個字段數據類型是否一致。
在測試備份還原時,使用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.
做者:笨熊
原文連接: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