使用存档数据库archive database实现Sybase ASE对象级别的恢复

来源:互联网 发布:java qq2007不能 编辑:程序博客网 时间:2024/05/19 16:34

存档数据库访问通过将数据库转储(“存档”)视作传统的只读数据库,从而允许数据库管理员验证或选择性地恢复数据库转储中的数据,此类数据库也称作“存档数据库”。

与传统数据库不同,存档数据库使用实际的数据库转储作为其主磁盘存储设备,利用最小的传统存储量来表示数据库转储恢复过程中产生的新页或修改页。由于数据库转储已包含许多(或大多数)数据库页的映像,因此不必使用 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 onchkpt","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_helpdbarchivedb
2> go
 name     db_size       owner dbid created
         status
 ——— ————- —– —- ————
         ————————————————————————–
 archivedb       20.0 MBsa       6 Jul 15, 2011
         don't recover, readonly, 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 scratchdatabase      NULL scratchdb
         NULL
 device_fragments              size          usage
        created                  free kbytes
 —————————— ————- ——————–
         ————————- —————-
 archivedb_dev                       20.0 MB data only
         Jul 15 201110: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

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
go

select 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 levelrecovery')
go

select 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 archivedbfrom 'd:\PDB.dmp'
go
online database archivedb
go

导出误删除表obj_level_recover的数据,使用bcp或者select into。

bcparchivedb..obj_level_recover out d:\obj_level_recover.bcpout -c -Usa -P -Stest

或者

select * intotempdb.dbo.BAK_obj_level_recover from archivedb..obj_level_recover

注意:select into新创建的表不要放在存档数据库archivedb中,因为archivedb是只读的。

 

恢复另外一张测试表testtbl的数据,

load tran archivedbfrom 'd:\PDB_tran1.dmp'

go

online databasearchivedb

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 theobject exists (sp_help may produce lots of output).

可见,使用存档数据库的日志恢复功能不能实现恢复表到误操作前的状态的功能!

 

查看存档数据库相关的属性

1> sp_helpdbarchivedb
2> go
 name     db_size       owner dbidcreated      status
 ——— ————- —– —- ———— —————————————
 archivedb       20.0 MBsa       6 Jul 15, 2011 read only, no free spaceacctg, 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 dataonly            Jul 152011 11:37AM                 19244
 archivedb_dev                        1.0 MB dataonly            Jul 152011 11:37AM                  1008
(return status = 0)

1> select * frommaster.dbo.sysusages where dbid=6
2> go
 dbid   segmap     lstart     size       vstart      pad    unreservedpgscrdate                    vdevno
 —— ———– ———– ———– ———– —— ————- ————————– ———–
     6        128          0       4864           0  NULL         4811        Jul 15 201111:37AM          11
     6        256       4864        256        9728   NULL          252        Jul 15 201111:37AM          11

(2 rows affected)

查看存档数据库archivedb的虚拟设备:

select class,attribute,object_type,object_cinfo,object frommaster.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         0D          scratchdb         6
    28         1D           SYSDEV$__12      6
    28         2D           SYSDEV$__14      6

(3 rows affected)

存档数据库的虚拟逻辑设备信息:

1> sp_helpdeviceSYSDEV$__12
2> go
 device_name physical_namedescription                                                  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 databasedisk, 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也被清空了。