Skip to content

OceanBase 用户创建与删除

用户管理核心概念

用户是 OceanBase 数据库中进行权限管理的基本单位,用于控制对数据库资源的访问。OceanBase 支持细粒度的用户权限管理,包括全局权限、数据库权限、表权限等。合理创建和管理用户对于保证数据库的安全性和可靠性至关重要。

用户类型

  • 系统用户:用于管理 OceanBase 集群的用户,如 root 用户
  • 租户管理员:每个租户的管理员用户,如 sys 租户的 root 用户
  • 普通用户:由租户管理员创建的,用于访问和操作数据库对象的用户
  • 应用用户:用于应用程序连接数据库的用户

用户创建方法

1. 使用 CREATE USER 语句创建用户

基本语法

sql
CREATE USER [IF NOT EXISTS] user_name [IDENTIFIED BY 'password'] [options];

示例

sql
-- 创建普通用户
CREATE USER 'test_user'@'%' IDENTIFIED BY 'password123';

-- 创建带有效期的用户
CREATE USER 'temp_user'@'%' IDENTIFIED BY 'password123' WITH MAX_USER_CONNECTIONS 5 PASSWORD EXPIRE INTERVAL 30 DAY;

-- 创建限制连接数的用户
CREATE USER 'app_user'@'%' IDENTIFIED BY 'password123' WITH MAX_USER_CONNECTIONS 100;

-- 创建本地用户
CREATE USER 'local_user'@'localhost' IDENTIFIED BY 'password123';

2. 使用 ALTER USER 语句修改用户

基本语法

sql
ALTER USER user_name [IDENTIFIED BY 'password'] [options];

示例

sql
-- 修改用户密码
ALTER USER 'test_user'@'%' IDENTIFIED BY 'new_password123';

-- 修改用户有效期
ALTER USER 'temp_user'@'%' PASSWORD EXPIRE INTERVAL 60 DAY;

-- 修改用户最大连接数
ALTER USER 'app_user'@'%' WITH MAX_USER_CONNECTIONS 200;

-- 锁定用户
ALTER USER 'test_user'@'%' ACCOUNT LOCK;

-- 解锁用户
ALTER USER 'test_user'@'%' ACCOUNT UNLOCK;

3. 使用 DROP USER 语句删除用户

基本语法

sql
DROP USER [IF EXISTS] user_name;

示例

sql
-- 删除单个用户
DROP USER 'test_user'@'%';

-- 删除多个用户
DROP USER 'temp_user'@'%', 'local_user'@'localhost';

-- 删除不存在的用户(使用 IF EXISTS 避免错误)
DROP USER IF EXISTS 'non_existent_user'@'%';

用户创建与删除的最佳实践

1. 用户命名规范

  • 使用有意义的用户名,反映用户的用途或所属部门
  • 避免使用敏感词汇作为用户名
  • 统一用户名格式,便于管理和审计
  • 定期清理不再使用的用户

2. 密码策略

  • 强制使用强密码,包含字母、数字和特殊字符
  • 设置合理的密码过期时间
  • 禁止使用默认密码
  • 定期强制用户修改密码
  • 记录密码修改历史
sql
-- 设置强密码策略
ALTER SYSTEM SET password_policy = 'STRONG';

-- 设置密码过期时间为90天
ALTER SYSTEM SET password_expire_time = 90;

3. 权限管理

  • 遵循最小权限原则,只授予用户必要的权限
  • 使用角色管理权限,便于批量授权和回收
  • 定期审查用户权限,及时回收不再需要的权限
  • 记录权限变更历史
sql
-- 创建角色
CREATE ROLE 'read_only_role';

-- 授予角色权限
GRANT SELECT ON *.* TO 'read_only_role';

-- 将角色授予用户
GRANT 'read_only_role' TO 'test_user'@'%';

4. 连接管理

  • 限制用户的最大连接数,避免资源耗尽
  • 限制用户的连接来源,提高安全性
  • 监控用户的连接状态,及时发现异常连接
sql
-- 创建限制连接数和来源的用户
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'password123' WITH MAX_USER_CONNECTIONS 100;

用户管理常用命令

1. 查看用户信息

查看所有用户

sql
SELECT user, host FROM mysql.user;

查看用户权限

sql
-- 方法1:使用 SHOW GRANTS 语句
SHOW GRANTS FOR 'test_user'@'%';

-- 方法2:使用 SHOW CREATE USER 语句
SHOW CREATE USER 'test_user'@'%';

查看用户连接状态

sql
SHOW PROCESSLIST;

-- 查看特定用户的连接
SHOW PROCESSLIST WHERE USER = 'test_user';

2. 管理用户密码

修改用户密码

sql
-- 方法1:使用 ALTER USER 语句
ALTER USER 'test_user'@'%' IDENTIFIED BY 'new_password123';

-- 方法2:使用 SET PASSWORD 语句
SET PASSWORD FOR 'test_user'@'%' = PASSWORD('new_password123');

重置用户密码

sql
-- 重置 root 用户密码
ALTER USER 'root'@'%' IDENTIFIED BY 'new_root_password';

强制用户修改密码

sql
ALTER USER 'test_user'@'%' PASSWORD EXPIRE;

3. 管理用户锁定状态

锁定用户

sql
ALTER USER 'test_user'@'%' ACCOUNT LOCK;

解锁用户

sql
ALTER USER 'test_user'@'%' ACCOUNT UNLOCK;

查看用户锁定状态

sql
SELECT user, host, account_locked FROM mysql.user WHERE user = 'test_user';

用户删除的注意事项

1. 确认用户不再使用

  • 检查用户是否还有活跃连接
  • 确认用户没有关联的作业或定时任务
  • 确认用户没有拥有任何数据库对象

2. 备份用户权限

  • 在删除用户之前,备份用户的权限信息
  • 以便在需要时恢复用户权限
sql
-- 备份用户权限
SHOW GRANTS FOR 'test_user'@'%' INTO OUTFILE '/tmp/test_user_grants.sql';

3. 回收用户权限

  • 在删除用户之前,先回收用户的所有权限
  • 避免权限残留导致安全问题
sql
-- 回收用户的所有权限
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'test_user'@'%';

4. 清理用户相关资源

  • 删除用户创建的数据库对象(如果需要)
  • 清理用户相关的日志和审计记录
  • 清理用户相关的连接和会话

批量用户管理

1. 使用脚本批量创建用户

示例脚本

sql
-- 创建批量用户的存储过程
DELIMITER //
CREATE PROCEDURE create_batch_users()
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE user_name VARCHAR(50);
    DECLARE password VARCHAR(50);
    
    WHILE i <= 10 DO
        SET user_name = CONCAT('user_', i);
        SET password = CONCAT('password_', i);
        
        SET @sql = CONCAT('CREATE USER ''', user_name, '''@''%'' IDENTIFIED BY ''', password, '''');
        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        
        SET i = i + 1;
    END WHILE;
END //
DELIMITER ;

-- 执行存储过程
CALL create_batch_users();

2. 使用脚本批量删除用户

示例脚本

sql
-- 创建批量删除用户的存储过程
DELIMITER //
CREATE PROCEDURE drop_batch_users()
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE user_name VARCHAR(50);
    
    WHILE i <= 10 DO
        SET user_name = CONCAT('user_', i);
        
        SET @sql = CONCAT('DROP USER IF EXISTS ''', user_name, '''@''%''');
        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        
        SET i = i + 1;
    END WHILE;
END //
DELIMITER ;

-- 执行存储过程
CALL drop_batch_users();

用户管理的安全最佳实践

1. 定期审查用户

  • 定期审查用户列表,清理不再使用的用户
  • 定期审查用户权限,回收不必要的权限
  • 定期更换用户密码,提高安全性

2. 使用最小权限原则

  • 只授予用户必要的权限
  • 避免使用 ALL PRIVILEGES 权限
  • 使用角色管理权限,便于统一管理

3. 限制用户连接

  • 限制用户的连接来源,只允许可信 IP 访问
  • 限制用户的最大连接数,避免资源耗尽
  • 监控用户的连接状态,及时发现异常连接

4. 启用审计日志

  • 启用用户操作审计,记录用户的所有操作
  • 定期分析审计日志,发现异常行为
  • 保存审计日志,便于追溯和合规检查
sql
-- 启用审计日志
ALTER SYSTEM SET enable_audit_log = True;

5. 使用加密连接

  • 启用 SSL/TLS 加密连接,保护数据传输安全
  • 配置用户必须使用加密连接
sql
-- 创建要求加密连接的用户
CREATE USER 'secure_user'@'%' IDENTIFIED BY 'password123' REQUIRE SSL;

常见问题(FAQ)

Q1: 如何创建带有特殊字符的用户密码?

A1: 创建带有特殊字符的用户密码时,需要使用单引号包裹密码:

sql
CREATE USER 'test_user'@'%' IDENTIFIED BY 'P@ssw0rd!23';

Q2: 如何修改当前用户的密码?

A2: 修改当前用户密码的方法:

sql
-- 方法1:使用 ALTER USER 语句
ALTER USER CURRENT_USER() IDENTIFIED BY 'new_password123';

-- 方法2:使用 SET PASSWORD 语句
SET PASSWORD = PASSWORD('new_password123');

Q3: 如何删除用户及其所有对象?

A3: 删除用户及其所有对象的方法:

sql
-- 先删除用户的所有对象
DROP DATABASE IF EXISTS test_db;

-- 然后删除用户
DROP USER 'test_user'@'%';

注意:OceanBase 不支持 CASCADE 选项,需要手动删除用户的所有对象。

Q4: 如何查看用户的有效期?

A4: 查看用户有效期的方法:

sql
SELECT user, host, password_expired, password_lifetime FROM mysql.user WHERE user = 'test_user';

Q5: 如何创建只读用户?

A5: 创建只读用户的方法:

sql
-- 创建用户
CREATE USER 'read_only_user'@'%' IDENTIFIED BY 'password123';

-- 授予只读权限
GRANT SELECT ON *.* TO 'read_only_user'@'%';

Q6: 如何限制用户只能访问特定数据库?

A6: 限制用户只能访问特定数据库的方法:

sql
-- 创建用户
CREATE USER 'db_user'@'%' IDENTIFIED BY 'password123';

-- 授予用户对特定数据库的权限
GRANT ALL PRIVILEGES ON test_db.* TO 'db_user'@'%';

-- 刷新权限
FLUSH PRIVILEGES;