Рейтинг:4

Предупреждение MySQL «Пользователь существует», но пользователь не в таблице «пользователь»

флаг in
Zak

У меня была эта проблема в течение нескольких недель. Я понятия не имею, где искать дальше. Я почистил, промыл, перезапустил MySQL сервис, перезагрузил Убунту сервер. Что может вызвать это ПРЕДУПРЕЖДЕНИЕ и пользователю не показывать в пользователь Таблица? Я также пытался УДАЛИТЬ пользователя и получить 0 затронутых строк как результат. Это расстраивает невероятно! Где еще информация о пользователе хранится в схеме и как ее очистить?

Скриншот

ОБНОВИТЬ

Когда я grep имя пользователя в /var/lib/mysql/mysql Я нахожу имя пользователя в дБ.MYD файл. Хотя я не могу его редактировать. Итак, я знаю, что имя пользователя существует где-то ДРУГИМ, чем таблица пользователей.

флаг us
Если вы создадите `mysqldump`, вы сможете узнать, какие таблицы содержат эту запись. Команда может выглядеть примерно так: `mysqldump -u YourUser -p YourDatabaseName > wantsqlfile.sql`. Вы должны иметь возможность просмотреть этот файл дампа в своем любимом редакторе.
Zak avatar
флаг in
Zak
Готово .. И пользователя в дампе не найти .. Впрочем если посмотреть мое обновление . Пользователь находится в файле `mysql/db.MYD`.
флаг in
Пожалуйста, не публикуйте скриншоты текста, который можно просто скопировать и вставить. Вместо этого скопируйте и вставьте его.
Рейтинг:11
флаг mx

This happens when a user is created and granted privileges and then deleted from mysql.user instead of being dropped:

First, create a user admin_x@localhost:

mysql> create user admin_x@localhost identified by 'abc123';
Query OK, 0 rows affected (0.01 sec)

Check if the user is in mysql.user:

mysql> select user, host from mysql.user where user='admin_x';
+---------+-----------+
| user    | host      |
+---------+-----------+
| admin_x | localhost |
+---------+-----------+
1 row in set (0.01 sec)

Okay.

Now we grant this user access to db test:

mysql> grant all on test.* to admin_x@localhost;
Query OK, 0 rows affected (0.00 sec)

And check it:

mysql> show grants for admin_x@localhost;
+---------------------------------------------+
| Grants for admin_x@localhost                              |
+---------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'admin_x'@'localhost'      |
| GRANT ALL PRIVILEGES ON `test`.* TO 'admin_x'@'localhost' |
+---------------------------------------------+
2 rows in set (0.00 sec)

Now delete the user improperly from mysql.user:

mysql> delete from mysql.user where user='admin_x';
Query OK, 1 row affected (0.00 sec)

And the user is no longer in mysql.user:

mysql> select user from mysql.user where user='admin_x';
Empty set (0.00 sec)

But when you now try to create it new, you get an error:

mysql> create user admin_x@localhost identified by 'abc123';
ERROR 1396 (HY000): Operation CREATE USER failed for 'admin_x'@'localhost'

That is because admin_x@localhost still has privileges stored in mysql.db:

mysql> select User from mysql.db where user='admin_x';
+---------+
| User    |
+---------+
| admin_x |
+---------+
1 row in set (0.00 sec)

Now, when you drop the user

mysql> drop user admin_x@localhost;
Query OK, 0 rows affected (0.00 sec)

it is really gone and you can create it again:

mysql> create user admin_x@localhost identified by 'abc123';
Query OK, 0 rows affected (0.00 sec)
Zak avatar
флаг in
Zak
Ваш ответ привел меня в правильном направлении! Я пытался удалить .. несколько раз .. Проблема заключалась в том, что пользователь все еще появлялся в таблице **file** `db.MYD` для этой базы данных (`mysql`) -- поэтому я скопировал (сбросил) mysql база данных.. Создал копию.. Вставил файл дампа.. Затем я скопировал файлы «db.MYI», «db.MYD», «db.opt» и «db.frm» обратно и изменил владельца указанных файлов. вернуться к `mysql:mysql` -- сброшено, перезапущено mysql и вуаля! Мне не удалось сравнить физические файлы базы данных с выводом «выбрать пользователя из mysql.db, где пользователь = «admin_x»; Спасибо за ответ!
digijay avatar
флаг mx
Странно, что `drop` не сработало, мне также было интересно, почему вы получаете предупреждение вместо ошибки при повторном создании пользователя. В любом случае, рад, что смог помочь!
флаг co
@digijay OP выполнил оператор «создать пользователя *если не существует*», пользователь существует в соответствии с логикой БД, поэтому строки не затронуты и предупреждение

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.