本例配置一个两节点 MPP。两个节点都配置两块网卡,一块接入内部网络交换模块,一
块接入到外部交换机。
两节点实例名分别为 EP01 和 EP02,相关的 IP、端口等规划见下表。
实例名 | MAL_INST_HOST | MAL_INST_PORT | MAL_HOST | MAL 端口 | MPP_SEQNO |
EP01 | dmmpp1 | 5236 | dmmpp1-priv | 5269 | 0 |
EP02 | dmmpp2 | 5237 | dmmpp2-priv | 5270 | 1 |
[root@dmmpp1 network-scripts]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.31.158 dmmpp1
192.168.31.159 dmmpp2
19.21.68.158 dmmpp1-priv
19.21.68.159 dmmpp2-priv
修改 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
为两个 EP 配置 dmmal.ini 如下,配置完全一样,EP 间可互相拷贝。dmmal.ini 与
dm.ini 放在相同的目录下。
[root@dmmpp2 EP02]# cat dmmal.ini
[MAL_INST1]
MAL_INST_NAME = EP01
MAL_HOST = dmmpp1-priv
MAL_PORT = 5269
MAL_INST_HOST = dmmpp1
MAL_INST_PORT = 5236
[MAL_INST2]
MAL_INST_NAME = EP02
MAL_HOST = dmmpp2-priv
MAL_PORT = 5270
MAL_INST_HOST = dmmpp2
MAL_INST_PORT = 5237
dmmpp.ctl 是一个二进制文件,用户不能直接配置,需要先配置 dmmpp.ini。
配置 dmmpp.ini 如下:
[root@dmmpp1 EP01]# cat dmmpp.ini
[SERVICE_NAME1]
MPP_SEQ_NO = 0
MPP_INST_NAME = EP01
[SERVICE_NAME2]
MPP_SEQ_NO = 1
MPP_INST_NAME = EP02
转换生成的 dmmpp.ctl 需要放在与 dm.ini 同一个目录。下面的命令将 dmmpp.ini 转换为 dmmpp.ctl,命令中的“TYPE=2”参数表示将文本文件转换成控制文件,也可以使用“TYPE=1”参数进行逆向转换。
[dmdba@dmmpp2 EP02]$ dmctlcvt TYPE=2 SRC=/dm/dmdbms/data/EP02/dmmpp.ini DEST=/dm/dmdbms/data/EP02/dmmpp.ctl
DMCTLCVT V8
convert txt to ctl success!
经过前面四个步骤,DM MPP 环境已经配置完成了。分别启动 EP01 和 EP02 的 DM 数据库实例(顺序不分先后),DM MPP 系统即能正常运行,用户就可以登录任一 EP 进行数据库操作了。
[root@dmmpp1 EP01]# systemctl restart DmServiceEP01.service
systemctl restart DmAPService.service
[root@dmmpp1 EP01]# systemctl restart DmAPService.service
[root@dmmpp2 EP02]# systemctl restart DmServiceEP02.service
systemctl restart DmAPService.service
[root@dmmpp2 EP02]# systemctl restart DmAPService.service
DM MPP 支持表数据的哈希分布、随机分布、复制分布、范围分布、LIST 分布类型,用户可根据实际情况选择合适的分布类型,MPP 的数据分布类型和具体设置在建表时指定,语法如下,建表的其他语法分支可参见
《DM8_SQL 语言使用手册》。
CREATE [[GLOBAL] TEMPORARY] TABLE <表名定义> <表结构定义>;
<表结构定义>::=<表结构定义 1> | <表结构定义 2>
<表结构定义 1>::= (<列定义> {,<列定义>} [,<表级约束定义>{,<表级约束定义>}]) [ON COMMIT
ROWS] [][<空间限制子句>] [][<
压缩子句>] [][]
<表结构定义 2>::= [ON COMMIT ROWS] [<空间限制子句>] [] [<压缩子句>]AS <不带 INTO 的 SELECT 语句>[];
::=DISTRIBUTED[|]
|DISTRIBUTED BY [](<列名> {,<列名>})
|DISTRIBUTED BY RANGE (<列名> {,<列名>})(<范围分布项> {,<范围分布项>})
|DISTRIBUTED BY LIST (<<列名> {,<列名>}>)( {,})
<范围分布项>::= VALUES LESS THAN (<表达式>{,<表达式>}) ON <实例名>
|VALUES EQU OR LESS THAN (<表达式>{,<表达式>}) ON <实例名>
::= VALUES (<表达式>{,<表达式>}) ON <实例名>
例 1:创建哈希分布表 T_HASH,分布列为 C1。
CREATE TABLE T_HASH(C1 INT, C2 CHAR(10))DISTRIBUTED BY HASH (C1);
例 2:创建随机分布表 T_RANDOM。
CREATE TABLE T_RANDOM(C1 INT, C2 CHAR(10))DISTRIBUTED RANDOMLY;
例 3:创建复制分布表 T_FULLY。
CREATE TABLE T_FULLY(C1 INT, C2 CHAR(10))DISTRIBUTED FULLY;
例 4:创建范围分布表 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);
例 5:创建 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);
例 6:创建哈希分布表的范围水平分区表。
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);
在创建分布表时,用户应注意以下一些使用限制:
单机模式下建的分布表和普通表一样,但是不能创建指定实例名的分布表(如范围
分布表和 LIST 分布表);
在 MPP 模式下创建分布表,如果未指定列则默认为 RANDOMLY(随机)分布表;
分布列类型不支持 BLOB、CLOB、IMAGE、TEXT、LONGVARCHAR、BIT、BINARY、
VARBINARY、LONGVARBINARY、BFILE、时间间隔类型、虚拟列和用户自定义类
型;
HASH 分布、RANGE 分布、LIST 分布允许更新分布列,并支持包含大字段列的表
的分布列更新,但包含 INSTEAD OF 触发器的表、堆表不允许更新分布列;
对于 FULLY(复制)分布表,只支持单表查询的更新和删除操作,并且查询项或者
条件表达式中都不能包含 ROWID 伪列表达式;
RANGE(范围)分布表和 LIST(列表)分布表,分布列与分布列值列表必须一致,
并且指定的实例名不能重复;
引用约束的引用列和被引用列都必需包含分布列,且分布情况完全相同;
随机分布表不支持 UNIQUE 索引。
[dmdba@dmmpp1 dm]$ disql sysdba/dmdba1234
Server[LOCALHOST:5236]:mode is normal, state is open
login used time: 4.043(ms)
disql V8
SQL> create tablespace jisen datafile '/dm/dmdbms/data/EP01/JISEN01.DBF' size 64;
executed successfully
used time: 91.153(ms). Execute id is 106.
SQL> create user jisen identified by jisen1234 default tablespace JISEN;
executed successfully
used time: 18.665(ms). Execute id is 107.
SQL> grant resource to JISEN;
executed successfully
used time: 10.955(ms). Execute id is 108.
SQL> conn jisen/jisen1234
Server[LOCALHOST:5236]:mode is normal, state is open
login used time: 3.775(ms)
SQL> create table t_hash(id int,sdate char(20)) distributed by hash (id);
executed successfully
used time: 15.394(ms). Execute id is 109.
SQL> create table t_random(c1 int, c2 char(10)) distributed randomly;
executed successfully
used time: 9.347(ms). Execute id is 110.
SQL> create table t_fully(c1 int, c2 char(10)) distributed fully;
executed successfully
used time: 14.855(ms). Execute id is 111.
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);
executed successfully
used time: 15.254(ms). Execute id is 112.
SQL> SQL> create table t_list(c1 int, c2 char(10)) distributed by list (c1) (values(3) on EP01,values(4) on EP02);
executed successfully
used time: 12.801(ms). Execute id is 113.
SQL> create table t_hash_range_partition
2 (c1 int, c2 char(10), c3 char(10))
3 partition by range(c1)
4 (
5 partition part_1 values less than(0) ,
6 partition part_2 values less than(10) ,
7 partition part_3 values less than(100) ,
8 partition part_4 values less than(maxvalue)
9 )
10 distributed by hash (c1);
executed successfully
used time: 18.577(ms). Execute id is 114.
SQL>
[dmdba@dmmpp2 ~]$ disql sysdba/dmdba1234:5237
Server[LOCALHOST:5237]:mode is normal, state is open
login used time: 4.165(ms)
disql V8
SQL> select username from dba_users;
LINEID USERNAME
---------- ----------
1 SYSSSO
2 JISEN
3 SYSDBA
4 SYS
5 SYSAUDITOR
used time: 10.847(ms). Execute id is 662509.
SQL>
[dmdba@dmmpp2 ~]$ disql sysdba/dmdba1234:5237
Server[LOCALHOST:5237]:mode is normal, state is open
login used time: 4.165(ms)
disql V8
SQL> select username from dba_users;
LINEID USERNAME
---------- ----------
1 SYSSSO
2 JISEN
3 SYSDBA
4 SYS
5 SYSAUDITOR
used time: 10.847(ms). Execute id is 662509.
SQL> conn jisen/jisen1234:5237
Server[LOCALHOST:5237]:mode is normal, state is open
login used time: 4.014(ms)
SQL> desc user_tables;
LINEID NAME TYPE$ NULLABLE
---------- --------------- ------------ --------
1 TABLE_NAME VARCHAR(128) N
2 TABLESPACE_NAME VARCHAR(128) Y
3 CLUSTER_NAME VARCHAR(1) Y
4 IOT_NAME VARCHAR(128) N
5 STATUS VARCHAR(8) Y
6 PCT_FREE NUMBER Y
7 PCT_USED NUMBER Y
8 INI_TRANS NUMBER Y
9 MAX_TRANS NUMBER Y
10 INITIAL_EXTENT NUMBER Y
11 NEXT_EXTENT NUMBER Y
LINEID NAME TYPE$ NULLABLE
---------- --------------- ---------- --------
12 MIN_EXTENTS NUMBER Y
13 MAX_EXTENTS NUMBER Y
14 PCT_INCREASE NUMBER Y
15 FREELISTS NUMBER Y
16 FREELIST_GROUPS NUMBER Y
17 LOGGING VARCHAR(1) Y
18 BACKED_UP VARCHAR(1) Y
19 NUM_ROWS NUMBER Y
20 BLOCKS NUMBER Y
21 EMPTY_BLOCKS NUMBER Y
22 AVG_SPACE NUMBER Y
LINEID NAME TYPE$ NULLABLE
---------- ------------------------- ---------- --------
23 CHAIN_CNT NUMBER Y
24 AVG_ROW_LEN NUMBER Y
25 AVG_SPACE_FREELIST_BLOCKS NUMBER Y
26 NUM_FREELIST_BLOCKS NUMBER Y
27 DEGREE VARCHAR(1) Y
28 INSTANCES VARCHAR(1) Y
29 CACHE VARCHAR(1) Y
30 TABLE_LOCK VARCHAR(7) Y
31 SAMPLE_SIZE NUMBER Y
32 LAST_ANALYZED DATE Y
33 PARTITIONED VARCHAR(3) Y
LINEID NAME TYPE$ NULLABLE
---------- ---------------- ----------- --------
34 IOT_TYPE VARCHAR(4) Y
35 TEMPORARY VARCHAR(1) Y
36 SECONDARY VARCHAR(1) Y
37 NESTED VARCHAR(1) Y
38 BUFFER_POOL VARCHAR(1) Y
39 FLASH_CACHE VARCHAR(7) Y
40 CELL_FLASH_CACHE VARCHAR(7) Y
41 ROW_MOVEMENT VARCHAR(7) Y
42 GLOBAL_STATS VARCHAR(3) Y
43 USER_STATS VARCHAR(2) Y
44 DURATION VARCHAR(15) Y
LINEID NAME TYPE$ NULLABLE
---------- --------------- ---------- --------
45 SKIP_CORRUPT VARCHAR(1) Y
46 MONITORING VARCHAR(1) Y
47 CLUSTER_OWNER VARCHAR(1) Y
48 DEPENDENCIES VARCHAR(1) Y
49 COMPRESSION VARCHAR(8) Y
50 COMPRESS_FOR VARCHAR(1) Y
51 DROPPED VARCHAR(1) Y
52 READ_ONLY VARCHAR(1) Y
53 SEGMENT_CREATED VARCHAR(3) Y
54 RESULT_CACHE VARCHAR(7) Y
54 rows got
used time: 308.531(ms). Execute id is 891935.
SQL> select TABLE_NAME from user_tables;
LINEID TABLE_NAME
---------- ----------------------
1 T_HASH
2 T_RANDOM
3 T_FULLY
4 T_RANGE
5 T_LIST
6 T_HASH_RANGE_PARTITION
6 rows got
used time: 55.583(ms). Execute id is 892289.
SQL>
SQL> begin
2 for i in 1 .. 10000
3 loop
4 insert into t_hash values (i, 'test');
5 commit;
6 end loop;
7 end;
8 /
DMSQL executed successfully
used time: 00:00:20.673. Execute id is 902329.
SQL>
如果其中一台主机宕机,则会引发Mpp不可用。
[dmdba@dmmpp1 ~]$ disql sysdba/dmdba1234
[-6024]:Remote node global login failed.
disql V8