web-dev-qa-db-ja.com

CentOS 7でMariaDBの起動に失敗した原因を特定する

私たちはフリー/オープンソースのプロジェクトです。 CentOS 7でMariaDB 5.5.58が起動しない理由を特定するのに問題があります。 CentOS Software Collections(SCL) を有効にしてMediaWikiのアップグレードを実行した後、起動の問題が発生しました。

有用なエラー情報がないため、問題のトラブルシューティングが難しくなっています。 CentOSの 問題9519、/ usr/libexec/mariadb-prepare-db-dirが失敗した (および Mariadbが起動しない-ステップEXECの生成で失敗した )が見つかりましたが、 /の権限は問題ないようです(以下を参照)。 Red Hatの Issue 1082018、systemctl start mariadb.service could n't start で説明されているPIDファイルもあります。

ルートとして/usr/libexec/mariadb-prepare-db-dirを使用してset -xを手動で実行した結果を以下に示します。 systemdでどのように実行されているかわかりません(情報を出力するコマンドはまだ見つかりません)。

VMを借りるので、検査するdmesgsyslogはありません。空です。

誰かが失敗の原因に関する詳細情報やトラブルシューティングのための追加の手順を提供できたら、感謝します。


MariaDB会議

# grep -v '#' /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

!includedir /etc/my.cnf.d

その後:

# echo "" > /var/log/mariadb/mariadb.log

その他のディレクトリ

# ls -al /
total 64
dr-xr-xr-x 20 root root 4096 Dec 23 15:46 .
dr-xr-xr-x 20 root root 4096 Dec 23 15:46 ..

# ls -al /var/run/mariadb/
total 0
drwxr-xr-x  2 mysql mysql  40 Dec 23 15:46 .
drwxr-xr-x 26 root  root  680 Dec 23 18:26 ..

データディレクトリ

# ls -al /var/lib/mysql
total 35060
drwxr-xr-x  5 mysql mysql     4096 Dec 23 15:45 .
drwxr-xr-x 30 root  root      4096 Dec 23 18:52 ..
-rw-rw----  1 mysql mysql    16384 Dec 23 15:45 aria_log.00000001
-rw-rw----  1 mysql mysql       52 Dec 23 15:45 aria_log_control
-rw-rw----  1 mysql mysql 35651584 Dec 23 15:45 ibdata1
-rw-rw----  1 mysql mysql  5242880 Dec 23 15:45 ib_logfile0
-rw-rw----  1 mysql mysql  5242880 Dec 23 15:31 ib_logfile1
drwx------  2 mysql mysql     4096 Sep 18  2016 mysql
drwx------  2 mysql mysql    16384 Dec 23 01:14 my_wiki
drwx------  2 mysql mysql     4096 Sep 18  2016 performance_schema

開始の試み

# ls /usr/libexec/mariadb-prepare-db-dir
/usr/libexec/mariadb-prepare-db-dir

# systemctl start mariadb.service
Job for mariadb.service failed because the control process exited with error code.
See "systemctl status mariadb.service" and "journalctl -xe" for details.

mariadb.log

# cat /var/log/mariadb/mariadb.log
#

systemctl status

# systemctl -l status mariadb.service
● mariadb.service - MariaDB database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Sat 2017-12-23 18:29:28 EST; 23s ago
  Process: 14537 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n (code=exited, status=1/FAILURE)

Dec 23 18:29:28 ftpit systemd[1]: Starting MariaDB database server...
Dec 23 18:29:28 ftpit systemd[1]: mariadb.service: control process exited, code=exited status=1
Dec 23 18:29:28 ftpit systemd[1]: Failed to start MariaDB database server.
Dec 23 18:29:28 ftpit systemd[1]: Unit mariadb.service entered failed state.
Dec 23 18:29:28 ftpit systemd[1]: mariadb.service failed.
Oct 27 19:05:23 ftpit systemd[1]: Stopping MariaDB database server...
Oct 27 19:05:28 ftpit systemd[1]: Stopped MariaDB database server.
Nov 16 12:48:44 ftpit systemd[1]: Stopping MariaDB database server...
Nov 16 12:48:54 ftpit systemd[1]: Stopped MariaDB database server.

journalctl -xe

# journalctl -xe
-- Subject: Unit sysinit.target has finished shutting down
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit sysinit.target has finished shutting down.
Nov 16 12:48:57 ftpit systemd[1]: Stopping System Initialization.
-- Subject: Unit sysinit.target has begun shutting down
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit sysinit.target has begun shutting down.
Nov 16 12:48:57 ftpit systemd[1]: Stopped target Swap.
-- Subject: Unit swap.target has finished shutting down
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit swap.target has finished shutting down.
Nov 16 12:48:57 ftpit systemd[1]: Stopping Swap.
-- Subject: Unit swap.target has begun shutting down
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit swap.target has begun shutting down.

これは、スクリプトに/usr/libexec/mariadb-prepare-db-dirを追加してset -xを手動で実行した結果です。正直なところ、これが予期されていることかどうかはわかりません。

# /usr/libexec/mariadb-prepare-db-dir
+ get_mysql_option mysqld datadir /var/lib/mysql
+ '[' 3 -ne 3 ']'
++ tail -n 1
++ sed -n 's/^--datadir=//p'
++ /usr/bin/my_print_defaults mysqld
+ result=/var/lib/mysql
+ '[' -z /var/lib/mysql ']'
+ datadir=/var/lib/mysql
+ get_mysql_option mysqld_safe log-error /var/log/mariadb/mariadb.log
+ '[' 3 -ne 3 ']'
++ sed -n 's/^--log-error=//p'
++ tail -n 1
++ /usr/bin/my_print_defaults mysqld_safe
+ result=/var/log/mariadb/mariadb.log
+ '[' -z /var/log/mariadb/mariadb.log ']'
+ errlogfile=/var/log/mariadb/mariadb.log
+ get_mysql_option mysqld socket /var/lib/mysql/mysql.sock
+ '[' 3 -ne 3 ']'
++ tail -n 1
++ sed -n 's/^--socket=//p'
++ /usr/bin/my_print_defaults mysqld
+ result=/var/lib/mysql/mysql.sock
+ '[' -z /var/lib/mysql/mysql.sock ']'
+ socketfile=/var/lib/mysql/mysql.sock
+ SERVICE_NAME=
+ '[' x = x ']'
+ SERVICE_NAME=mysqld.service
++ sed 's/^User=//'
++ systemctl show -p User mysqld.service
+ myuser=
+ '[' x = x ']'
+ myuser=mysql
++ sed 's/^Group=//'
++ systemctl show -p Group mysqld.service
+ mygroup=
+ '[' x = x ']'
+ mygroup=mysql
++ dirname /var/log/mariadb/mariadb.log
+ '[' '!' -e /var/log/mariadb/mariadb.log -a '!' -h /var/log/mariadb/mariadb.log -a x/var/log/mariadb = x/var/log ']'
++ dirname /var/log/mariadb/mariadb.log
+ errlogdir=/var/log/mariadb
+ '[' -d /var/log/mariadb ']'
+ '[' -e /var/log/mariadb/mariadb.log -a '!' -w /var/log/mariadb/mariadb.log ']'
+ fuser /var/lib/mysql/mysql.sock
+ export LC_ALL=C
+ LC_ALL=C
+ should_initialize /var/lib/mysql
++ list_datadir /var/lib/mysql
++ grep -v -e '^lost+found$' -e '\.err$' -e '^.bash_history$'
++ ls -1A /var/lib/mysql
+ test -z 'aria_log.00000001
aria_log_control
ib_logfile0
ib_logfile1
ibdata1
my_wiki
mysql
performance_schema'
+ '[' -d /var/lib/mysql/mysql/ ']'
+ echo 'Database MariaDB is probably initialized in /var/lib/mysql already, nothing is done.'
Database MariaDB is probably initialized in /var/lib/mysql already, nothing is done.
++ basename /usr/libexec/mariadb-prepare-db-dir
+ echo 'If this is not the case, make sure the /var/lib/mysql is empty before running mariadb-prepare-db-dir.'
If this is not the case, make sure the /var/lib/mysql is empty before running mariadb-prepare-db-dir.
+ exit 0
1
user141074

CentOS 7でMariaDBの起動に失敗した原因を特定する

問題の原因を発見しました。 VMがメモリ不足になると、Linux OOMキラーがサービスを停止しているようです。

悪化する状況には、GoDaddyが提供するVMが含まれます。マシンには1 GBのRAMがあり、仮想メモリがありません。 RAMをアップグレードできず、スワップファイルを構成できません。

Webサーバーのパラメーターとキャッシュを含め、ApacheとPHPのVMパフォーマンスを調整しようとしました。残念ながら、私たちの誰もこの分野の専門家ではないため、変更がどれほど効果的だったかはわかりません。実際、問題が再発すると、私たちの試みは失敗したようです。

(1)実行されていないサービスを再起動するcronジョブを提供します。 (2)再起動時にデータベースを修復します。 (2)キル後に破損したテーブルが表示されることがあるので重要です。

同様の状況のユーザーのために、CentOS7とMySQLのコマンドを次に示します。

  • サービスの状態を確認する

    systemctl status mariadb.service

  • データベースを修復する

    mysqlcheck --all-databases --auto-repair --user=XXX --password=YYY


スクリプトは次のとおりです。

# cat /etc/cron.hourly/1restart-mysql.cron
#!/usr/bin/env bash

Shell=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin

RUNNING=$(systemctl status mariadb.service | grep -i -c "running")
if [[ "$RUNNING" -eq 0 ]]; then
    systemctl restart mariadb.service
    mysqlcheck --all-databases --auto-repair --user=XXX --password=YYY
fi

そして:

# ls -Al /etc/cron.hourly
total 8
-rwxr-xr-x 1 root root 362 Apr 13  2018 0yum-hourly.cron
-rwxr-xr-x 1 root root 429 Oct 13 17:33 1restart-mysql.cron

そして、これが原因を特定する方法です。最初はサーバーをバウンスしてサービスを復元することでしたので、最初はそれを逃しました。後でdmesgをチェックすると、空になります。他のログではこの情報は見つかりませんでした。

# dmesg
[51000952.633919] Out of memory in UB 5299: OOM killed process 692 (mysqld) score 0 vm:1689248kB, rss:101160kB, swap:0kB
[51000954.240514] Out of memory in UB 5299: OOM killed process 18692 (httpd) score 0 vm:484768kB, rss:27528kB, swap:0kB
[51021879.542687] Out of memory in UB 5299: OOM killed process 20755 (mysqld) score 0 vm:1684804kB, rss:96828kB, swap:0kB
[51031927.106440] Out of memory in UB 5299: OOM killed process 26157 (mysqld) score 0 vm:1687764kB, rss:92504kB, swap:0kB
[51031927.991303] Out of memory in UB 5299: OOM killed process 27789 (httpd) score 0 vm:484616kB, rss:28828kB, swap:0kB
[51031928.375203] Out of memory in UB 5299: OOM killed process 27999 (httpd) score 0 vm:484596kB, rss:28632kB, swap:0kB
[51031928.851050] Out of memory in UB 5299: OOM killed process 27722 (httpd) score 0 vm:482796kB, rss:26124kB, swap:0kB
[51038506.759513] Out of memory in UB 5299: OOM killed process 28865 (mysqld) score 0 vm:1683916kB, rss:92152kB, swap:0kB
[51038508.175325] Out of memory in UB 5299: OOM killed process 30527 (mysqld) score 0 vm:680280kB, rss:69276kB, swap:0kB
[51047405.296807] Out of memory in UB 5299: OOM killed process 21185 (mysqld) score 0 vm:1682140kB, rss:95504kB, swap:0kB
[51047406.815046] Out of memory in UB 5299: OOM killed process 21994 (mysqld) score 0 vm:413284kB, rss:30480kB, swap:0kB
[51094257.662248] Out of memory in UB 5299: OOM killed process 2751 (mysqld) score 0 vm:1678112kB, rss:95196kB, swap:0kB
[51097918.747681] Out of memory in UB 5299: OOM killed process 3689 (mysqld) score 0 vm:1683916kB, rss:91052kB, swap:0kB
[51098957.885464] Out of memory in UB 5299: OOM killed process 4833 (mysqld) score 0 vm:1683620kB, rss:91232kB, swap:0kB
[51099129.993959] Out of memory in UB 5299: OOM killed process 13167 (mysqld) score 0 vm:1686284kB, rss:95464kB, swap:0kB
[51099131.831039] Out of memory in UB 5299: OOM killed process 13255 (httpd) score 0 vm:482484kB, rss:25508kB, swap:0kB
[51099132.017423] Out of memory in UB 5299: OOM killed process 13215 (httpd) score 0 vm:480240kB, rss:22188kB, swap:0kB
[51099132.211569] Out of memory in UB 5299: OOM killed process 13216 (httpd) score 0 vm:478200kB, rss:20832kB, swap:0kB
[51099132.390457] Out of memory in UB 5299: OOM killed process 13240 (httpd) score 0 vm:478040kB, rss:20900kB, swap:0kB
[51099132.505624] Out of memory in UB 5299: OOM killed process 13245 (httpd) score 0 vm:478036kB, rss:20404kB, swap:0kB
0
user141074