gpt4 book ai didi

mysql - 剖析 MySQL InnoDB 记录格式以从原始磁盘恢复

转载 作者:行者123 更新时间:2023-11-29 22:24:23 25 4
gpt4 key购买 nike

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

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

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

该表的 CREATE 语句是:
CREATE TABLE <code>ExpenseTransactions</code> (
<code>idExpenseTransactions</code> int(11) NOT NULL AUTO_INCREMENT,
<code>TransactionDate</code> datetime NOT NULL,
<code>DollarAmount</code> float DEFAULT NULL,
<code>PoundAmount</code> float DEFAULT NULL,
<code>Location</code> varchar(255) DEFAULT NULL,
<code>MinorCategory</code> int(11) NOT NULL,
<code>Comment</code> varchar(255) DEFAULT NULL,
<code>Recurring</code> bit(1) NOT NULL DEFAULT b'0',
<code>Estimate</code> bit(1) NOT NULL DEFAULT b'0',
PRIMARY KEY (<code>idExpenseTransactions</code>),
KEY <code>MinorCategory</code> (<code>MinorCategory</code>)
) 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 <b>80 00 0B 6C</b> 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 位值。剩下的就比较困难了。

最佳答案

相关记录已正确识别,根据我的博客文章 The physical structure of records in 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

关于mysql - 剖析 MySQL InnoDB 记录格式以从原始磁盘恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30405909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com