著者はCOVID-19救済基金を選択し、 Write forDOnationsプログラムの一環として寄付を受け取りました。

序章

パスワードを忘れることは私たちの最善を尽くします。 MySQLまたはMariaDBデータベースのrootパスワードを忘れたり紛失したりした場合でも、サーバーとsudo権限を持つユーザーアカウントにアクセスできる場合は、アクセスを取得してパスワードをリセットできます。

注: Ubuntu 18.04の新規インストールでは、デフォルトのMySQLまたはMariaDB構成では、通常、システムのから接続している限り、パスワードを指定せずにデータベースにアクセスできます(完全な管理者権限を使用)。 rootアカウント。 このシナリオでは、パスワードをリセットする必要がない場合があります。 データベースのrootパスワードをリセットする前に、sudo mysqlコマンドを使用してデータベースにアクセスしてみてください。 認証のデフォルト構成が変更され、その結果アクセス拒否エラーが発生した場合にのみ、このチュートリアルの手順に従ってください。

このチュートリアルでは、Ubuntu18.04のaptパッケージマネージャーとともにインストールされたMySQLおよびMariaDBデータベースのrootパスワードをリセットする方法を示します。 ルートパスワードを変更する手順は、MySQLまたはMariaDBがインストールされているかどうか、および他のベンダーのディストリビューションまたはパッケージに付属しているデフォルトのsystemd構成によって異なります。 このチュートリアルの手順は、他のシステムまたはデータベースサーバーのバージョンでも機能する可能性がありますが、Ubuntu18.04およびディストリビューション提供のパッケージで明示的にテストされています。

前提条件

MySQLまたはMariaDBroot パスワードを回復するには、次のものが必要です。

  • sudoユーザーまたはroot権限でサーバーにアクセスする他の方法でMySQLまたはMariaDBを実行しているUbuntu18.04サーバーにアクセスします。 本番サーバーに影響を与えずにこのチュートリアルのリカバリ方法を試すには、初期サーバーセットアップチュートリアルを使用して、sudo権限を持つ通常の非rootユーザーでテストサーバーを作成します。 次に、 Ubuntu18.04にMySQLをインストールする方法に従ってMySQLをインストールします。

ステップ1—データベースのバージョンを特定してサーバーを停止する

Ubuntu 18.04は、MySQLまたはMariaDBのいずれかを実行します。これは、MySQLと完全に互換性のある人気のあるドロップイン代替品です。 インストールしたパスワードに応じて、さまざまなコマンドを使用してrootパスワードを回復する必要があるため、このセクションの手順に従って、実行しているデータベースサーバーを確認してください。

次のコマンドでバージョンを確認します。

  1. mysql --version

MariaDBを実行している場合は、出力にバージョン番号が前に付いた「MariaDB」が表示されます。

MariaDB output
mysql Ver 15.1 Distrib 10.1.47-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

MySQLを実行している場合は、次のような出力が表示されます。

MySQL output
mysql Ver 14.14 Distrib 5.7.32, for Linux (x86_64) using EditLine wrapper

このチュートリアルの残りの部分で従うべき適切なコマンドを決定するので、どのデータベースをメモしてください。

root パスワードを変更するには、データベースサーバーをシャットダウンする必要があります。 MariaDBを実行している場合は、次のコマンドを使用して実行できます。

  1. sudo systemctl stop mariadb

MySQLの場合、以下を実行してデータベースサーバーをシャットダウンします。

  1. sudo systemctl stop mysql

データベースを停止した状態で、セーフモードでデータベースを再起動して、rootパスワードをリセットできます。

手順2—権限チェックなしでデータベースサーバーを再起動する

権限チェックなしでMySQLとMariaDBを実行すると、有効なパスワードを指定せずにroot権限でデータベースコマンドラインにアクセスできます。 これを行うには、データベースがユーザー特権情報を格納する付与テーブルをロードしないようにする必要があります。 これはセキュリティ上のリスクが少しあるため、ネットワークを無効にして、他のクライアントが一時的に脆弱なサーバーに接続できないようにすることもできます。

インストールしたデータベースサーバーによって、グラントテーブルをロードせずにサーバーを起動する方法が異なります。

Grantテーブルなしで開始するようにMariaDBを構成する

付与テーブルなしでMariaDBサーバーを起動するには、systemdユニットファイルを使用して、MariaDBサーバーデーモンの追加パラメーターを設定します。

次のコマンドを実行します。これにより、起動時にMariaDBが使用するMYSQLD_OPTS環境変数が設定されます。 --skip-grant-tablesおよび--skip-networkingオプションは、Grantテーブルまたはネットワーク機能をロードせずに起動するようにMariaDBに指示します。

  1. sudo systemctl set-environment MYSQLD_OPTS="--skip-grant-tables --skip-networking"

次に、MariaDBサーバーを起動します。

  1. sudo systemctl start mariadb

このコマンドは出力を生成しませんが、新しい環境変数設定を考慮して、データベースサーバーを再起動します。

sudo systemctl status mariadbで開始されていることを確認できます。

これで、パスワードを入力しなくても、MariaDB rootユーザーとしてデータベースに接続できるようになります。

  1. sudo mysql -u root

データベースシェルプロンプトがすぐに表示されます。

MariaDB prompt
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>

データベースサーバーにアクセスできるようになったので、手順3に示すようにrootパスワードを変更できます。

Grantテーブルなしで開始するようにMySQLを構成する

付与テーブルなしでMySQLサーバーを起動するには、MySQLのsystemd構成を変更して、起動時に追加のコマンドラインパラメーターをサーバーに渡します。

これを行うには、次のコマンドを実行します。

  1. sudo systemctl edit mysql

このコマンドは、nanoエディターで新しいファイルを開きます。このファイルを使用して、MySQLのサービスオーバーライドを編集します。 これらは、MySQLのデフォルトのサービスパラメータを変更します。 このファイルは空になるので、次のコンテンツを追加します。

MySQLサービスのオーバーライド
[Service]
ExecStart=
ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid --skip-grant-tables --skip-networking

最初のExecStartステートメントはデフォルト値をクリアし、2番目のステートメントはsystemdに、許可テーブルとネットワーク機能のロードを無効にするパラメーターを含む新しいスタートアップコマンドを提供します。

CTRL-xを押してファイルを終了し、Yを押して変更を保存し、ENTERを押してファイル名を確認します。

systemd構成を再ロードして、これらの変更を適用します。

  1. sudo systemctl daemon-reload

次に、MySQLサーバーを起動します。

  1. sudo systemctl start mysql

コマンドは出力を表示しませんが、データベースサーバーは起動します。 付与テーブルとネットワークは有効になりません。

rootユーザーとしてデータベースに接続します。

  1. sudo mysql -u root

データベースシェルプロンプトがすぐに表示されます。

MySQL prompt
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>

サーバーにアクセスできるようになったので、rootパスワードを変更できます。

ステップ3—ルートパスワードの変更

データベースサーバーは現在、制限付きモードで実行されています。 付与テーブルはロードされておらず、ネットワークサポートは有効になっていません。 これにより、パスワードを入力せずにサーバーにアクセスできますが、データを変更するコマンドを実行することはできません。 root パスワードをリセットするには、サーバーにアクセスできるようになったので、許可テーブルをロードする必要があります。

FLUSH PRIVILEGESコマンドを発行して、データベースサーバーに許可テーブルを再ロードするように指示します。

  1. FLUSH PRIVILEGES;

rootパスワードを変更できるようになりました。 使用する方法は、MariaDBとMySQLのどちらを使用しているかによって異なります。

MariaDBパスワードの変更

MariaDBを使用している場合は、次のステートメントを実行して root アカウントのパスワードを設定し、new_passwordを覚えやすい強力な新しいパスワードに置き換えてください。

  1. UPDATE mysql.user SET password = PASSWORD('new_password') WHERE user = 'root';

パスワードが変更されたことを示す次の出力が表示されます。

Output
Query OK, 1 row affected (0.00 sec)

MariaDBではカスタム認証メカニズムを使用できるため、次の2つのステートメントを実行して、rootアカウントに割り当てた新しいパスワードにMariaDBがデフォルトの認証メカニズムを使用するようにします。

  1. UPDATE mysql.user SET authentication_string = '' WHERE user = 'root';
  2. UPDATE mysql.user SET plugin = '' WHERE user = 'root';

ステートメントごとに次の出力が表示されます。

Output
Query OK, 0 rows affected (0.01 sec)

パスワードが変更されました。 exitと入力してMariaDBコンソールを終了し、手順4に進んでデータベースサーバーを通常モードで再起動します。

MySQLパスワードの変更

MySQLの場合、次のステートメントを実行して root ユーザーのパスワードを変更し、new_passwordを覚えやすい強力なパスワードに置き換えます。

  1. UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE user = 'root';

パスワードが正常に変更されたことを示す次の出力が表示されます。

Output
Query OK, 1 row affected (0.00 sec)

MySQLではカスタム認証メカニズムの使用が許可されているため、次のステートメントを実行して、デフォルトの認証メカニズムを使用して新しいパスワードを使用してrootユーザーを認証するようにMySQLに指示します。

  1. UPDATE mysql.user SET plugin = 'mysql_native_password' WHERE user = 'root';

前のコマンドと同様の出力が表示されます。

Output
Query OK, 1 row affected (0.00 sec)

パスワードが変更されました。 exitと入力して、MySQLコンソールを終了します。

通常の操作モードでデータベースを再起動してみましょう。

ステップ4—データベースサーバーを通常の設定に戻す

データベースサーバーを通常モードで再起動するには、行った変更を元に戻して、ネットワークを有効にし、許可テーブルをロードする必要があります。 繰り返しますが、使用する方法は、MariaDBとMySQLのどちらを使用したかによって異なります。

MariaDBの場合、前に設定したMYSQLD_OPTS環境変数の設定を解除します。

  1. sudo systemctl unset-environment MYSQLD_OPTS

次に、systemctlを使用してサービスを再起動します。

  1. sudo systemctl restart mariadb

MySQLの場合、変更されたsystemd構成を削除します。

  1. sudo systemctl revert mysql

次のような出力が表示されます。

Output
Removed /etc/systemd/system/mysql.service.d/override.conf. Removed /etc/systemd/system/mysql.service.d.

次に、systemd構成をリロードして、変更を適用します。

  1. sudo systemctl daemon-reload

最後に、サービスを再起動します。

  1. sudo systemctl restart mysql

これでデータベースが再起動され、通常の状態に戻ります。 root ユーザーとしてパスワードを使用してログインし、新しいパスワードが機能することを確認します。

  1. mysql -u root -p

パスワードの入力を求められます。 新しいパスワードを入力すると、期待どおりにデータベースプロンプトにアクセスできるようになります。

結論

MySQLまたはMariaDBサーバーへの管理アクセスを復元しました。 選択した新しいパスワードが強力で安全であることを確認し、安全な場所に保管してください。

ユーザー管理、認証メカニズム、または他のバージョンのMySQLまたはMariaDBのデータベースパスワードをリセットする方法の詳細については、公式のMySQLドキュメントまたはMariaDBドキュメントを参照してください。