0

我有一个存储在 USB 拇指驱动器上的 mysql 数据库,它已经不可挽回地丢失了它的文件分配表。因此,我无法访问整个 ibdata1 文件。但是,我可以找到使用十六进制编辑器使用的记录页面。

所有的数据都在那里,但我必须自己阅读每条记录,并将新的 SQL 语句回放到从 6 个月前的备份恢复的数据库中。

因为我有备份,所以我知道表结构。并且可以在新数据库中找到一条我知道大致相当于一小块二进制数据的记录。但是,我无法准确确定记录的开始位置和解码记录数据。

该表的 CREATE 语句是: CREATE TABLE ExpenseTransactions ( idExpenseTransactions int(11) NOT NULL AUTO_INCREMENT, TransactionDate datetime NOT NULL, DollarAmount float DEFAULT NULL, PoundAmount float DEFAULT NULL, Location varchar(255) DEFAULT NULL, MinorCategory int(11) NOT NULL, Comment varchar(255) DEFAULT NULL, Recurring bit(1) NOT NULL DEFAULT b'0', Estimate bit(1) NOT NULL DEFAULT b'0', PRIMARY KEY (idExpenseTransactions), KEY MinorCategory (MinorCategory) ) ENGINE=InnoDB AUTO_INCREMENT=4687 DEFAULT CHARSET=utf8;

干净的记录如下所示: '2924', '2013-11-01 00:00:00', '60', NULL, 'George', '66', 'Lawn Maintenance', '1', '0'

接下来是与该记录相关的十六进制字节。我很确定有比重新创建记录所需的更多字节数,但我已经标记了我认为是 id 字段以尝试提供一些参考点。 10 06 02 00 01 70 00 41 80 00 0B 6C 00 00 00 00 07 05 86 00 00 01 4A 0E B1 80 00 12 4F 23 1F C1 40 00 00 70 42 47 65 6F 72 67 65 80 00 00 42 4C 61 77 6E 20 4D 61 69 6E 74 65 6E 61 6E 63 65 01 00

我可以很容易地理解字符串,并且可以挑选出构成 MinorCategory 的 4 个字节。最后 2 个字节应代表 2 位值。剩下的就更难了。

4

1 回答 1

0

有问题的记录被正确识别,根据我的博客文章InnoDB 中记录的物理结构,它是如何解码的:

Header:
10                          Length of Comment = 16 bytes
06                          Length of Location = 6 bytes
02                          Nullable field bitmap (PoundAmount = NULL)
00                          Info flags and number of records owned
01 70                       Heap number and record type
00 41                       Offset to next record = +65 bytes

Record:
80 00 0B 6C                 idExpenseTransactions = 2924
00 00 00 00 07 05           TRX_ID
86 00 00 01 4A 0E B1        ROLL_PTR
80 00 12 4F 23 1F C1 40     TransactionDate = "2013-11-01 00:00:00"
00 00 70 42                 DollarAmount = 60.0
                            (No data, PoundAmount = NULL)
47 65 6F 72 67 65           Location = "George"
80 00 00 42                 MinorCategory = 66
4C 61 77 6E 20 4D 61 69     Comment = "Lawn Maintenance"
6E 74 65 6E 61 6E 63 65     (Comment continues...)
01                          Recurring = 1
00                          Estimate = 0
于 2015-05-22T21:39:57.817 回答