使用存档数据库archive database实现Sybase ASE对象级别的恢复
存档数据库访问通过将数据库转储(“存档”)视作传统的只读数据库,从而允许数据库管理员验证或选择性地恢复数据库转储中的数据,此类数据库也称作“存档数据库”。
与传统数据库不同,存档数据库使用实际的数据库转储作为其主磁盘存储设备,利用最小的传统存储量来表示数据库转储恢复过程中产生的新页或修改页。由于数据库转储已包含许多(或大多数)数据库页的映像,因此不必使用 Backup Server 将页从存档转换为传统的数据库存储,就可以装载存档数据库。因此,装载速度明显快于传统数据库。
存档数据库的用途:
1.对从生产数据库生成的转储的最新副本运行数据库一致性检查。
2.检查数据库转储的完整性。
3.数据库转储的对象级别恢复。
使用存档数据库的典型步骤:
1.创建scratch数据库
use master
go
disk init
name='scratchdb_dat',
physname='d:\syb_data\scratchdb_dat.dat',
size='10m'
go
disk init
name='scratchdb_log',
physname='d:\syb_data\scratchdb_log.dat',
size='5m'
go
create database scratchdb on scratchdb_dat='10m' log on scratchdb_log='5m'
go
2.将刚创建的数据库指定为空数据库
sp_dboption "scratchdb","scratch database","true"
go
打开检查点自动截断日志的选项:
sp_dboption "scratchdb","trunc. log on chkpt","true"
go
3.创建存档数据库(archive database)
use master
go
disk init
name='archivedb_dev',
physname='d:\syb_data\archivedb_dev.dat',
size='20m'
go
create archive database archivedb
on archivedb_dev='20m'
with scratch_database = scratchdb
go
使用sp_helpdb archivedb查看数据库状态,
1> sp_helpdb archivedb
2> go
name db_size owner dbid created
status
--------- ------------- ----- ---- ------------
--------------------------------------------------------------------------
archivedb 20.0 MB sa 6 Jul 15, 2011
don't recover, read only, no free space acctg, mixed log and data, archive(1 row affected)
name attribute_class attribute int_value char_value
comments
--------- ----------------------- ---------------- --------- ----------
--------
archivedb Archive Database Access scratch database NULL scratchdb
NULL
device_fragments size usage
created free kbytes
------------------------------ ------------- --------------------
------------------------- ----------------
archivedb_dev 20.0 MB data only
Jul 15 2011 10:35AM 20396
(return status = 0)
1> use archivedb
2> go
Msg 966, Level 14, State 1:
Server 'TEST', Line 1:
The archive database with id '6' is unavailable as it is yet to be loaded.
可以看到存档数据库archivedb是只读的,目前不可访问。
4.装载一个数据库转储文件
load database archivedb from "d:\test.dmp"
go
不能装载利用“compress::”形式生成的备份文件,只能装载未压缩备份文件或者使用with compression=N形式的备份文件。
5.使数据库联机
online database archivedb
go
online database 执行撤消恢复操作,在此期间,已修改或分配的页可能会重新映射到修改页面区域。
若装载数据库时使用了 with norecovery,则您不需要将此数据库联机,因为装载过程会自动使数据库联机,而不用运行恢复撤消过程。
6.使用 dbcc 命令检查存档数据库的一致性
dbcc checkdb(archivedb)
go
在上面的装载数据库转储文件步骤中也可以使用:
1> load database archivedb from "d:\test.dmp" with norecovery
2> go
The archive database 'archivedb' has been brought online automatically. It may
have some inconsistencies as a result of not running recovery.
load database 命令的 with norecovery 选项允许将数据库转储装载到存档数据库中而不恢复任何数据,从而可减少装载所需的时间。
演示对象级别的恢复
1.准备测试环境
--*****************************************************
use PDB
go
create table obj_level_recover(id int not null,name varchar(30) null)
go
insert into obj_level_recover
select id,name from sysobjects
go
commit
goselect getdate()
go
dump database PDB to 'd:\PDB.dmp'
go--*****************************************************
--误更新数据
update obj_level_recover
set id=id+10
go
--创建另外一张测试表
create table testtbl(id int not null,name varchar(50) null)
go
insert into testtbl values(1,'存档数据库 archive database')
insert into testtbl values(2,'对象级别恢复 object level recovery')
goselect getdate()
go
--日志备份1
dump tran PDB to 'd:\PDB_tran1.dmp'
go
--*****************************************************--误删除表obj_level_recover
drop table obj_level_recover
go
insert into testtbl values(3,'load database ... with norecovery')
go
commit
go
select getdate()
go
--误删除表 testtbl
drop table testtbl
go
--日志备份2
dump tran PDB to 'd:\PDB_tran2.dmp'
go
--*****************************************************
分析测试环境中的备份策略,发现表obj_level_recover在全备后被误更新,且更新后的数据保留在了日志备份1中。测试表testtbl在日志备份1后被误删除,数据库日志备份2中包含测试表testtbl新插入的记录但是该表已被删除。
2.对象级别的恢复步骤
继续使用上面创建好的存档数据库archivedb。为了恢复误删除的表obj_level_recover,首先做一个全库的恢复。
load database archivedb from 'd:\PDB.dmp'
go
online database archivedb
go
导出误删除表obj_level_recover的数据,使用bcp或者select into。
bcp archivedb..obj_level_recover out d:\obj_level_recover.bcpout -c -Usa -P -Stest
或者
select * into tempdb.dbo.BAK_obj_level_recover from archivedb..obj_level_recover
注意:select into新创建的表不要放在存档数据库archivedb中,因为archivedb是只读的。
恢复另外一张测试表testtbl的数据,
load tran archivedb from 'd:\PDB_tran1.dmp'
go
online database archivedb
go
use archivedb
go
1> select * from testtbl
2> go
id name
----------- --------------------------------------------------
1 存档数据库 archive database
2 对象级别恢复 object level recovery
(2 rows affected)
以上只恢复了测试表testtbl的部分数据。在日志备份1后,测试表testtbl也进行了一些更新操作。如果想恢复testtbl在被删除前的数据的话,需要使用基于时间点的日志恢复技术。存档数据库的日志恢复不具备时间点恢复的功能。只能使用传统的数据库恢复方法了。
use master
go
load tran archivedb from 'd:\PDB_tran2.dmp'
go
online database archivedb
go
1> select * from testtbl
2> go
Msg 208, Level 16, State 1:
Server 'TEST', Line 2:
testtbl not found. Specify owner.objectname or use sp_help to check whether the object exists (sp_help may produce lots of output).
可见,使用存档数据库的日志恢复功能不能实现恢复表到误操作前的状态的功能!
查看存档数据库相关的属性
1> sp_helpdb archivedb
2> go
name db_size owner dbid created status
--------- ------------- ----- ---- ------------ ---------------------------------------
archivedb 20.0 MB sa 6 Jul 15, 2011 read only, no free space acctg, archive(1 row affected)
name attribute_class attribute int_value char_value comments
--------- ----------------------- ----------------------- --------- ---------------- --------
archivedb Archive Database Access scratch database NULL scratchdb NULL
archivedb Archive Database Access dump device 0 d:\PDB.dmp NULL
archivedb Archive Database Access transaction dump device 2 d:\PDB_tran2.dmp NULL
device_fragments size usage created free kbytes
------------------------------ ------------- -------------------- ------------------------- ----------------
archivedb_dev 19.0 MB data only Jul 15 2011 11:37AM 19244
archivedb_dev 1.0 MB data only Jul 15 2011 11:37AM 1008
(return status = 0)1> select * from master.dbo.sysusages where dbid=6
2> go
dbid segmap lstart size vstart pad unreservedpgs crdate vdevno
------ ----------- ----------- ----------- ----------- ------ ------------- -------------------------- -----------
6 128 0 4864 0 NULL 4811 Jul 15 2011 11:37AM 11
6 256 4864 256 9728 NULL 252 Jul 15 2011 11:37AM 11(2 rows affected)
查看存档数据库archivedb的虚拟设备:
select class,attribute,object_type,object_cinfo,object from master.dbo.sysattributes where class=28
1> sp_autoformat 'sysattributes','class,attribute,object_type,object_cinfo,object',' where class=28'
2> go
class attribute object_type object_cinfo object
----- --------- ----------- ------------ ------
28 0 D scratchdb 6
28 1 D SYSDEV$__12 6
28 2 D SYSDEV$__14 6(3 rows affected)
存档数据库的虚拟逻辑设备信息:
1> sp_helpdevice SYSDEV$__12
2> go
device_name physical_name description status cntrltype vdevno vpn_low
vpn_high
----------- ------------- ------------------------------------------------------------- ------ --------- ------ -------
--------
SYSDEV$__12 d:\PDB.dmp file system device, special, archive database disk, read-only 12 0 12 0
1253(1 row affected)
(return status = 0)
1> sp_helpdevice SYSDEV$__14
2> go
device_name physical_name description status cntrltype vdevno vpn_
low vpn_high
----------- ---------------- ------------------------------------------------------------- ------ --------- ------ ----
--- --------
SYSDEV$__14 d:\PDB_tran2.dmp file system device, special, archive database disk, read-only 12 0 14
0 66(1 row affected)
(return status = 0)
查看存档数据库的页面映射关系表:
1> select top 10 * from scratchdb..sysaltusages
2> go
dbid location lstart size vstart vdevno segmap
------ ----------- ----------- ----------- ----------- ----------- -----------
6 8 24 1 10234 11 3
6 8 80 1 10236 11 3
6 5 0 32 8 12 3
6 5 32 227 74 12 3
6 5 264 2 528 12 3
6 5 272 1 532 12 3
6 5 280 2 534 12 3
6 5 288 1 538 12 3
6 5 296 2 540 12 3
6 5 304 1 544 12 3(10 rows affected)
删除归档数据库:
drop database archivedb
go
再次查看存档数据库相关的信息:
1> select count(*) from master.dbo.sysattributes where class=28
2> go-----------
0(1 row affected)
1> select name from master..sysdevices where name in ('SYSDEV$__12','SYSDEV$__14')
2> go
name
------------------------------(0 rows affected)
1> select count(*) from scratchdb..sysaltusages
2> go-----------
0(1 row affected)
可见,系统表sysdevices中的虚拟逻辑设备'SYSDEV$__12','SYSDEV$__14'被删除,“空数据库”scratchdb中的页面映射表sysaltusages也被清空了。
--EOF--