前回にも少し書きましたが、先日にデータベースのアクセスエラーで当ブログへのアクセスができなくなっていました。
今回は、その際の対処要領の備忘録です。
◆エラー状況
ブログにアクセスすると「Error establishing a database connection」と表示されアクセスできませんでした。
■サービスの確認
サービスを確認すると「failed」となっており、動いていません。
# systemctl status mariadb ● mariadb.service - MariaDB 10.11.9 database server Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled) Drop-In: /etc/systemd/system/mariadb.service.d mqmigrated-from-my.cnf-settings.conf Active: failed (Result: exit-code) since 金 2024-08-23 10:14:11 JST; 13s ago ~ 略 ~
■サービスの再起動
単純にサービスがダウンしただけで起動し直せば解決すると思い、起動してみましたが起動しませんでした。
◆データベースのアップデート
データベース(MariaDB)のバージョンを最新版にアップデート
10.11.9 ⇒ 11.5.2
■リポジトリ構成のアップデート
公式のドキュメントにあるようにMariaDBパッケージリポジトリセットアップスクリプトを使用して最新バージョンのリポジトリ構成にアップデートします。
# curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash # cat /etc/yum.repos.d/mariadb.repo [mariadb-main] name = MariaDB Server baseurl = https://dlm.mariadb.com/repo/mariadb-server/11.rolling/yum/rhel/7/x86_64 gpgkey = file:///etc/pki/rpm-gpg/MariaDB-Server-GPG-KEY gpgcheck = 1 enabled = 1 [mariadb-maxscale] # To use the latest stable release of MaxScale, use "latest" as the version # To use the latest beta (or stable if no current beta) release of MaxScale, use "beta" as the version name = MariaDB MaxScale baseurl = https://dlm.mariadb.com/repo/maxscale/latest/yum/rhel/7/x86_64 gpgkey = file:///etc/pki/rpm-gpg/MariaDB-MaxScale-GPG-KEY gpgcheck = 1 enabled = 1 [mariadb-tools] name = MariaDB Tools baseurl = https://downloads.mariadb.com/Tools/rhel/7/x86_64 gpgkey = file:///etc/pki/rpm-gpg/MariaDB-Enterprise-GPG-KEY gpgcheck = 1 enabled = 1
1行目:リポジトリセットアップスクリプトの実行
3行目:リポジトリ構成の確認
6行目:MariaDBのバージョンが最新版をインストールするように「11.rolling」となっている
■サービスの停止
サービスは動いてはいないのですが、おまじないで停止します。
# systemctl stop mariadb
■MariaDBのアンインストール
インストールされている現バージョンのMariaDBをアンインストールします。
# yum remove MariaDB-server.x86_64 削除しました: MariaDB-server.x86_64 0:10.11.9-1.el7.centos 完了しました!
■最新バージョンのMariaDBのインストール
# yum install -y MariaDB-server.x86_64 インストール: MariaDB-server.x86_64 0:11.5.2-1.el7.centos 依存性関連をインストールしました: MariaDB-client-compat.noarch 0:11.5.2-1.el7.centos MariaDB-server-compat.noarch 0:11.5.2-1.el7.centos 依存性を更新しました: MariaDB-client.x86_64 0:11.5.2-1.el7.centos 完了しました!
■MariaDBのインストール済みパッケージの確認
インストール後のパッケージリストを確認します。
# yum list installed MariaDB* 読み込んだプラグイン:langpacks, versionlock インストール済みパッケージ MariaDB-backup.x86_64 10.11.9-1.el7.centos @mariadb-main MariaDB-client.x86_64 11.5.2-1.el7.centos @mariadb-main MariaDB-client-compat.noarch 11.5.2-1.el7.centos @mariadb-main MariaDB-common.x86_64 10.11.9-1.el7.centos @mariadb-main MariaDB-compat.x86_64 10.11.9-1.el7.centos @mariadb-main MariaDB-devel.x86_64 10.11.9-1.el7.centos @mariadb-main MariaDB-server.x86_64 11.5.2-1.el7.centos @mariadb-main MariaDB-server-compat.noarch 11.5.2-1.el7.centos @mariadb-main MariaDB-shared.x86_64 10.11.9-1.el7.centos @mariadb-main
■パッケージのアップデート
MariaDBのパッケージが一部アップデートされていないので、YUMアップデートを実行します。
# yum update
■MariaDBのインストール済みパッケージの再確認
# yum list installed MariaDB* 読み込んだプラグイン:langpacks, versionlock インストール済みパッケージ MariaDB-backup.x86_64 11.5.2-1.el7.centos @mariadb-main MariaDB-client.x86_64 11.5.2-1.el7.centos @mariadb-main MariaDB-client-compat.noarch 11.5.2-1.el7.centos @mariadb-main MariaDB-common.x86_64 11.5.2-1.el7.centos @mariadb-main MariaDB-compat.x86_64 11.5.2-1.el7.centos @mariadb-main MariaDB-devel.x86_64 11.5.2-1.el7.centos @mariadb-main MariaDB-server.x86_64 11.5.2-1.el7.centos @mariadb-main MariaDB-server-compat.noarch 11.5.2-1.el7.centos @mariadb-main MariaDB-shared.x86_64 11.5.2-1.el7.centos @mariadb-main
すべてのMariaDBインストール済みパッケージのバージョンが最新版にアップデートされた。
■設定ファイルの変更
必要に応じて、設定ファイル(my.cnf)などを変更します。
※当サーバの環境では、「my.cnf」にはインクルード設定としており、「/etc/my.cnf.d/server.cnf」で設定している
# view /etc/my.cnf.d/server.cnf ~ 中略 ~ [mariadb] socket=/var/lib/mysql/mysql.sock character-set-server=utf8mb4 log-error=/var/log/mariadb/error.log general_log=1 general_log_file=/var/log/mariadb/query.log ~ 略 ~
[mariadb]セクションに以下を追加
6行目:ソケットファイルを明示的に指定
7行目:文字セットを4バイト扱える「utf8mb4」に設定
8行目:エラーログの出力先指定
9行目:すべてのクエリログを出力する設定
10行目:クエリログの出力先指定
■サービスの起動
サービスを起動してみたが、変わらず起動せず。
# systemctl start mariadb
■サービスの確認
# systemctl status mariadb ● mariadb.service - MariaDB 11.5.2 database server Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled) Drop-In: /etc/systemd/system/mariadb.service.d mqmigrated-from-my.cnf-settings.conf Active: failed (Result: exit-code) since 金 2024-08-23 16:34:29 JST; 13s ago Docs: man:mariadbd(8) https://mariadb.com/kb/en/library/systemd/ Process: 25211 ExecStart=/usr/sbin/mariadbd $MYSQLD_OPTS $_WSREP_NEW_CLUSTER $_WSREP_START_POSITION (code=exited, status=218/CAPABILITIES) Process: 25188 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= || VAR=`/usr/bin/galera_recovery`; [ $? -eq 0 ] && systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1 (code=exited, status=0/SUCCESS) Process: 25185 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS) Main PID: 25211 (code=exited, status=218/CAPABILITIES) 8月 23 16:34:29 marusv.maruweb.jp.net systemd[1]: Starting MariaDB 11.5.2 database server... 8月 23 16:34:29 marusv.maruweb.jp.net systemd[1]: mariadb.service: main process exited, code=exited, status=218/CAPABILITIESsi 8月 23 16:34:29 marusv.maruweb.jp.net systemd[1]: Failed to start MariaDB 11.5.2 database server. 8月 23 16:34:29 marusv.maruweb.jp.net systemd[1]: Unit mariadb.service entered failed state. 8月 23 16:34:29 marusv.maruweb.jp.net systemd[1]: mariadb.service failed.
◆エラー対処
ここからが、本題のエラー対処になります。
■ジャーナルログの出力と確認
MariaDBのジャーナルログをmariadb.logとして手動で出力してみます。
# journalctl -xeu mariadb > mariadb.log # view journalctl mariadb.log ~ 抜粋 ~ -- Unit mariadb.service has begun starting up. 8月 23 16:34:29 marusv.maruweb.jp.net systemd[1915]: Failed at step CAPABILITIES spawning /usr/sbin/mariadbd: Invalid argument -- Subject: Process /usr/sbin/mariadbd could not be executed -- Defined-By: systemd -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- The process /usr/sbin/mariadbd could not be executed and failed. -- -- The error number returned by this process is 22. 8月 23 16:34:29 marusv.maruweb.jp.net systemd[1]: mariadb.service: main process exited, code=exited, status=218/CAPABILITIES 8月 23 16:34:29 marusv.maruweb.jp.net systemd[1]: Failed to start MariaDB 11.5.2 database server. -- Subject: Unit mariadb.service has failed -- Defined-By: systemd -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit mariadb.service has failed. -- -- The result is failed. 8月 23 16:34:29 marusv.maruweb.jp.net systemd[1]: Unit mariadb.service entered failed state. 8月 23 16:34:29 marusv.maruweb.jp.net systemd[1]: mariadb.service failed. 8月 23 16:54:17 marusv.maruweb.jp.net systemd[1]: Starting MariaDB 11.5.2 database server... -- Subject: Unit mariadb.service has begun start-up -- Defined-By: systemd -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
1行目:MariaDBのジャーナルログの出力
3行目:出力したジャーナルログの確認
■問題の特定
ジャーナルログの中で「CAPABILITIES」に関して色々と調べていくと、あるサイトに辿り着き、MariaDBのサービスのある設定をコメントアウトすることで起動できたとあったので試してみました。
# vi /lib/systemd/system/mariadb.service ~ 中略 ~ # CAP_IPC_LOCK To allow memlock to be used as non-root user # CAP_DAC_OVERRIDE To allow auth_pam_tool (which is SUID root) to read /etc/shadow when it's chmod 0 # does nothing for non-root, not needed if /etc/shadow is u+r # CAP_AUDIT_WRITE auth_pam_tool needs it on Debian for whatever reason #AmbientCapabilities=CAP_IPC_LOCK CAP_DAC_OVERRIDE CAP_AUDIT_WRITE ~ 略 ~
9行目:コメントアウト
・AmbientCapabilitiesとは
AmbientCapabilitiesは、プロセスが実行される環境で、プロセスがデフォルトで持つことができる特別な権限のことです。MariaDBのようなデータベースサーバーは、他のプロセスと通信したり、システムリソースにアクセスしたりするために、特定のcapabilitiesを必要とすることがあります。
Geminiに聞いてみた
・CAP_IPC_LOCK, CAP_DAC_OVERRIDE, CAP_AUDIT_WRITEとは
CAP_AUDIT_WRITE: システム監査イベントを書き込むことを許可します。
GEMINIに聞いてみた
CAP_IPC_LOCK: 共有メモリセグメントへのロック操作を許可します。
CAP_DAC_OVERRIDE: ファイルのアクセス許可をオーバーライドすることを許可します。
■デーモンの再読み込み
サービスファイルを変更したのでデーモンを再読み込みします。
# systemctl daemon-reload
■MariaDBサービスの起動
問題が取り除かれたため今度はエラー無く起動しました。
# systemctl start mariadb
■MariaDBサービスの確認
# systemctl status mariadb.service ● mariadb.service - MariaDB 11.5.2 database server Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled) Drop-In: /etc/systemd/system/mariadb.service.d mqmigrated-from-my.cnf-settings.conf Active: active (running) since 金 2024-08-23 16:54:24 JST; 6s ago Docs: man:mariadbd(8) https://mariadb.com/kb/en/library/systemd/ Process: 3502 ExecStartPost=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS) Process: 3461 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= || VAR=`/usr/bin/galera_recovery`; [ $? -eq 0 ] && systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1 (code=exited, status=0/SUCCESS) Process: 3458 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS) Main PID: 3484 (mariadbd) Status: "Taking your SQL requests now..." CGroup: /system.slice/mariadb.service mq3484 /usr/sbin/mariadbd 8月 23 16:54:17 marusv.maruweb.jp.net systemd[1]: Starting MariaDB 11.5.2 database server... 8月 23 16:54:17 marusv.maruweb.jp.net mariadbd[3484]: 2024-08-23 16:54:17 0 [ERROR] feedback plugin: failed to retrieve the MAC address 8月 23 16:54:24 marusv.maruweb.jp.net systemd[1]: Started MariaDB 11.5.2 database server.
6行目:「Active: active (running)」となっているのを確認
■MariaDBアップグレードツールの実行
MariaDBの起動後、MariaDBのバージョンをアップデートしたのでアップグレードツールを実行します。
# mariadb-upgrade -u root -p
・mariadb-upgrade の主な機能
データベース構造の調整: 新しいバージョンで変更されたデータベースの構造を自動的に調整します。
GEMINIに聞いてみた
プラグインの更新: 古いバージョンのプラグインを新しいバージョンに置き換えます。
設定ファイルの調整: 新しいバージョンに対応するために、設定ファイルを変更します。
内部テーブルのチェックと修復: データベースの内部テーブルをチェックし、必要に応じて修復します。
◆確認
データベースへのログイン及びブログへのアクセスをそれぞれ確認します。
# mysql -u root -p mysql: Deprecated program name. It will be removed in a future release, use '/usr/bin/mariadb' instead Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 23 Server version: 11.5.2-MariaDB-log MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> quit Bye
ブログへのアクセスも問題なく確認できました。
対処後、1週間ほど経過しましたが、問題なく動作しているようです。