目录
1、DM MPP 环境搭建
系统规划
系统检查
软件安装
配置 dm.ini
配置 dmmal.ini
配置 dmmpp.ctl
运行 MPP
2、建立分布表
3、停止 MPP 系统
4、MPP 相关系统过程与函数
5、MPP 下系统过程与系统视图
DM MPP主要针对海量数据的 OLAP 应用而研发,对普通的、并发量不大的一般 OLTP 或混合类型应用也适用,但不适合于高并发操作的 OLTP 类型应用。
MPP 系统需要通过网络在各 EP 间传递数据,因此网络的带宽对于 MPP 系统的效率非常重要,建议配置千兆或万兆内部网络。
1、DM MPP 环境搭建
系统规划
两个节点都配置两块网卡,一块接入内部网络交换模块,一块接入到外部交换机。两节点实例名分别为 EP01 和 EP02。
MPP系统规划
实例名 | MAL_INST_HOST | MAL_INST_PORT | MAL_HOST | MAL 端口 | MPP_SEQNO |
EP01 | 192.168.64.131 | 5236 | 192.168.169.141 | 5337 | 0 |
EP02 | 192.168.64.132 | 5236 | 192.168.169.142 | 5337 | 1 |
系统检查
防火墙关闭:
##防止 Linux 防火墙影响数据库的运行,设置开机禁用防火墙并关闭防火墙。
[root@localhost dmdba]#systemctl disable firewalld
[root@localhost dmdba]#systemctl stop firewalld
selinux 检查:
[root@localhost dmdba]#setenforce 0
[root@localhost dmdba]#vim /etc/selinux/config ##设置 selinux 状态为关闭
SELINUX=disabled
##修改后,保存退出
软件安装
两节点进行数据库软件安装,安装目录/dm,步骤略。
配置 dm.ini
在两个机器上分别初始化数据库,分别对两个实例的dm.ini进行配置。
A 机器上初始化库至目录/dm/data/EP01:
dminit path=/dm/data/EP01
B 机器上初始化库至目录/dm/data/EP02:
dminit path=/dm/data/EP02
修改 EP01 的 dm.ini :
INSTANCE_NAME = EP01
PORT_NUM = 5236
MAL_INI = 1
MPP_INI = 1
修改 EP02 的 dm.ini:
INSTANCE_NAME = EP02
PORT_NUM = 5236
MAL_INI = 1
MPP_INI = 1
配置 dmmal.ini
两节点配置完全一样,EP 间可互相拷贝。dmmal.ini 与 dm.ini 放在相同的目录下。
[MAL_INST1]
MAL_INST_NAME = EP01
MAL_HOST = 192.168.169.141
MAL_PORT = 5337
MAL_INST_HOST = 192.168.64.131
MAL_INST_PORT = 5236
[MAL_INST2]
MAL_INST_NAME = EP02
MAL_HOST = 192.168.169.142
MAL_PORT = 5337
MAL_INST_HOST = 192.168.64.132
MAL_INST_PORT = 5236
配置 dmmpp.ctl
dmmpp.ctl 是一个二进制文件,用户不能直接配置,需要先配置 dmmpp.ini。
配置 dmmpp.ini 如下:
[SERVICE_NAME1]
MPP_SEQ_NO = 0
MPP_INST_NAME = EP01
[SERVICE_NAME2]
MPP_SEQ_NO = 1
MPP_INST_NAME = EP02
使用 DM 提供的工具 dmctlcvt 将 dmmpp.ini 转换成 dmmpp.ctl。命令中的“TYPE=2”参数表示将文本文件转换成控制文件,也可以使用“TYPE=1”参数进行逆向转换。
转换生成的 dmmpp.ctl 需要放在与 dm.ini 同一个目录。
dmctlcvt TYPE=2 SRC=/dm/data/EP01/DAMENG/dmmpp.ini DEST=/dm/data/EP01/DAMENG/dmmpp.ctl
将生成的 dmmpp.ctl 拷贝至另一 EP,保证 MPP 系统中所有 EP 的 dmmpp.ctl 完全相同。
运行 MPP
分别启动 EP01 和 EP02 的 DM 数据库实例(顺序不分先后),DM MPP 系统即能正常运行,用户就可以登录任一 EP 进行数据库操作了。
dmserver /dm/data/EP01/DAMENG/dm.ini
dmserver /dm/data/EP02/DAMENG/dm.ini
2、建立分布表
DM MPP 支持表数据的LIST 分布、范围分布、哈希分布、随机分布、复制分布类型。
单机模式下建的分布表和普通表一样,但是不能创建指定实例名的分布表。
例
创建哈希分布表 T_HASH,分布列为 C1。
CREATE TABLE T_HASH(C1 INT, C2 CHAR(10))DISTRIBUTED BY HASH (C1);
创建随机分布表 T_RANDOM。
CREATE TABLE T_RANDOM(C1 INT, C2 CHAR(10))DISTRIBUTED RANDOMLY;
创建复制分布表 T_FULLY。
CREATE TABLE T_FULLY(C1 INT, C2 CHAR(10))DISTRIBUTED FULLY;
创建范围分布表 T_RANGE,分布列为 C1。
CREATE TABLE T_RANGE (C1 INT, C2 CHAR(10)) DISTRIBUTED BY RANGE (C1) (VALUES EQU OR LESS THAN (100) ON EP01, VALUES LESS THAN(MAXVALUE) ON EP02);
创建 LIST 分布表 T_LIST,分布列为 C1。
CREATE TABLE T_LIST(C1 INT, C2 CHAR(10))
DISTRIBUTED BY LIST (C1) (VALUES(3) ON EP01,VALUES(4) ON EP02);
如果没有分区,会报错:
[-2731]:没有找到合适的分区.
创建哈希分布的RANGE分区表。
CREATE TABLE T_HASH_RANGE_PARTITION
(C1 INT, C2 CHAR(10), C3 CHAR(10))
PARTITION BY RANGE(C1)
(
PARTITION PART_1 VALUES LESS THAN(0) ,
PARTITION PART_2 VALUES LESS THAN(10) ,
PARTITION PART_3 VALUES LESS THAN(100) ,
PARTITION PART_4 VALUES LESS THAN(MAXVALUE)
)
DISTRIBUTED BY HASH (C1);
3、停止 MPP 系统
需要停止 DM MPP 系统的运行时,只需要停止每个 EP 的 DM 实例即可,没有特别的顺序要求。
注意:如果MPP有其中一个节点没有正常启动,disql连接会报错:
[-6024]:全局登录时远程节点连接失败.
4、MPP 相关系统过程与函数
1.设置当前会话是否只查询本节点数据。默认表示可以查询全部节点数据:
SP_SET_SESSION_MPP_SELECT_LOCAL(1);
设为1时,事务会变为只读事务,插入会报错:
[-6506]:试图在只读事务中修改数据.
2.设置本会话上是否允许 DDL 操作。本地登录默认不允许 DDL 操作:
SP_SET_SESSION_LOCAL_TYPE (1);
CREATE TABLE TEST(C1 INT);
SP_SET_SESSION_LOCAL_TYPE (0);
3.根据查询出的行数据的 ROWID 获取本条数据来自哪个 EP:
SELECT SF_GET_EP_SEQNO(ROWID);
4.获取本会话连接的 EP 序号:
SELECT SF_GET_SELF_EP_SEQNO();
5.统计 MPP 环境下表在各个节点的数据行数:
SP_GET_EP_COUNT('SYSDBA','T');
5、MPP 下系统过程与系统视图
- 获取 EP 节点配置信息
SELECT * FROM V$MPP_CFG_ITEM WHERE SF_GET_EP_SEQNO(ROWID) = SF_GET_SELF_EP_SEQNO();
2.获取当前会话连接的实例名
SELECT NAME FROM V$INSTANCE WHERE SF_GET_EP_SEQNO(ROWID) = SF_GET_SELF_EP_SEQNO();
3.获取 MPP 系统内所有 EP 的所有会话
SELECT * FROM V$SESSIONS;
4.获取当前连接的实例上的所有会话
SELECT * FROM V$SESSIONS WHERE SF_GET_EP_SEQNO(ROWID) = SF_GET_SELF_EP_SEQNO();
5.获取实例 EP01 上的所有会话
SELECT * FROM V$SESSIONS WHERE SF_GET_EP_SEQNO(ROWID) = (SELECT DISTINCT
EP_SEQNO FROM V$MPP_CFG_ITEM WHERE INST_NAME ='EP01');
6.获取所接实例上的表 TEST 的使用空间
SELECT TABLE_USED_PAGES('SYSDBA','TEST');
7.获取每个实例上的表 TEST 使用空间
SELECT TABLE_USED_PAGES('SYSDBA','TEST'), NAME FROM V$INSTANCE;