【达梦】DM8 查询建表-CTAB_SEL_WITH_CONS

背景

描述一次生产事故

在生产环境上,做表备份(create tablex user_1001 as select * from user),做了一些验证,做完验证后要把数据恢复回来,为了方便操作,把 user drop 掉之后,再用相同的方法,把 user_1001 复制为 user 表,再把 user_1001 表给drop 掉。

这样,验证完成后,数据还是原来的数据,听起来没有什么毛病。但第二天就出现生产事故了。

原因

在dm8下面(可能其它数据库也是), 通过 create tablex user_1001 as select * from user 这种方式只会表结构和表数据上的拷贝,并不会进行列上的一些约束相关的拷贝。

即:这种方式的拷贝,会丢失主键,唯一约束,索引,CHECK约束,分区信息,存储信息等等。

所以,看起来表是原来的表,数据还是原来的数据,但已经丢失了一些东西了。而这一次的生产事故就是因为丢失了主键、唯一约束,索引而引发的事故。

如何进行正确的表复制

官网上有这么一段: https://eco.dameng.com/document/dm/zh-cn/pm/management-table.html

9.2.4 查询建表
为了创建一个与已有表相同的新表,或者为了创建一个只包含另一个表的一些行和列的新表,可以使用 CREATE TABLE AS SELECT(CTAS)命令。使用该命令,可以通过使用 WHERE 条件将已有表中的一部分数据装载到一个新表中,或者可以通过 SELECT * FROM 子句将已有表的所有数据装载到创建的表中,如以下程序片段所示:

CREATE TABLE NEW_EMP
AS
SELECT * FROM EMPLOYEE;

如果用户通过单表的全表查询进行建表操作,则可以通过将 INI 参数 CTAB_SEL_WITH_CONS 置为 1 进行原始表上约束的拷贝,列上能拷贝的约束包括默认值属性、自增属性、非空属性以及加密属性,表上能拷贝的约束包括唯一约束、PK 约束以及 CHECK 约束。也可将 CTAB_SEL_WITH_CONS 置为 2 进行原始表上表结构、分区信息、存储信息以及表约束的拷贝,其中表约束包括唯一约束、PK 约束以及 CHECK 约束。

DM 里面,关于查询建表,它有涉及到这么一个参数:
CTAB_SEL_WITH_CONS: 它的默认值是 0 (即只复制结构和数据)

  • 把这个参数设置为 1: 列上能拷贝的约束包括默认值属性、自增属性、非空属性以及加密属性,表上能拷贝的约束包括唯一约束、PK 约束以及 CHECK 约束
  • 把这个参数设置为2: 进行原始表上表结构、分区信息、存储信息以及表约束的拷贝,其中表约束包括唯一约束、PK 约束以及 CHECK 约束。

设置方法

su - dmdba && cd $DM_HOME/bin

disql SYSDBA/'"密码"'@localhost:端口   连入后 设置:sp_set_para_value(1,'CTAB_SEL_WITH_CONS',1);
posted @ 2023-02-06 10:24  aaacarrot  阅读(361)  评论(1编辑  收藏  举报