前面学习了DM MPP集群的搭建,有兴趣的朋友可以查看另外一篇,MPP集群搭建,这节主要讲一下DM MPP集群的管理。
全局登录和本地登录
MPP 系统中数据分布在各个 EP 中,用户只需要登录到某个 EP,系统自动建立这个 EP与其余 EP 的连接,因此用户建立的实际上是与整个 MPP 系统的全局连接,用户对数据库的操作通过全局连接在 MPP 系统的所有 EP 进行。使用全局连接时,要求 MPP 系统的所有 EP都正常提供服务,否则无法建立连接。
通常在 MPP 系统正常运行时都使用全局连接,DM MPP 的快速装载和动态扩容使用到了本地连接,用户在某些时候如 MPP 系统中有 EP 故障时也可以使用本地连接。
DM 的各接口驱动程序都提供了连接属性用于设置全局连接(登录)或本地连接(登录),
缺省都为全局连接。DM 交互式工具 disql 也提供了登录参数MPP_TYPE 用来指定使用全局连接或本地连接,“GLOBAL”表示全局连接,“LOCAL”表示本地连接,默认为全局连接。
下图未指定MPP_TYPE参数,则默认为全局管理。
登录后查看到的各EP节点状态:
select * from v$mpp_cfg_item;
查看登录节点序号:
select sf_get_self_ep_seqno();
统计 MPP 环境下指定表在各个站点的数据行数,下图所示表数据均匀分布在3个节点上:
根据查询出的行数据的 ROWID 获取本条数据来自哪个 EP 站点,下面所示分别指定不同ID段的数据,看存储分布情况:
SQL> SELECT ID, NAME, SF_GET_EP_SEQNO(ROWID) AS "NODE" FROM TEST WHERE ID BETWEEN 20000 AND 20005;
LINEID ID NAME NODE
---------- ----------- ---------- -----------
1 20002 ceshi20002 0
2 20003 ceshi20003 0
3 20004 ceshi20004 0
4 20000 ceshi20000 2
5 20001 ceshi20001 2
6 20005 ceshi20005 2
6 rows got
used time: 16.113(ms). Execute id is 779115.
SQL> SELECT ID, NAME, SF_GET_EP_SEQNO(ROWID) AS "NODE" FROM TEST WHERE ID BETWEEN 2000 AND 2005;
LINEID ID NAME NODE
---------- ----------- --------- -----------
1 2001 ceshi2001 2
2 2002 ceshi2002 2
3 2000 ceshi2000 1
4 2003 ceshi2003 1
5 2004 ceshi2004 1
6 2005 ceshi2005 1
6 rows got
used time: 12.305(ms). Execute id is 779117.
DM MPP 也提供本地连接。当使用本地连接时,用户登录到某个 EP 后,这个 EP 不再建立与其余 EP 的连接,用户的所有数据库操作仅在这个 EP 上进行。如 SELECT 语句以及及UPDATE和DELETE语句中的WHERE条件中的子查询都仅仅查询本地EP的数据,而INSERT 语句如果插入的数据根据分布定义应分布在其余 EP 时系统会报错。
本地登录时,指定MPP_TYPE项为local,如下图:
在本地登录模式下,无法获取全局配置信息,如下图获取节点数则会报错。
SQL> CALL SP_GET_EP_COUNT('SYSDBA','TEST');
CALL SP_GET_EP_COUNT('SYSDBA','TEST');
[-5027]:[SP_GET_EP_COUNT] DDL operation is forbidden under mpp local mode.
used time: 5.423(ms). Execute id is 0.
在本地登录模式下,查询表中数据,只能查到存储在本地节点的数据,其它节点的数据无法显示。
获取会话连接的 EP 的节点序号:
获取 EP 节点配置信息:
SELECT * FROM V$MPP_CFG_ITEM WHERE SF_GET_EP_SEQNO(ROWID) = SF_GET_SELF_EP_SEQNO();
获取当前会话连接的实例名 :
SELECT NAME FROM V$INSTANCE WHERE SF_GET_EP_SEQNO(ROWID) = SF_GET_SELF_EP_SEQNO();
获取指定节点的中的数据:
SELECT NAME FROM TEST WHERE SF_GET_EP_SEQNO(ROWID) = 0;
获取表 TEST 在每个实例上的数据行数 :
CALL SP_GET_EP_COUNT('SYSDBA','TEST');
获取所接实例上的表 TEST 的使用空间 :
SELECT TABLE_USED_PAGES('SYSDBA','TEST');
获取每个实例上的表 TEST 使用空间 :
SELECT TABLE_USED_PAGES('SYSDBA','TEST'), NAME FROM V$INSTANCE;
获取所有实例上表 TEST 的总使用空间 :
SELECT SUM(TOTAL_SIZE) FROM (SELECT TABLE_USED_PAGES('SYSDBA','TEST') TOTAL_SIZE, NAME FROM V$INSTANCE);
设置当前会话是否只查询本节点数据。如果不设置,表示可以查询全部节点数据。设置标记1 代表只查询本节点数据;0 代表查询全部节
点数据。
SP_SET_SESSION_MPP_SELECT_LOCAL(1);
查询 MPP 系统下当前会话是否只查询本节点数据,1代表只查询本节点数据,0 查询全部节点数据。
SELECT SF_GET_SESSION_MPP_SELECT_LOCAL();
MPP 下本地登录时,设置本会话上是否允许 DDL 操作。本地登录默认不允许DDL 操作。 DDL_FLAG为 1 时表示允许当前本地会话执行 DDL 操作,为 0 时则不允许。
MPP 下本地登录会话:
SP_SET_SESSION_LOCAL_TYPE (1);
CREATE TABLE TEST(C1 INT);
SP_SET_SESSION_LOCAL_TYPE (0);
根据查询出的行数据的 ROWID 获取本条数据来自哪个 EP 站点:
SELECT SF_GET_EP_SEQNO(ROWID) FROM V$INSTANCE;
增加 MPP 实例配置:
SF_MPP_INST_ADD(' SERVICE_NAME3', 'EP03');
删除 MPP 实例:
SF_MPP_INST_REMOVE('EP03');