使用存档数据库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
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 level recovery')
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 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--

  • 本文链接地址:https://www.dbainfo.net/sybase-ase-object-level-recovery-archived-by-archive-database.htm
  • 本文为dbainfo个人原创,请在尊重作者劳动成果的前提下进行转载;
  • 转载务必注明原始出处 : Sybase数据库技术,数据库恢复专家
  • 对《使用存档数据库archive database实现Sybase ASE对象级别的恢复》有何疑问或见解,请在本文下方发表;
  • 对网站还有其他问题或建议,请提交在留言板,谢谢!
  • 目前还没有任何评论.
    :wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)