我已经创建了数据库,例如'mydb'。

CREATE DATABASE mydb CHARACTER SET utf8 COLLATE utf8_bin;
CREATE USER 'myuser'@'%' IDENTIFIED BY PASSWORD '*HASH';
GRANT ALL ON mydb.* TO 'myuser'@'%';
GRANT ALL ON mydb TO 'myuser'@'%';
GRANT CREATE ON mydb TO 'myuser'@'%';
FLUSH PRIVILEGES;

现在我可以登录到数据库从任何地方,但不能创建表。

如何授予该数据库和(将来)表上的所有特权。我不能在“mydb”数据库中创建表。我总是得到:

CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);
ERROR 1142 (42000): CREATE command denied to user 'myuser'@'...' for table 't'

当前回答

仅从远程服务器访问mydb数据库

GRANT ALL PRIVILEGES ON mydb.* TO 'root'@'192.168.2.21';

从远程服务器访问所有数据库。

GRANT ALL PRIVILEGES ON * . * TO 'root'@'192.168.2.21';

其他回答

我可以使它只通过添加GRANT OPTION工作,没有总是接收许可拒绝错误

GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost' WITH GRANT OPTION;

这个SQL只授予所有数据库的基本权限。它们对于Drupal或Wordpress来说已经足够了,而且还允许一个开发人员帐户用于本地项目。

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, 
    INDEX, ALTER, CREATE TEMPORARY TABLES 
ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password';

仅从远程服务器访问mydb数据库

GRANT ALL PRIVILEGES ON mydb.* TO 'root'@'192.168.2.21';

从远程服务器访问所有数据库。

GRANT ALL PRIVILEGES ON * . * TO 'root'@'192.168.2.21';

这是一个老问题,但我不认为公认的答案是安全的。它适合创建超级用户,但不适合在单个数据库上授予特权。

grant all privileges on mydb.* to myuser@'%' identified by 'mypasswd';
grant all privileges on mydb.* to myuser@localhost identified by 'mypasswd';

%似乎不包括套接字通信,这是本地主机的目的。WITH GRANT OPTION仅适用于超级用户,否则通常存在安全风险。

MySQL 5.7+的更新提示如下:

使用GRANT语句修改现有用户的属性 Privileges已弃用,将在未来的版本中删除。使用 ALTER USER语句用于此操作。

所以设置密码应该用单独的命令。感谢来自@ scare -wombat的评论。

ALTER USER 'myuser'@'%' IDENTIFIED BY 'mypassword';
ALTER USER 'myuser'@'localhost' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON mydb.* TO myuser@localhost IDENTIFIED BY 'mypasswd';

适用于schema上的特权:)

可选:在mypasswd之后,您可以添加WITH GRANT OPTION