サービス停止なしでMariaDB rootパスワード変更する方法|skip-grant-tablesを使わない手順

運営:リナックスマスター.JP(代表 宮崎智広)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Linuxtips > データーベース管理 > サービス停止なしでMariaDB rootパスワード変更する方法|skip-grant-tablesを使わない手順
「MariaDBのrootパスワードを変更したいのに、ネットで調べると必ずskip-grant-tablesを使う手順ばかり出てくる。本番データベースをサービス停止なしに変更する方法はないのか」

その疑問はもっともです。多くの解説記事が「パスワードを完全に忘れた場合の緊急復旧」を扱っているため、検索結果はサービス停止が前提の手順ばかりになりがちです。しかしMariaDB 10.4以降では、サービスを止めずにrootパスワードを変更できます。

この記事では、RHEL 9 / Rocky Linux 9 / Ubuntu 24.04 LTSで動作確認済みの手順を解説します。unix_socket認証の仕組みを使ったサービス停止なしの変更方法、ALTER USERコマンドの実行例、よくあるエラーと対処法まで網羅します。

この記事のポイント

・MariaDB 10.4以降はALTER USERコマンドでサービス停止なしにパスワードを変更できる
・unix_socket認証があれば sudo mariadb でパスワードなしにroot接続が可能
・skip-grant-tablesはパスワードを完全に忘れた場合の緊急復旧専用の最終手段
・mysqladminコマンドを使えばコマンドライン1行でパスワード変更が完結する


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

skip-grant-tablesを使うべきではない場面

`--skip-grant-tables`オプションは「rootパスワードを完全に忘れてしまい、どうしても接続できない」緊急事態のための最終手段です。このオプションを指定してMariaDBを起動すると、すべての認証チェックを無効化した状態で起動します。

本番環境でこの方法を使う場合、2つの大きなデメリットがあります。

・サービスの停止が必要:MariaDBを一度停止し、オプションを付けて再起動する必要がある
・セキュリティリスク:起動中は誰でも認証なしに接続できる状態になる

現在のrootパスワードが分かっている、あるいはOSのrootユーザーとしてサーバーにログインできる状態なら、skip-grant-tablesは一切不要です。

事前確認:MariaDBのバージョンと認証プラグインの確認

この記事の手順はMariaDB 10.4以降を対象にしています。まずバージョンを確認します。

# MariaDBのバージョン確認 $ mariadb --version mariadb Ver 15.1 Distrib 10.11.6-MariaDB, for Linux (x86_64) using EditLine wrapper

次に、rootユーザーの認証プラグインを確認します。MariaDB 10.4以降では、インストール直後のrootユーザーの認証プラグインが`mysql_native_password`から`unix_socket`に変わっています。

# sudo経由でMariaDBに接続(unix_socket認証) $ sudo mariadb # rootユーザーの認証プラグインを確認 MariaDB [(none)]> SELECT user, host, plugin FROM mysql.user WHERE user = 'root'; +------+-----------+-------------+ | user | host | plugin | +------+-----------+-------------+ | root | localhost | unix_socket | +------+-----------+-------------+ 1 row in set (0.001 sec)

`plugin`列が`unix_socket`になっていれば、OSのrootユーザーとして`sudo mariadb`コマンドを実行するだけでパスワードなしにMariaDBへ接続できます。この仕組みを利用してサービスを停止せずにパスワードを変更します。

サービス停止なしでMariaDB rootパスワードを変更する手順

1. unix_socket認証でMariaDBに接続する

MariaDBサービスが起動したまま、`sudo`コマンドでOSのrootとしてMariaDBに接続します。

# sudo経由でMariaDBに接続 $ sudo mariadb Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 8 Server version: 10.11.6-MariaDB MariaDB Server Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>

unix_socket認証が設定されていない環境(MariaDB 10.3以前や、すでにnative_passwordに切り替え済みの環境)では、現在のrootパスワードで接続します。

# 現在のrootパスワードで接続(MariaDB 10.3以前または既にnative_password設定済みの場合) $ mysql -u root -p Enter password:

2. ALTER USERコマンドで新しいパスワードを設定する

MariaDB 10.4以降では`ALTER USER`コマンドが推奨の変更方法です。このコマンドはMariaDBサービスを停止せずに実行できます。

-- rootパスワードを変更する MariaDB [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED BY '新しいパスワード'; Query OK, 0 rows affected (0.003 sec) MariaDB [(none)]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.001 sec) MariaDB [(none)]> EXIT; Bye

注意:このコマンドを実行すると、認証プラグインが`unix_socket`から`mysql_native_password`に切り替わります。以降は`sudo mariadb`ではなく`mysql -u root -p`でパスワードを入力して接続することになります。unix_socket認証を維持したまま通常のパスワード認証も有効にしたい場合は後述の「応用Tips」を参照してください。

MariaDB 10.3以前の環境では`SET PASSWORD`コマンドも使えます。

-- MariaDB 10.3以前でも使える変更コマンド MariaDB [(none)]> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('新しいパスワード'); Query OK, 0 rows affected (0.001 sec) MariaDB [(none)]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.000 sec)

3. 新しいパスワードでログインできることを確認する

変更が正しく反映されているか、パスワードを指定して接続できることを確認します。

# 新しいパスワードで接続確認 $ mysql -u root -p Enter password: <- 新しいパスワードを入力 Welcome to the MariaDB monitor. MariaDB [(none)]> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | +--------------------+ 3 rows in set (0.000 sec) MariaDB [(none)]> EXIT; Bye

`SHOW DATABASES`が正常に返ってくれば、パスワード変更は完了です。MariaDBサービスは停止することなく変更できたことが確認できます。

応用・実務Tips

unix_socket認証を維持したままパスワードも設定する

unix_socket認証(sudoなしのroot接続)と通常のパスワード認証を両方有効にしたい場合は、`IDENTIFIED VIA`句で複数の認証方式を指定します。

-- unix_socketとmysql_native_passwordの両方を有効にする MariaDB [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED VIA unix_socket OR mysql_native_password USING PASSWORD('新しいパスワード'); Query OK, 0 rows affected (0.002 sec) MariaDB [(none)]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.001 sec) -- 設定確認 MariaDB [(none)]> SELECT user, host, plugin FROM mysql.user WHERE user = 'root'; +------+-----------+-------------+ | user | host | plugin | +------+-----------+-------------+ | root | localhost | unix_socket | +------+-----------+-------------+

この設定では`sudo mariadb`(unix_socket)でも`mysql -u root -p`(パスワード認証)でも接続できます。Linuxサーバーの体系的な管理スキルを習得したい方は、Linux Master Pro SeminarでMariaDB/MySQLの設定を含むサーバー管理を実践的に学べます。

mysqladminコマンドで1行でパスワードを変更する

現在のrootパスワードが分かっていれば、MariaDBにログインせずにシェルからパスワードを変更できます。

# mysqladminコマンドでパスワードを変更する(-p'パスワード'は引用符を忘れずに) $ mysqladmin -u root -p'現在のパスワード' password '新しいパスワード' # 変更後の接続確認 $ mysql -u root -p -e "SELECT user();" Enter password: +----------------+ | user() | +----------------+ | root@localhost | +----------------+

注意:コマンドラインにパスワードを直接指定すると、`history`コマンドで履歴に残ります。本番環境では`mysqladmin -u root -p`(パスワードを対話入力)の形式を使うか、`.my.cnf`ファイルで設定を記述することを検討してください。

トラブルシュート:よくあるエラーと対処法

「ERROR 1698 (28000): Access denied for user 'root'@'localhost'」が出た場合

unix_socket認証が有効な環境で`mysql -u root -p`を実行するとこのエラーが出ます。unix_socket認証はパスワード入力による認証を受け付けないためです。

# エラーが出るパターン(unix_socket認証が有効な環境) $ mysql -u root -p Enter password: ERROR 1698 (28000): Access denied for user 'root'@'localhost' # 正しい接続方法(sudo経由でOS認証を通す) $ sudo mariadb MariaDB [(none)]>

「ERROR 1396 (HY000): Operation ALTER USER failed for 'root'@'localhost'」が出た場合

指定した`user@host`の組み合わせがmysql.userテーブルに存在しない場合に発生します。実際に登録されているhostを確認して、ホスト名を合わせて再実行します。

-- 実際に登録されているrootユーザーのhost名を確認 MariaDB [(none)]> SELECT user, host FROM mysql.user WHERE user = 'root'; +------+-----------+ | user | host | +------+-----------+ | root | localhost | +------+-----------+ -- hostを確認してからALTER USERを再実行 MariaDB [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED BY '新しいパスワード';

ALTER USER後もパスワードが変わらない場合

`FLUSH PRIVILEGES`を実行していないか、同じパスワードを入力してしまっている可能性があります。passwordカラムのハッシュ値を確認して変更が反映されているか確かめます。

-- passwordカラムのハッシュ値を確認 MariaDB [(none)]> SELECT user, host, plugin, LEFT(password,20) AS pw_hash FROM mysql.user WHERE user = 'root'; +------+-----------+--------------------+----------------------+ | user | host | plugin | pw_hash | +------+-----------+--------------------+----------------------+ | root | localhost | mysql_native_pass~ | *2470C0C06DEE42FD1~ | +------+-----------+--------------------+----------------------+ -- passwordに値が入っていればALTER USERは成功している -- 変更が反映されない場合はFLUSH PRIVILEGES;を再実行する

本記事のまとめ

MariaDB rootパスワード変更の場面ごとの推奨手順をまとめます。
状況 推奨コマンド・手順
MariaDB 10.4以降・unix_socket認証が有効 sudo mariadb → ALTER USER 'root'@'localhost' IDENTIFIED BY 'X'; → FLUSH PRIVILEGES;
現在のパスワードが分かっている(旧環境) mysql -u root -p → SET PASSWORD FOR 'root'@'localhost' = PASSWORD('X'); → FLUSH PRIVILEGES;
シェルから1行で変更したい mysqladmin -u root -p'旧PW' password '新PW'
unix_socketとパスワード認証の両方を有効にしたい ALTER USER 'root'@'localhost' IDENTIFIED VIA unix_socket OR mysql_native_password USING PASSWORD('X');
パスワードを完全に忘れた(緊急復旧のみ) MariaDB停止 → --skip-grant-tables起動 → PW変更 → 通常再起動
サービスを止めずにMariaDB rootパスワードを変更するポイントは2つです。unix_socket認証を活用してsudo経由でMariaDBに接続すること、そしてALTER USERコマンドでサービスが稼働したままパスワードを更新することです。skip-grant-tablesは緊急復旧の最終手段であり、通常のパスワード変更には不要です。この区別を覚えておくだけで、本番環境での不要なダウンタイムを防げます。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、MariaDB/MySQLの初期設定・認証設計・バックアップ設計まで実機演習で学べるLinux Master Pro Seminarの詳細はこちらからご確認ください。
>> セミナー詳細・お申し込みはこちら

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録

運営

リナックスマスター.JP(代表 宮崎智広)

株式会社イーネットマーキュリーが運営するLinux教育サイトです。代表の宮崎智広は現役のLinuxサーバー管理者として20年以上の実務経験を持ち、累計3,100名以上のエンジニアを指導してきました。実践型のLinuxセミナーや無料マニュアルの配布を通じてLinux人材の育成に取り組んでいます。