存档
本文提供master配置区域损坏的一种修复方法!
Sybase ASE master数据库的前2048字节存储着Sybase数据库服务器的configuration area(配置区域)。如果configuration area corrupt,那么Sybase服务器无法启动。
造成configuration area corrupt的原因一般为硬件故障。通过下面的案例分享configuration area corrupt的一种恢复方法。
背景:
版本:ASE 15.0.3 ESD#3
在通过临时设置参数upgrade version为492来重置sa口令为空时,忘记将upgrade version改回原值 (参考:将Sybase ASE登录sa的密码置为空NULL的方法)。之后重启Sybase服务器时报错:
Pre 10.0 database cannot work with this version of the server. Please upgrade the databases to 10.0 or above release and then try to start with this version of the server. Shutting down ***.
ASE配置文件(*.cfg)中大多数情况下不存在参数:upgrade version。在cfg中添加upgrade version=15000后,启动时仍然报上面的master数据库版本低于10.0的错误。
通过比较多个版本的configuration area,发现master数据库的第1805和第1806字节表示upgrade version,15000的十六进制形式为:0x3A98,则将第1805字节改为98,第1806字节改为3A(此处master为linux平台上的数据库)。改为之后启动报错:
The configuration area in device '/home/sybase/data/master.dat' appears to be corrupt. The server cannot continue and will shut down.
看来仅仅修改2个字节的内容无法验证通过,那么通过替换master数据库头部2048字节呢? 我测试是可行的!
专注于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)上提取数据的非常规恢复工具
- 适用于所有的SQL Anywhere版本 包括:5.x,6.x,7.x,8.x,9.x,10.x,11.x,12.x,16.x
- 适用于所有的UltraLite版本
- 能够恢复出来表结构和数据
- 能够恢复自定义数据类型
- 能够恢复存储过程等对象的语法
- 能够导出到目标数据库
- 能够导出到SQL文件并生成导入脚本
- 支持多种字符集 包括:cp850、cp936、gb18030、utf8等
- 能够恢复未加密或者简单加密类型的数据
- 简单易用
- 限制:不支持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
等等。报错的同时可能会在db文件相同目录下生成assert.dmp文件。
关于Assertion Failure,大家可以参考Sybase官方技术文章:I've got an assertion! What should I do?
本博中有两篇文章介绍Sybase SQL Anywhere数据库db文件的物理存储结构的分析过程,可以参考一下:
本人不提供此工具的下载。如想了解使用本工具恢复损坏db文件的过程,可以观看下面的视频:
-- 创建测试数据库
CREATE DATABASE Db
GO
-- 对数据库进行备份
BACKUP DATABASE Db TO DISK = ' c:\db.bak ' WITH FORMAT
GO
-- 创建测试表
CREATE TABLE Db.dbo.TB_test(ID int )
-- 延时1秒钟,再进行后面的操作(这是由于SQL Server的时间精度最大为百分之三秒,不延时的话,可能会导致还原到时间点的操作失败)
WAITFOR DELAY ' 00:00:01 '
GO
-- 假设我们现在误操作删除了 Db.dbo.TB_test 这个表
DROP TABLE Db.dbo.TB_test
-- 保存删除表的时间
SELECT dt = GETDATE () INTO #
GO
-- 在删除操作后,发现不应该删除表 Db.dbo.TB_test
-- 下面演示了如何恢复这个误删除的表 Db.dbo.TB_test
-- 首先,备份事务日志(使用事务日志才能还原到指定的时间点)
BACKUP LOG Db TO DISK = ' c:\db_log.bak ' WITH FORMAT
GO
-- 接下来,我们要先还原完全备份(还原日志必须在还原完全备份的基础上进行)
RESTORE DATABASE Db FROM DISK = ' c:\db.bak ' WITH REPLACE ,NORECOVERY
GO
-- 将事务日志还原到删除操作前(这里的时间对应上面的删除时间,并比删除时间略早
DECLARE @dt datetime
SELECT @dt = DATEADD (ms, - 20 ,dt) FROM # -- 获取比表被删除的时间略早的时间
RESTORE LOG Db FROM DISK = ' c:\db_log.bak ' WITH RECOVERY,STOPAT = @dt
GO
-- 查询一下,看表是否恢复
SELECT * FROM Db.dbo.TB_test
/* --结果:
ID
-----------
(所影响的行数为 0 行)
-- */
-- 测试成功
GO
-- 最后删除我们做的测试环境
DROP DATABASE Db
DROP TABLE #
专注于Sybase Adaptive Server Enterprise(ASE)以及 Sybase SQL Anywhere(ASA)数据库文件的恢复。
联系手机:(微信),QQ: !
郑重承诺,修不好不收费。客户验证数据的正确性后,再付款。
Sybase ASE恢复工具产生背景:
曾经将笔记本电脑上的另一个数据库的备份文件B恢复到了一个在线数据库A里了(两个都是实验用数据库!)。库B比库A要小很多。向多方(包括sybase technical)咨询都说没有办法只能通过备份文件来恢复。但是,我感觉应该有种办法吧!难道sybase公司都没有办法?如果这样,我将一个小的备份文件load到一个大的数据库里面,难道这个大数据库也只能用备份来恢复吗? 突然产生了一种想法,能不能打开sybase的设备文件看看里面都存了一些什么样的数据?能读取一点数据也是收获啊!
于是,在接下来的三个月时间里我花了很大的精力来研究Sybase ASE的内部数据结构,用VB编写读取程序,并反复测试修改。最后,基本形成两个小工具。
1.能够从Sybase数据设备上提取数据的:READSYBDEVICE
2.从日志设备上提取日志信息的:LOG_ANALYZER_ASSISTANT (暂时叫这两个名字,以后可能会改)
下面为两个工具读取出来的数据截图:
一、下图为读取的Sybase数据库内页面上的数据(页号:165621,表名:FLOWREC1,右上部显示页面上的十六进制数据,下部分是FLOWREC1在页面165621上的数据)
二、下图为从日志设备上提取的日志信息(包括:页号,页内偏移,可用行号,日志类型OP,会话ID,列宽度,日志操作时间,SUID,UID,SPID,以及日志信息内容等)。针对插入(OP=4)、删除(OP=5)、更新(OP=9)能够逆向写出相应的SQL语句。
Sybase ASE的恢复工具支持ASE v11.0, v11.5,v11.9.2,v12.0,v12.5.x,v15.x等各个版本,支持little endian以及big endian,支持cp850,iso_1,cp936,eucgb,utf8等国内常用的多个字符集。
关于从Sybase ASE设备文件中提取对象包含的页面不外乎两种方法。
第一:依次扫描页面获取页头控制信息中记录的对象ID;
第二:根据分配页追踪到对象的OAM页,再从OAM页上分析出对象占用的页面。
另 外,已经研发成功了能够从Sybase SQL Anywhere的DB文件中恢复数据的工具,支持ASA v5.0,v6.0,v7.0,v8.0,v9.0,v10.0,v11.0,v12.0等版本。恢复Sybase SQL Anywhere的工具在国内应该算首创。