创建用户
权限要求
数据库在运行过程中,往往需要创建不同的用户,并为用户赋予相应的权限,一般被授予 CREATE USER
权限的用户可以创建用户。
由于 CREATE USER
权限较大,默认仅集群管理员和租户管理员 拥有此系统权限 ,其他用户如果需要创建用户,则需要被授予 CREATE USER
权限,授权相关操作请参见 直接授予权限。
用户名称的规则
为用户指定名称时,需要注意以下限制:
- 用户名的唯一性:每个用户名需要保证在租户内唯一。
用户名称在租户内是唯一的,不同租户下的用户可以同名,故通过 用户名@租户名
的形式可以在系统全局唯一定位一个租户用户。
由于系统租户与 MySQL 租户属于同一兼容模式 ,为区别系统租户和普通租户下的用户,建议对系统租户下的用户名称使用特定前缀。
-
用户名的命名约定:
- 使用 OBClient 、ODC 等客户端创建用户时,要求用户名长度不超过 64 个字节 。
- 使用 OCP 创建用户时,要求用户名以英文字母开头,可包含大写字母、小写字母、数字和下划线,且长度为 2~64 个字符 。
连接集群
使用 root
用户登录集群的 mysql_tenant 租户。
obclient -h192.168.63.201 -P2881 -uroot@mysql_tenant -p'ggj0F8Yt0MzZ3mnGy8r8' -Doceanbase -A
创建一个拥有最小数据库权限的用户和拥有超级权限的用户
可以使用 CREATE USER
语句创建用户。创建用户必须拥有 CREATE USER
的系统权限。在创建用户时,建议坚持最小权限原则,即所有用户只拥有执行其任务所需的最小权限。
创建一个拥有最小数据库权限的用户
示例:创建一个拥有最小数据库权限的用户 test2
创建用户 test
CREATE USER 'test' IDENTIFIED BY 'test';
授予用户权限
授予用户 test
访问数据库 testdb
中所有表的权限
GRANT SELECT ON testdb.* TO test;
查看已创建的用户
select user from mysql.user WHERE user='test';
返回结果如下:
obclient(root@mysql_tenant)[test]> select user from mysql.user WHERE user='test';
+------+
| user |
+------+
| test |
+------+
1 row in set (0.037 sec)
创建一个超级权限的用户
示例:创建一个拥有超级权限的用户 dba_test
,用户进行高权限操作。
创建用户 dba_test
CREATE USER 'dba_test' IDENTIFIED BY 'dbatest';
授予用户 dba_test
超级权限
注意:不建议生产环境创建如此高权限的用户。
GRANT all on *.* TO dba_test;
查看用户权限
用户创建成功后,可以根据需要查看用户的权限。
查看指定用户被授予的权限
SHOW GRANTS FOR test;
输出如下:
obclient(root@mysql_tenant)[test]> SHOW GRANTS FOR test;
+--------------------------------------+
| Grants for test@% |
+--------------------------------------+
| GRANT USAGE ON *.* TO 'test' |
| GRANT SELECT ON `testdb`.* TO 'test' |
+--------------------------------------+
2 rows in set (0.012 sec)
查看用户所拥有的用户级权限
管理员可 以通过 mysql.user
视图 查看某个用户所拥有的用户级权限 。
普通用户可以通过 mysql.user
视图查看自己所拥有的用户级权限。
SELECT * FROM mysql.user WHERE user='test'\G
输出结果如下:
obclient(root@mysql_tenant)[test]> SELECT * FROM mysql.user WHERE user='test'\G
*************************** 1. row ***************************
host: %
user: test
password: *94bdcebe19083ce2a1f959fd02f964c7af4cfc29
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
create_role_priv: N
drop_role_priv: N
1 row in set (0.009 sec)
查看用户所拥有的数据库级权限
管理员可以通过 mysql.db
视图查看某个用户所拥有的数据库级权限。
普通用户可以通过 mysql.db
视图查看自己所拥有的数据库级权限。
SELECT * FROM mysql.db WHERE user='test'\G
输出结果如下:
obclient(root@mysql_tenant)[test]> 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.011 sec)