MySQL用户创建脚本

26

我试图自动化MySQL用户创建过程。 我想创建一个包含MySQL用户创建语句的临时文件, 然后我将像这样调用它:

mysql -u root -proot < temp

但是我卡在了MySQL语法上: 以下是我的临时文件的内容:


DROP DATABASE IF EXISTS mytestdatabase;
CREATE DATABASE mytestdatabase;
SELECT @password:="my password";
DELETE FROM mysql.user WHERE Host='localhost' AND User='mytestdatabase';
GRANT ALL PRIVILEGES ON mytestdatabase.* TO 'mytestdatabase'@'localhost' IDENTIFIED BY PASSWORD '@password';
FLUSH PRIVILEGES;
但是这行代码
GRANT ALL PRIVILEGES ON mytestdatabase.* TO 'mytestdatabase'@'localhost' IDENTIFIED BY PASSWORD '@password';

(密码哈希应该是一个41位十六进制数)

它的解释不符合我的预期。 即使我移除@password标签周围的单引号,仍然会有错误(语法错误)。

我该如何让这个工作?


错误 1372 (HY000) 在第9行: 密码哈希应该是由41个十六进制数字组成的。 - ling
7个回答

55

为了解释这个错误的原因并展示差异:


A) 期望@password是一个哈希字符串1值:

GRANT ALL PRIVILEGES 
    ON `mydb` . * TO 'username'@'localhost' IDENTIFIED 
BY
PASSWORD '@password';

注意使用PASSWORD关键字!


B)期望@password是一个明文字符串值:

GRANT ALL PRIVILEGES 
    ON `mydb` . * TO 'username'@'localhost' IDENTIFIED 
BY
'@password';

需要注意的是,PASSWORD 关键字缺失


1 其中“哈希字符串”是 SELECT PASSWORD('明文密码'); 的结果 - 请参见Snowman的回答以获取示例。


13

如果您不想以明文形式存储密码,则可以将其保存为散列格式 -

GRANT ALL PRIVILEGES ON mytestdatabase.* TO 'mytestdatabase'@'localhost'
  IDENTIFIED BY PASSWORD '*7560636C2922C05954FE6A2446AA00C84708B57B';

哈希密码是这个查询的结果 -

SELECT PASSWORD('my password');

8

我也遇到了同样的问题,只需按下面的查询设置密码即可解决。

SET PASSWORD FOR 'user'@'localhost' = PASSWORD('MyNewPass');


5
请查看以下网址,这将帮助您解决问题:http://linuxadministrator.pro/blog/?p=147
mysql> select password('12345');
+-------------------------+
| password('123456') |
+-------------------------+
| 2ff898e158cd0311        |
+-------------------------+
1 row in set (0.00 sec)

mysql> create user test identified by password '2ff898e158cd0311';
Query OK, 0 rows affected (0.00 sec)

1

尝试:

GRANT ALL PRIVILEGES ON mytestdatabase.* 
      TO mytestdatabase@localhost IDENTIFIED BY 'PASSWORD';

PASSWORD是您的密码(请用引号括起来)。


是的,这个方法可以运行,但我听说它不太安全,因为密码可能会以明文形式出现在mysql历史文件中。如果可能的话,我更愿意避免使用这种解决方案。 - ling
然后您可以按照我展示的方式进行设置,然后像这样更改它:SET PASSWORD FOR mytestdatabase= PASSWORD('PASSWORD'); - Nir Alfasi
密码的明文形式仍然会出现,但可能因为它是从文件中调用的,所以不会被记录在“mysql历史记录”中。我可以尝试获取更多关于“mysql历史记录”的信息。谢谢。 - ling
http://www.thegeekstuff.com/2010/01/disable-mysql-history-clear-mysql_history-and-mysql_histfile/ - Nir Alfasi

0

你的代码出错了,因为你写错了,你写成了错误的方式,正确的写法是:

GRANT ALL PRIVILEGES ON *.* TO 'USER'@'localhost' IDENTIFIED BY PASSWORD '@password';

而真正的语法如下。看这里。

GRANT ALL PRIVILEGES ON *.* TO 'USER'@'localhost' IDENTIFIED BY '@password';

因为您的密码导致了该错误。它必须按照所示进行设置。


0

我打开了phpMyAdmin并进入了用户选项卡,找到了我想要连接的用户,点击了编辑权限,向下滚动到更改登录信息/复制用户部分,并选择任何主机作为主机选项,因为它被设置为本地。当我点击“Go”按钮时,它生成了一个类似于此处列出的脚本。

GRANT ALL PRIVILEGES ON * . * TO 'james'@'%' IDENTIFIED BY PASSWORD '*780E1D13F1C7713F341A117499C6D8644464C4CF' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接