DM MPP 使用
(第一节点,全局登录, 第二节点查看信息)
本地登录
disql SYSDBA/'"SYSDBA"'@192.168.2.142:5236#"{mpp_type=local}"
全局登录
disql SYSDBA/'"SYSDBA"'@192.168.2.141:5236#"{mpp_type=global}"
1.建立分布表
创建hash分布表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_full
create table t_full (c1 int) DISTRIBUTED FULLY ;
创建范围分布表t_range ,分布列c1
create table t_range (c1 int ,c2 CHAR(10)) DISTRIBUTED BY RANGE (c1) (VALUES EQU OR LESS THAN (500) on EP01,VALUES EQU OR LESS THAN (1000) 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 ) ; --实例名大小不限制
创建哈希分布表的范围水平分区表
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
索引。
DM
提供了快速装载工具 dmfldr,能够对 DM 单机版和 MPP 系统进行海量数据的快速装载。
2.停止MPP系统
需要停止DM MPP系统的运行时,只需要停止每个EP的DM实例即可,没有特别的顺序要求.
若在DM MPP系统的运行过程中,某一EP发生故障停机,则整个MPP系统将处于不能正常服务的状态。当前所有的用户会话会被系统断开,不能进行全局登录,只能进行本地登录。因此,为了保证MPP系统的高可用性,我们强烈建议采用DM MPP与数据守护相结合的部署方案。
3.MPP 相关系统过程与函数
为了方便
MPP
环境下数据库应用的编写,
DM
提供了一些
MPP
相关的系统过程与函数。
1.
SP_SET_SESSION_MPP_SELECT_LOCAL
MPP
系统下设置当前会话是否只查询本节点数据。如果不设置,表示可以查询全部节点数据
--local_flag: 设置标记,0:查询全部节点数据;1:只查询本节点数据
SP_SET_SESSION_MPP_SELECT_LOCAL(1);
2.
SF_GET_SESSION_MPP_SELECT_LOCAL
查询
MPP
系统下当前会话是否只查询本节点数据。
0
表示查询全部节点数据,
1
表示只查询本节点数据。
select SF_GET_SESSION_MPP_SELECT_LOCAL() ;
3.
SP_SET_SESSION_LOCAL_TYPE
MPP
下本地登录时,设置本会话上是否允许
DDL
操作。本地登录默认不允许
DDL
操作。
ddl_flag
:
0
表示不允许当前本地会话执行
DDL
操作,
1
表示允许。
MPP
下本地登录会话。
SP_SET_SESSION_LOCAL_TYPE (1);
CREATE TABLE TEST(C1 INT);
SP_SET_SESSION_LOCAL_TYPE (0);
4.
SF_GET_EP_SEQNO
根据查询出的行数据的
ROWID
获取本条数据来自哪个
EP
。
rowid
:行数据的
ROWID
。
返回值 MPP
系统内
EP
的序号。
SELECT SF_GET_EP_SEQNO(ROWID);
5.
SF_GET_SELF_EP_SEQNO
获取本会话连接的
EP
序号。
返回:
本会话连接的
EP
序号。
SELECT SF_GET_SELF_EP_SEQNO();
6.
SP_GET_EP_COUNT
统计
MPP
环境下表在各个节点的数据行数。
参数说明:
SCH_NAME
:表所在模式名
TAB_NAME
:表名
SP_GET_EP_COUNT('SYSDBA','T');
4.MPP下系统与guo'c系统视图常见用法
1.
获取会话连接的
EP
的节点序号
SELECT SF_GET_SELF_EP_SEQNO();
2.
根据
ROWID
获取本行数据来自哪个
EP
SELECT SF_GET_EP_SEQNO(ROWID);
3.
获取
EP
节点配置信息
SELECT * FROM V$MPP_CFG_ITEM WHERE SF_GET_EP_SEQNO(ROWID) = SF_GET_SELF_EP_SEQNO();
4.
获取当前会话连接的实例名
SELECT NAME FROM V$INSTANCE WHERE SF_GET_EP_SEQNO(ROWID) = SF_GET_SELF_EP_SEQNO();
5.
获取
MPP
系统内所有
EP
的所有会话
SELECT * FROM V$SESSIONS;
6.
获取当前连接的实例上的所有会话
SELECT * FROM V$SESSIONS WHERE SF_GET_EP_SEQNO(ROWID) = SF_GET_SELF_EP_SEQNO();
7.
获取实例
EP01
上的所有会话
SELECT * FROM V$SESSIONS WHERE SF_GET_EP_SEQNO(ROWID) = (SELECT DISTINCT EP_SEQNO FROM V$MPP_CFG_ITEM WHERE INST_NAME ='EP01');
8.
获取表
TEST
在每个实例上的数据行数
CALL SP_GET_EP_COUNT('SYSDBA','TEST');
9.
获取所接实例上的表
TEST
的使用空间
SELECT TABLE_USED_PAGES('SYSDBA','TEST');
10.
获取每个实例上的表
TEST
使用空间
SELECT TABLE_USED_PAGES('SYSDBA','TEST'), NAME FROM V$INSTANCE;
11.
获取所有实例上表
TEST
的总使用空间
SELECT SUM(TOTAL_SIZE) FROM (SELECT TABLE_USED_PAGES('SYSDBA','TEST') TOTAL_SIZE, NAME FROM V$INSTANCE);
使用限制:
DM MPP
支持绝大多数单机版
DM
的功能,但在某些小的功能点使用上存在一些使用限制,具体如下:
MPP
环境下,不支持创建
SET NULL
或
SET DEFAULT
约束检查规则的引用约束;
MPP
环境下不支持创建外部表、间隔分区表;
MPP
环境下不支持修改表的
ADD [COLUMN] <
列名
>[<IDENTITY
子句
>]
子句;
MPP
环境下不支持创建位图索引、空间索引、数组索引;
MPP
环境下位图连接索引涉及的维度表需
FULLY
分布;
MPP
环境下不支持索引的
ONLINE
选项;
MPP
环境下不支持视图的
WITH CHECK OPTION
操作;
MPP
环境下不支持闪回查询;
MPP
环境下不支持物化视图日志;
MPP
各
EP
创建数据库时指定的编码格式应相同,否则可能造成乱码问题;
MPP
环境下
INI
参数
MVCC_RETRY_TIMES
无效,发生
MVCC
冲突时直接报错;
MPP
环境下不支持
DBMS_JOB
包;
MPP
环境下日志辅助表不支持
FULLY
分布
MPP
系统动态扩容
1.禁止系统ddl操作
全局登录
MPP
系统任一节点,执行下面的语句禁止系统的
DDL
操作。
SP_DDL_FORBIDEN(1);
2.克隆数据库
数据库克隆的目的是把系统中的对象定义信息进行备份,用于恢复到新加的节点上,生成的备份集位于指定的目录备份集中。
若
MPP
系统处于运行状态,采用联机
DDL
克隆方式(需要配置本地归档)。全局登录 MPP 系统任一节点,执行下面的语句。
BACKUP DATABASE DDL_CLONE BACKUPSET 'CLONE';
生成的备份集保存在当前登陆节点
bak
路径中的
clone
目录中。
若
MPP
系统处于退出状态,选择
MPP
系统任一节点使用
DMRMAN
工具进行脱机备份。
RMAN>backup database 'c:\dmdbms\data\dameng\dm.ini' ddl_clone backupset 'clone';
生成的备份集保存在当前备份节点
bak
路径中的
clone
目录中。
3.脱机还原
在新增节点上执行脱机还原。手动拷贝克隆的备份集目录
clone
到新增节点
EP03
的bak 目录中,使用 DMRMAN 工具进行脱机还原并更新数据库。
RMAN>RESTORE DATABASE 'c:\dmdbms\data\dameng\dm.ini' FROM BACKUPSET 'c:\dmdbms\data\dameng\bak\clone';
RMAN>RECOVER DATABASE 'c:\dmdbms\data\DAMENG\dm.ini' FROM BACKUPSET 'c:\dmdbms\data\dameng\bak\clone';
RMAN>RECOVER DATABASE ' c:\dmdbms\data\DAMENG\dm.ini' UPDATE DB_MAGIC;
若要增加多个节点,则依次执行拷贝、脱机还原和更新数据库步骤。
4.配置新增节点的dmmal.ini
为新增的节点配置
dmmal.ini
,其中包含扩容前
MPP
系统的节点,以及新增节点
EP03
的信息。
添加:
[MAL_INST3]
MAL_INST_NAME = EP03
MAL_HOST = 192.168.0.32
MAL_PORT = 5271
MAL_INST_HOST = 192.168.1.31
MAL_INST_PORT = 5238
修改新增节点的
dm.ini
文件中的如下配置项:
INSTANCE_NAME = EP03
PORT_NUM = 5236
MAL_INI = 1
MPP_INI = 1
5.mount方式启动新增节点
以
MOUNT
方式启动新增节点
EP03
,登录后执行如下命令。
SP_DDL_FORBIDEN(1);
ALTER DATABASE OPEN FORCE;
以
MOUNT
方式启动的目的是防止启动后有用户执行
DDL
操作,因此先禁止
DDL
后再OPEN。
6.动态添加MAL
分别本地登录
MPP
系统中原有的每个节点,执行下列语句为每个原有节点的
MAL
配置增加新增节点信息。
--设置本地 MAL 配置状态
SF_MAL_CONFIG(1,0);
--增加 MAL 配置
SF_MAL_INST_ADD('MAL_INST3','EP03','192.168.0.32',5271, '192.168.1.31',5238);
--应用 MAL 配置
SF_MAL_CONFIG_APPLY();
--重置本地 MAL 配置状态
SF_MAL_CONFIG(0,0);
7.增加MPP节点,设置表的标记
全局登录
MPP
系统原有节点中的任一个,执行下列语句。
--广播方式设置 MAL 配置状态
SF_MAL_CONFIG(1,1);
--保存老的 HASHMAP
SF_MPP_SAVE_HASHMAP();
--增加 MPP 实例 EP03
SF_MPP_INST_ADD('service_name3', 'EP03');
增加节点配置后,之前的连接失效,需要断开连接,重新全局登录,然后执行下列语句。
--设置分布表的重分发状态
SF_MPP_REDIS_STATE_SET_ALL();
--广播方式重置 MAL 配置状态
SF_MAL_CONFIG(0,1);
--增加节点之后,可以放开 DDL 限制
SP_DDL_FORBIDEN(0);
至此,节点
EP03
已经顺利地加入
MPP
系统中。但是,
MPP
系统动态扩容并没有完成,在原有 MPP 系统中建立的哈希分布表、复制分布表和随机分布表需要在增加节点后的 MPP
系统中进行数据重分发。
数据重分发
MPP
动态增加节点后,原系统中的哈希分布表、复制分布表和随机分布表需要进行数据重分发,范围分布表和 LIST 分布表不需要进行数据重分发。
1.哈希分布表数据重分发
具体步骤如下:
1)
全局登录新增节点
EP03
(如果新增多个节点,则要分别全局登录每个新增节点)
2)
设置本
session
可对表进行重分发(插入和删除),执行如下语句:
SET_SESSION_MPP_REDIS(1);
3)
设置重分发状态,执行如下语句:
SF_MPP_REDIS_STATE_SET('SYSDBA','T1',2);
SF_MPP_REDIS_STATE_SET('SYSDBA','T2',2);
4)
进行查询插入,执行如下语句:
INSERT INTO T1 SELECT * FROM T1 WHERE EP_SEQNO('T1')= 2; --2 为本节点 SEQNO
COMMIT;
INSERT INTO T2 SELECT * FROM T2 WHERE EP_SEQNO('T2')= 2; --2 为本节点 SEQNO
COMMIT;
5)
设置待删除数据状态,执行如下语句:
SF_MPP_REDIS_STATE_SET('SYSDBA','T1',3);
SF_MPP_REDIS_STATE_SET('SYSDBA','T2',3);
6)
本地登录每个
MPP
系统的原有节点,删除分发出去的数据。执行如下语句:
SET_SESSION_MPP_REDIS(1);
对于普通表
T1
,执行如下语句:
DELETE FROM T1 WHERE EP_SEQNO('T1')=2; --2 为本节点 SEQNO
如果新增了多个节点,则需要删除分发到所有这些新增节点的数据,语句形如:
DELETE FROM T1 WHERE EP_SEQNO('T1')=新加节点 MPP 序号 1 OR EP_SEQNO('T1')=新加节点
MPP
序号
2 ......
对于
HUGE
表
T2
,由于直接使用
DELETE
效率较低,采用查询插入再删除表的方
式:
--
放开本地登录下的
DDL
限制
SP_SET_SESSION_LOCAL_TYPE(1);
CREATE TABLE STR_TAB(A VARCHAR);
INSERT INTO STR_TAB SELECT TABLEDEF('SYSDBA','T2') FROM DUAL;
ALTER TABLE T2 RENAME TO T2_REDIS;
DECLARE
sqltxt VARCHAR;
BEGIN
SELECT * INTO sqltxt FROM STR_TAB;
EXECUTE IMMEDIATE sqltxt;
END;
/
SF_MPP_REDIS_STATE_SET('SYSDBA','T2',3);
INSERT INTO T2 SELECT * FROM T2_REDIS WHERE EP_SEQNO('T2_REDIS')= 2;
DROP TABLE T2_REDIS;
DROP TABLE STR_TAB;
COMMIT;
在这个步骤中需要注意的是,如果表上建有二级索引,则需要重新创建二级索引。
7)
所有新增节点执行完上述步骤后,重置表的分发状态为普通状态,执行如下语句:
SF_MPP_REDIS_STATE_SET('SYSDBA','T1',0);
-
复制发布表数据重发布
具体步骤如下:
1)
本地登录新增节点
EP03
(如果新增多个节点,则要分别本地登录每个新增节点),
执行如下语句:
SET_SESSION_MPP_REDIS(1);
SP_SET_SESSION_LOCAL_TYPE(1); --放开本地登录下的 DDL 限制
2)
创建新增节点
EP03
到某一原有节点间的外部链接(如果新增多个节点,则要为每个新增节点创建一个这样的外部链接)
CREATE LINK LINK_EP01 CONNECT WITH SYSDBA IDENTIFIED BY SYSDBA USING 'EP01';
3)
执行查询插入
INSERT INTO T3 SELECT * FROM T3@LINK_EP01;
4)
删除外部链接
DROP LINK LINK_EP01;
5)
全局登录
MPP
系统,重置表的分发状态为普通状态,执行如下语句:
SET_SESSION_MPP_REDIS(1);
SF_MPP_REDIS_STATE_SET('SYSDBA','T3',0);
3.随机分布表数据重分发
具体步骤如下:
1)
本地登录新增节点
EP03
(如果新增多个节点,则要分别本地登录每个新增节点),
执行如下语句:
SET_SESSION_MPP_REDIS(1);
SP_SET_SESSION_LOCAL_TYPE(1); --放开本地登录下的 DDL 限制
2)
设置表的重分发状态
SF_MPP_REDIS_STATE_SET('SYSDBA','T4',2);
3)
创建
EP03
与每个原有节点间的外部链接(如果新增多个节点,则要为每个新增节
点创建这样的外部链接)
CREATE LINK LINK1 CONNECT WITH SYSDBA IDENTIFIED BY SYSDBA USING 'EP01';
CREATE LINK LINK2 CONNECT WITH SYSDBA IDENTIFIED BY SYSDBA USING 'EP02';
4)
本地登录每个原有节点,查出每个原有节点上表
T4
的
min(ROWID)
和max(ROWID)。
SELECT MIN(ROWID),MAX(ROWID) FROM T4;
5)
在新增节点
EP03
上,分别使用连接每个原有节点的外部链接执行查询插入。
INSERT INTO T4 SELECT * FROM T4@LINK1 WHERE ROWID BETWEEN V_MIN1 AND V_MIN1 + (V_MAX1 - V_MIN1)*1/3;
INSERT INTO T4 SELECT * FROM T4@LINK2 WHERE ROWID BETWEEN V_MIN2 AND V_MIN2 + (V_MAX2 - V_MIN2)*1/3;
说明:
V_MIN1
和
V_MAX1
对应第
4)
步中查询出的
EP01
上的
min(ROWID)
和 max(ROWID);V_MIN2 和 V_MAX2 对应第 4)步中查询出的 EP02 上的 min(ROWID)和 max(ROWID);1/3 中的 3 表示动态增加节点后的节点总数。
如果有多个新增节点,则节点 2、节点 3……上执行的查询插入语句形如:
INSERT INTO T4 SELECT * FROM T4@LINKx WHERE ROWID BETWEEN V_MINx + (V_MAXx - V_MINx)*N_SEQ/N_SITE_NEW_TOTAL+ 1 AND V_MINx + (V_MAXx - V_MINx)*(N_SEQ + 1)/N_SITE_NEW_TOTAL;
说明:
V_MINx
和
V_MAXx
的意义与前面说明的一致;
N_SEQ
表示新增节点序号,新增节点 1 的 N_SEQ 为 0,新增节点 2 的 N_SEQ 为 1……;N_SITE_NEW_TOTAL 表示动态增加节点后的节点总数。
6)
全局登录某一节点,设置表的待删除数据状态
SF_MPP_REDIS_STATE_SET('SYSDBA','T4',3);
7)
本地登录每个原有节点,删除分发出去的数据,执行如下语句:
SET_SESSION_MPP_REDIS(1);
DELETE FROM T4 WHERE ROWID BETWEEN V_MIN AND V_MIN + (V_MAX - V_MIN) * 1/3;
说明:
V_MIN
和
V_MAX
对应第
4)
步中查询出的
min(ROWID)
和
max(ROWID)
;1/3 中的 1 表示新增节点数;3 表示动态增加节点后的节点总数。
8)
每个原有节点都完成删除后,都执行提交操作。
COMMIT;
9)
全局登录某个节点,重置表的分发状态为普通状态,执行如下语句:
SET_SESSION_MPP_REDIS(1);
SF_MPP_REDIS_STATE_SET('SYSDBA','T4',0);
10)
本地登录
EP03
,删除之前创建的到每个原有节点的外部链接(如果新增多个节点,
则要本地登录每个新增节点删除这些外部链接)
DROP LINK LINK1;
DROP LINK LINK2;
至此,原有
MPP
的哈希分布表、复制分布表和随机分布表都已进行了数据重分发,但
是还需要更新扩容后的
MPP
系统的控制文件中的数据分布控制结构。
全局登录某个节点,执行如下语句:
SF_MAL_CONFIG(1,1);
SF_MPP_SAVE_HASHMAP();
SF_MAL_CONFIG(0,1);
MPP
系统动态扩容全部完成!
MPP环境的DDL克隆与还原
DDL
克隆可以把系统中的对象定义信息进行备份,之后再还原到别的数据库节点。利用这个功能,可以将一个 MPP 系统的对象定义信息克隆并还原到另一个 MPP 系统中,且两个
MPP
系统的节点数不必一致。
由于
MPP
环境下执行
DDL
克隆时会将
dmmpp.ctl
也一并备份还原,若还原的 MPP 环境与备份环境不一致时,会导致还原后的 MPP 系统不能正确启动。因此在
执行完还原操作后,需要使用使用
dmctlcvt
工具,将当前环境的
dmmpp.ini
再次生成dmmpp.ctl,替换还原生成的 dmmpp.ctl.
MPP 主备系统