对于一些会大规模发生delete的场景下,数据库是不会回收空间的,此时需要手动对其进行空间释放。但因为其中可能存在大量索引、约束及触发器等对象。随意操作,可能会影响正常业务的正常使用。本例利用dexp和dimp达到这一效果。
环境准备表、索引及触发器:
student表:
CREATE TABLE "SYSDBA"."STUDENT"
(
"NAME" VARCHAR(20),
"AGE" INT NOT NULL,
"SEX" VARCHAR(10),
"GRADE" INT,
NOT CLUSTER PRIMARY KEY("AGE"),
CHECK(SEX IN ('MAIL', 'FEMAIL'))
,CHECK(GRADE IN (7, 8, 9)))
PARTITION BY LIST("GRADE")
SUBPARTITION BY LIST("SEX") SUBPARTITION TEMPLATE
(
SUBPARTITION "Q1" VALUES('MAIL') STORAGE(ON "MAIN"),
SUBPARTITION "Q2" VALUES('FEMAIL') STORAGE(ON "MAIN")
),
SUBPARTITION BY RANGE("AGE") SUBPARTITION TEMPLATE
(
SUBPARTITION "R1" VALUES LESS THAN(12) STORAGE(ON "MAIN"),
SUBPARTITION "R2" VALUES LESS THAN(15) STORAGE(ON "MAIN"),
SUBPARTITION "R3" VALUES LESS THAN(MAXVALUE) STORAGE(ON "MAIN")
)
(
PARTITION "P1" VALUES(7) STORAGE(ON "MAIN", CLUSTERBTR) ,
PARTITION "P2" VALUES(8) STORAGE(ON "MAIN", CLUSTERBTR) ,
PARTITION "P3" VALUES(9) STORAGE(ON "MAIN", CLUSTERBTR)
) STORAGE(HASHPARTMAP(1), ON "MAIN", CLUSTERBTR) ;
局部索引:
CREATE INDEX "IND_STUDENT_NAME" ON "SYSDBA"."STUDENT"("NAME" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
触发器:
CREATE OR REPLACE TRIGGER STUDENT_TRIGGER
BEFORE INSERT
ON "SYSDBA"."STUDENT_BAK"
FOR EACH ROW --表示行级触发器
BEGIN
if :new.AGE<7 then
RAISE_APPLICATION_ERROR(-20001,'未到达入学年龄');
END if;
end;
对表student利用dexp进行备份
[dmdba@MySQL5 ~]$ dmdbms/bin/dexp USERID=SYSDBA/SYSDBA@192.168.56.100:5236 FILE=student.dmp DIRECTORY=/home/dmdba TABLES=STUDENT LOG=student.log
dexp V8
----- [2023-01-03 10:54:27]导出表:STUDENT -----
导出索引:IND_STUDENT_NAME
导出触发器: STUDENT_TRIGGER
导出模式下的对象权限...
表STUDENT导出结束,共导出 4 行数据
整个导出过程共花费 0.060 s
成功终止导出, 没有出现警告
从导出信息来看,导出的对象非常详尽。如果是生产环境的大表,请注意再导出统计信息,以防止重新收集统计导致新旧统计信息产生偏差,最终影响应用。
再删除student表:
[dmdba@MySQL5 ~]$ dmdbms/bin/disql
disql V8
用户名:
密码:
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.876(ms)
SQL> drop table student purge;
操作已执行
已用时间: 60.306(毫秒). 执行号:2200.
SQL> exit
利用dimp完成表还原:
[dmdba@MySQL5 ~]$ dmdbms/bin/dimp USERID=SYSDBA/SYSDBA@192.168.56.100:5236 FILE=student.dmp DIRECTORY=/home/dmdba LOG=student_imp.log
dimp V8
本地编码:PG_UTF8, 导入文件编码:PG_GB18030
----- [2023-01-03 10:56:37]导入表:STUDENT -----
创建表 STUDENT ...
导入表 STUDENT 的数据:4 行被处理
导入表的索引:
IND_STUDENT_NAME
导入成功……
导入表的触发器:
STUDENT_TRIGGER
导入成功……
整个导入过程共花费 0.314 s
成功终止导入, 没有出现警告
[dmdba@MySQL5 ~]$
验证一下触发器效果:
如此操作可以确保delete操作后,数据空间的释放。
达梦数据库技术社区:https://eco.dameng.com