MySQL常見故障彙總(一)

MySQL常見故障彙總(一)

1.案例概述

  • MySQL 是目前企業最常見的數據庫之一,佔用絕大部分市場份額。在日常維護管理的過程中相信大家肯定會遇到很多常見的故障,爲了提高故障處理的及時性,本章案例將常見故 障進行彙總,加強學習經驗。另外數據庫的默認的配置無法滿足高性能網站架構的需求,從 工作經驗上總結 MySQL 數據庫應該如何優化。

2.數據庫邏輯架構圖

在這裏插入圖片描述

  • 最上層是一些客戶端和連接服務,包含本地 sock 通信和大多數基於客戶端/ 服務器端工具實現的類似於 tcp/ip 的通信。主要完成一些類似於連接處理、授權認證、及相關的安全方案。在該層上引入了線程池的概念,爲通過認證安全接入的客戶端提供線程。 同樣在該層上可以實現基於 SSL 的安全鏈接。服務器也會爲安全接入的每個客戶端驗證它所具有的操作權限。
  • 第二層架構主要完成大多少的核心服務功能,如 SQL 接口,並完成緩存的查詢,SQL 的分析和優化及部分內置函數的執行。所有跨存儲引擎的功能也在這一層實現,如過程、函數 等。在該層,服務器會解析查詢並創建相應的內部解析樹,並對其完成相應的優化如確定查 詢表的順序,是否利用索引等,最後生成相應的執行操作。如果是 select 語句,服務器還會查詢內部的緩存。如果緩存空間足夠大,這樣在解決大量讀操作的環境中能夠很好的提升 系統的性能。
  • 存儲引擎層,存儲引擎真正的負責了 MySQL 中數據的存儲和提取,服務器通過 API 與存儲引擎進行通信。不同的存儲引擎具有的功能不同,這樣我們可以根據自己的實際需要進行 選取。
  • 數據存儲層,主要是將數據存儲在運行於裸設備的文件系統之上,並完成與存儲引擎的 交互。

3.實驗環境

centos7(MySQL5.6),IP地址:192.168.73.10

centos7(MySQL5.6),IP地址:192.168.73.11

4.單庫常見故障分析

4.1故障現象1

ERROR	2002	(HY000):	Can't	connect	to	local	MySQL	server	through	socket '/data/mysql/mysql.sock' (2)
  • 問題分析:
    • 以上這種情況一般都是數據庫未啓動或者數據庫端口被防火牆攔截導致。
  • 解決方法:
    • 啓動數據庫或者防火牆開放數據庫監聽端口。

4.2故障現象2

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
  • 問題分析
    • 密碼不正確或者沒有權限訪問。
  • 解決辦法
1)修改 my.cnf 主配置文件,在[mysqld]下添加 skip-grant-tables,重啓數據庫。最後修改密碼命令如下:
mysql> use mysql;
mysql> update user set password=password("123456") where user="root";
再刪除剛剛添加的 skip-grant-tables 參數,再重啓數據庫,使用新密碼即可登錄。
2)重新授權,命令如下:
mysql> grant all on *.* to 'root'@'mysql-server' identified by '123456';

4.3故障現象3

  • 在使用遠程連接數據庫時偶爾會發生遠程連接數據庫很慢的問題。
  • 問題分析:
    • 如果 MySQL 主機查詢 DNS 很慢或是有很多客戶端主機時會導致連接很慢,由於開發機器是不能夠連接外網的,所以 DNS 解析是不可能完成的,從而也就明白了爲什麼連接那麼慢了。
  • 解決辦法:
    • 修改 my.cnf 主配置文件,在[mysqld]下添加 skip-name-resolve,重啓數據庫可以解決。注意在以後授權裏面不能再使用主機名授權。

4.4故障現象4

Can't open file: 'xxx_forums.MYI'. (errno: 145)
  • 問題分析

    • 1) 服務器非正常關機,數據庫所在空間已滿,或一些其它未知的原因,對數據庫表造成了損壞。

    • 2) 可能是操作系統下直接將數據庫文件拷貝移動會因爲文件的屬組問題而產生這個錯

      誤。

  • 解決辦法:

    • 可以使用下面的兩種方式修復數據表:(第一種方法僅適合獨立主機用戶)

    • 1 ) 使用 myisamchk , MySQL 自帶了專門用戶數據表檢查和修復的工具 — — myisamchk 。一般情況下只有在這個下面才能運行 myisamchk 命令。常用的修復命令爲: myisamchk -r 數據文件目錄/數據表名.MYI;

    • 2)通過 phpMyAdmin 修復, phpMyAdmin 帶有修復數據表的功能,進入到某一個表中後,點擊“操作”,在下方的“表維護”中點擊“修復表”即可。

      注意:以上兩種修復方式在執行前一定要備份數據庫。修改文件的屬組(僅適合獨立主機用戶):

      複製數據庫文件的過程中沒有將數據庫文件設置爲 MySQL 運行的帳號可讀寫(一般適用於 Linux 和 FreeBSD 用戶)。

4.5故障現象5

ERROR 1129 (HY000): Host 'xxx.xxx.xxx.xxx' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
  • 問題分析
    • 由於 mysql 數據庫的參數:max_connect_errors(系統默認 10) mysqld 已經得到了大量(max_connect_errors)的主機’hostname’的在中途被中斷了的連接請求累計超過 10 次, 就再也無法連接上 mysqld 服務,同一個 ip 在短時間內產生太多中斷的數據庫連接而導致的阻塞(超過 mysql 數據庫 max_connection_errors 的最大值)。
  • 解決辦法
1)使用 mysqladmin flush-hosts 命令清除緩存,命令執行方法如下:
mysqladmin -uroot -p -h 192.168.241.48 flush-hosts Enter password:
2)修改 mysql 配置文件,在[mysqld]下面添加 max_connect_errors=1000,然後重啓MySQL。

4.6故障現象6

客戶端報 Too many connections
  • 問題分析
    • 連接數超出 Mysql 的最大連接限制。
  • 解決辦法
1)在 my.cnf 配置文件裏面增加連接數,然後重啓 MySQL 服務。
max_connections = 10000
2)臨時修改最大連接數,重啓後不生效。需要在 my.cnf 裏面修改配置文件,下次重啓生效。
set GLOBAL max_connections=10000;

4.7故障現象7

Warning: World-writable config file '/etc/my.cnf' is ignored ERROR! MySQL is running but PID file could not be found
  • 問題分析
    • mysql的配置文件/etc/my.cnf權限不對
  • 解決辦法
chmod 644 /et/my.cnf

4.8故障現象8

InnoDB: Error: page 14178 log sequence number 29455369832
InnoDB: is in the future! Current system log sequence number 29455369832
  • 問題分析
    • InnoDB數據文件損壞
  • 解決辦法
修改 my.cnf 配置文件,在[mysqld]下添加 innodb_force_recovery=4, 啓動數據庫後備份數據文件,然後去掉該參數,利用備份文件恢復數據。

5.MySQL主從故障排查

5.1故障現象1

從庫的 Slave_IO_Running 爲 NO
The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).
  • 問題分析
    • 主庫和從庫的 server-id 值一樣
  • 解決辦法
    • 修改從庫的 server-id 的值,修改爲和主庫不一樣,比主庫低。修改完後重啓,再同步即可

5.2故障現象2

從庫的 Slave_IO_Running 爲 NO
  • 問題分析
  • 造成從庫線程爲 NO 的原因會有很多,主要原因是主鍵衝突或者主庫刪除或更新數據, 從庫找不到記錄,數據被修改導致。通常狀態碼報錯有 1007、1032、1062、1452 等。
  • 解決方法
解決方法一:
mysql> stop slave;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> start slave;
解決方法二:
設置用戶權限,設置從庫只讀權限
set global read_only=true;

5.3故障現象3

Error initializing relay log position: I/O error reading the header from the binary log
  • 分析問題
    • 從庫的中繼日誌 relay-bin 損壞.
  • 解決辦法
手工修復,重新找到同步的 binlog 和 pos 點,然後重新同步即可。
mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.xxx',MASTER_LOG_POS=xxx;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章