表级联机备份还原
表备份与还原的限制条件参考《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