暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

达梦数据库物理备份恢复_表级备份还原

原创 LeeWen2020 2021-06-22
936

表级联机备份还原

表备份与还原的限制条件参考《DM8备份恢复手册》。

选项说明:

TABLE:需要还原的表名称。表名:指定表名还原时数据库中必须存在该表,否则报错,不会从备份集判断是否存在目标表。
STRUCT:执行表结构还原,若未指定,则认为是表中数据还原;表数据还原要求还原目标表结构与备份集中完全一致,否则报错,所以表结构还原可以在表数据还原之前执行,减少报错。
KEEP TRXID:指定还原后数据页上记录的TRXID保持不变, 若发现备份时系统最大的TRXID大于等于当前系统的最大TRXID,则将当前系统最大事务 ID+1000。调整后副作用:rec_id>=next_trxid的记录,或者rec_id<=bak_max_trxid+1000的记录,可能因为执行了表还原,导致查询结果不正确,原本不可见的数据,变得可见了。
BACKUPSET:表空间备份时指定的备份集路径。若指定为相对路径,会在默认备份目录下搜索备份集。
DEVICE TYPE:指存储备份集的介质类型,目前表还原暂时仅支持DISK,表示备份集存储介质为磁盘。
PARMS:介质参数,只对介质类型为 TAPE 时有效。
IDENTIFIED BY:加密备份表时,用户设置的密码。密码长度为9到48个字节。
ENCRYPT WITH:加密算法。缺省情况下,算法为AES256_CFB。
TRACE FILE:指定生成的TRACE文件名。
TRACE LEVEL:有效值1、2,默认为1表示不启用TRACE,为2表示启用TRACE。

与备份数据库与表空间不同,备份表不需要服务器配置归档。不依赖dmap,直接通过SQL备份即可。
在表还原的时候,DELETE 、TRUNCATE的恢复可以指定表名也可以不指定表名,STRUCT选项可指定也可不指定,DROP的恢复,需要先恢复表结构再恢复数据。

1.1 无索引无约束表备份恢复

###创建测试表

create table test.t (id int,name varchar(100));
 insert into test.t values(1,'aa');
 insert into test.t values(2,'bb');
 insert into test.t values(3,'cc');
 insert into test.t values(4,'dd');
Commit;

###备份表

backup table test.t backupset '/dm8/dmbak/test_t_bak01';

###删除部分表数据

delete from test.t where id > 2;
Commit;
SQL> select * from test.t;

行号     ID          NAME
---------- ----------- ----
1          1           aa
2          2           bb

###还原表数据

restore table test.t from backupset '/dm8/dmbak/test_t_bak01';
表还原不需要recover

----查询数据
SQL> select * from test.t;

行号     ID          NAME
---------- ----------- ----
1          1           aa
2          2           bb
3          3           cc
4          4           dd

1.2 有约束有索引表备份恢复

1.2.1 DELETE 恢复

###对T表增加主键,并创建t2表外键关联t表id列

alter table "TEST"."T" add primary key("ID");
create table "TEST"."T2"
(
	"TID" INT not null ,
	"LOCAL" CHAR(10),
	"COMM" CHAR(10)
);

alter table "TEST"."T2" add constraint foreign key("TID") references "TEST"."T"("ID") with index;
---插入数据
insert into test.t2 values(1,'abc','xxx');
insert into test.t2 values(2,'abc','xxx');
insert into test.t2 values(3,'abc','xxx');
insert into test.t2 values(4,'abc','xxx');
commit;

SQL> select * from test.t2;

行号     TID         LOCAL      COMM      
---------- ----------- ---------- ----------
1          1           abc        xxx       
2          2           abc        xxx       
3          3           abc        xxx       
4          4           abc        xxx  

###备份表

SQL> backup table test.t2 backupset '/dm8/dmbak/test_t2_bak01';
情况1:只删除子表数据,参照表数据都存在

###只删除T2表数据

SQL> delete from test.t2 where tid>2;
SQL> commit;
SQL> select * from test.t2;

行号     TID         LOCAL      COMM      
---------- ----------- ---------- ----------
1          1           abc        xxx       
2          2           abc        xxx     

###还原T2表数据

###注意:如果直接还原会报错[-8327],需要先恢复进行表结构还原,然后再进行表数据还原
SQL> restore table test.t2 from backupset '/dm8/dmbak/test_t2_bak01';
restore table test.t2 from backupset '/dm8/dmbak/test_t2_bak01';
[-8327]:还原表中存在二级索引或冗余约束.

#还原表结构
SQL> restore table test.t2 struct from backupset '/dm8/dmbak/test_t2_bak01';

#还原表数据
SQL> restore table test.t2 from backupset '/dm8/dmbak/test_t2_bak01';

---查看表数据
SQL> select * from test.t2;

行号     TID         LOCAL      COMM      
---------- ----------- ---------- ----------
1          1           abc        xxx       
2          2           abc        xxx       
3          3           abc        xxx       
4          4           abc        xxx   
情况2:删除子表数据,并删除参照表部分数据

###删除T2表部分数据之后,参照的主表T也进行了数据删除操作

SQL> delete from test.t2 where tid>2;
SQL> commit;
SQL> delete from test.t where id>3;
SQL> commit;

###还原表T2数据

#还原表结构
SQL> restore table test.t2 struct from backupset '/dm8/dmbak/test_t2_bak01';
#还原表数据
SQL> restore table test.t2 from backupset '/dm8/dmbak/test_t2_bak01';
restore table test.t2 from backupset '/dm8/dmbak/test_t2_bak01';
[-6607]:违反引用约束[CONS134218769].

此时还原T2表数据时,由于主表T的进行了数据删除操作,恢复时会报“违反引用约束”
这种情况下,我们可以在还原表数据时,指定不还原约束或者索引(without constraint/index),操作如下:

#还原表结构
SQL> restore table test.t2 struct from backupset '/dm8/dmbak/test_t2_bak01';
#还原表数据
SQL> restore table test.t2 without constraint from backupset '/dm8/dmbak/test_t2_bak01';

---查看表数据
SQL> select * from test.t2;

行号     TID         LOCAL      COMM      
---------- ----------- ---------- ----------
1          1           abc        xxx       
2          2           abc        xxx       
3          3           abc        xxx       
4          4           abc        xxx   

1.2.2 TRUNCATE 恢复

TRUNCATE TABLE后,恢复表数据操作与DELETE 完全相同。

1.2.3 DROP 恢复

场景1:

SQL> drop table test.t2;

SQL> restore table test.t2 from backupset '/dm8/dmbak/test_t2_bak01';
restore table test.t2 from backupset '/dm8/dmbak/test_t2_bak01';
第1 行附近出现错误[-2106]:无效的表或视图名[T2].

此处根据DM8备份恢复手册-表还原的概述,若未指定struct选项,则认为是表中数据还原;表数据还原要求还原目标表结构与备份集中完全一致,否则报错。所以需要先恢复表结构再恢复数据。

恢复步骤如下:
如果在建表语句中指定了约束或者索引,需要先还原表结构,再还原表数据,如果还原表数据提示“违反引用约束”,则需要指定without constraint不还原约束。

#还原表结构
restore table test.t2 struct from backupset '/dm8/dmbak/test_t2_bak01';

#还原表数据
restore table test.t2 from backupset '/dm8/dmbak/test_t2_bak01';
或者 不还原约束
restore table test.t2 without constraint from backupset '/dm8/dmbak/test_t2_bak01';

场景2:可以通过手动创建目标表后,然后进行恢复

---drop t2表
SQL> drop table test.t2;

---创建t2表
create table "TEST"."T2"
(
	"TID" INT not null ,
	"LOCAL" CHAR(10),
	"COMM" CHAR(10)
);

---还原步骤同上

1.3 表级备份还原总结

表备份还原:
与备份数据库与表空间不同,备份表不需要服务器配置归档。不依赖dmap,直接通过SQL备份即可。
在表还原的时候,DELETE 、TRUNCATE的恢复可以指定表名也可以不指定表名,STRUCT选项可指定也可不指定,DROP的恢复,需要先恢复表结构再恢复数据。
如果在建表语句中指定了约束或者索引,需要先还原表结构,再还原表数据,如果还原表数据提示“违反引用约束”,则需要指定without constraint不还原约束。

结语

随着产品不断的改进,达梦数据库不同的版本在操作或者限制条件等方面可能有细微差别(也可能没有),当我们在操作时如果不是很清楚相关操作,可以先参考当前数据库版本的官方手册,所有的官方手册位于软件安装目录下的doc目录中($DM_HOME/doc)。
更多资讯请上达梦技术社区了解:https://eco.dameng.com

最后修改时间:2021-06-22 11:17:09
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论