数据库变更

本章节主要介绍达梦数据库变更常见问题,为用户提供数据库变更常见问题的分析和解决思路。除此之外,用户还可前往达梦技术社区参与更多问题讨论。

目录


正文

在达梦 MPP 集群已有节点的基础上,如何动态增加节点?

【问题解决】

假如在 MPP 系统已有 EP01 和 EP02 两个节点的基础上,增加一个节点 EP03,具体步骤如下:

一、动态增加节点

  • 禁止系统 DDL 操作。全局登录 MPP 系统任一节点,执行下面的语句禁止系统的 DDL 操作。
SP_DDL_FORBIDEN(1);
  • 克隆数据库。数据库克隆的目的是把系统中的对象定义信息进行备份,用于恢复到新加的节点上,生成的备份集位于指定的目录备份集中。

(1)若 MPP 系统处于运行状态,采用联机 DDL 克隆方式(需要配置本地归档)。全局登录 MPP 系统任一节点,执行下面的语句。生成的备份集保存在当前登陆节点 bak 路径中的 clone 目录中。

BACKUP DATABASE DDL_CLONE BACKUPSET 'CLONE';

(2)若 MPP 系统处于退出状态,选择 MPP 系统任一节点使用 DMRMAN 工具进行脱机备份。生成的备份集保存在当前备份节点 bak 路径中的 clone 目录中。

RMAN>backup database '/dmdbms/data/dameng/dm.ini' ddl_clone backupset 'clone';
  • 脱机还原。在新增节点上执行脱机还原。手动拷贝克隆的备份集目录 clone 到新增节点 EP03 的 bak 目录中,使用 DMRMAN 工具进行脱机还原并更新数据库。
RMAN>RESTORE DATABASE '/dmdbms/data/dameng/dm.ini' FROM BACKUPSET 
'c:\dmdbms\data\dameng\bak\clone';
RMAN>RECOVER DATABASE '/dmdbms/data/dameng/dm.ini' FROM BACKUPSET '
c:\dmdbms\data\dameng\bak\clone';
RMAN>RECOVER DATABASE ' /dmdbms/data/dameng/dm.ini' UPDATE DB_MAGIC;

注意:若要增加多个节点,则依次执行拷贝、脱机还原和更新数据库步骤。

  • 配置新增节点的 dmmal.ini。为新增的节点配置 dmmal.ini,其中包含扩容前 MPP 系统的节点,以及新增节点 EP03 的信息。
[MAL_INST1]
MAL_INST_NAME = EP01
MAL_HOST = 192.168.117.129
MAL_PORT = 5270
MAL_INST_HOST = 192.168.117.129
MAL_INST_PORT = 5240
[MAL_INST2]
MAL_INST_NAME = EP02
MAL_HOST = 192.168.117.128
MAL_PORT = 5271
MAL_INST_HOST = 192.168.117.128
MAL_INST_PORT = 5241
 #新增节点的信息
[MAL_INST2]
MAL_INST_NAME = EP03  #实例名
MAL_HOST = 192.168.117.130  # MAL IP 地址
MAL_PORT = 5272  # MAL 监听端口
MAL_INST_HOST = 192.168.117.130 #实例对外服务的 IP 地址
MAL_INST_PORT = 5242  #实例服务器监听通讯端口号
  • 配置新增节点的 dm.ini。修改新增节点的 dm.ini 文件中的如下配置项:
INSTANCE_NAME = EP03
PORT_NUM = 5242
MAL_INI = 1
MPP_INI = 1
  • 以 MOUNT 方式启动新增节点 EP03。以 MOUNT 方式启动的目的是防止启动后有用户执行 DDL 操作,因此先禁止 DDL 后再 OPEN。
---登录
./dmserver /dmdata/dmdb/mppdb/dm.ini mount
---登录后执行如下命令。
SP_DDL_FORBIDEN(1);
ALTER DATABASE OPEN FORCE;
  • 动态增加 MAL。分别本地登录 MPP 系统中原有的每个节点,执行下列语句为每个原有节点的 MAL 配置增加新增节点信息。
--设置本地 MAL 配置状态
SF_MAL_CONFIG(1,0);
--增加 MAL 配置
SF_MAL_INST_ADD('MAL_INST3','EP03','192.168.117.130',5272, '192.168.117.130',5242);
--应用 MAL 配置
SF_MAL_CONFIG_APPLY();
--重置本地 MAL 配置状态
SF_MAL_CONFIG(0,0);
  • 增加 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 分布表不需要进行数据重分发。下面以原有的 T_HASH 表为例进行哈希分布表的数据重分发。

  • 全局登录新增节点 EP03(如果新增多个节点,则要分别全局登录每个新增节点)
---设置本 session 可对表进行重分发(插入和删除)
SET_SESSION_MPP_REDIS(1); 

---设置重分发状态
SF_MPP_REDIS_STATE_SET('SYSDBA','T_HASH',2);

---进行查询插入,2 为本节点 SEQNO 
INSERT INTO T_HASH SELECT * FROM T_HASH WHERE EP_SEQNO('T_HASH')= 2; 
COMMIT; 

---设置待删除数据状态
SF_MPP_REDIS_STATE_SET('SYSDBA','T_HASH',3);
  • 本地登录每个 MPP 系统的原有节点,删除分发出去的数据。 设置本 session 可对表进行重分发(插入和删除),执行如下语句:
SET_SESSION_MPP_REDIS(1); 
---删除数据
DELETE FROM T1 WHERE EP_SEQNO('T1')=2; --2 为本节点 SEQNO
COMMIT; 
  • 所有新增节点执行完上述步骤后,重置表的分发状态为普通状态,执行如下语句:
SF_MPP_REDIS_STATE_SET('SYSDBA','T_HASH',0);

至此,原有 MPP 的哈希分布表已进行了数据重分发,但是还需要更新扩容后的 MPP 系统的控制文件中的数据分布控制结构。

---全局登录某个节点
SF_MAL_CONFIG(1,1); 
SF_MPP_SAVE_HASHMAP(); 
SF_MAL_CONFIG(0,1);

添加多条数据后,使用系统视图 CALL SP_GET_EP_COUNT('SYSDBA','TABLE') 查看表 T_HASH 在每个实例上的数据行数,可以看到新的 EP 节点存储的数据行数。

如何更改数据库实例目录

【问题解决】

数据库安装目录为:/dm8/dmdbms
当前实例路径为:/dm8/data/DAMENG1
预计修改的实例路径为:/dm8/data1
具体操作步骤如下:

---创建实例路径并授权(root 用户下执行)
mkdir -p /dm8/data1
chown -R dmdba:dinstall /dm8/data1

---停止数据库服务
su - dmdba
cd /dm8/dmdbms/bin
./DmServiceDMSERVER1 stop

---将数据文件复制到新路径
cp -r /dm8/data/DAMENG1/ /dm8/data1

---切换到新路径下
cd /dm8/data1/DAMENG1/

---修改dm.ini配置文件中的路径,将文件中的路径 /dm8/data/DAMENG1 都改为 /dm8/data1/DAMENG1
vim /dm8/data1/DAMENG1/dm.ini

---使用 dmctlcvt 将控制文件转化为 txt 文件
cd /dm8/dmdbms/bin
./dmctlcvt TYPE=1 SRC=/dm8/data/DAMENG1/dm.ctl DEST=/dm8/data1/DAMENG1/dmctl.txt

---编辑上面的 txt 文件,将里面原有路径改为 /dm8/data1/DAMENG1
vim /dm8/data1/DAMENG1/dmctl.txt

---重新生成控制文件
./dmctlcvt TYPE=2 SRC=/dm8/data1/DAMENG1/dmctl.txt DEST=/dm8/data1/DAMENG1/dm.ctl

---重新创建服务并指定新的实例路径,或在原有服务文件中,修改ini文件路径为/dm8/data1/DAMENG1/dm.ini,并启动数据库实例服务
cd /dm8/dmdbms/bin
./DmServiceDMSERVER1 start

---检查数据库实例目录
ps -ef|grep dmserver

修改用户密码时报错长度不够或不满足策略

【问题描述】:

已经修改了 dm.ini 文件中与密码相关的参数 PWD_POLICY 和 PWD_MIN_LEN,再修改用户密码依旧报错:长度不满足要求或不满足策略。

【问题解决】:

1、dm.ini 文件中与密码相关的参数 PWD_POLICY 和 PWD_MIN_LEN 修改后,只对新建用户有效。
2、已有用户密码策略由之前创建时的密码策略决定,已绑定在用户属性上。如需修改,需要先修改用户绑定的密码策略,再修改密码。

---通过以下 sql 可获知当前用户的密码策略
select PWD_POLICY,SF_GET_USERNAME_BY_ID(ID),* from  SYSUSERS;
---修改已有用户密码策略可通过以下语法进行修改
alter user 用户名 PASSWORD_POLICY 密码策略 ;

安全员用户密码忘记问题

【问题描述】:

安全员用户密码忘记后如何登录,修改密码。

【问题解决】:

可通过修改支持本机操作系统认证参数,重启数据库后,通过免密登陆修改密码。可参考如下步骤:

  1. 确定安全员用户对应的系统用户组为 SYSAUDITOR/******。
  2. 登录数据库修改支持本机操作系统认证参数:
SQL> SP_SET_PARA_VALUE(2,'ENABLE_LOCAL_OSAUTH',1)
  1. 参数修改完成后,重启数据库。
[dmdba@CentOS7-04 bin]$ ./DmServiceDM restart
Stopping DmServiceDM:                                      [ OK ]
Starting DmServiceDM:                                      [ OK ]
[dmdba@CentOS7-04 bin]$ exit
  1. 添加用户组。
[root@CentOS7-04 ~]# groupadd dmauditor
[root@CentOS7-04 ~]# grep dmauditor /etc/group
dmauditor:x:1002:
[root@CentOS7-04 ~]# usermod -a -G dmauditor dmdba
[root@CentOS7-04 ~]# id dmdba
uid=1001(dmdba) gid=1001(dinstall) 组=1001(dinstall),1002(dmauditor)
[root@CentOS7-04 ~]# getent group dmauditor
dmauditor:x:1002:dmdba
  1. 登陆数据库修改 SYSAUDITOR 密码。
[root@CentOS7-04 ~]# su - dmdba
上一次登录:一 10月 10 18:29:07 CST 2022pts/0 上
[dmdba@CentOS7-04 ~]$ cd dmdbms/bin
[dmdba@CentOS7-04 bin]$ ./disql / as SYSAUDITOR
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 1.591(ms)
disql V8
SQL> select user;

行号     USER()  
---------- ----------
1          SYSAUDITOR

已用时间: 2.962(毫秒). 执行号:300.
SQL> alter user "SYSAUDITOR" identified by "******";
操作已执行
已用时间: 5.549(毫秒). 执行号:301.
SQL> exit
  1. 修改完成后,即可使用修改后的密码登录 SYSAUDITOR 用户。

image.png

如何使用 sql 的方式开启数据库加密通信?

【问题解决】:

  1. 在 disql 或管理工具中执行以下命令可以开启加密通信。
SP_SET_PARA_STRING_VALUE(2,'COMM_ENCRYPT_NAME','DES_OFB');
  1. 修改后重启 DM 数据库服务器生效,通过以下 SQL 命令可以查看通信加密是否已开启。
SELECT * FROM V$DM_INI WHERE PARA_NAME= 'COMM_ENCRYPT_NAME';

image.png

如果想进一步验证加密通信是否已生效,请参考数据库检查:如何验证通信是否已经加密?

函数解释如下:

SP_SET_PARA_STRING_VALUE () 函数一般用来设置 DM.INI 文件中的字符串型参数值,内置 scope、ini_param_name、value 三个参数。

  • scope:取值为 0、1、2 。0 表示修改内存中的动态配置参数值;1 表示 DM.INI 文件和内存参数都修改,不需要重启服务器;2 表示只修改 DM.INI 文件,服务器重启后生效。
  • ini_param_name:DM.INI 文件中的参数名。
  • value:设置的字符串的值。

参数 COMM_ENCRYPT_NAME 说明如下:

参数 默认值 属性 说明
COMM_ENCRYPT_NAME 空串 静态 用于通信加密。基于应用层的消息包加密的开关。
空串:不加密。
算法名:按照指定的算法名进行加密。如果给的加密算法名
错误,则用使用加密算法 DES_CFB。DM 支持的加密算法名
可以通过查询动态视图 V$CIPHERS 获取。

如何将表中字段类型由 varchar 改为 text?

【问题描述】:

在达梦数据中,如果直接将 varchar 类型修改为大字段类型会报错:"数据类型的变更无效"。那么如何将数据库表中 COLUMN_1 字段的类型由 varchar 改为 text 类型?

【问题解决】:

提供以下方法仅供参考:例如将表 TABLE_1 中 COLUMN_1 字段的类型由 varchar 改为 text 类型。

--在 TABLE_1 表中增加一个为 text 类型的字段 COLUMN_2
alter table "BBB"."TABLE_1" add COLUMN_2 text;

--将 TABLE_1 表中 COLUMN_1 字段的值赋给 COLUMN_2
update "BBB"."TABLE_1" set COLUMN_2=trim(COLUMN_1);

--删除 TABLE_1 表字段 COLUMN_1
alter table "BBB"."TABLE_1" drop column COLUMN_1;

--将 TABLE_1 表字段 COLUMN_2 改名为 COLUMN_1
alter table "BBB"."TABLE_1" rename column COLUMN_2 to COLUMN_1;
注意

以上操作适用于数据量较小的表,数据量大的表建议创建新表,进行迁移。

如何实现免密码登录?

【问题描述】

如何实现类似 oracle 的 sqlplus / as sysdba 在操作系统上免密码登录。

【问题解决】

  1. 修改支持本机操作系统认证参数 ENABLE_LOCAL_OSAUTH。
SQL> select * from v$dm_ini where para_name='ENABLE_LOCAL_OSAUTH';

行号     PARA_NAME           PARA_VALUE MIN_VALUE MAX_VALUE MPP_CHK SESS_VALUE FILE_VALUE
---------- ------------------- ---------- --------- --------- ------- ---------- ----------
           DESCRIPTION                                                     PARA_TYPE
           --------------------------------------------------------------- ---------
1          ENABLE_LOCAL_OSAUTH 0          0         1         N       0          0
           Whether to enable local authorization by operating system users READ ONLY

SQL> SP_SET_PARA_VALUE(2,'ENABLE_LOCAL_OSAUTH',1);
DMSQL 过程已成功完成
已用时间: 25.095(毫秒). 执行号:600.

参数说明:

参数名 默认值 属性 说明
ENABLE_LOCAL_OSAUTH 0 静态 是否支持本机操作系统认证,0:不支持;1:支持
  1. 重启数据库生效。
[root@dm8dsc1 bin]# ./DmServiceDMSERVER restart
  1. 查看参数是否生效。
SQL> select * from v$dm_ini where para_name='ENABLE_LOCAL_OSAUTH';  

行号     PARA_NAME           PARA_VALUE MIN_VALUE MAX_VALUE MPP_CHK SESS_VALUE FILE_VALUE
---------- ------------------- ---------- --------- --------- ------- ---------- ----------
           DESCRIPTION                                                     PARA_TYPE
           --------------------------------------------------------------- ---------
1          ENABLE_LOCAL_OSAUTH 1          0         1         N       1          1
           Whether to enable local authorization by operating system users READ ONLY
已用时间: 7.851(毫秒). 执行号:400.
  1. 配置操作系统组 dmdba。
[dmdba@dm8dsc1 ~]$ id dmdba
用户id=1000(dmdba) 组id=1000(dinstall) 组=1000(dinstall)
[root@dm8dsc1 bin]# groupadd dmdba
[root@dm8dsc1 bin]# usermod -g dmdba -G dmdba,dinstall dmdba
[root@dm8dsc1 bin]# id dmdba
用户id=1000(dmdba) 组id=1001(dmdba) 组=1001(dmdba),1000(dinstall)
  1. 免密登录。
[dmdba@dm8dsc1 ~]$ disql / as sysdba
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 5.959(ms)
disql V8
SQL>
微信扫码
分享文档
扫一扫
联系客服