创建用户(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'@'%';