パッケージphp
、mariadb
、およびnginx
とともにUbuntu 16.04 LTSをインストールしました。 mysql_secure_installation
を実行し、rootパスワードを変更しました。
これで、通常のユーザーアカウントとしてUbuntuにログインしているときにルートアカウントを使用してmysql
にログインしようとすると、アクセスが拒否されます。
Sudo mysql
を使用してログインすると、mysqlはパスワードを要求しません。 mysql_secure_installtion
を実行すると、古い設定が永続的に設定されないことがわかります。
何が間違っていますか?
最近、Ubuntu 15.04を16.04にアップグレードしましたが、これでうまくいきました。
まず、Sudo mysqlで接続します
Sudo mysql -u root
データベースに存在するアカウントを確認してください
SELECT User,Host FROM mysql.user;
+------------------+-----------+
| User | Host |
+------------------+-----------+
| admin | localhost |
| debian-sys-maint | localhost |
| magento_user | localhost |
| mysql.sys | localhost |
| root | localhost |
現在のroot @ localhostアカウントを削除する
mysql> DROP USER 'root'@'localhost';
Query OK, 0 rows affected (0,00 sec)
ユーザーを再作成する
mysql> CREATE USER 'root'@'%' IDENTIFIED BY '';
Query OK, 0 rows affected (0,00 sec)
ユーザーに許可を与えます(特権をフラッシュすることを忘れないでください)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
Query OK, 0 rows affected (0,00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0,01 sec)
MySQLを終了し、Sudoなしで再接続を試みます。
これが誰かを助けることを願っています:)
5.7をインストールし、
root
ユーザーにパスワードを提供しない場合、auth_socket
プラグインが使用されます。そのプラグインは気にせず、パスワードを必要としません。ユーザーがUNIXソケットを使用して接続しているかどうかを確認し、ユーザー名を比較します。
「plugin:auth_socket」を使用したMySQL 5.7のユーザーパスワードの変更
したがって、plugin
をmysql_native_password
に戻すには:
Sudoでログイン:
Sudo mysql -u root
plugin
を変更し、1つのコマンドでパスワードを設定します。
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'test';
もちろん、上記のコマンドを使用して空のパスワードを設定することもできます。
レコード(およびMariaDB < 10.2
ユーザー)だけのために、パスワードを提供せずにplugin
のみを変更する(空のままにする)別の方法もあります。
update mysql.user set plugin = 'mysql_native_password' where User='root';
// to change the password too (credits goes to Pothi Kalimuthu)
// UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('secret') WHERE User = 'root';
FLUSH PRIVILEGES;
要するに、MariaDBで
UPDATE mysql.user SET plugin = 'mysql_native_password',
Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';
nEWPASSWORDを必要なパスワードに置き換えます。
ここでの問題は、MariaDBまたはMySQLがインストール/更新されるとき(特にある時点でルートがパスワードなしで設定されている場合)、Usersテーブルでパスワードが実際に空(または無視)であり、ログインは対応するシステムユーザーに依存することですMySQLユーザーに。システムルートに切り替えて、次のように入力すると、次のようにテストできます。
mysql -uroot -p
次に、パスワードを入力しないか、wrongパスワードを入力します。おそらくあなたは許可されます(パスワードは無関係であり、ユーザーが定義されているので、単に# mysql
でunixルートからログインすることさえできます)。
それで何が起きているのでしょうか?さて、rootとしてログインして次の操作を行うと:
select User,Host,plugin from mysql.user;
+----------------+-----------+-----------------------+
| User | Host | plugin |
+----------------+-----------+-----------------------+
| root | localhost | auth_socket |
+----------------+-----------+-----------------------+
auth_socket
(MariaDBではunix_socket
と表示される場合があります)に注意してください。これらのソケットはパスワードを無視し、withoutパスワードチェックで対応するUnixユーザーを許可します。これがrootでログインできるが、別のユーザーではログインできない理由です。
したがって、解決策は、auth_socket/unix_socket
を使用しないようにユーザーを更新し、パスワードを適切に設定することです。
2017年のUbuntuバージョン16にあるMariaDB(<10.2、以下のコメントを参照)ではこれで十分です。 NEWPASSWORDはパスワードです。 mysql_native_password
をそのまま入力します。
UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';
(プラグインを空に設定しても機能する可能性があります。YMMV。私はこれを試しませんでした。したがって、これは代替です。)
UPDATE mysql.user SET plugin = '', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';
そうでなければ:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NEWPASSWORD';
それから
FLUSH PRIVILEGES;
記録のために、ユーザーを削除して '%'で再作成するソリューションでは、データベースから完全にロックアウトされ、grant
ステートメントを正確に取得しない限り、他の問題を引き起こす可能性があります。あなたはすでに持っています。
私の経験では、他のユーザーは初期インストール/更新の一部ではなく手動で追加されるため、この問題はrootユーザーでのみ発生します。
ベースリポジトリからMySQL/MariaDBをインストールした場合、ユーザーはUnixログインからMySQLルートユーザーとしてMySQLにログインできません(Sudoアクセス)
MySQLルートシェルにログインします。
$ Sudo mysql -u root -p
以下のクエリを実行します。
use mysql;
update user set plugin='mysql_native_password' where user='root';
flush privileges;
quit;
新しいシェルを開いてから:
$ mysql -u root -p
新しいmysqlアカウントを作成してみてください、私にとってはうまくいきました(mysql 5.7.12):
Sudoとしてログイン:
Sudo mysql -uroot
新しいユーザーを作成し、権限を付与します(パスワードなし):
CREATE USER 'admin'@'localhost' IDENTIFIED BY '';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
新しいユーザーとしてログイン:
mysql -uadmin
私は2つのことをしなければなりませんでした(@Todorと@Loremhipsumに感謝します):
update mysql.user set plugin = 'mysql_native_password' where User='root';
grant all privileges on *.* to 'root'@'localhost';
その後:
FLUSH PRIVILEGES;
ユーザーroot
を削除することはお勧めしません。
最初にこのコードを試してください、
echo "CREATE USER 'root'@'localhost' IDENTIFIED BY 'root';" > your_init_file.sql
echo "GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;" >> your_init_file.sql
echo "FLUSH PRIVILEGES;" >> your_init_file.sql
その後、
killall mysqld
mysqld_safe --init-file=$PWD/your_init_file.sql
次にCtrl+Z
を押してbg
と入力して、フォアグラウンドからバックグラウンドにプロセスを実行し、次の方法でアクセスを確認します。
mysql -u root -proot
mysql> show grants;
Rootユーザーでmysqlコマンドを実行すると、root @ localhostでソケット認証が有効になるため、パスワードを要求されることなくアクセスが許可されます。 。
パスワードを設定する唯一の方法は、次のようなネイティブ認証に切り替えることです。
$須藤mysql
mysql> ALTER USER 'root' @ 'localhost' mysql_native_password WITH 'test'で識別;
MariaDBを使用するために作成したいくつかのプロビジョニングスクリプトを調整しており、この問題に遭遇しました。ここで多くの情報をつなぎ合わせて Gazzerの答え 問題に本当にゼロが入ります。すべてはauth_socket
/unix_socket
設定に要約されます。
そのため、MariaDB 5.5(Ubuntu 14.04)およびMariaDB 10(Ubuntu 16.04)を使用している場合、MySQLにログインしてこのコマンドを実行すると、すぐに問題が解決しました。
UPDATE mysql.user SET plugin='' WHERE User='root';
FLUSH PRIVILEGES;
Loremhipsumによるこの投稿の時点で最も投票された回答 を含む他の回答は、ユーザーをドロップしてから再作成することを推奨することにより、悪い習慣を本当に奨励します。私にとって、それはかなり根本的な解決策です。 plugin
の値を無効にし、特権をフラッシュし、生き延びるための最良/最も簡単なソリューションです。