快照采用的是“写时复制(Copy On Write)”的技术,实现原理比较简单,快照时复制一份原磁盘的索引,指向的实际数据均为原始磁盘的数据,只有当原镜像的的数据发生变化时,才将变化区域的在变化之前的数据复制一份给快照对应位置。所以打快照的时候数据比较小,后面会越来越大。
LVM快照原理
左图为最初创建的快照数据卷状况,LVM 会预留一个区域 (比如左图的左侧三个 PE 区块) 作为数据存放处。 此时快照数据卷内并没有任何数据,而快照数据卷与源数据卷共享所有的 PE 数据, 因此你会看到快照数据卷的内容与源数据卷中的内容是一模一样的。 等到系统运行一阵子后,假设 A 区域的数据被更新了(上面右图所示),则更新前系统会将该区域的数据移动到快照数据卷中, 所以在右图的快照数据卷中被占用了一块 PE 成为 A,而其他 B 到 I 的区块则还是与源数据卷共享!
总结
原理大同小异,都是依赖源磁盘。对于源磁盘未曾修改的数据,仅仅在快照中建立个数据索引(指向源数据盘中未改变的数据块)
一旦源数据改变,快照中才会从源数据中复制一份未改变的元数据到自己的快照磁盘中。注意如果快照的磁盘太小,此时你删除了所有源磁盘的数据,那么意味着源磁盘所有数据都要复制到快照磁盘,如果快照磁盘不够大,那么就会数据丢失。
举例
源数据盘大小15g,已用10g
此时对源数据盘做个快照,指定大小也是15g,然后把快照挂载到目录上你会发现两个数据盘容量以及已用百分比全都一致。
接下来我们在源数据盘建立一个大文件再观察发展,源数据盘使用量变多了,而快照盘没有改变,这是合理的。因为我们做的快照仅仅保留未曾增加这个大文件之前的状态。只有那个状态下的文件有变化,快照盘才会有所变化。语言描述有点难。
简单理解
源数据盘有abc三个文件,此时对源数据盘做个快照盘,做完之后快照盘里面也是abc。
现在只有源数据盘的abc这三个文件发生变化,快照盘才会把发生变化之前的文件拷过来一份。对于源数据盘新加文件,快照盘不做 *** 作。如果想对新产生的文件做备份,请在这个新文件生成之后再做另一个快照盘。则这块新的快照盘就只对abc以及新生成的文件做 *** 作。
所谓快照,就是留住某一时刻的状态,这个状态归根结底就是保留那个时刻的文件。快照只关心那个时刻的文件有没有变化(修改删除),对于新生成的文件,快照不关心。
个人见解,不足之处多指教。
快照是数据存储的某一时刻的状态记录;备份则是数据存储的某一个时刻的副本。这是两种完全不同的概念。
快照和备份的区别:
快照和云硬盘备份均是重要的数据容灾手段,两者存储方案不同。
快照数据与云硬盘数据存储在一起,可以支持快速备份和恢复。
备份数据则存储在对象存储(OBS)中,可以实现在云硬盘存储损坏情况下的数据恢复。
快照当前不支持设置自动创建。备份支持设置自动创建,您可以指定备份策略,系统会根据策略自动对云硬盘进行数据备份。
存储快照的实现原理
目前,快照的实现方式均由各个厂商自行决定,但主要技术分为2类,一种是写时拷贝COW(Copy On Write),另一种,是写重定向ROW(Redirect On Write)。
写时拷贝COW(Copy-On-Write),也称为写前拷贝。
创建快照以后,如果源卷的数据发生了变化,那么快照系统会首先将原始数据拷贝到快照卷上对应的数据块中,然后再对源卷进行改写。
用数据库快照就能实现啊.Oracle快照原理及实现总结
Oracle数据库的快照是一个表,它包含有对一个本地或远程数据库上一个或多个表或视图的查询的结果。对于中大型数据库,业务数据库里所有的数据同步到另外一个处理服务器上最佳的选择还是使用SnapShot方式,即快照的方式。
由于工作需要,今天需要将业务数据库里所有的数据同步到另外一个处理服务器上。在做方案的时候,想了很多方法,当然最快的办法还是使用物理热备的方式。
但是我个人认为如果对于中大型数据库(我们的数据库有300G左右)最佳的选择还是使用SnapShot方式,即快照的方式。
Oracle数据库的快照是一个表,它包含有对一个本地或远程数据库上一个或多个表或视图的查询的结果。也就是说快照根本的原理就是将本地或远程数据库上的一个查询结果保存在一个表中。
以下是我建立的Snapshot,目的是从业务数据库上将数据Copy到处理数据库上,是不同的两个服务器之间对数据copy。
第一步:在处理服务器上的Oracle终端,建立database link,业务数据库服务器SID为TEST
create database link TEST_DBLINK.US.ORACLE.COM
connect to AMICOS identified by AMICOS
using 'test'
第二步:在业务数据库上对应的表建立快照日志
Create snapshot log on A_Table
第三步:建立Snapshot 快照名称为:Test_SnapShot
Create snapshot Test_SnapShot
REFRESH COMPLETE START WITH SYSDATE NEXT SYSDATE+1/24
as select * from A_Table@TEST_DBLINK
说明:REFRESH是刷新方法
刷新方式有:COMPLETE和FAST两种,而START WITH是说明开始执行的时间。
Next是下次执行的时间
而AS以后是构成快照的查询方法。
相关的方法:
更改快照
ALTER SNAPSHOT Test_SnapShot
REFRESH COMPLETE START WITH SYSDATE NEXT SYSDATE+1/2
手动刷新快照 在命令界面执行:
EXEC DBMS_SNAPSHOT.REFRESH('Test_SnapShot ','C')
第一个参数是要刷新的快照名
第二个参数是刷新的方式,F----FAST, C---COMPLETE
查看快照最后刷新的日期
SELECT NAME,LAST_REFRESH
FROM ALL_SNAPSHOT_REFRESH_TIMES
最后非常的方案:
1:为需要做Snapshot的表建立Snapshot日志
create snapshot log on t1 with rowid这里使用ROWID建立日记的参数
2:采用Fast的方式建立快照,使用rowid做为参考参数
create snapshot fb_test_b refresh fast with rowid start with sysdate next sysdate+1/1440 as select * from fb_test_b@my_dblink
最好能按照rowid来建立快照。要不然就必须要为表建立Primary Key。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)