MySQL创build用户和数据库权限

我正在尝试编写一个简单的shell脚本来为这个用户创build新的mysql用户和数据库。 由于我不想使用mysql root帐户,所以我创build了一个新用户(让我们称他为“创build者”)。 我给了他INSERT, SELECT, UPDATE, CREATE, CREATE USER, GRANT权限,但是我不能授予访问权为新用户创build一个数据库。

脚本看起来像这样:

 myuser=creator mypass=xxxx dbuser=newuser dbname=newdb mysql -u$myuser -p$mypass -rs -e "CREATE USER '$dbuser'@'localhost' IDENTIFIED BY '$dbpass';"; mysql -u$myuser -p$mypass -rs -e "GRANT USAGE ON * . * TO '$dbuser'@'localhost' IDENTIFIED BY '$dbpass' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;"; mysql -u$myuser -p$mypass -rs -e "CREATE DATABASE IF NOT EXISTS $dbname ;"; mysql -u$myuser -p$mypass -rs -e "GRANT ALL PRIVILEGES ON $dbname . * TO '$dbuser'@'localhost';"; mysql -u$myuser -p$mypass -rs -e "FLUSH PRIVILEGES ;"; 

我得到ERROR 1044 (42000) at line 1: Access denied for user 'creator'@'localhost' to database 'newdb' 。 当我作为“创造者”login时,我得到了同样的错误,因为“创build者”具有GRANT特权。 那么,“创造者”缺less了什么特权呢? 我希望他有尽可能最小的特权。

这里的问题非常简单。 看看事物的顺序:

 mysql -u$myuser -p$mypass -rs -e "CREATE USER '$dbuser'@'localhost' IDENTIFIED BY '$dbpass';"; mysql -u$myuser -p$mypass -rs -e "GRANT USAGE ON *. * TO '$dbuser'@'localhost' IDENTIFIED BY '$dbpass' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;"; mysql -u$myuser -p$mypass -rs -e "CREATE DATABASE IF NOT EXISTS $dbname ;"; mysql -u$myuser -p$mypass -rs -e "GRANT ALL PRIVILEGES ON $dbname . * TO '$dbuser'@'localhost';"; mysql -u$myuser -p$mypass -rs -e "FLUSH PRIVILEGES ;"; 

前三(3)行不能由$myuser执行,因为。 超级用户(例如root@localhost )必须执行前三行。

这里是另外的东西:只有root@localhost可以执行FLUSH PRIVILEGES; 。 但是,甚至没有必要,因为GRANT命令在内部执行FLUSH PRIVILEGES;

考虑到这些因素,您可以使用自己的数据库创build新用户:

 rootuser=root rootpass=rootpassword myuser=creator mypass=xxxx dbuser=newuser dbname=newdb mysql -u$rootuser -p$rootpass -rs -e "CREATE USER '$dbuser'@'localhost' IDENTIFIED BY '$dbpass';"; mysql -u$rootuser -p$rootpass -rs -e "GRANT USAGE ON *.* TO '$dbuser'@'localhost' IDENTIFIED BY '$dbpass' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;"; mysql -u$rootuser -p$rootpass -rs -e "CREATE DATABASE IF NOT EXISTS $dbname ;"; mysql -u$rootuser -p$rootpass -e "GRANT ALL PRIVILEGES ON $dbname . * TO '$dbuser'@'localhost';"; 

如果你真的不想使用root@localhost ,请按如下所示创build用户:

步骤01)作为root@localhost ,login到mysql并运行

 SELECT PASSWORD('creatorpassword'); 

这将返回一个41个字符的MD5类似的string。

步骤02)作为root@localhost ,login到mysql并运行

 SET SQL_LOG_BIN=0; GRANT ALL PRIVILEGES ON *.* to creator@localhost IDENTIFIED BY PASSWORD '41-character MD5-like string'; 

这将创build用户并设置其密码。 如果您启用了二进制日志logging,则第一行SET SQL_LOG_BIN=0只是防止将命令logging在二进制日志中。

步骤03)从mysql的审计历史logging中删除命令。

每次login到mysql时,这些命令都logging在一个名为.mysql_history的文件中。 跑步

 cd vi .mysql_history 

一旦你进入vi ,运行/SELECT PASSWORD ,按回车。 这会将您置于从文本打印PASSWORDfunction的命令行。 只需打ddZZ ,就完成了。

outlook未来,您可以使用创build者@ localhost,拥有与root @ localhost相同的权限,并且您已经很好地隐藏了密码。 你将只需要保持其完整性。

目前,根据下面的评论,我认为问题是creator用户没有权限试图授予新用户帐户。

根据文件 ,

您不能授予其他用户您自己没有的权限

所以我明白你希望让creator帐号拥有尽可能less的特权,但这不是MySQL特权模式的工作原理; 要将newdb。*上的ALL授予newuser,创build者还需要newdb。*上的ALL以及GRANT特权。