1.MySQL 创建用户
语法格式:
CREATE USER <用户名> [ IDENTIFIED ] BY [ PASSWORD ] <口令>
语法说明如下:
1) <用户名>
指定创建用户账号,格式为 'user_name'@'host_name'。这里user_name是用户名,host_name为主机名,即用户连接 MySQL 时所在主机的名字。
若在创建的过程中,只给出了账户的用户名,而没指定主机名,则主机名默认为“%”,表示一组主机。
2) PASSWORD
可选项,用于指定散列口令,即若使用明文设置口令,则需忽略PASSWORD关键字;
若不想以明文设置口令,且知道 PASSWORD() 函数返回给密码的散列值,则可以在口令设置语句中指定此散列值,但需要加上关键字PASSWORD。
3) IDENTIFIED BY子句
用于指定用户账号对应的口令,若该用户账号无口令,则可省略此子句。
4) <口令>
指定用户账号的口令,在IDENTIFIED BY关键字或PASSWOED关键字之后。
给定的口令值可以是只由字母和数字组成的明文,也可以是通过 PASSWORD() 函数得到的散列值。
使用 CREATE USER 语句应该注意以下几点:
如果使用 CREATE USER 语句时没有为用户指定口令,那么 MySQL
允许该用户可以不使用口令登录系统,然而从安全的角度而言,不推荐这种做法。
使用 CREATE USER 语句必须拥有 MySQL 中 MySQL 数据库的 INSERT 权限或全局 CREATE USER 权限。
使用 CREATE USER 语句创建一个用户账号后,会在系统自身的 MySQL 数据库的 user
表中添加一条新记录。若创建的账户已经存在,则语句执行时会出现错误。
新创建的用户拥有的权限很少。他们可以登录 MySQL,只允许进行不需要权限的操作,如使用 SHOW 语句查询所有存储引擎和字符集的列表等。
如果两个用户具有相同的用户名和不同的主机名,MySQL 会将他们视为不同的用户,并允许为这两个用户分配不同的权限集合。
【实例 1】使用 CREATE USER 创建一个用户,用户名是 james,密码是 tiger,主机是 localhost。输入的 SQL 语句和执行过程如下所示。
mysql> CREATE USER 'james'@'localhost' IDENTIFIED BY 'tiger';
Query OK, 0 rows affected (0.12 sec)
在 Windows 命令行工具中,使用新创建的用户 james 和密码 tiger 登录数据库服务器,如下所示。
C:\Users\USER>mysql -h localhost -u james -p
Enter password: *****
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.20-log MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
2.MySQL 的创建用户和授权:这是标准的做法
mysql> create user user_test identified by '123456'; 或指定主机
mysql> create user user_test@'1.1.1.1' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql>
mysql> select * from mysql.user;
+-----------+---------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+-------------+------------------+--------------+-----------------+------------------+------------------+----------------+-----------------------------+---------------+-------------+-----------------+----------------------+-----------------------+-------------------------
| Host | User | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Reload_priv | Shutdo_priv | Lock_tables_priv | Execute_priv | Repl_slave_priv | Repl_client_priv | Create_view_priv | Show_view_priv | Create_routine_pr09_subject | max_questions | max_updates | max_connections | max_user_connections | plugin | authentication_string
+-----------+---------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+-------------+------------------+--------------+-----------------+------------------+------------------+----------------+-----------------------------+---------------+-------------+-----------------+----------------------+-----------------------+-------------------------
| localhost | root | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | 0 | 0 | 0 | 0 | mysql_native_password | *847F22511E63C7ACE6146E8
| localhost | mysql.session | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | 0 | 0 | 0 | 0 | mysql_native_password | *THISISNOTAVALIDPASSWORD
| localhost | mysql.sys | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | 0 | 0 | 0 | 0 | mysql_native_password | *THISISNOTAVALIDPASSWORD
| % | root | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | 0 | 0 | 0 | 0 | mysql_native_password | *847F22511E63C7ACE6146E8
| localhost | doggggggg | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | 0 | 0 | 0 | 0 | mysql_native_password | *847F22511E63C7ACE6146E8
| % | admin_test | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | 0 | 0 | 0 | 0 | mysql_native_password | *50378C3B9EBAEEC633B913A
| % | user_test | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | 0 | 0 | 0 | 0 | mysql_native_password | *847F22511E63C7ACE6146E8
+-----------+---------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+-------------+------------------+--------------+-----------------+------------------+------------------+----------------+-----------------------------+---------------+-------------+-----------------+----------------------+-----------------------+-------------------------
7 rows in set (0.00 sec)
mysql>
mysql>
mysql> # 因为 mysql.user 表中的 Host 列是 localhost,
mysql> # 所以在执行授权的命令要想成功必须严格匹配 mysql.user 表中 @
mysql> # 如果是对 *.* 授权,则查询 mysql.user 即可看到授权结果
mysql> # 如果是对 robdb.* 授权,则查询 mysql.db 即可看到授权结果
mysql>
mysql> GRANT SELECT on robertdb.* To 'user_test'@'192.168.56.101';
ERROR 1133 (42000): Can't find any matching row in the user table
mysql>
mysql>
mysql> GRANT SELECT on *.* To 'user_test'@'%';
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql>
3. GRANT 语句是否隐含创建用户,取决于 grant 的写法, 和环境变量 sql_mode
mysql> GRANT SELECT ON *.* To 'aaaa'@'%'; ---创建失败,因为 sql_mode 中 NO_AUTO_CREATE_USER 不允许创建没有密码的用户, 解决办法是添加一个indentified 子句
ERROR 1133 (42000): Can't find any matching row in the user table
mysql>
mysql>
mysql> GRANT SELECT ON *.* To 'aaaa'@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql>
mysql>
mysql> show variables like '%mode%';
+--------------------------+----------------------------------------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------------------------------------+
| block_encryption_mode | aes-128-ecb |
| gtid_mode | OFF |
| innodb_autoinc_lock_mode | 1 |
| innodb_strict_mode | ON |
| offline_mode | OFF |
| pseudo_slave_mode | OFF |
| rbr_exec_mode | STRICT |
| slave_exec_mode | STRICT |
| sql_mode | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+--------------------------+----------------------------------------------------------------+
9 rows in set, 1 warning (0.02 sec)
mysql>
以前一直使用如下面的语句给mysql服务器添加用户:
grant CREATE, DROP,INSERT, SELECT, DELETE, UPDATE,ALTER on xxx.* to xxx;
grant CREATE, DROP,INSERT, SELECT, DELETE, UPDATE,ALTER on xxx.* to xxx@localhost;
set password for xxx@'%' = password(xxx);
set password for xxx@'localhost' = password(xxx);
flush privileges;
谁知道今天在另一个Mysql服务器上照葫芦画瓢出了问题,抱错说:
ERROR 1133 (42000): Can’t find any matching row in the user table
原来Mysql还有一个模式控制这个,那就是NO_AUTO_CREATE_USER模式。