MySQLやMariaDBのrootパスワードを失念しても、サービスを一時的に認証チェックなしで起動することで安全にリセットできます。全体の流れは次の4ステップです。
- MySQLサービスを停止する
- 設定ファイルに
skip-grant-tablesとskip-networkingを追記して再起動する - rootのパスワードを書き換える
- 追記した設定を削除して通常再起動し、新パスワードでログインを確認する
旧来の /etc/rc.d/init.d/mysql start --skip-grant-tables のような init.d 形式は、現代の systemd 環境では使用できません。本記事では Ubuntu 22.04/24.04・AlmaLinux 9・Rocky Linux 9 など systemd を採用した最近のディストリでの手順を解説します。
事前確認:サービス名とバージョンを把握する
作業前に、稼働しているのが MySQL か MariaDB か、そのサービス名を確認しておきます。サービス名を誤ると systemctl コマンドがエラーになり、手順が止まります。
# MySQLの場合
sudo systemctl status mysqld
# MariaDBの場合(Debian/Ubuntu 系ではサービス名が "mariadb" になることが多い)
sudo systemctl status mariadb
# バージョン確認
mysql --version
MySQL 8.0 以降では後述のパスワード変更SQL構文が 5.7 以前と異なります。バージョンを確認してから次の手順に進んでください。また、設定ファイルのパスはディストリによって異なるため、どこに my.cnf が置かれているかも確認しておくと安心です。
# 読み込まれる設定ファイルの順番を確認する
mysql --help | grep "my.cnf" -A 5
ステップ1・2:サービスを停止し、認証なしで再起動する
まずサービスを停止し、設定ファイルに2行追記してから再起動します。skip-networking を併記することで、この状態でのネットワーク越しの外部接続を遮断できます。パスワードなし運用中の攻撃面を最小化するために必ず一緒に設定してください。
# サービスを停止(MariaDB の場合は mysqld を mariadb に読み替える)
sudo systemctl stop mysqld
次に設定ファイルを開きます。ディストリ別の代表的なパスは以下のとおりです。
# RHEL 系(AlmaLinux / Rocky Linux / CentOS Stream)
sudo vi /etc/my.cnf
# Debian / Ubuntu 系(MySQL)
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
# Debian / Ubuntu 系(MariaDB)
sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf
[mysqld] セクションに以下の2行を追記します。既存の [mysqld] 行の直下に挿入するのが確実です。
[mysqld]
skip-grant-tables
skip-networking
# 再起動してパスワードなしで接続できることを確認
sudo systemctl start mysqld
mysql -u root
プロンプトが mysql> に変わればここまでの手順は成功です。
ステップ3:rootパスワードをリセットする
MySQL 8.0 以降では PASSWORD() 関数が廃止されています。旧来の UPDATE user SET Password=PASSWORD('…') 構文はエラーになります。ALTER USER 構文を使ってください。また、skip-grant-tables が有効な状態では、まず FLUSH PRIVILEGES を実行して権限テーブルを読み込ませてから変更操作を行う必要があります。
-- 権限テーブルを読み込む(skip-grant-tables 中は必須)
FLUSH PRIVILEGES;
-- MySQL 8.0 以降 / MariaDB 10.4 以降
ALTER USER 'root'@'localhost' IDENTIFIED BY '新しいパスワード';
-- 変更を即時反映
FLUSH PRIVILEGES;
exit
パスワードには英大文字・小文字・数字・記号を組み合わせ、12文字以上を推奨します。アプリケーションとの接続方式によっては、認証プラグインを明示する必要があります。
-- 認証プラグインを明示する場合(MySQL 8.x でアプリ接続エラーが出るとき)
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新しいパスワード';
FLUSH PRIVILEGES;
ステップ4:設定を元に戻して通常起動し、動作確認する
このステップが最も重要です。追記した skip-grant-tables と skip-networking の2行を必ず削除または行頭を # でコメントアウトしてから再起動してください。削除を忘れると、再起動後もパスワードなしで誰でもrootとして接続できる状態が続きます。
# 先ほど追記した2行を削除する(コメントアウトでも可)
sudo vi /etc/my.cnf # ディストリに合わせたパスで開く
# 以下の2行を削除またはコメントアウト
# skip-grant-tables
# skip-networking
# 通常モードで再起動
sudo systemctl restart mysqld
# 新しいパスワードでログインして確認
mysql -u root -p
# Enter password: ← ステップ3で設定したパスワードを入力
mysql> プロンプトが表示されればリセット完了です。確認できたら exit で抜けてください。念のため sudo systemctl status mysqld でサービスが正常動作していることも確認しておくと安心です。
バージョン・ディストリ別の注意点と落とし穴
MySQL 5.7 系での旧構文との違い
MySQL 5.7 では UPDATE 構文も動作しますが、カラム名が Password から authentication_string に変わっている点に注意が必要です。バージョンをまたいで手順を流用する場合は、ALTER USER 構文に統一するほうがミスを防げます。
-- MySQL 5.7 系での旧構文(参考:非推奨)
UPDATE mysql.user SET authentication_string=PASSWORD('新しいパスワード') WHERE User='root';
FLUSH PRIVILEGES;
MariaDB 10.4 以降の unix_socket 認証
Debian/Ubuntu の MariaDB 10.4 以降では、rootの認証方式がデフォルトで unix_socket になっている場合があります。この場合、OSのrootユーザーであれば sudo mysql で接続できるため、skip-grant-tables を使わずにパスワードを設定できます。
# unix_socket 認証の場合(sudo で直接接続)
sudo mysql
-- パスワード認証プラグインに切り替えつつパスワードを設定
ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('新しいパスワード');
FLUSH PRIVILEGES;
exit
よくある失敗パターン
ある運用現場では、skip-grant-tables を設定したまま週次メンテナンスで再起動し、翌朝まで認証なしで接続できる状態になっていたというインシデントがありました。作業後は必ず mysql -u root -p でパスワードを求められることを確認してください。
- MySQL 8.x で
PASSWORD()関数を使うとERROR 1064:ALTER USER構文に切り替える - 設定ファイルのパスを誤り
skip-grant-tablesが効かない:mysql --help | grep my.cnfで実際に読まれているファイルを確認する - MariaDB なのに
mysqldでサービス操作しようとする:systemctl status mariadbを試す - リモートホストからの接続権限も変更が必要なケース:
'root'@'%'エントリが存在する場合はSELECT User, Host FROM mysql.user WHERE User='root';で確認し、必要なら同様にALTER USERを実行する
「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。
ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。
>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)
※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。
