DM备份恢复到指定时间点

一、备份还原原理

(0。0)不会吧不会吧,不会有人想看这么枯燥的意义讲解吧(别打我,我错了,下次还敢)

一、正经的第一点:开启归档

        哦,对了,还是先看看环境对备份还原的限制吧(皮了一下,差点给忘了)

环境/状态/模式

支持与限制

联级备份

联机还原

MPP环境

仅允许库和归档备份,且各节点都会执行,生成相应的备份集,支持DDL CLONE;

不支持

DSC环境

支持库级备份、表空间备份和表备份,要求 DSC 环境的所有节点都处于 OPEN 状态;

支持

MOUNT状态

仅支持归档备份;

/

SUSPEND状态

所有备份均不支持;

所有还原均不支持

OPEN状态

支持所有备份,支持 DDL CLONE;

支持

PRIMARY模式

支持所有备份,支持 DDL CLONE;

/

STANDBY模式

仅支持库级、表空间级和归档备份,支持 DDL CLONE;

/

DDL CLONE

必须备份归档,不允许指定 WITHOUT LOG。

/

这次测试就在单机环境下执行吧,没有什么限制

首先,配置归档,直接联机配置就行,执行sql语句:

ALTER DATABASE MOUNT;
ALTER DATABASE ADD ARCHIVELOG 'DEST = /home/dmdba/dm8_20210804/data_zsw/test1/arch, TYPE = local, FILE_SIZE = 1024, SPACE_LIMIT = 2048';
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;

二、全量备份

        开启归档后,对数据库进行全量备份,这里使用的是联机备份,客官也可以用脱机备份工具dmrman进行,一样样的操作。sql语句如下:

backup database full to backup_test1 backupset '/home/dmdba/dm8_20210804/data_zsw/backup_test1' parallel 8;

        哦,对了,上面的 parallel 8 这个参数是指定的并行备份(8线程的,不用在意)。

三、创建测试表并模拟误操作

        建表:

create table utest(uid varchar(10),uname varchar(10));
insert into utest values(1,'new');
commit;

        刷盘,并查看此时的LSN号(记住这个LSN,后面要用的):

alter system switch logfile;
select file_lsn from v$rlog;       #记住此时的LSN号

        误操作:

insert into utest values(2,'test');     #将此处当作误操作
commit;

        ok,到了这一步,这个数据表中就有两条数据了“new”和“test”,其中我们认为,“test”是一个错误操作添加进去的一条错误数据,后面的还原操作是想去除掉这个错误操作的。

四、恢复数据库

        首先我们把数据库实例停掉,(什么?为什么要停掉,我要进行全库恢复呀喂,要用脱机工具dmrman的喂),嗯嗯,DM仅支持表的联机还原,数据库、表空间和归档日志的还原必须通过脱机工具 DMRMAN 执行。

        停掉数据库实例之后,开始恢复数据库,在dm的bin目录下执行:

./dmrman ctlstmt="restore database '/home/dmdba/dm8_20210804/data_zsw/test2/dm.ini' from backupset '/home/dmdba/dm8_20210804/data_zsw/backup_test1' "

        这里的dm.ini和备份集所在的目录自己指定哦,如果说这个你还进行了增量备份,那么该指定哪一个备份集的路径呢?当然是增量备份的路径啦,他会自动根据增量寻找全量的路径的。

        继续还原数据库到指定时间点:

./dmrman ctlstmt="recover database '/home/dmdba/dm8_20210804/data_zsw/test2/dm.ini' 
with archivedir '/home/dmdba/dm8_20210804/data_zsw/test1/arch'
  UNTIL LSN 60000 "      #此处的LSN号与模拟误操作步骤中记录的值保持一致。

        这个语句中需要指定归档路径,嗯,没错就是你想的那个归档路径。然后  UNTIL LSN  就是之前咱们记住的那个LSN值,当然,这个UNTIL  LSN可以换成UNTIL TIME,这样的话就可以通过时间点来还原数据库了,until  time的格式如下:

 UNTIL TIME '2000-05-20 13:14:00'

        看出来这个时间的用意了吧,嗯,看懂了还不给我点赞~~~~    ૧(●´৺`●)૭  

        嗯嗯,继续下一步,更新数据库魔数。

./dmrman ctlstmt="recover database '/home/dmdba/dm8_20210804/data_zsw/test2/dm.ini' update db_magic"

五、验证

        启动数据库服务后,登录,查询之前的测试表:

select * from utest; #此时utest表中只有一条记录“new”,没有“误操作”加入的“test”值。

        此时表中只有一条数据,去除掉了误操作的影响,测试完成。

六、奇怪的问题

        有的小伙伴可能要问,如果我数据库之前没有做过备份和归档,然后在10点开了归档并做了备份,现在我想通过这种方式回到9点钟数据库的状态,行不行嘞?

        嗯,,不行。

        为啥呢,我不是做全量备份了吗,我所有的数据都在备份集里呀,LSN什么的都在啊,为啥会不到9点的状态呢?

        嗯,,,我能想到的是,数据库做了备份,这里的备份装的是数据,这里面其实是没有时间的,或者说是没有记录我的操作的,差不多这样吧,然后我的操作记录在归档里,归档中有操作有时间点,我想要恢复到指定时间点,是数据库在备份集的数据基础上,通过归档里的操作与时间戳,重现我的操作,来恢复指定时间点的。说人话就是,只能恢复到有归档记录的时间段内的任意时刻。假如我只在某天10点开了归档与备份,然后,我可以恢复到这天10点之后的任意时间点,10点之前的时刻我是没办法回去的。

        哦,,这个奇怪的问题是谁想到的呀

        当然是我喽@.@      

如果还有任何问题,欢迎到达梦云适配中心提问哦!

社区 | 达梦云适配中心 (dameng.com)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值