前書き
パスワードを忘れるのは私たちにとって最高のことです。 MySQLまたはMariaDBデータベースのrootパスワードを忘れたり紛失したりした場合でも、サーバーとsudo
対応のユーザーアカウントにアクセスできる場合は、アクセスを取得してパスワードをリセットできます。
このチュートリアルでは、MySQLとMariaDBの古いバージョンと新しいバージョンのルートパスワードをリセットする方法について説明します。
前提条件
ルートMySQL / MariaDBパスワードを回復するには、次のものが必要です。
-
sudoユーザーでMySQLまたはMariaDBを実行しているLinuxサーバーにアクセスします。
[[step-1 -—-データベースバージョンの識別]] ==ステップ1—データベースバージョンの識別
最新のLinuxディストリビューションのほとんどには、MySQLまたはMariaDBのいずれかが同梱されています。MariaDBは、MySQLと完全に互換性のある人気のドロップイン代替品です。 使用するデータベースとそのバージョンに応じて、異なるコマンドを使用してルートパスワードを回復する必要があります。
次のコマンドでバージョンを確認できます。
mysql --version
MySQLで次のような出力が表示されます。
MySQL outputmysql Ver 14.14 Distrib 5.7.16, for Linux (x86_64) using EditLine wrapper
または、MariaDBに対して次のように出力します。
MariaDB outputmysql Ver 15.1 Distrib 5.5.52-MariaDB, for Linux (x86_64) using readline 5.1
後で使用するため、実行しているデータベースとバージョンをメモします。 次に、データベースに手動でアクセスできるようにデータベースを停止する必要があります。
[[step-2 -—-データベースサーバーの停止]] ==ステップ2—データベースサーバーの停止
ルートパスワードを変更するには、事前にデータベースサーバーをシャットダウンする必要があります。
MySQLの場合は次のようにできます。
sudo systemctl stop mysql
また、MariaDBの場合:
sudo systemctl stop mariadb
データベースサーバーを停止したら、手動でアクセスしてルートパスワードをリセットします。
[[step-3 -—- restarting-the-database-server-without-permission-checking]] ==ステップ3—権限チェックなしでデータベースサーバーを再起動する
ユーザー権限に関する情報をロードせずにMySQLとMariaDBを実行すると、パスワードを入力せずにルート権限でデータベースコマンドラインにアクセスできます。 これにより、知らなくてもデータベースにアクセスできます。
これを行うには、データベースがユーザー特権情報を格納するgrant tablesをロードしないようにする必要があります。 これは少しセキュリティ上のリスクがあるため、他のクライアントが接続できないようにネットワークもスキップする必要があります。
許可テーブルをロードしたり、ネットワークを有効にせずにデータベースを起動します。
sudo mysqld_safe --skip-grant-tables --skip-networking &
このコマンドの最後にあるアンパサンドにより、このプロセスがバックグラウンドで実行されるため、端末を引き続き使用できます。
これで、rootユーザーとしてデータベースに接続できるようになりました。パスワードを要求するべきではありません。
mysql -u root
代わりに、すぐにデータベースシェルプロンプトが表示されます。
MySQLプロンプト
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
MariaDBプロンプト
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
これでrootアクセスが可能になったので、rootパスワードを変更できます。
[[step-4 -—- changeing-the-root-password]] ==ステップ4—ルートパスワードの変更
MySQLの最新バージョンのルートパスワードを変更する簡単な方法の1つは、ALTER USER
コマンドを使用することです。 ただし、許可テーブルが読み込まれていないため、このコマンドは現在機能しません。
FLUSH PRIVILEGES
コマンドを発行して、許可テーブルを再ロードするようにデータベースサーバーに指示しましょう。
FLUSH PRIVILEGES;
これで、実際にルートパスワードを変更できます。
MySQL 5.7.6 and newerとMariaDB 10.1.20 and newerの場合は、次のコマンドを使用します。
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
MySQL 5.7.5 and olderおよびMariaDB 10.1.20以前の場合は、次を使用します。
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');
必ずnew_password
を選択した新しいパスワードに置き換えてください。
[。注意]##
Note:ALTER USER
コマンドが機能しない場合は、通常、より大きな問題を示しています。 ただし、代わりにUPDATE ... SET
を試してrootパスワードをリセットすることができます。
UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';
この後、必ず許可テーブルをリロードしてください。
どちらの場合でも、コマンドが正常に実行されたことの確認が表示されます。
OutputQuery OK, 0 rows affected (0.00 sec)
パスワードが変更されたため、データベースサーバーの手動インスタンスを停止して、以前と同じように再起動できます。
[[step-5 -—- restart-the-database-server-normally]] ==ステップ5—データベースサーバーを通常どおり再起動します
まず、手順3で手動で起動したデータベースサーバーのインスタンスを停止します。 このコマンドは、MySQLまたはMariaDBプロセスのPIDまたはプロセスIDを検索し、SIGTERM
を送信して、クリーンアップ操作の実行後にスムーズに終了するように指示します。 詳細については、this Linux process management tutorialを参照してください。
MySQLの場合は、次のように使用します。
sudo kill `cat /var/run/mysqld/mysqld.pid`
MariaDBの場合:
sudo kill `/var/run/mariadb/mariadb.pid`
次に、systemctl
を使用してサービスを再起動します。
MySQLの場合は、次のように使用します。
sudo systemctl start mysql
MariaDBの場合:
sudo systemctl start mariadb
次のコマンドを実行して、新しいパスワードが正しく適用されたことを確認できます。
mysql -u root -p
これで、コマンドは新しく割り当てられたパスワードを要求するようになります。 これを入力すると、期待どおりにデータベースプロンプトにアクセスできるはずです。
結論
これで、MySQLまたはMariaDBサーバーへの管理アクセスが復元されました。 選択した新しいルートパスワードが強力で安全であることを確認し、安全な場所に保管してください。