系统规划:
实例名 | MAL_INST_HOST | MAL_INST_PORT | MAL_HOST | MAL端口 | MPP_SEQN |
EP01 | 10.0.0.200 | 5236 | 10.0.0.200 | 10001 | 0 |
EP02 | 10.0.0.201 | 5237 | 10.0.0.201 | 20001 | 1 |
准备两台机器:
ep01:
[root@ep01 bin]# ./dminit path=/dm/data/ db_name=DMDB instance_name=EP01 port_num=5236 SYSDBA_PWD="dameng123" initdb V8 db version: 0x7000a file dm.key not found, use default license! License will expire on 2021-02-12 log file path: /dm/data/DMDB/DMDB01.log log file path: /dm/data/DMDB/DMDB02.log write to dir [/dm/data/DMDB]. create dm database success. 2021-01-29 13:18:34
注册数据库:
[root@ep01 root]# ./dm_service_installer.sh -t dmserver -p DMDB -dm_ini /dm/data/DMDB/dm.ini Created symlink from /etc/systemd/system/multi-user.target.wants/DmServiceDMDB.service to /usr/lib/systemd/system/DmServiceDMDB.service. 创建服务(DmServiceDMDB)完成
EP02:
[root@ep02 bin]# ./dminit path=/dm/data/ db_name=DMDB instance_name=EP02 port_num=5237 SYSDBA_PWD="dameng123" initdb V8 db version: 0x7000a file dm.key not found, use default license! License will expire on 2021-02-12 log file path: /dm/data/DMDB/DMDB01.log log file path: /dm/data/DMDB/DMDB02.log write to dir [/dm/data/DMDB]. create dm database success. 2021-01-29 13:25:01
注册数据库:
[root@ep02 root]# ./dm_service_installer.sh -t dmserver -p DMDB -dm_ini /dm/data/DMDB/dm.ini Created symlink from /etc/systemd/system/multi-user.target.wants/DmServiceDMDB.service to /usr/lib/systemd/system/DmServiceDMDB.service. 创建服务(DmServiceDMDB)完成
修改 EP01 的 dm.ini 的以下几个参数如下:
INSTANCE_NAME = EP01
PORT_NUM = 5236
MAL_INI = 1
MPP_INI = 1
修改 EP02 的 dm.ini 的以下几个参数如下:
INSTANCE_NAME = EP02 PORT_NUM = 5237 MAL_INI = 1 MPP_INI = 1
配置 dmmal.ini
为两个 EP 配置 dmmal.ini 如下,配置完全一样,EP 间可互相拷贝。dmmal.ini 与
dm.ini 放在相同的目录下。
[MAL_INST1] MAL_INST_NAME = EP01 MAL_HOST = 10.0.0.200 MAL_PORT = 10001 MAL_INST_HOST = 10.0.0.200 MAL_INST_PORT = 5236 [MAL_INST2] MAL_INST_NAME = EP02 MAL_HOST = 10.0.0.201 MAL_PORT = 20001 MAL_INST_HOST = 10.0.0.201 MAL_INST_PORT = 5237
配置 dmmpp.ctl
dmmpp.ctl 是一个二进制文件,用户不能直接配置,需要先配置 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,dmctlcvt 工具
在 DM 安装目录的“bin”子目录中。
[root@ep01 bin]# ./dmctlcvt TYPE=2 SRC=/dm/data/DMDB/dmmpp.ini DEST=/dm/data/DMDB/dmmpp.ctl DMCTLCVT V8 convert txt to ctl success!
将生成的 dmmpp.ctl 拷贝至另一 EP,保证 MPP 系统中所有 EP 的 dmmpp.ctl 完全
相同。
运行 MPP
经过前面步骤,DM MPP 环境已经配置完成了。分别启动 EP01 和 EP02 的 DM 数据库实例(顺序不分先后),DM MPP 系统即能正常运行,用户就可以登录任一 EP 进行数据
库操作了。
SQL> SELECT * FROM V$MPP_CFG_ITEM WHERE SF_GET_EP_SEQNO(ROWID) =SF_GET_SELF_EP_SEQNO(); 行号 SERVICE_NAME INST_NAME EP_SEQNO STATE ---------- ------------- --------- ----------- ----- 1 SERVICE_NAME1 EP01 0 OK 2 SERVICE_NAME2 EP02 1 OK
建立分布表
下面给出几个简单的创建不同类型分布表的例子。
例 1:创建哈希分布表 T_HASH,分布列为 C1。
SQL> CREATE TABLE T_HASH(C1 INT, C2 CHAR(10))DISTRIBUTED BY HASH (C1);
操作已执行
已用时间: 16.649(毫秒). 执行号:992.
EP02可以查到
[dmdba@ep02 bin]$ disql sysdba/dameng123:5237
服务器[LOCALHOST:5237]:处于普通打开状态
登录使用时间: 8.227(毫秒)
disql V8
SQL> desc T_HASH;
行号 NAME TYPE$ NULLABLE
---------- ---- -------- --------
1 C1 INTEGER Y
2 C2 CHAR(10) Y
已用时间: 46.399(毫秒). 执行号:305249.
例 2:创建随机分布表 T_RANDOM。
SQL> CREATE TABLE T_RANDOM(C1 INT, C2 CHAR(10))DISTRIBUTED RANDOMLY;
操作已执行
已用时间: 15.748(毫秒). 执行号:993.
SQL> desc T_RANDOM;
行号 NAME TYPE$ NULLABLE
---------- ---- -------- --------
1 C1 INTEGER Y
2 C2 CHAR(10) Y
已用时间: 39.142(毫秒). 执行号:305279.
例 3:创建复制分布表 T_FULLY。
SQL> CREATE TABLE T_FULLY(C1 INT, C2 CHAR(10))DISTRIBUTED FULLY;
操作已执行
已用时间: 22.836(毫秒). 执行号:994.
SQL> desc T_FULLY;
行号 NAME TYPE$ NULLABLE
---------- ---- -------- --------
1 C1 INTEGER Y
2 C2 CHAR(10) Y
已用时间: 36.515(毫秒). 执行号:305309.
例 4:创建范围分布表 T_RANGE,分布列为 C1。
SQL> 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);2 3
操作已执行
已用时间: 17.970(毫秒). 执行号:995.
SQL> desc T_RANGE;
行号 NAME TYPE$ NULLABLE
---------- ---- -------- --------
1 C1 INTEGER Y
2 C2 CHAR(10) Y
已用时间: 36.516(毫秒). 执行号:305339.
例 5:创建 LIST 分布表 T_LIST,分布列为 C1。
SQL> CREATE TABLE T_LIST(C1 INT, C2 CHAR(10)) DISTRIBUTED BY LIST (C1) (VALUES(3) ON EP01,VALUES(4) ON EP02);
2 操作已执行
已用时间: 30.160(毫秒). 执行号:996.
SQL> desc T_LIST;
行号 NAME TYPE$ NULLABLE
---------- ---- -------- --------
1 C1 INTEGER Y
2 C2 CHAR(10) Y
已用时间: 42.306(毫秒). 执行号:305369.
例 6:创建哈希分布表的范围水平分区表。
SQL> 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);
9 10 操作已执行
已用时间: 47.560(毫秒). 执行号:997.
SQL> desc T_HASH_RANGE_PARTITION;
行号 NAME TYPE$ NULLABLE
---------- ---- -------- --------
1 C1 INTEGER Y
2 C2 CHAR(10) Y
3 C3 CHAR(10) Y
已用时间: 51.757(毫秒). 执行号:305399.
SQL> CREATE TABLE T_RANDOM(C1 INT, C2 CHAR(10))DISTRIBUTED RANDOMLY; 操作已执行 已用时间: 15.748(毫秒). 执行号:993. SQL> desc T_RANDOM; 行号 NAME TYPE$ NULLABLE ---------- ---- -------- -------- 1 C1 INTEGER Y 2 C2 CHAR(10) Y 已用时间: 39.142(毫秒). 执行号:305279.
例 3:创建复制分布表 T_FULLY。
SQL> CREATE TABLE T_FULLY(C1 INT, C2 CHAR(10))DISTRIBUTED FULLY;
操作已执行
已用时间: 22.836(毫秒). 执行号:994.
SQL> desc T_FULLY;
行号 NAME TYPE$ NULLABLE
---------- ---- -------- --------
1 C1 INTEGER Y
2 C2 CHAR(10) Y
已用时间: 36.515(毫秒). 执行号:305309.
例 4:创建范围分布表 T_RANGE,分布列为 C1。
SQL> 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);2 3
操作已执行
已用时间: 17.970(毫秒). 执行号:995.
SQL> desc T_RANGE;
行号 NAME TYPE$ NULLABLE
---------- ---- -------- --------
1 C1 INTEGER Y
2 C2 CHAR(10) Y
已用时间: 36.516(毫秒). 执行号:305339.
例 5:创建 LIST 分布表 T_LIST,分布列为 C1。
SQL> CREATE TABLE T_LIST(C1 INT, C2 CHAR(10)) DISTRIBUTED BY LIST (C1) (VALUES(3) ON EP01,VALUES(4) ON EP02);
2 操作已执行
已用时间: 30.160(毫秒). 执行号:996.
SQL> desc T_LIST;
行号 NAME TYPE$ NULLABLE
---------- ---- -------- --------
1 C1 INTEGER Y
2 C2 CHAR(10) Y
已用时间: 42.306(毫秒). 执行号:305369.
例 6:创建哈希分布表的范围水平分区表。
SQL> 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);
9 10 操作已执行
已用时间: 47.560(毫秒). 执行号:997.
SQL> desc T_HASH_RANGE_PARTITION;
行号 NAME TYPE$ NULLABLE
---------- ---- -------- --------
1 C1 INTEGER Y
2 C2 CHAR(10) Y
3 C3 CHAR(10) Y
已用时间: 51.757(毫秒). 执行号:305399.
SQL> 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);2 3 操作已执行 已用时间: 17.970(毫秒). 执行号:995. SQL> desc T_RANGE; 行号 NAME TYPE$ NULLABLE ---------- ---- -------- -------- 1 C1 INTEGER Y 2 C2 CHAR(10) Y 已用时间: 36.516(毫秒). 执行号:305339.
例 5:创建 LIST 分布表 T_LIST,分布列为 C1。
SQL> CREATE TABLE T_LIST(C1 INT, C2 CHAR(10)) DISTRIBUTED BY LIST (C1) (VALUES(3) ON EP01,VALUES(4) ON EP02);
2 操作已执行
已用时间: 30.160(毫秒). 执行号:996.
SQL> desc T_LIST;
行号 NAME TYPE$ NULLABLE
---------- ---- -------- --------
1 C1 INTEGER Y
2 C2 CHAR(10) Y
已用时间: 42.306(毫秒). 执行号:305369.
例 6:创建哈希分布表的范围水平分区表。
SQL> 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);
9 10 操作已执行
已用时间: 47.560(毫秒). 执行号:997.
SQL> desc T_HASH_RANGE_PARTITION;
行号 NAME TYPE$ NULLABLE
---------- ---- -------- --------
1 C1 INTEGER Y
2 C2 CHAR(10) Y
3 C3 CHAR(10) Y
已用时间: 51.757(毫秒). 执行号:305399.
SQL> 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); 9 10 操作已执行 已用时间: 47.560(毫秒). 执行号:997. SQL> desc T_HASH_RANGE_PARTITION; 行号 NAME TYPE$ NULLABLE ---------- ---- -------- -------- 1 C1 INTEGER Y 2 C2 CHAR(10) Y 3 C3 CHAR(10) Y 已用时间: 51.757(毫秒). 执行号:305399.
在创建分布表时,用户应注意以下一些使用限制:
1、单机模式下建的分布表和普通表一样,但是不能创建指定实例名的分布表(如范围分布表和 LIST 分布表);
2、在 MPP 模式下创建分布表,如果未指定列则默认为 RANDOMLY(随机)分布表;
3、分布列类型不支持 BLOB、CLOB、IMAGE、TEXT、LONGVARCHAR、BIT、BINARY、VARBINARY、LONGVARBINARY、BFILE、时间间隔类型、虚拟列和用户自定义类型;
4、HASH 分布、RANGE 分布、LIST 分布允许更新分布列,并支持包含大字段列的表的分布列更新,但包含 INSTEAD OF 触发器的表、堆表不允许更新分布列;
5、对于 FULLY(复制)分布表,只支持单表查询的更新和删除操作,并且查询项或者条件表达式中都不能包含 ROWID 伪列表达式;
6、RANGE(范围)分布表和 LIST(列表)分布表,分布列与分布列值列表必须一致,并且指定的实例名不能重复;
7、引用约束的引用列和被引用列都必需包含分布列,且分布情况完全相同;
8、随机分布表不支持 UNIQUE 索引。
快速数据装载
DM MPP 特别适合于海量数据的存储和处理,因此在应用中常常面临将大量数据从某个或某些历史数据库中装载到 MPP 系统的需求。为了满足海量数据的快速装载需求,DM 提供了快速装载工具 dmfldr,能够对 DM 单机版和 MPP 系统进行海量数据的快速装载。
dmfldr 支持 MPP 环境下的两种数据加载模式:客户端分发模式和本地分发模式,通过参数 MPP_CLIENT 进行设置。使用客户端分发模式时,数据在 dmfldr 客户端进行分发然后直接向指定 EP 发送数据;使用本地分发模式时,每个 EP 对应一个 dmfldr 和一份数据,每个 dmfldr 只选择出对应本节点的数据并发送,不管其他节点的数据。默认使用客户端分发模式。
停止 MPP 系统
需要停止 DM MPP 系统的运行时,只需要停止每个 EP 的 DM 实例即可,没有特别的顺序要求。
若在 DM MPP 系统的运行过程中,某一 EP 发生故障停机,则整个 MPP 系统将处于不能正常服务的状态。当前所有的用户会话会被系统断开,不能进行全局登录,只能进行本地登录。因此,为了保证 MPP 系统的高可用性,我们强烈建议采用 DM MPP 与数据守护相结合的部署方案