云数据库 SelectDB 版实例下可以包含多个计算集群,类似分布式系统中的计算组、计算队列,可分别用于支持不同的工作负载(例如读写隔离、在离线隔离等),以满足多业务间负载隔离的需求。本文介绍如何在云数据库 SelectDB 版实例中进行集群的访问管理。
在生产环境中,除非必要,避免修改已确定的集群名称;由于集群名称在查询过程中被使用,对其进行修改可能导致授权失效。
查看集群列表
查看当前云数据库 SelectDB 版实例拥有的所有计算集群。
语法
SHOW CLUSTERS;示例
SHOW CLUSTERS;返回结果如下:
+---------------+------------+-------------+
| cluster       | is_current | users       |
+---------------+------------+-------------+
| test_cluster  | FALSE      | admin, jack |
| test_cluster1 | FALSE      |             |
+---------------+------------+-------------+切换集群
指定使用数据库和计算集群。
语法
USE { [catalog_name.]database_name[@cluster_name] | @cluster_name } 参数说明
| 参数名称 | 参数说明 | 
| catalog_name | catalog名称。 | 
| database_name | 数据库名称。 | 
| cluster_name | 集群名称。 | 
如果数据库名称或者集群名称是保留的关键字, 需要使用符号backtick``。示例如下:
USE @`interval`示例
- 示例1:指定使用计算集群 - test_cluster。- USE @test_cluster;
- 示例2:指定使用数据库 - test_database和计算集群- test_cluster。- USE test_database@test_cluster;
- 示例3:通过jdbc连接串指定使用数据库 - test_database和计算集群- test_cluster。- jdbc:mysql://selectdb-cn-****:9030/test_database@test_cluster
授予集群访问权限
授予用户集群访问的权限。
语法
GRANT USAGE_PRIV ON CLUSTER {cluster_name} TO {user} 参数说明
| 参数名称 | 参数说明 | 
| cluster_name | 集群名称。 | 
| user | 用户名称。 | 
示例
- 示例1: - 授予用户 - jack访问- test_cluster集群。- GRANT USAGE_PRIV ON CLUSTER test_cluster TO jack;
- 查询 - jack的集群权限。- SHOW GRANTS FOR jack\G;- 返回结果如下: - UserIdentity: 'jack'@'%' Password: Yes GlobalPrivs: Admin_priv (false) CatalogPrivs: NULL DatabasePrivs: internal.information_schema: Select_priv (false) TablePrivs: NULL ResourcePrivs: NULL CloudCluster: test_cluster: Usage_priv (false) CloudStage: NULL
 
- 示例2: - 为用户 - jack授权一个不存在集群- not_exist_cluster的访问权限。- GRANT USAGE_PRIV ON CLUSTER not_exist_cluster TO jack;
- 查询 - jack集群权限。- SHOW GRANTS FOR jack\G;- 返回结果如下: - UserIdentity: 'jack'@'%' Password: Yes GlobalPrivs: Admin_priv (false) CatalogPrivs: NULL DatabasePrivs: internal.information_schema: Select_priv (false) TablePrivs: NULL ResourcePrivs: NULL CloudCluster: not_exist_cluster: Usage_priv (false) CloudStage: NULL
- 使用不存在集群 - not_exist_cluster。- USE information_schema@not_exist_cluster;- 返回结果如下: - No connection. Trying to reconnect... Connection id: 1 Current database: *** NONE *** ERROR 5091 (42000): Cluster not_exist_cluster not exist
 
撤销集群访问权限
撤销用户集群访问权限
语法
REVOKE USAGE_PRIV ON CLUSTER {cluster_name} FROM {user} 参数说明
| 参数名称 | 参数说明 | 
| cluster_name | 集群名称。 | 
| user | 用户名称。 | 
示例
撤销jack访问集群的权限并进行查询。
REVOKE USAGE_PRIV ON CLUSTER test_cluster FROM jack;
SHOW grants for jack\G返回结果如下:
 UserIdentity: 'jack'@'%'
     Password: Yes
  GlobalPrivs: Admin_priv  (false)
 CatalogPrivs: NULL
DatabasePrivs: internal.information_schema: Select_priv  (false)
   TablePrivs: NULL
ResourcePrivs: NULL
 CloudCluster: NULL
   CloudStage: NULL设置默认集群
在云数据库 SelectDB 版中为用户设置默认集群的作用主要是为了简化用户的访问流程和提升操作便捷性。默认集群允许用户在执行查询或其他操作时无需指定集群,系统会自动选择设定的默认集群进行处理,这样可以减少用户每次操作时的配置步骤,提高工作效率。同时,这也有助于用户更加专注于数据分析和处理任务本身,而不必过多关注集群管理的细节。
如果用户没有指定默认集群,系统将自动分配一个具有活跃后端且用户有权限使用的集群。在同一会话期间,所选择的集群将保持不变。在不同会话中,由系统自动选定的集群可能会因以下原因而改变:
- 用户不再拥有之前被选择集群的使用权限。 
- 有新的集群被添加或现有的集群被移除。 
- 上一次选择的集群没有活跃的后端。 
在上述三种情况中,第一种和第二种将必然导致选择的集群发生变更,而第三种情况则可能导致变更。基于此,我们建议定期检查各自的集群权限设置,确保对所需资源的访问不受影响。
语法
-- 设置默认集群
SET PROPERTY 'default_cloud_cluster' = '{clusterName}';
-- 为用户设置默认集群
SET PROPERTY FOR {user} 'default_cloud_cluster' = '{clusterName}';参数说明
| 参数名称 | 参数说明 | 
| cluster_name | 集群名称。 | 
| user | 用户名称。 重要  指定用户名称的场合,需要拥有admin权限。 | 
示例
- 示例1: - 为当前用户设置默认集群。 - SET PROPERTY 'default_cloud_cluster' = 'test_cluster';
- 查询当前用户可访问的默认集群。 - SHOW PROPERTY;- 返回结果如下: - +------------------------+-------------------------------+ | Key | Value | +------------------------+-------------------------------+ | cpu_resource_limit | -1 | | default_cloud_cluster | test_cluster | | exec_mem_limit | -1 | | load_mem_limit | -1 | | max_query_instances | -1 | | max_user_connections | 100 | | quota.high | 800 | | quota.low | 100 | | quota.normal | 400 | | resource.cpu_share | 1000 | | resource.hdd_read_iops | 80 | | resource.hdd_read_mbps | 30 | | resource.io_share | 1000 | | resource.ssd_read_iops | 1000 | | resource.ssd_read_mbps | 30 | | resource_tags | | | sql_block_rules | | +------------------------+-------------------------------+
 
- 示例2: - 创建用户 - jack,并设置角色为admin。- CREATE USER jack IDENTIFIED BY '123456' DEFAULT ROLE "admin";
- 查询 - jack可访问的默认集群。- SHOW PROPERTY FOR jack;- 返回结果如下: - +------------------------+-------------------------------+ | Key | Value | +------------------------+-------------------------------+ | cpu_resource_limit | -1 | | default_cloud_cluster | test_cluster1 | | exec_mem_limit | -1 | | load_mem_limit | -1 | | max_query_instances | -1 | | max_user_connections | 100 | | quota.high | 800 | | quota.low | 100 | | quota.normal | 400 | | resource.cpu_share | 1000 | | resource.hdd_read_iops | 80 | | resource.hdd_read_mbps | 30 | | resource.io_share | 1000 | | resource.ssd_read_iops | 1000 | | resource.ssd_read_mbps | 30 | | resource_tags | | | sql_block_rules | | +------------------------+-------------------------------+
 
- 示例3: - 若当前实例下不存在将要设置的默认集群会报错,提示使用 - SHOW CLUSTERS;展示当前实例下所有有效的集群。- SET PROPERTY 'default_cloud_cluster' = 'not_exist_cluster';- 返回结果如下: - ERROR 5091 (42000): errCode = 2, detailMessage = Cluster not_exist_cluster not exist, use SQL 'SHOW CLUSTERS' to get a valid cluster
- 展示当前实例下所有有效的集群。 - SHOW CLUSTERS;- 返回结果如下: - +---------------+------------+-------------+ | cluster | is_current | users | +---------------+------------+-------------+ | test_cluster | FALSE | admin, jack | | test_cluster1 | FALSE | | +---------------+------------+-------------+- 其中 - cluster列表示集群名称,- is_current列表示当前用户是否使用此集群,- users列表示这些用户可以设置默认集群为当前行的集群。
 
常见问题
问题描述:如果您在使用过程中数据库报错,且报错内容中包含关键字No cloud cluster name selected.,应当如何处理。
解决方案:您可尝试向当前用户授予集群访问权限。如何授予集群权限,请参见授予集群访问权限。