一、备份还原原理
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
(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点之前的时刻我是没办法回去的。
哦,,这个奇怪的问题是谁想到的呀
当然是我喽@.@
如果还有任何问题,欢迎到达梦云适配中心提问哦!