MySQL rootユーザーの完全な権限を復元するにはどうすればよいですか?


108

テーブルを変更する機能など、MySQL rootユーザーからいくつかの権限を誤って削除しました。このユーザーを(すべての権限で)元の状態に復元する方法はありますか?

UPDATE mysql.user SET Grant_priv = 'Y', Super_priv = 'Y' WHERE User = 'root';
# MySQL returned an empty result set (i.e. zero rows).
FLUSH PRIVILEGES ;
# MySQL returned an empty result set (i.e. zero rows).


#1045 - Access denied for user 'root'@'localhost' (using password: YES)
GRANT ALL ON *.* TO 'root'@'localhost'

1
2番目のエラーはパスワードの問題のようです。おそらく、あなたがすでに「root」@「localhost」アカウントを持っていると仮定したことによる私の過失。--skip-grant-tablesを指定してmysqldを再実行し、「DROP USER 'root' @ 'localhost'; GRANT ALL PRIVILEGES ON TO 'ルート' @ '%';" 代わりに?アクセス権を付与する必要があるアカウントを見つける最善の方法は、「SELECT User、Host FROM mysql.user WHERE User = 'root';」を実行することです...これにより、@の後に使用するホスト名がわかりますGRANTコマンドのシンボル。
DMI

1
トピックがトピックから外れている場合にmodsがトピックをオフトピックとしてマークするのは不適切です。ただし、トピックに適した別のStack Exchangeサイトがあり、その場合はそれを特定する必要があります。(改造に対する恥。)これはどこに行くかです:dba.stackexchange.com
Jon Davis

^同意し、再開に投票しました。DBAサイトの存在により閉鎖された場合、少なくとも言及され、OPがそこに誘導されているはずです。(または、ここで別の質問の複製としてクローズされる可能性があります)
不可分

回答:


148

GRANT ALL動作しない場合は、次を試してください。

  1. オプションmysqldで停止して再起動し--skip-grant-tablesます。
  2. mysqldただ次のようにサーバーに接続しますmysql(つまり、-pオプションはなく、ユーザー名は必要ない場合があります)。
  3. mysqlクライアントで次のコマンドを発行します。

    UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';

    FLUSH PRIVILEGES;

その後、実行GRANT ALL ON *.* TO 'root'@'localhost';して機能させることができるはずです。


7
1.だけでmysqldサーバーに接続する方法:mysql 2. UPDATEを発行したときmysql.user SET Grant_priv = '1' WHERE User = 'root'; FLUSH PRIVILEGES; 私はクエリに成功しました、0行に影響しました(0.00秒)一致しました:2変更されました:0警告:0クエリに問題ありません、0行に影響しました(0.00秒)。rootユーザーとしてphpMyAdminにログインしても、「特権なし」と表示されます。
スティーブン

上記の手順を完了すると、GRANT ALLコマンドを実行できるようになります。mysqldに接続するには、パスワードは必要ないということです-ユーザー名が機能するかどうか、または「root」である必要があるかどうかを思い出せません。
DMI

2
これは動作しません。Stevenが言ったように、ユーザーテーブルの更新は0レコードに影響します。rootユーザーは引き続き付与できません。
セリン

1
はい、動作します。また、Windowsを使用している場合は、mysql構成ファイルのセクションに一時的に追加skip-grant-tablesするだけ[mysqld]で、パスワードなしでコマンドラインからmysqlにアクセスできます。
マーカス2013年

1
私はグラント部分(うまくいかなかった)で9時間以上固執し、あなたの答えが私を救いました...あなたは命の恩人です。ありがとう
Ali SH

91

rootユーザーを誤って削除してしまった場合は、次の1つのことを行えます。

  1. MySQLサービスを停止します
  2. 走る mysqld_safe --skip-grant-tables &
  3. タイプ mysql -u root -pしてEnterを押します。
  4. パスワードを入力してください
  5. mysqlコマンドラインで次のように入力します。 use mysql;

次に、このクエリを実行します。

insert into `user` (`Host`, `User`, `Password`, `Select_priv`, `Insert_priv`, `Update_priv`, `Delete_priv`, `Create_priv`, `Drop_priv`, `Reload_priv`, `Shutdown_priv`, `Process_priv`, `File_priv`, `Grant_priv`, `References_priv`, `Index_priv`, `Alter_priv`, `Show_db_priv`, `Super_priv`, `Create_tmp_table_priv`, `Lock_tables_priv`, `Execute_priv`, `Repl_slave_priv`, `Repl_client_priv`, `Create_view_priv`, `Show_view_priv`, `Create_routine_priv`, `Alter_routine_priv`, `Create_user_priv`, `ssl_type`, `ssl_cipher`, `x509_issuer`, `x509_subject`, `max_questions`, `max_updates`, `max_connections`, `max_user_connections`) 
values('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','','0','0','0','0');

次に、mysqldを再起動します

編集:2018年10月6日

他の誰かがこの答えを必要とする場合に備えて、今日innodb_version 5.6.36-82.010.1.24-MariaDBを使用して試してみましたがバッククォートを削除すると機能します(単一引用符も使用せず、削除するだけです)。

insert into user (Host, User, Password, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv, Show_db_priv, Super_priv, Create_tmp_table_priv, Lock_tables_priv, Execute_priv, Repl_slave_priv, Repl_client_priv, Create_view_priv, Show_view_priv, Create_routine_priv, Alter_routine_priv, Create_user_priv, ssl_type, ssl_cipher, x509_issuer, x509_subject, max_questions, max_updates, max_connections, max_user_connections) 
values('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','','0','0','0','0');

1
@Bipin、変ではなくmysqld.exebinフォルダにのみありますmysqld_safe.exe。「mysqld_safe」とはどういう意味ですか?
Pacerier、2015年

4
MySQL 5.5の場合、さらに2つの特権、Event_privとTrigger_privが必要です。
グレッグベル

5.6.5でこれが壊れると
思います

1
- @Pacerierによると、このポストあなたが本当に必要としないmysqld_safe:、普通のmysqldバイナリ実行mysqld.exe --skip-grant-tables
bkwdesign

2
ERROR 1054 (42S22): Unknown column 'Password' in 'field list'
ジェイミーハットバー2017

24

また、私はrootユーザーであったときにmysqlコンソールにrootおよびデータベースの権限が表示されないため、ユーザーmysql>mysql -u 'userName' -p;とパスワードを変更しました 。

UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';

FLUSH PRIVILEGES;

このコマンドの後、すべてのデータベースがrootに表示されます。

ありがとう


1
物事の組み合わせをしなければなりませんでした。mysqldサービスを停止してから、mysqld_safe --skip-crant-tables&を実行し、次に上記のUPDATEコマンドを実行してから、mysqlを再起動してからGRANT ALL ONを実行する必要がありましたTO 'user' @ 'localhost';
Nick Woodhams

5

ルートへの挿入と再ロードの権限を拒否しました。そのため、権限を更新した後、FLUSH PRIVILEGESが機能しなくなりました(リロード特権がないため)。そのため、Ubuntu 16.04でdebian-sys-maintユーザーを使用してuser.root権限を復元しました。このファイルからuser.debian-sys-maintのパスワードを見つけることができます

sudo cat /etc/mysql/debian.cnf

あなたは私を助けてくれる!GRANTは--skip-grant-tablesモードでも機能しなかったため、ubuntu-systemとして入力すると、ルートユーザーを再度作成できるようになり、すべての権限を更新できました
lunix15

4
GRANT ALL ON *.* TO 'user'@'localhost' with GRANT OPTION;

該当する場合はそれぞれのパスワードを使用してrootからログインし、ユーザーが何であれ上記のコマンドを実行するだけです。

例えば:

GRANT ALL ON *.* TO 'root'@'%' with GRANT OPTION;

3
しかし、「root」ユーザーが特権を失った場合、これはどのように機能しますか?rootユーザーはこれを行うために昇格された特権を必要としませんか?これは私にはうまくいきませんでした。
Terungwa 2017

3

各列の特権にmysql.user値を挿入または更新するだけYです。


2

ローカルコンピューター(mysqlバージョン5.7.14)でWAMPを使用している場合ステップ1:my.iniファイルを開くステップ2:セミコロンを削除してこの行 'skip-grant-tables'のコメントを外しますステップ3:mysqlを再起動します。サーバーステップ4:mySQLコンソールを起動するステップ5:

UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
FLUSH PRIVILEGES;

ステップ6:問題は解決しました!!!!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.