DM MPP 使用

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. 复制发布表数据重发布
具体步骤如下:
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 主备系统
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值