集群中创建用户(MySQL 模式)步骤

创建用户(MySQL 模式)

权限要求

数据库在运行过程中,往往需要创建不同的用户,并为用户赋予相应的权限,一般被授予 CREATE USER 权限的用户可以创建用户。

由于 CREATE USER 权限较大,默认仅集群管理员和租户管理员拥有此系统权限,其他用户如果需要创建用户,则需要被授予 CREATE USER 权限,授权相关操作请参见 修改用户权限

用户名称的规则

为用户指定名称时,需要注意以下限制:

  • 用户名的唯一性:每个用户名需要保证在租户内唯一。

用户名称在租户内是唯一的,不同租户下的用户可以同名,故通过 用户名@租户名 的形式可以在系统全局唯一定位一个租户用户。

由于系统租户与 MySQL 租户属于同一兼容模式,为区别系统租户和普通租户下的用户,建议对系统租户下的用户名称使用特定前缀。

  • 用户名的命名约定:

    • 使用 OBClient 、ODC 等客户端创建用户时,要求用户名长度不超过 64 个字节。
    • 使用 OCP 创建用户时,要求用户名以英文字母开头,可包含大写字母、小写字母、数字和下划线,且长度为 2~64 个字符。

连接集群

使用 root 用户登录 obcluster 集群的 MySQL 模式租户 mysql_tenant

obclient -h127.0.0.1 -P2883 -uroot@mysql_tenant#obcluster -Doceanbase -A

创建一个拥有最小数据库权限的用户和拥有超级权限的用户

可以使用 CREATE USER 语句创建用户。创建用户必须拥有 CREATE USER 的系统权限。在创建用户时,建议坚持最小权限原则,即所有用户只拥有执行其任务所需的最小权限。

创建一个拥有最小数据库权限的用户

创建一个拥有最小数据库权限的用户 test2 的示例如下。

创建用户 test

CREATE USER 'test' IDENTIFIED BY '123456';

授予用户权限

授予用户 test 访问数据库 testdb 中所有表的权限

GRANT SELECT ON testdb.* TO test;

查看已创建的用户

select user from mysql.user WHERE user='test';

输出结果如下:

obclient(root@mysql_tenant)[oceanbase]> select user from mysql.user WHERE user='test';
+------+
| user |
+------+
| test |
+------+
1 row in set (0.023 sec)

创建一个超级权限的用户

创建一个拥有超级权限的用户 dba_test ,用户进行高权限操作。示例如下。

创建用户 dba_test

CREATE USER 'dba_test' IDENTIFIED BY '123456';

授予用户 dba_test 超级权限

不建议生产环境创建如此高权限的用户。

GRANT all on *.* TO dba_test;

查看用户权限

用户创建成功后,您可以根据需要查看用户的权限。

场景一:通过 SHOW GRANTS 语句查看某个用户被授予的权限。

SHOW GRANTS FOR test;

输出结果如下:

obclient(root@mysql_tenant)[oceanbase]> SHOW GRANTS FOR test;
+--------------------------------------+
| Grants for test@%                    |
+--------------------------------------+
| GRANT USAGE ON *.* TO 'test'         |
| GRANT SELECT ON `testdb`.* TO 'test' |
+--------------------------------------+
2 rows in set (0.004 sec)

场景二:查看用户所拥有的用户级权限

管理员可以通过 mysql.user 视图查看某个用户所拥有的用户级权限。

普通用户可以通过 mysql.user 视图查看自己所拥有的用户级权限。

SELECT * FROM mysql.user WHERE user='test'\G

输出结果如下:

obclient(root@mysql_tenant)[oceanbase]> SELECT * FROM mysql.user WHERE user='test'\G
*************************** 1. row ***************************
                     host: %
                     user: test
                 password: *6bb4837eb74329105ee4568dda7dc67ed2ca2ad9
              select_priv: N
              insert_priv: N
              update_priv: N
              delete_priv: N
              create_priv: N
                drop_priv: N
              reload_priv: N
            shutdown_priv: N
             process_priv: N
                file_priv: N
               grant_priv: N
          references_priv: N
               index_priv: N
               alter_priv: N
             show_db_priv: N
               super_priv: N
    create_tmp_table_priv: N
         lock_tables_priv: N
             execute_priv: N
          repl_slave_priv: N
         repl_client_priv: N
         create_view_priv: N
           show_view_priv: N
      create_routine_priv: N
       alter_routine_priv: N
         create_user_priv: N
               event_priv: N
             trigger_priv: N
   create_tablespace_priv: N
                 ssl_type: 
               ssl_cipher: 
              x509_issuer: 
             x509_subject: 
            max_questions: 0
              max_updates: 0
          max_connections: 0
     max_user_connections: 0
                   plugin: ob_native_password
    authentication_string: 
         password_expired: 
           account_locked: N
  drop_database_link_priv: N
create_database_link_priv: N
1 row in set (0.022 sec)

场景三:查看用户所拥有的数据库级权限

管理员可以通过 mysql.db 视图查看某个用户所拥有的数据库级权限。

普通用户可以通过 mysql.db 视图查看自己所拥有的数据库级权限。

SELECT * FROM mysql.db WHERE user='test'\G

输出结果如下:

obclient(root@mysql_tenant)[oceanbase]> SELECT * FROM mysql.db WHERE user='test'\G
*************************** 1. row ***************************
                 host: %
                   db: testdb
                 user: test
          select_priv: Y
          insert_priv: N
          update_priv: N
          delete_priv: N
          create_priv: N
            drop_priv: N
           grant_priv: N
      references_priv: N
           index_priv: N
           alter_priv: N
create_tmp_table_priv: N
     lock_tables_priv: N
     create_view_priv: N
       show_view_priv: N
  create_routine_priv: N
   alter_routine_priv: N
         execute_priv: N
           event_priv: N
         trigger_priv: N
1 row in set (0.006 sec)

为业务系统规划用户示例

这里以 test 业务系统为示例,创建一系列用户为业务系统服务。

注意:在建用户授权时,请遵循最小权限原则。

业务对象属主用户:testdata

CREATE DATABASE if not exists testdb DEFAULT CHARACTER SET UTF8;
CREATE USER if not exists 'testdata' IDENTIFIED BY '123456';
GRANT SELECT,UPDATE,DELETE,INSERT ON test.* TO 'testdata'@'%';
GRANT CREATE,DROP,ALTER,INDEX,CREATE VIEW ON testdb.testdata TO 'testdata'@'%';

应用访问数据库用户:testopr

CREATE USER if not exists 'testopr' IDENTIFIED BY '123456';
GRANT SELECT,UPDATE,DELETE,INSERT ON testdb.* TO 'testopr'@'%';

工具类用户 testktl

工具类用户:这里以 kettle 相关用户为例,用户名为 testktl。需要迁移 testdb 库所有的表。

CREATE USER 'testktl' IDENTIFIED BY '123456';
GRANT SELECT,UPDATE,DELETE,INSERT ON testdb.* TO 'testktl'@'%';

监控类用户示例:dbmonopr

CREATE DATABASE if not exists dbmonopr DEFAULT CHARACTER SET UTF8;
CREATE USER if not exists 'dbmonopr' IDENTIFIED BY '123456';
GRANT SELECT ON testdb.* TO 'dbmonopr'@'%';
GRANT SELECT ON mysql.* TO 'dbmonopr'@'%';
GRANT SELECT ON oceanbase.* TO 'dbmonopr'@'%';
GRANT ALL ON dbmonopr.* TO 'dbmonopr'@'%';

注意:

obclient> GRANT SELECT ON information_schema.* TO 'dbmonopr'@'%'; //需要额外授权

数据备份用户:testbak

CREATE DATABASE if not exists testbak DEFAULT CHARACTER SET UTF8;
CREATE USER if not exists 'testbak' IDENTIFIED BY '123456';
GRANT SELECT ON testdb.* TO 'dbmonopr'@'%';
GRANT all ON testbak.* TO 'dbmonopr'@'%';

测试通用用户:该用户名为 devmgr

CREATE USER if not exists 'devmgr' IDENTIFIED BY '123456';
GRANT SELECT,UPDATE,DELETE,INSERT ON testdb.* TO 'devmgr'@'%';

感谢分享

1 个赞