Не может предоставлять привилегии базе данных mysql

У меня есть версия mysql Server: 5.5.32-0ubuntu0.12.04.1 (Ubuntu) установлен Linux Ubuntu 12.04 LTS.

Кажется, у меня есть все права доступа как root. Я могу создать пользователя и db. Тем не менее, я не могу предоставить пользователю все разрешения для db.

My.my.cnf:

[client]
user=root
password=test

Я вхожу в систему через mysql -u root -h localhost -p, но я не могу войти без опции -p, хотя у меня есть .my.cnf(не проблема, но нечетная).

Было множество пользователей root, поэтому я избавился от них, и у меня есть эти пользователи:

mysql> SELECT host,user,password FROM mysql.user;
+-----------+------------------+-------------------------------------------+
| host      | user             | password                                  |
+-----------+------------------+-------------------------------------------+
| localhost | root             | ***************************************** |
| localhost | debian-sys-maint | ***************************************** |
+-----------+------------------+-------------------------------------------+

mysql> SHOW GRANTS FOR 'root'@'localhost';
+----------------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]                                                                                            |
+----------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*****************************************' |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION                                                         |
+----------------------------------------------------------------------------------------------------------------------+

Теперь я создаю db, пользователя. В последней строке отображается ошибка при предоставлении разрешений. Не могли бы вы сообщить мне, почему я получаю эту ошибку и что могу сделать, чтобы сделать эту работу?

mysql> create database staging;
Query OK, 1 row affected (0.00 sec)

mysql> CREATE USER 'staging'@'localhost' IDENTIFIED BY 'test';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON staging.* TO 'staging'@'localhost';
ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'staging'

Ответ 1

Во-первых, определите пользователя, с которым вы вошли в систему, как:

 select user(); select current_user();

Результат для первой команды - это то, что вы пытались войти в систему, а второй - это то, на что вы действительно связаны. Убедитесь, что вы вошли в систему как [email protected] в mysql.

Проблема заключалась в том, что установка, которую я придумал, не обеспечивала Grant_priv до [email protected]. Вот как вы можете проверить.

mysql> SELECT host,user,password,Grant_priv,Super_priv FROM mysql.user;
+-----------+------------------+-------------------------------------------+------------+------------+
| host      | user             | password                                  | Grant_priv | Super_priv |
+-----------+------------------+-------------------------------------------+------------+------------+
| localhost | root             | ***************************************** | N          | Y          |
| localhost | debian-sys-maint | ***************************************** | Y          | Y          |
| localhost | staging          | ***************************************** | N          | N          |
+-----------+------------------+-------------------------------------------+------------+------------+

Вы можете видеть, что для Grant_priv установлено значение N для root @localhost. Это должно быть Y. Вот как я исправил это:

UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
FLUSH PRIVILEGES;
GRANT ALL ON *.* TO 'root'@'localhost';

Я получил некоторую ошибку разрешения, но когда я вошел в систему, все было в порядке.

Ответ 2

попробуйте сбросить привилегии после предоставления разрешений

GRANT ALL PRIVILEGES ON staging.* TO 'staging'@'localhost' IDENTIFIED BY 'test';
FLUSH PRIVILEGES;

Ответ 3

Для тех, кто все еще спотыкается на это, как и я, стоит проверить, чтобы попытка GRANT еще не существовала:

SHOW GRANTS FOR username;

В моем случае ошибка не была на самом деле потому, что была ошибка разрешения, но поскольку GRANT уже существовал.