1. 程式人生 > >Linux MySQL 常見無法啟動或啟動異常的解決方案

Linux MySQL 常見無法啟動或啟動異常的解決方案

Linux MySQL 常見無法啟動或啟動異常的解決方案

  在 Linux 上自建 MySQL 伺服器,經常遇到各種無法啟動或啟動後異常的問題,本文列舉一些常見問題的解決辦法。

  注意:以下錯誤日誌提示,都是檢視 MySQL 錯誤日誌得到,檢視方法如下:

  檢視下 MySQL 配置檔案 my.cnf 中有記錄,日誌記錄在 /alidata/log/mysql/error.log

1.jpg

 

  MySQL 配置檔案 my.cnf 許可權問題導致無法啟動,錯誤提示:World-writable config file '/etc/my.cnf'  is ignored

  Binlog 丟失導致無法啟動,錯誤日誌: File './mysql-bin.000001' not found

  Binlog 無法讀取導致無法啟動,錯誤日誌:Failed to open log (file './mysql-bin.000001', errno  13)

  不能建立 PID 導致無法啟動,錯誤日誌:Can't start server: can't create PID file: No such  file or directory

  不能建立臨時檔案導致無法啟動,錯誤日誌:mysqld: Can't create/write to file '/tmp/ibfguTtC'  (Errcode: 13)

  MySQL 服務無法識別導致無法啟動,錯誤提示:mysqld: unrecognized service

  MySQL 配置了過大的記憶體導致無法啟動,錯誤日誌:InnoDB: Cannot allocate memory for the buffer  pool

  MySQL 啟動引數過多導致無法啟動,錯誤提示:Too many arguments (first extra is 'start')

  MySQL 目錄許可權問題導致無法啟動,錯誤日誌:File './mysql-bin.index' not found (Errcode:13 -  Permission denied)

  MySQL 未初始化導致無法啟動,錯誤提示:can't open the mysql.plugin table

  MySQL 啟動成功但未監聽埠

  MySQL ibdata1許可權問題導致無法啟動,錯誤日誌:InnoDB Operating system error number 13 in a  file operation

  磁碟空間滿導致 MySQL 無法啟動

  程序殘留導致 MySQL 無法啟動

  MySQL 服務自動停止

 

  MySQL 配置檔案 my.cnf 許可權問題導致無法啟動,錯誤提示:World-writable config file '/etc/my.cnf'  is ignored

  問題描述

  主機 Linux MySQL 無法啟動,報如下錯誤:

2.jpg

 

  問題分析

  檢視 MySQL 錯誤日誌發現如下錯誤(提示 MySQL 庫的 host 表無法開啟):

3.jpg

 

  檢視 /etc/my.cnf 配置檔案:

4.jpg

 

  到 MySQL 資料庫所在目錄查看錶是否存在:

5.jpg

 

  發現 MySQL 庫的 host 表是存在的,那為什麼會提示不存在呢?

  問題應該出在 /etc/my.cnf 檔案上,從第一個截圖也可以看到警告資訊(/etc/my.cnf 被忽視)

  檢視檔案許可權:

6.jpg

 

  原來檔案許可權被設定成 777,因安全問題導致被 MySQL 忽視,所以去查詢預設的資料庫存放路徑,沒有 MySQL 庫的 host  表導致啟動失敗:

7.jpg

 

  解決辦法

  將 /etc/my.cnf 許可權修改成 644,然後啟動 MySQL 即可:

8.jpg

 

  Binlog 丟失導致無法啟動,錯誤日誌: File './mysql-bin.000001' not found

  問題描述

  清理磁碟空間時刪除了全部 binglog 日誌,導致 MySQL 無法啟動:

9.jpg

 

  MySQL 的 errorlog 裡面可以看到錯誤資訊:

10.jpg

 

  解決辦法

  1、註釋 Binlog 配置恢復方法:

  編輯 /etc/my.cnf,找到 log-bin=mysql-bin,在前面加#將其註釋暫時關閉 binlog,儲存修改後啟動 MySQL  服務

  注意:my.cnf 配置檔案路徑以實際呼叫路徑為準

11.jpg

 

  2、清理 Binlog 索引恢復方法:

  檢視 Binlog 索引檔案

12.jpg

 

  所以,需要清空 mysql-bin.index 索引檔案後即可,清理方法可以通過 vi 或者 echo 命令清理,如下:

  echo “” > mysql-bin.index

  去除 Binlog 日誌索引檔案中呼叫的內容後,測試啟動成功。

  [[email protected] var]# /etc/init.d/mysqld startStarting MySQL. SUCCESS!

  3、檔案還原恢復方法:

  提交工單,由我們幫您掛載最近的快照,您從快照磁碟複製最新的 binlog 檔案到 mysql 的資料目錄下,再重啟 MySQL 服務即可。

  注意:提交工單時請說明需要掛載快照的磁碟和快照。

  正確清理 MySQL Binlog 方法請參考如下命令:

  mysql -uroot -p 密碼use mysql;purge binary logs to ‘mysql-bin.011113’;

  注意:mysql-bin.011113 是 Binlog 檔名,mysql-bin.011113 不會被刪除,而 mysql-bin.011113  之前的日誌都會被刪除。

13.jpg

 

  Binlog 無法讀取導致無法啟動,錯誤日誌:Failed to open log (file './mysql-bin.000001', errno  13)

  問題描述

  MySQL 無法啟動報錯:

  Starting MySQL…The server quit without updating PID file  [FAILED]a/server/mysql/data/test.pid).

  檢視 MySQL 的錯誤日誌會提示如下資訊:

  110711 00:00:00 [ERROR] Failed to open log (file './mysql-bin.000001',  errno 13)

  這說明 Binlog 日誌無法去讀,一般由於磁碟空間滿,或者許可權不正確導致。

  解決辦法

  首先查詢磁碟空間:

  [[email protected] /]# df -hFilesystem Size Used Avail Use% Mounted on/dev/xvda1  20G 2.7G 17G 14% /tmpfs 498M 0 498M 0% /dev/shm/dev/xvdb1 30G 19G 9.7G 66%  /alidata

  檢視磁碟空間沒有滿,則需要 ls 命令檢查檔案許可權:

  -r———— 1 root root 601 Jul 28 2014 mysql-bin.000001

  這說明檔案屬主和許可權不正確,需要執行如下兩條命令修復(mysql-bin.000001 這個日誌檔案需要換成具體檔名):

  chmod 660 mysql-bin.000001chown mysql.mysql mysql-bin.000001

  修改正確後已經可以正常啟動mysql

  不能建立 PID 導致無法啟動,錯誤日誌:Can't start server: can't create PID file: No such  file or directory

  問題描述

  MySQL 啟動報錯資訊如下:

  Starting mysqld (via systemctl): Job for mysqld.service failed because the  control process exited with error code. See "systemctl status mysqld.service"  and "journalctl -xe" for details、 [FAILED]

  根據提示,使用 systemctl status mysqld.service 和 journalctl -xe 檢視服務啟動失敗的原因。

  [[email protected] ~]# systemctl status mysqld.servicemysqld.service - SYSV: MySQL  database server.Loaded: loaded (/etc/rc.d/init.d/mysqld)Active: failed (Result:  exit-code) since Wed 2016-01-20 18:26:57 CST; 40s agoDocs:   man:systemd-sysv-generator(8)Process: 2979 Ex主機tart=/etc/rc.d/init.d/mysqld  start (code=exited, status=1/FAILURE)Jan 20 18:26:56 spark01 systemd[1]:  Starting SYSV: MySQL database server….Jan 20 18:26:57 spark01 mysqld[2979]:  MySQL Daemon failed to start.Jan 20 18:26:57 spark01 mysqld[2979]: Starting   mysqld: [FAILED]Jan 20 18:26:57 spark01 systemd[1]: mysqld.service: control  process exited, code=exited status=1Jan 20 18:26:57 spark01 systemd[1]: Failed  to start SYSV: MySQL database server..Jan 20 18:26:57 spark01 systemd[1]: Unit  mysqld.service entered failed state.Jan 20 18:26:57 spark01 systemd[1]:  mysqld.service failed.[[email protected] ~]#journalctl -xeUnit session-2.scope has begun  starting up.Jan 20 18:26:48 spark01 sshd[2916]: pam_unix(sshd:session): session  opened for user spark by (uid=0)Jan 20 18:26:52 spark01 su[2944]: (to root)  spark on pts/1Jan 20 18:26:52 spark01 su[2944]: pam_unix(su-l:session): session  opened for user root by spark(uid=1000)Jan 20 18:26:56 spark01 polkitd[909]:   Registered Authentication Agent for unix-process:2974:117137 (system bus name  :1.25Jan 20 18:26:56 spark01 systemd[1]: Starting SYSV: MySQL database server….—  Subject: Unit mysqld.service has begun start-up— Defined-By: systemd— Support:   http://lists.freedesktop.org/mailman/listinfo/systemd-devel—— Unit   mysqld.service has begun starting up.Jan 20 18:26:57 spark01 mysqld[2979]: MySQL  Daemon failed to start.Jan 20 18:26:57 spark01 mysqld[2979]: Starting mysqld:  [FAILED]Jan 20 18:26:57 spark01 systemd[1]: mysqld.service: control process  exited, code=exited status=1Jan 20 18:26:57 spark01 systemd[1]: Failed to start  SYSV: MySQL database server..— Subject: Unit mysqld.service has failed—   Defined-By: systemd— Support:   http://lists.freedesktop.org/mailman/listinfo/systemd-devel—— Unit   mysqld.service has failed.—— The result is failed.Jan 20 18:26:57 spark01  systemd[1]: Unit mysqld.service entered failed state.Jan 20 18:26:57 spark01  systemd[1]: mysqld.service failed.Jan 20 18:26:57 spark01 polkitd[909]:  Unregistered Authentication Agent for unix-process:2974:117137 (system bus name  :1.

  這些資訊並不能提供服務啟動失敗的真正原因。

  檢視 MySQL 的告警日誌:

  2016-01-20T10:00:19.935771Z 0 [ERROR] /usr/sbin/mysqld: Can’t create/write  to file ‘/var/run/mysqld/mysqld.pid’ (Errcode: 2 - No such file or  directory)2016-01-20T10:00:19.935795Z 0 [ERROR] Can’t start server: can’t create  PID file: No such file or directory160120 18:00:20 mysqld_safe mysqld from pid  file /var/run/mysqld/mysqld.pid ended

  解決辦法

  MySQL 服務在啟動的時候,不能建立 pid 檔案。

  在終端看一下該目錄是否存在,如果不存在,手動建立:

  [[email protected] ~]# mkdir -p /var/run/mysqld/

  再次嘗試啟動 MySQL 服務,報錯如下:

  Starting mysqld (via systemctl): Job for mysqld.service failed because the  control process exited with error code. See "systemctl status mysqld.service"  and "journalctl -xe" for details. [FAILED]

  檢視 MySQL 的告警日誌:

  2016-01-20T10:28:37.183387Z 0 [ERROR] /usr/sbin/mysqld: Can’t create/write  to file ‘/var/run/mysqld/mysqld.pid’ (Errcode: 13 - Permission  denied)2016-01-20T10:28:37.183431Z 0 [ERROR] Can’t start server: can’t create  PID file: Permission denied160120 18:28:37 mysqld_safe mysqld from pid file  /var/run/mysqld/mysqld.pid ended160120 18:32:06 mysqld_safe Starting mysqld  daemon with databases from /var/lib/mysql

  許可權不正確,/var/run/mysqld/ 的屬主和屬組還是 root,MySQL 並不能在其中建立檔案後修改該目錄的屬主和屬組,

  [[email protected] ~]# ls -ld /var/run/mysqld/drwxr-xr-x 2 root root 40 Jan 20 18:28  /var/run/mysqld/[[email protected] ~]# chown mysql.mysql /var/run/mysqld/[[email protected] ~]#  /etc/init.d/mysqld startStarting mysqld (via systemctl): [ OK ]

  不能建立臨時檔案導致無法啟動,錯誤日誌:mysqld: Can't create/write to file '/tmp/ibfguTtC'  (Errcode: 13)

  問題描述

  MySQL 啟動失敗,錯誤日誌:mysqld: Can't create/write to file '/tmp/ibfguTtC'  (Errcode: 13)

  說明/tmp目錄無法寫入

  解決辦法

  1、使用命令 ll -d /tmp 命令檢查目錄許可權

  2、使用 chmod 1777 /tmp 設定為正確許可權

  再測試可以啟動成功

14.jpg

 

  MySQL 服務無法識別導致無法啟動,錯誤提示:mysqld: unrecognized service

  問題描述

  執行 MySQL 啟動命令 service mysqld start 時,提示 mysqld: unrecognized  service(未識別的服務),現象如圖:

15.jpg

  問題分析

  因為 service 命令是通過 /etc/init.d 啟動服務目錄來呼叫的,所以我們需要看一下 /etc/init.d 是否存在 mysqld  這個服務,使用 find /etc/init.d/ -name mysqld 命令來查詢,發現沒有 mysqld 這個檔案了

16.jpg

 

  這個就是導致通過 service 命令啟動報錯的原因了,這時候我們需要將原始碼包中的 mysql.server 拷貝複製到 /etc/init.d/  下,先使用 find / -name mysql.server 命令來查詢下 mysql.server 檔案位置,發現是在  /alidata/server/mysql-5.6.21/support-files/mysql.server 中

17.jpg

 

  解決辦法

  現在我們需要將這個檔案複製到 /etc/init.d/ 目錄下,改名為 mysqld,並且賦予這個檔案可執行許可權

18.jpg

 

  最後通過命令 chkconfig —add mysqld 新增開機自動啟動服務

19.jpg

 

  使用 service mysqld start 啟動成功

20.jpg

 

  MySQL 配置了過大的記憶體導致無法啟動,錯誤提示:InnoDB: Cannot allocate memory for the buffer  pool

  問題描述

        MySQL 啟動時報錯,檢視錯誤日誌有[ERROR] InnoDB: Cannot allocate memory for the buffer  pool(不能從快取池中分配給innodb引擎需要的記憶體)

 

  解決辦法

  需要調整 MySQL 配置檔案 my.cnf 中的 "innodb_buffer_pool_size"、"key_buffer_size"  的大小設定,適當的調大記憶體分配,一般調整為系統記憶體的一半

  先使用 free -m 檢視下系統記憶體大小,檢視是 1G 記憶體

21.jpg

 

  那麼 vi /etc/my.cnf,調整 "innodb_buffer_pool_size"、"key_buffer_size" 各為  500M

  注意:my.cnf 以實際配置檔案路徑為準。

22.jpg

 

  重啟 MySQL 服務使其生效

23.jpg

 

  MySQL 啟動引數過多導致無法啟動,錯誤提示:Too many arguments (first extra is 'start')

  問題描述

  主機 Linux 系統安裝 MySQL,啟動的方式有多種,如果輸入 /路徑/mysqld start —user=mysql 啟動後,出現報錯:Too  many arguments (first extra is 'start'),則說明這是因為啟動 MySQL 的時候引數過多導致。

24.jpg

 

  解決辦法

  遇到該問題,通過直接輸入 /路徑/mysqld —user=mysql,的方式啟動,如下圖:

25.jpg

 

  MySQL 目錄許可權問題導致無法啟動,錯誤提示:File './mysql-bin.index' not found (Errcode:13 -  Permission denied)

  問題描述

  MySQL 啟動報錯,錯誤日誌,如下圖

26.jpg

 

  提示的異常為許可權異常,我們到 data 目錄檢視 mysql-bin.index 的許可權

27.jpg

 

  正常情況下 data 目錄下檔案的屬主和屬組都應該是 mysql,目前為 root

  備註:不太熟悉許可權的朋友可以找一臺正常的 MySQL 主機對比下

  解決辦法

  找到問題之後解決起來就比較好辦了,授予正確的許可權,然後啟動 MySQL

28.jpg

 

  MySQL 未初始化導致無法啟動,錯誤提示:can't open the mysql.plugin table

  問題描述

  MySQL 服務啟動時提示:

  ERROR! MySQL manager or server PID file could not be found!

  Starting MySQL. ERROR! Manager of pid-file quit without updating file.

  問題分析

  檢視錯誤日誌提示:can't open the mysql.plugin table ,please run mysql_upgrade to  create it

29.jpg

 

  解決辦法

  使用如下命令指定 datadir 與 basedir 進行初始化啟動:

  /alidata/server/mysql-5.1.73/scripts/mysql_install_db —user=mysql   —datadir=/alidata/server/mysql/data —basedir=/alidata/server/mysql-5.1.73/

  注意:以實際 MySQL 安裝路徑為準

  MySQL 啟動成功但未監聽埠

  問題描述

  MySQL 啟動成功,使用 ps -ef |grep mysql 可以看到程序,如下圖:

30.jpg

 

  也可以在伺服器登陸,如下圖:

31.jpg

 

  但是使用 netstat -antp| grep 3306 可以看到沒有監聽埠。

32.jpg

 

  檢視 MySQL 配置檔案,埠也沒有更改。

33.jpg

 

  解決辦法

  檢查發現是配置檔案中使用了 skip-networking,可以看到這個選項的的作用是不監聽埠,同主機的使用者通過 sockets  進行連結。外部主機由於沒有監聽埠,將無法連線。

34.jpg

 

  將 skip-networking 註釋掉之後,重啟 MySQL 可以看到埠監聽了。

35.jpg

 

  MySQL ibdata1許可權問題導致無法啟動,錯誤日誌:InnoDB Operating system error number 13 in a  file operation

  問題描述

  mysql啟動提示 update pid 失敗:

  Starting MySQL. ERROR! Manager of pid-file quit without updating file.

  同時錯誤日誌中記錄:

  InnoDB Operating system error number 13 in a file operation,如圖:

36.jpg

 

  解決辦法

  從該報錯看,是提示作業系統訪問檔案 /usr/local/mysql/var/idata1 無許可權

  檢視許可權如下:

37.jpg

 

  調整為 MySQL 可以訪問的許可權後,比如 777,或者是調整屬帳號為 mysql,可以正常啟動 MySQL。

  磁碟空間滿導致 MySQL 無法啟動

  問題描述

  啟動 MySQL 報錯:ERROR! MySQL manager or server PID file could not be found!  Starting MySQL. ERROR! Manager of pid-file quit without updating file.

  檢視下 MySQL 錯誤日誌提示:

38.jpg

 

  沒有記錄有效的資訊,磁碟空間不足會導致這種情況

  解決辦法

  df -h 看下

39.jpg

 

  find / -size +100M 檢視下大於100M 的檔案

40.jpg

 

  MySQL 日誌佔用空間太大,無特殊需求可以刪除掉。

  程序殘留導致 MySQL 無法啟動

  問題描述

  MySQL 啟動失敗,錯誤提示:Starting MySQL. ERROR! Manager of pid-file quit without  updating file. [[email protected] bin]# Starting MySQL. ERROR! Manager of  pid-file quit without updating file.

  使用 ps -A | grep mysqld ,發現 mysqld 和 mysqld_safe 程序殘留,程序 ID 994 和 1221

  解決辦法

  kill兩個程序之後重新啟動 MySQL 成功啟動

41.jpg

 

  MySQL 服務自動停止

  問題描述

  伺服器上安裝的 MySQL,會出現自動停止的情況。出現這種現象,通常是伺服器的記憶體不足導致的。

  具體可以通過伺服器日誌來進行分析排查:

  檢視伺服器的系統日誌 /var/log/messages

  1.tail /var/log/messages

42.jpg

 

  看下在 MySQL 自動停止的時間段內,有什麼異常的日誌資訊,如果日誌有提示 “Out of memory” 就可以判定,是伺服器的記憶體使用不足,導致系統自動殺死的 MySQL 的程序

  解決辦法

  通過升級伺服器的記憶體可以解決.