存档

文章标签 ‘读取设备内容’,文章数:9

专注于Sybase ASE以及Sybase ASA数据库文件的恢复。专注于各种勒索病毒加密数据库的修复。

联系手机: 13811580958(微信),QQ: 289965371!
郑重承诺,修不好不收费。客户验证数据的正确性后,再付款。

一、Sybase ASE数据库恢复工具READSYBDEVICE主要功能有:

  1.  被勒索病毒加密数据文件及备份文件情况下的恢复; 
  2.  系统崩溃只剩下数据文件的情况下的恢复,甚至数据库文件不存在而只有损坏的备份文件情况下的恢复;
  3.   因断电、硬盘坏道等造成数据库文件损坏情况下的恢复;
  4.   delete数据恢复、误update数据恢复、误删除表(drop)恢复、误truncate表恢复  等;
  5.   各种sybase内部系统表损坏、索引错误的修复;
  6.   master数据库损坏而无法正常运行情况下的恢复;
  7.   sybase数据库被标记为可疑,不可用等情况的恢复;
  8.   sybase数据库中数据文件内部出现坏块情况下的恢复;
  9.   sybase数据库无数据文件但有日志文件的情况下的恢复;
  10.  sybase数据库只有数据文件无任何日志文件的情况下的恢复;
  11.  sybase数据文件被误删除情况下的碎片提取恢复;
  12.  磁盘阵列上的sybase数据库被误格式化情况下的数据库恢复;
  13.  数据库sysobjects等系统表损坏无法正常应用情况下的恢复;
  14.  sybase数据库还原数据库出现失败情况下的恢复;
  15.  sybase数据库只剩下损坏的备份文件情况下的恢复。

 

二、Sybase ASE数据库恢复工具READSYBDEVICE支持的版本:
Sybase ASE 11.0.x,11.5.x,11.9.2,12.0.x,12.5.x,15.0.x,15.5.x,15.7.x,16.0.x

 

三、Sybase SQL Anywhere (ASA)数据库恢复工具ReadASADB功能:
       能够从损坏的SQL Anywhere数据文件(.db)和UltraLite数据文件(.udb)上提取数据的非常规恢复工具

  1.      适用于所有的SQL Anywhere版本    包括:5.x,6.x,7.x,8.x,9.x,10.x,11.x,12.x,16.x
  2.     适用于所有的UltraLite版本
  3.     能够恢复出来表结构和数据
  4.     能够恢复自定义数据类型
  5.     能够恢复存储过程等对象的语法
  6.     能够导出到目标数据库
  7.     能够导出到SQL文件并生成导入脚本
  8.     支持多种字符集  包括:cp850、cp936、gb18030、utf8等
  9.     能够恢复未加密或者简单加密类型的数据
  10.    简单易用
  11.    限制:不支持AES加密的数据文件

四、Sybase SQL Anywhere (ASA)数据库恢复工具ReadASADB适用场景:

各种误操作:

  1.     误截断表(truncate table)
  2.     误删除表(drop table)
  3.     错误的where条件误删数据
  4.     误删除db或log文件
  5.     误删除表中的字段

专注于SQL Server数据库的恢复。专注于各种勒索病毒加密数据库的修复。

联系手机:(微信),QQ:
郑重承诺,修不好不收费。客户验证数据的正确性后,再付款。

SQLRescue可用于从损坏的 MS SQL Server 数据库数据文件(*.mdf  *.ndf 文件)中恢复数据。它可以保存关键数据,避免其丢失。

一、SQLRescue主要功能有:

  1. 系统崩溃只剩下数据文件的情况下的恢复,即无日志文件或者日志文件损坏情况下的恢复;

  2. 断电导致数据库文件损坏情况下的恢复;

  3. 硬盘坏道造成数据库损坏情况下的恢复;

  4. 数据文件内部存在坏页情况下的恢复;

  5. 企业管理器误删除数据表记录,管理软件误删除数据表记录的恢复;

  6. 并闩锁错误、格式化、误删除后导致软件不能使用的情况;

  7. 无法读取并闩锁页sysindexes失败情况下的修复;

  8. 数据文件被误删除情况下的碎片提取恢复;

  9. 系统表损坏、索引错误、误删除数据库表、删除记录的数据找回;

  10. master数据库损坏而无法正常运行情况下的恢复;

  11. 数据文件无法附加情况下的数据恢复;

  12. 数据库被标记为可疑,质疑,不可用等情况的恢复;

  13. 数据库sysobjects等系统表损坏情况下的恢复;

  14. 数据被误(drop、delete、truncate)删除表数据的恢复,误update后的数据恢复等;

  15. 还原时报一致性错误,错误823等情况下的数据恢复,各种错误提示的数据库文件修复;

  16. 数据库被误格式化等情况下的数据库恢复;

  17. 日志收缩造成数据库损坏情况下的恢复;

  18. 仅剩损坏的备份文件情况下的恢复。


二、SQLRescue主要技术特点:

只要SQL Server数据库的数据文件存在,我们就有办法帮您从数据文件中找回重要数据。

  1. 从数据文件中直接恢复数据

  2. 不能附加时直接恢复数据并生成新的数据库

  3. 系统表损坏的数据库修复

  4. 快速修复SQL 823错误、连接中断错误

三、SQLRescue支持的版本:

Microsoft SQL Server 6.5, 7.0, 2000, 2005, 2008, 2008R2, 2012, 2014, 2016, 2017。

试用方法:

SQL ASE非常规恢复工具

SQL Anywhere非常规恢复工具:ReadASADB/p>

如果没有跳转,请直接访问该页面:Sybase ASE&ASA非常规恢复工具

专注于Sybase Adaptive Server Enterprise(ASE)以及 Sybase SQL Anywhere(ASA)数据库文件的恢复。

联系手机:(微信),QQ:
郑重承诺,修不好不收费。客户验证数据的正确性后,再付款。

Sybase SQL Anywhere(ASA)数据库非常规恢复工具

ReadASADB---一个不依赖数据库管理系统、直接从db文件上提取数据的业内领先的恢复工具!

一、SQL Anywhere、UltraLite介绍
SQL Anywhere  一个免维护、易管理的移动数据库。

SQL Anywhere 提供了企业级的功能,包括完全的事务处理、无与伦比的可靠性和功能,包括参照完整性、存储过程、触发器、行级锁、自动的任务安排和自动恢复等功能

  • 易于使用,易于管理 ,降低最终用户的日常管理费用!
  • 多平台支持
  • 资源效率高
  • 配套的定时数据同步工具Mobilink

UltraLite 是一种用于小型、移动和嵌入式设备的、具有同步功能的关系数据库

  • 稳健的数据管理
  • 强大的同步功能
  • 直接简明的开发
  • 多平台可用性

您可以开发和部署用于 Windows CE、 Palm OS 和基于 Java 的设备的 UltraLite 数据库应用程序!

二、ReadASADB功能
能够从损坏的SQL Anywhere数据文件(.db)和UltraLite数据文件(.udb)上提取数据的非常规恢复工具

  1. 适用于所有的SQL Anywhere版本    包括:5.x,6.x,7.x,8.x,9.x,10.x,11.x,12.x,16.x
  2. 适用于所有的UltraLite版本
  3. 能够恢复出来表结构和数据
  4. 能够恢复自定义数据类型
  5. 能够恢复存储过程等对象的语法
  6. 能够导出到目标数据库
  7. 能够导出到SQL文件并生成导入脚本
  8. 支持多种字符集  包括:cp850、cp936、gb18030、utf8等
  9. 能够恢复未加密或者简单加密类型的数据
  10. 简单易用
  11. 限制:不支持AES加密的数据文件

之前就已经研发成功了能够从Sybase SQL Anywhere的DB文件中恢复数据的工具,现在公布一下。

此工具支持ASA v5.0,v6.0,v7.0,v8.0,v9.0,v10.0,v11.0,v12.0等版本。恢复Sybase SQL Anywhere的工具在国内应该算首创。

本工具的应用场景:

1.因为物理磁盘故障、操作系统、系统软件方面或者掉电等等原因导致的Sybase SQL Anywhere数据库无法打开的情况;

2.误操作,包括truncate table,drop table,不正确的where条件导致的误删除等;

Sybase SQL Anywhere无法打开时,比较常见的错误是:Assertion failed。

如:

1、Internal database error *** ERROR *** Assertion failed:201819 (8.0.1.2600) Checkpoint log: invalid bitmap page -- transaction rolled back
2、Internal database error *** ERROR *** Assertion failed:201819 (8.0.1.2600) Page number on page does not match page requested -- transaction rolled back
3、Internal database error *** ERROR *** Assertion failed:200502 (9.0.2.2451) Checksum failure on page 23 -- transaction rolled back

4、File is shorter than expected

5、Internal database error *** ERROR *** Assertion failed: 201116 Invalid free list index page found while processing checkpoint log -- transaction rolled back

6、*** ERROR *** Assertion failed: 51901 Page for requested record not a table page or record not present on page

7、*** ERROR *** Assertion failed: 201417 (7.0.4.3541) Invalid count or free space offset detected on a table page

8、Internal database error *** ERROR *** Assertion failed: 201425 (8.0.3.5594) Invalid count or free space offset detected on a free list page -- transaction rolled back.

9、Internal database error *** ERROR *** Assertion failed: 100702 (8.0.1.2600) Unable to modify indexes for a row referenced in rollback log -- transaction rolled back

Checkpoint log: invalid bitmap page -- transaction rolled back
Internal database error *** ERROR *** Assertion failed: 201116 Invalid free list index page found while processing checkpoint log -- transaction rolled back
Unable to modify indexes for a row referenced in rollback log -- transaction rolled back

等等。报错的同时可能会在db文件相同目录下生成assert.dmp文件。

关于Assertion Failure,大家可以参考Sybase官方技术文章:I've got an assertion! What should I do?

本博中有两篇文章介绍Sybase SQL Anywhere数据库db文件的物理存储结构的分析过程,可以参考一下:

ASA数据库物理存储结构分析(1)

ASA数据库物理存储结构分析(2)

本人不提供此工具的下载。如想了解使用本工具恢复损坏db文件的过程,可以观看下面的视频:

先来介绍一下裸设备的知识

1.什么是裸设备(RAW DEVICE)
裸设备是指未创建文件系统的磁盘分区(raw partition)或逻辑卷(raw logical volume),应用程序直接通过一
个字符设备驱动程序对它进行访问。如何对设备上的数据读写决定于使用它的应用程序。由于对裸设备的操作不通过UNIX的缓冲区,数据在ORACLE的数据 缓冲区(BUFFER CACHE)和磁盘之间直接传递,所以使用裸设备在一定程度上能够提高I/O性能,适合I/O量大的系统。另外OPS/RAC (Oracle Parallel Server/Real Application Cluster)环境下,多个节点同时访问同一个数据库,所以CONTROL FILE、DATA FILE、REDO LOG都必须建在RAW DEVICE上。

2.裸设备的可用空间
不同的UNIX对裸设备的管理不完全相同,特别要注意的是某些UNIX在每个裸设备的头部要保留一定的空间,应用程序在使用裸设备时不可以覆盖这一部分, 否则会对裸设备造成损坏。所以一个裸设备的实际可用空间是分配给裸设备的空间再减去这部分操作系统保留空间。下面是常用UNIX的OS Reserved Size列表:
UNIX     OS Reserved Size
------------ ----------------
SUN Solaris       0
HP-UX          0
IBM AIX         4k
Tru64 UNIX       64k
Linux          0
3.如何读裸设备上的数据?

UNIX上读写裸设备不能使用cp, cpio, tar等命令,必须用dd,下面是几个dd常用参数的简单说明,更详细的信息请参考UNIX使用手册或用命令man dd。
dd [ operand=value ... ]
if=file 指定输入文件,缺省值是标准输入
of=file 指定输出文件,缺省值是标准输出
bs=n 设置输入和输出的块大小为n字节,也可以用“k”作单位
skip=n 在拷贝之前跳过n个输入块,缺省值是0
seek=n 在拷贝之前从输出文件首部跳过n块,缺省值是0
count=n 指定拷贝的块数,缺省拷贝到输入文件结束

4.用十六进制读取unix的文件系统上的文件

介绍一下od命令的用法,linux od(octal dump) 命令详解
功能说明:输出文件内容。
语  法:od [-abcdfhilovx][-A <字码基数>][-j <字符数目>][-N <字符数目>][-s <字符串字符数>][-t <输出格式>][-w <每列字符数>][--help][--version][文件...]

补充说明:od指令会读取所给予的文件的内容,并将 其内容以八进制字码呈现出来。

参  数:
-a  此参数的效果和同时指定"-ta"参数相同。
-A<字码基 数>  选择要以何种基数计算字码。
-b  此参数的效果和同时指定"-toC"参数相同。
-c  此参数的效果和同时指定"-tC"参数相同。
-d  此参数的效果和同时指定"-tu2"参数相同。
-f  此参数的效果和同时指定"-tfF"参数相同。
-h  此参数的效果和同时指定"-tx2"参数相同。
-i  此参数的效果和同时指定"-td2"参数相同。
-j<字符数目>或--skip-bytes=<字符数目>  略过设置的字符数目。
-l  此参数的效果和同时指定"-td4"参数相同。
-N<字符数目>或--read- bytes=<字符数目>  到设置的字符数目为止。
-o  此参数的效果和同时指定"-to2"参数相同。
-s<字符串字符数>或--strings=<字符串字符数>  只显示符合指定的字符数目的字符串。
-t<输 出格式>或--format=<输出格式>  设置输出格式。
-v或--output-duplicates  输出时不省略重复的数据。
-w<每列字符数>或--width=<每列字符数>  设置每列的最大字符数。
-x  此参数的效果和同时指定"-h"参数相同。
--help  在线帮助。
--version  显示版本信息。

5.实例

用od命令读solaris上的文件,以十六进制的形式显示结果

bash-3.00$ uname -a
SunOS sunv890 5.10 Generic_137111-08 sun4u sparc SUNW,Sun-Fire-V890
bash-3.00$ od -t x4 master.dat | head -10
0000000 00000800 00000002 00000000 00000014
0000020 00000002 00000000 00000005 00000000
0000040 00000019 00008706 0000000c 00002710
0000060 000001f4 00000000 00001000 00000000
0000100 00000064 00000006 00000000 00000000
0000120 00000000 00002000 0000000a 00000001
0000140 4e554c4c 00000000 00000000 00000000
0000160 00002000 00000200 00001000 00000050
0000200 00000000 00000000 00000000 00000000
*
bash-3.00$

上面是我在solaris sparc平台上执行od命令用16进制读取文件的结果。

最左边用红色标记的是偏移量(八进制形式)。如:0000000表示偏移0,0000020表示偏移16(因为0000020(o)=16(d)),0000040表示偏移32。。。

od -t x4 master.dat 这条命令的意思是:用od读取master.dat文件的内容,用16进制的形式显示结果,并且每四个字节为一个显示单位,之间用空格分隔。一般都是每行显示16个字节的数据。

head -10 这条命令的意思是只显示前10行的数据。

在IBM-AIX上读取文件内容

-bash-3.2$ prtconf
System Model: IBM,7044-170
Machine Serial Number: 10D908C
Processor Type: PowerPC_POWER3
Processor Implementation Mode: POWER 630
Processor Version: PV_630
Number Of Processors: 1
Processor Clock Speed: 333 MHz
CPU Type: 64-bit
Kernel Type: 64-bit
以上为系统配置

-bash-3.2$ od -t x4 master.dat |head -10
0000000 00000000 00000000 00000000 00000000
*
0010000 00000800 00000002 00000000 00000014
0010020 00000002 00000000 00000005 00000000
0010040 00000019 00009481 0000000c 00002710
0010060 000001f4 00000000 00001000 00000000
0010100 00000064 00000006 00000000 00000000
0010120 00000000 00002000 0000000a 00000001
0010140 4e554c4c 00000000 00000000 00000000
0010160 00002000 00000200 00001000 00000050
-bash-3.2$

说明:中间的红色星号是od命令显示出来的,非人工添加。最左边红色一列表示偏移量(8进制形式)。第一行的偏移为0,并且结果好像都是0(ascii中的0)。然后第二行的偏移量就变成了4096(0010000(o)=4096(d) )。右边的数据是master.dat文件中的内容。以16进制的形式显示出来,每行16字节,每四个字节为一个单位,之间用空格分隔。

可以看出在ibm-aix powerpc平台上文件系统的数据是从4096偏移处开始存储的。前4096字节的内容为文件的控制信息。

用UltraEdit读取windows平台上的文件master.dat。

00000000 | 00 00 00 00 03 00 00 00 A6 00 00 00 63 00 00 00 | ...........c... | ....¦.c.
00000010 | 01 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 | ................ | ......̀.
00000020 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ | ........
00000030 | 01 00 00 00 00 00 00 00 01 00 00 00 FF 00 00 00 | ............... | ......ÿ.
00000040 | 01 00 00 00 00 00 00 00 01 00 00 00 0F 00 03 00 | ................ | ........
00000050 | 02 00 00 00 00 00 00 00 02 00 00 00 FF 00 00 00 | ............... | ......ÿ.
说明:最左边一列表示偏移量(16进制数据)。中间的部分数据是文件master.dat的内容。

windows上的文件自偏移0开始存储,没有类似ibm-aix上的类似的前4096字节的控制内容。

在linux平台上读取文件的16进制数据的结果,我这边只有一个32bit的虚拟机。就不演示了。

大家可以对比上面的显示结果。发现文件系统或者裸设备的文件可用空间和上面介绍的常用UNIX的OS Reserved Size列表是一致的。

————————————————————————————————————
——— 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;
——— 转载务必注明原始出处 : http://www.dbainfo.net
——— 关键字:unix hex file system raw device 文件系统 裸设备 od
————————————————————————————————————

本帖子转自:echoaix  嘟嘟之家  http://blog.chinaunix.net/u/10212/showart.php?id=88834

向echoaix这位sybase 高手表示感谢。

转下面内容的原因是作个记录方便以后来查看如何在unix下修改文件内容。在windows下以十六进制形式修改文件内的数据很简单,可以用 UltraEdit这个强大的工具。我编出来了工具能够实现从sybase数据设备文件中提取数据和翻译解析sybase日志设备文件内容,这个过程中 UE提供了莫大的帮助。我编写的工具跟UE没有关系。但是,有时候对sybase设备文件做一个小小的修改的时候,我喜欢用UE。

但是,在unix环境下的sybase设备文件该如何修改呢?总不能每次都ftp下载下来,用windows下的Ultraedit改好了后再上传到服务器吧?

这样做太麻烦。

幸运的是,早有高手提供了解决的方法!厉害!

下面的代码我没有完全看明白,主要是没unix写过shell的原因。

大概意思是:向sh脚本传递3个参数,用指定数据替换指定文件中的相应偏移的相同字节的数据。

用od定位出被修改的偏移位置。然后用echo向dd传入数据,dd会处理这个文件。

至于如何将4个字节的数据转化到数组里的那段代码,我没有看懂!

-----------------------------------------------------------------------------

环境 :
iBM aix 4.3和sybase11.9 只有这环境
master设备/dev/rlvsybmaster1
前面还是一样看page内容:
dbcc traceon(3604)
go
dbcc tablealloc(sysdatabases) 或  select first from sysindexes where id = object_id("sysdatabases" and indid=1\\找到数据页(pageno)
go
dbcc page(master,pageno,1,0)  \\从硬盘上拿这页内容详细内容
go
master的如下:
Offset 266 -
3256210a:  02000001 00010000 80000001 000008a1  ................
3256211a:  00000000 00000000 00009179 00fe9caa  ...........y....
3256212a:  0005adda 00120034 6d617374 65728000  .......4master..
3256213a:  03302e28                             .0.(.
用od命令定位(od命令真好)
#od -H /dev/lvsybmaster1 |grep '02000001 00010000 80000001 000008a1'
报找不到,郁闷,仔细看看dbcc page用法1(print page header, data rows and row offset table), 2 (print page header and hex dump of data page) 。改用dbcc page(master,pageno,2,0)
结果如下:不只这些,择了master的
32562110:  00008000 00010000 08a10000 00000000  ................
32562120:  00000000 917900fe 9caa0005 adda0012  .....y..........
32562130:  00346d61 73746572 80000330 2e280201  .4master...0.(..
32562140:  00030001 00000000 00010000 01e00000  ................
32562150:  00000000 00000000 917900fd acd60013  .........y......
32562160:  9866001e 00336d6f 64656c80 00032f2d  .f...3model.../-
原来是顺序不同,怪不得grep找不到,再来:
#od -H /dev/lvsybmaster1 |grep '00008000 00010000 08a10000 00000000' 结果
2024420  00008000 00010000 08a10000 00000000  找到,注意这的偏移量是8进制的
找到如何改呢?知道应该用dd,叨咕半天,不行,上网求助 ,在liveunix看到“炸鸡”高人的帖子,给了一个sh如下
cat chvgid.sh
#!/usr/bin/ksh
vgid=$1
disk=$2

set -A a `echo $vgid|\
awk '{
for (f=1; f <= length($0); f=f+2) {
print "ibase=16\nobase=8\n"toupper(substr($0,f,2))
}
}'|bc 2>/dev/null`
/usr/bin/echo "\0"${a[0]}"\0"${a[1]}"\0"${a[2]}"\0"${a[3]}"\c"|dd bs=1 seek=3600 of=/dev/$disk
原来他是要直接改VGID的信息,看来能改的东西真不少。
到现在这个sh我还是看不很明白,但是用没问题,自己改了改如下
#cat chfile.sh
#!/usr/bin/ksh
dstatus=$1
filename=$2
offset=$3

set -A a `echo $dstatus|\
awk '{
for (f=1; f <= length($0); f=f+2) {
print "ibase=16\nobase=8\n"toupper(substr($0,f,2))
}
}'|bc 2>/dev/null`

/usr/bin/echo "\0"${a[0]}"\0"${a[1]}"\0"${a[2]}"\0"${a[3]}"\c"|dd bs=1 seek=$offset of=$filename conv=notrunc
加了$3偏移量,还有注意加conv=notrunc,要不你在修改点后的数据可能都没了。这的偏移量可是10进制的
od -Ad -H /dev/lvsybmaster1 |grep '00008000 00010000 08a10000 00000000' 找10进制偏移
0534800  00008000 00010000 08a10000 00000000
停sybase
改master设备
#chfile.sh 00000000 /dev/lvsybmaster1 534800
4+0 records in.
4+0 records out.
就是要把00008000 改为00000000
重启sybase ok

此方法有一定的风险,请做好备份。you do it at your own risk!

以前的版本为:
Adaptive Server Enterprise/15.0.3/EBF 16550 ESD#1/P/NT (IX86)/Windows 2003/ase1503/2680/32-bit/OPT/Thu Mar 05 00:21:40 2009
在用mon表的时候报:NT storage access violation in omni_closetable destroyRemoteAccess. 怀疑是bug562998 。

于是打了ebf16738补丁。打补丁的过程和初次安装的过程一样只是wizard显示ASE15.0.3ESD#2,没有新建任何服务就选择完成了。
但是启动数据库的时候报错,很让人崩溃。难道我升级的方法有问题?

启动错误信息如下:

00:00000:00000:2009/12/14 14:55:34.59 kernel  engine 0, os pid 2404  online
00:00000:00000:2009/12/14 14:55:34.59 server  No active traceflags
00:00000:00001:2009/12/14 14:55:34.59 kernel  libomni1 - Component Integration Services: using 'Sybase Client-Library/15.0/P-EBF16074 ESD #15/PC Intel/BUILD1500-111/OPT/Thu Jul 31 20:59:50 2008'
00:00000:00001:2009/12/14 14:55:34.59 server  Opening Master Database ...
00:00000:00001:2009/12/14 14:55:34.71 server  Loading ASE's default sort order and character set
00:00000:00001:2009/12/14 14:55:34.73 server  Recovering database 'master'.
00:00000:00001:2009/12/14 14:55:34.75 server  Started estimating recovery log boundaries for database 'master'.
00:00000:00001:2009/12/14 14:55:34.75 server  Database 'master', checkpoint=(3779,8), first=(3779, 8), last=(3779, 31).
00:00000:00001:2009/12/14 14:55:34.75 server  Completed estimating recovery log boundaries for database 'master'.
00:00000:00001:2009/12/14 14:55:34.75 server  Started ANALYSIS pass for database 'master'.
00:00000:00001:2009/12/14 14:55:34.75 server  Completed ANALYSIS pass for database 'master'.
00:00000:00001:2009/12/14 14:55:34.75 server  Log contains all committed transactions until 2009/12/14 14:42:57.56 for database master.
00:00000:00001:2009/12/14 14:55:34.75 server  Started REDO pass for database 'master'. The total number of log records to process is 24.
00:00000:00001:2009/12/14 14:55:34.78 server  Error: 3474, Severity: 21, State: 1
00:00000:00001:2009/12/14 14:55:34.78 server  During redo the page timestamp value is less than old timestamp from log. Page #=348, object id = 37, page timestamp=0000 00000b20. Log old timestamp=0000 0000dbc2. Log record marker = (3779, 12).
00:00000:00001:2009/12/14 14:55:34.78 server  Cannot recover the master database, exiting.
00:00000:00001:2009/12/14 14:55:34.78 kernel  ueshutdown: exiting

又启动了一次,同样的错误信息。日志的意思是当前时间戳比日志中的时间要小,正常的应该为0000 0000dbc2,而redo中的时间戳为:0000 00000b20。以前日志都记录到(3779, 12).页面上了,升级后不知道什么原因却记到348页面上了?

原因没有搞清楚,但是sybase数据库不能用了。以前研究并且实现了对sybase日志设备的解析工作。通过修改设备文件修改一下时间戳看看能不能奏效吧?

用二进制工具打开master设备文件,根据错误信息中的可疑页号348定位到1433600(350*4096,@@maxpagesize=4096),找到

时间戳0000 00000b20将其修改为0000 0000dbc2。让咱们也来欺骗一下sybase服务器。^_^

0015E000 | 5C 01 00 00 00 00 00 00 5A 01 00 00 25 00 00 00 | \.......Z...%...
0015E010 | 20 0B 00 00 45 00 00 04 00 00 F7 09 02 08 02 00 |  ...E..........
0015E020 | 13 00 02 01 45 00 00 00 00 00 00 00 02 A8 01 4C | ....E.........L
0015E030 | 01 00 00 17 00 1C 70 65 72 63 65 6E 74 20 64 61 | ......percent da
0015E040 | 74 61 62 61 73 65 20 66 6F 72 20 68 69 73 74 6F | tabase for histo
0015E050 | 72 79 02 0E 00 02 AA 01 4C 01 00 00 19 00 1B 70 | ry.....L......p
0015E060 | 65 72 63 65 6E 74 20 64 61 74 61 62 61 73 65 20 | ercent database 
0015E070 | 66 6F 72 20 6F 75 74 70 75 74 02 0E 00 02 A9 01 | for output.....
0015E080 | 4C 01 00 00 18 00 14 70 65 72 63 65 6E 74 20 68 | L......percent h
0015E090 | 69 73 74 6F 72 79 20 66 72 65 65 02 0E 00 02 AB | istory free....

上红色的 20 0B  改为C2 DB 后,启动sybase服务器,成功!日志如下:

00:00000:00001:2009/12/14 15:27:44.29 server  Opening Master Database ...
00:00000:00001:2009/12/14 15:27:44.39 server  Loading ASE's default sort order and character set
00:00000:00001:2009/12/14 15:27:44.40 server  Recovering database 'master'.
00:00000:00001:2009/12/14 15:27:44.40 server  Started estimating recovery log boundaries for database 'master'.
00:00000:00001:2009/12/14 15:27:44.42 server  Database 'master', checkpoint=(3779, 8), first=(3779, 8), last=(3779, 31).
00:00000:00001:2009/12/14 15:27:44.42 server  Completed estimating recovery log boundaries for database 'master'.
00:00000:00001:2009/12/14 15:27:44.42 server  Started ANALYSIS pass for database 'master'.
00:00000:00001:2009/12/14 15:27:44.42 server  Completed ANALYSIS pass for database 'master'.
00:00000:00001:2009/12/14 15:27:44.42 server  Log contains all committed transactions until 2009/12/14 14:42:57.56 for database master.
00:00000:00001:2009/12/14 15:27:44.42 server  Started REDO pass for database 'master'. The total number of log records to process is 24.
00:00000:00001:2009/12/14 15:27:44.46 server  Redo pass of recovery has processed 2 committed and 0 aborted transactions.
00:00000:00001:2009/12/14 15:27:44.46 server  Completed REDO pass for database 'master'.
00:00000:00001:2009/12/14 15:27:44.48 server  Recovery of database 'master' will undo incomplete nested top actions.
00:00000:00001:2009/12/14 15:27:44.48 server  Started recovery checkpoint for database 'master'.
00:00000:00001:2009/12/14 15:27:44.53 server  Completed recovery checkpoint for database 'master'.
00:00000:00001:2009/12/14 15:27:44.53 server  Started filling free space info for database 'master'.
00:00000:00001:2009/12/14 15:27:44.65 server  Completed filling free space info for database 'master'.
00:00000:00001:2009/12/14 15:27:44.65 server  Started cleaning up the default data cache for database 'master'.
00:00000:00001:2009/12/14 15:27:44.67 server  Completed cleaning up the default data cache for database 'master'.
00:00000:00001:2009/12/14 15:27:44.75 server  Checking external objects.
00:00000:00001:2009/12/14 15:27:45.26 server  Database 'master' is now online.

呵呵,问题解决了。出现该问题的原因还未搞清楚!

————————————————————————————————————
——— 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;
——— 转载务必注明原始出处 : http://www.dbainfo.net
——— 关键字: ASE 15.0.3 ESD#2 补丁 二进制 设备 dat
————————————————————————————————————