#### 1. 创建用户 创建一个新用户并设置密码的命令如下: ```sql CREATE USER 'username'@'host' IDENTIFIED BY 'password'; ``` - `localhost` 表示仅允许本地连接。 - `%` 表示允许所有 IP 地址连接。
#### 2. 赋予部分权限 可以为用户赋予特定的权限,例如只允许进行查询、插入、更新和删除操作: ```sql GRANT SELECT, INSERT, UPDATE, DELETE ON testdb.* TO 'abc'@'%'; ```
#### 3. 赋予所有权限 如果需要赋予用户所有权限,并允许其将权限授予其他用户,可以使用以下命令: ```sql GRANT ALL PRIVILEGES ON testdb.* TO 'abc'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION; ``` 注意:`WITH GRANT OPTION` 允许用户将自己拥有的权限授予他人。
#### 2. 查看其他用户的权限 ```sql SHOW GRANTS FOR 'abc'@'%'; ```
### 三、撤销用户权限
#### 1. 撤销所有权限 ```sql REVOKE ALL PRIVILEGES ON *.* FROM '用户名'@'%'; ```
#### 2. 撤销 GRANT OPTION 权限 ```sql REVOKE GRANT OPTION ON *.* FROM '用户名'@'%'; ```
### 四、MySQL 权限层次 MySQL 支持多个层次的权限控制,具体如下:
#### 1. 服务器级别权限 作用于整个 MySQL 服务器: ```sql GRANT SELECT ON *.* TO 'dba'@'localhost'; ```
#### 2. 数据库级别权限 作用于单个数据库: ```sql GRANT SELECT ON testdb.* TO 'dba'@'localhost'; ```
#### 3. 表级别权限 作用于单个数据表: ```sql GRANT SELECT, INSERT, UPDATE, DELETE ON testdb.orders TO 'dba'@'localhost'; ```
#### 4. 列级别权限 作用于表中的特定列: ```sql GRANT SELECT (id, se, rank) ON testdb.apache_log TO 'dba'@'localhost'; ```
#### 5. 存储过程和函数权限 作用于存储过程或函数: ```sql GRANT EXECUTE ON PROCEDURE testdb.pr_add TO 'dba'@'localhost'; GRANT EXECUTE ON FUNCTION testdb.fn_add TO 'dba'@'localhost'; ```
### 五、注意事项
1. **权限生效**:修改权限后,用户需要重新连接 MySQL 数据库,权限才会生效。 2. **授权选项**:如果希望用户能够将权限授予其他用户,必须添加 `WITH GRANT OPTION` 选项。
### 六、常见错误及解决方法
#### 错误:Host is blocked because of many connection errors; unblock with ‘mysqladmin flush-hosts’ **原因**:同一 IP 在短时间内产生过多中断的数据库连接,导致主机被阻塞。 **解决方法**: 1. 使用 `mysqladmin` 命令清除缓存: ```sh mysqladmin -u root -p flush-hosts ``` 2. 在 MySQL 控制台中执行: ```sql FLUSH HOSTS; ```
### 七、授权表结构 MySQL 的授权表包括 `user`、`db`、`host`、`tables_priv` 和 `columns_priv`。这些表用于记录用户权限信息,具体用途如下: