cari
Rumahpangkalan datatutorial mysql解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase

解剖 SQLSERVER 第十六篇 OrcaMDF RawDatabase --MDF文件的瑞士军刀(译) http://improve.dk/orcamdf-rawdatabase-a-swiss-army-knife-for-mdf-files/ 当我最初开始开发OrcaMDF的时候我只有一个目标,比市面上大部分的书要获取MDF文件内部的更深层次的知识

解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase --MDF文件的瑞士军刀(译)

http://improve.dk/orcamdf-rawdatabase-a-swiss-army-knife-for-mdf-files/

当我最初开始开发OrcaMDF的时候我只有一个目标,比市面上大部分的书要获取MDF文件内部的更深层次的知识

随着时间的推移,OrcaMDF确实做到了。在我当初没有计划的时候,OrcaMDF 已经可以解析系统表,元数据,甚至DMVs。我还做了一个简单UI,让OrcaMDF 更加容易使用。

这很好,但是带来的代价是软件非常复杂。为了自动解析元数据 例如schemas, partitions, allocation units 还有其他的东西,更不要提对于堆表和索引的细节的抽象层了,抽象层需要很多代码并且需要更多的数据库了解。鉴于不同SQLSERVER版本之间元数据的改变,OrcaMDF 目前仅支持SQL Server 2008 R2。然而,数据结构是相对稳定的,元数据的存储方式只有一点不同,使用DMVs暴露数据等等。要让OrcaMDF 正常运行,需要元数据是完好无损的,这就导致当SQLSERVER损坏的时候OrcaMDF 也是一样的。遇到损坏的boot page吗?无论SQLSERVER还是 OrcaMDF 都不能解析数据库

 

向RawDatabase问好
我在憧憬OrcaMDF 的未来 和如何使用他才是最有用的。我能够不断增加新的特性进去以使SQLSERVER支持什么功能他也支持,最终使得他能100%解析MDF文件。但是意义何在?当然,这是一个很好的学习机会,不过重点是,你使用软件读取数据,SQLSERVER能比你做得更好。所以,该如何选择?

RawDatabase, 参照Database 类,他不会尝试解析任何东西除非你让他去解析。
他不会自动解析schemas。他不知道系统表。他不知道DMVs。然而他知道SQLSERVER数据结构和给他一个接口他可以直接读取MDF文件。

让RawDatabase 只解析数据结构意味着他可以跳过损坏的系统表或者损坏的数据

 

 

例子
这个工具还在开发的早起,不过让我展示一下使用RawDatabase能够做什么东西。
当我运行LINQPad上的代码,他很容易的显示出结果,结果只是标准的.NET 对象。
所有的例子都在AdventureWorks 2008R2 LT (Light Weight)数据库上运行

 


获取单个页面
很多时候,我们只需要解析单个页面

<span>//</span><span> Get page 197 in file 1</span>
<span>var</span> db = <span>new</span> RawDatabase(<span>@"</span><span>C:\AWLT2008R2.mdf</span><span>"</span><span>);
db.GetPage(</span><span>1</span>, <span>197</span>).Dump();

解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase

 

解析页头
现在我们获取到页面,我们如何把页头dump出来

<span>//</span><span> Get the header of page 197 in file 1</span>
<span>var</span> db = <span>new</span> RawDatabase(<span>@"</span><span>C:\AWLT2008R2.mdf</span><span>"</span><span>);
db.GetPage(</span><span>1</span>, <span>197</span>).Header.Dump();

解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase

 

 

解析行偏移阵列
就像页头那样,我们也可以把页尾的行偏移阵列条目dump出来

<span>//</span><span> Get the slot array entries of page 197 in file 1</span>
<span>var</span> db = <span>new</span> RawDatabase(<span>@"</span><span>C:\AWLT2008R2.mdf</span><span>"</span><span>);
db.GetPage(</span><span>1</span>, <span>197</span>).SlotArray.Dump();

解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase

 

解析数据记录
当获取到行偏移条目的原始数据,你通常想看一下数据行记录的内容。幸运的是,这也很容易做到

<span>//</span><span> Get all records on page 197 in file 1</span>
<span>var</span> db = <span>new</span> RawDatabase(<span>@"</span><span>C:\AWLT2008R2.mdf</span><span>"</span><span>);
db.GetPage(</span><span>1</span>, <span>197</span>).Records.Dump();

解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase

 

 

从记录中检索数据
一旦你得到记录,你现在可以利用FixedLengthData 或者 VariableLengthOffsetValues 属性
去获取原始的定长数据内容和变长数据内容。然而,你肯定只想获取到实际的已解析的数据值。
对于解析,OrcaMDF会帮你解析,你只需要为他提供schema.

<span>//</span><span> Read the record contents of the first record on page 197 of file 1</span>
<span>var</span> db = <span>new</span> RawDatabase(<span>@"</span><span>C:\AWLT2008R2.mdf</span><span>"</span><span>);
RawPrimaryRecord firstRecord </span>= (RawPrimaryRecord)db.GetPage(<span>1</span>, <span>197</span><span>).Records.First();

</span><span>var</span> values = RawColumnParser.Parse(firstRecord, <span>new</span><span> IRawType[] {
    RawType.Int(</span><span>"</span><span>AddressID</span><span>"</span><span>),
    RawType.NVarchar(</span><span>"</span><span>AddressLine1</span><span>"</span><span>),
    RawType.NVarchar(</span><span>"</span><span>AddressLine2</span><span>"</span><span>),
    RawType.NVarchar(</span><span>"</span><span>City</span><span>"</span><span>),
    RawType.NVarchar(</span><span>"</span><span>StateProvince</span><span>"</span><span>),
    RawType.NVarchar(</span><span>"</span><span>CountryRegion</span><span>"</span><span>),
    RawType.NVarchar(</span><span>"</span><span>PostalCode</span><span>"</span><span>),
    RawType.UniqueIdentifier(</span><span>"</span><span>rowguid</span><span>"</span><span>),
    RawType.DateTime(</span><span>"</span><span>ModifiedDate</span><span>"</span><span>)
});
    
values.Dump();</span>

解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase

 

RawColumnParser.Parse方法做的事情是 跟他一个schema,他帮你自动将raw bytes转换为Dictionary,key就是从schema 那里获取到的列名,

而value就是数据列的实际值,例如int,short,guid,string等等。让你的用户给定schema, OrcaMDF 可以跳过大量的依赖的元数据进行解析,因此可以忽略可能的元数据错误带来的数据读取失败。

由于页头已经给出了 NextPageID 和 PreviousPageID属性 ,这能够让软件简单的遍历链表中的所有页面,并解析这些页面里面的数据 --他基本上是根据给定的allocation unit来进行扫描

 

过滤页面
除非检索一个特定的页面,RawDatabase 也有一个页面属性能够枚举数据库中的所有页面。
使用这个属性,举个例子,获取数据库中所有的IAM页面的列表

<span>//</span><span> Get a list of all IAM pages in the database</span>
<span>var</span> db = <span>new</span> RawDatabase(<span>@"</span><span>C:\AWLT2008R2.mdf</span><span>"</span><span>);
db.Pages
    .Where(x </span>=> x.Header.Type ==<span> PageType.IAM)
    .Dump();</span>

解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase


并且由于这是使用LINQ技术,这很容易去设计你想要的属性。
举个例子,你可以获取所有的 index pages 和他们的 slot counts 就像这样:

<span>//</span><span> Get all index pages and their slot counts</span>
<span>var</span> db = <span>new</span> RawDatabase(<span>@"</span><span>C:\AWLT2008R2.mdf</span><span>"</span><span>);
db.Pages
    .Where(x </span>=> x.Header.Type ==<span> PageType.Index)
    .Select(x </span>=> <span>new</span><span> {
        x.PageID,
        x.Header.SlotCnt
    }).Dump();</span>

解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase

 

或者假设你想获得如下条件的页面
1、页面里面至少有一条记录
2、free space空间至少有7000 bytes

下面是page id, free count, record count 和 平均记录大小的输出

<span>var</span> db = <span>new</span> RawDatabase(<span>@"</span><span>C:\AWLT2008R2.mdf</span><span>"</span><span>);
db.Pages
    .Where(x </span>=> x.Header.FreeCnt > <span>7000</span><span>)
    .Where(x </span>=> x.Header.SlotCnt >= <span>1</span><span>)
    .Where(x </span>=> x.Header.Type ==<span> PageType.Data)
    .Select(x </span>=> <span>new</span><span> {
        x.PageID,
        x.Header.FreeCnt,
        RecordCount </span>=<span> x.Records.Count(),
        RecordSize </span>= (<span>8096</span> - x.Header.FreeCnt) /<span> x.Records.Count()
    }).Dump();</span>

解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase

 

 

最后一个例子,,假设你只有一个MDF文件并且你已经忘记了有哪些对象存储在MDF文件里面。
不要紧,我们只需要查询系统表sysschobjs !sysschobjs 系统表包含了所有对象的数据
并且幸运的是,他的object ID 是 34。利用这些信息,我们可以把所有属于object ID 34的数据页面
过滤出来,并且从这些页面里读取记录并只需要解析这个表的前两列(你可以定义一个分部schema, 只要你在最后忽略列)

最后我们只需要把名称dump出来(当然我们可以把表里的所有列都查询出来,如果我们想的话)

<span>SELECT</span> <span>*</span> <span>FROM</span> sys.sysschobjs 

解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase

<span>var</span> db = <span>new</span> RawDatabase(<span>@"</span><span>C:\AWLT2008R2.mdf</span><span>"</span><span>);

</span><span>var</span> records =<span> db.Pages
    .Where(x </span>=> x.Header.ObjectID == <span>34</span> && x.Header.Type ==<span> PageType.Data)
    .SelectMany(x </span>=><span> x.Records);
    
</span><span>var</span> rows = records.Select(x => RawColumnParser.Parse((RawPrimaryRecord)x, <span>new</span><span> IRawType[] {
    RawType.Int(</span><span>"</span><span>id</span><span>"</span><span>),
    RawType.NVarchar(</span><span>"</span><span>name</span><span>"</span><span>)
}));

rows.Select(x </span>=> x[<span>"</span><span>name</span><span>"</span>]).Dump();

解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase

 


兼容性
可以看到 RawDatabase并不依赖于元数据,这很容易兼容多个版本的SQLSERVER。
因此,我很高兴的宣布:RawDatabase 完全兼容SQL Server 2005, 2008, 2008R2 , 2012.
这也有可能兼容2014,不过我还未进行测试。说到测试,所有的单元测试都是自动运行的
在测试期间使用AdventureWorksLT for 2005, 2008, 2008R2 and 2012 。
现在有一些测试demo来让OrcaMDF RawDatabase去解析AdventureWorks LT 数据库里面每个表的每条记录

 

 

数据损坏
其中一个有趣的使用RawDatabase 的方法是用来附加损坏的数据库。你可以检索特定object id的所有页面然后硬解析每个页面
无论他们是否是可读的。如果元数据损坏,你可以忽略他,你手工提供schema (输入表的每个列的列名)并且只需要沿着页面链表
或者解析IAM页面去读取堆表里面的数据。接下来的几个星期我将会 写一些关于OrcaMDF RawDatabase 的使用场景的博客,其中包括数据损坏

 

源代码和反馈
我非常兴奋因为最新的RawDatabase 已经添加到OrcaMDF 里面并且我希望不单只只有我一个见证他的威力。
如果你也想试一试,或者有任何想法,建议或者其他反馈,我都很乐意接受。

如果你想试用,在GitHub上签出OrcaMDF项目。一旦这个工具做得比较完美了,我会把他放上去NuGet 。
就好像OrcaMDF一样,在GPL v3 licensed 下发布

 

第十六篇完

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tempat Mysql: Pangkalan Data dan PengaturcaraanTempat Mysql: Pangkalan Data dan PengaturcaraanApr 13, 2025 am 12:18 AM

Kedudukan MySQL dalam pangkalan data dan pengaturcaraan sangat penting. Ia adalah sistem pengurusan pangkalan data sumber terbuka yang digunakan secara meluas dalam pelbagai senario aplikasi. 1) MySQL menyediakan fungsi penyimpanan data, organisasi dan pengambilan data yang cekap, sistem sokongan web, mudah alih dan perusahaan. 2) Ia menggunakan seni bina pelanggan-pelayan, menyokong pelbagai enjin penyimpanan dan pengoptimuman indeks. 3) Penggunaan asas termasuk membuat jadual dan memasukkan data, dan penggunaan lanjutan melibatkan pelbagai meja dan pertanyaan kompleks. 4) Soalan -soalan yang sering ditanya seperti kesilapan sintaks SQL dan isu -isu prestasi boleh disahpepijat melalui arahan jelas dan log pertanyaan perlahan. 5) Kaedah pengoptimuman prestasi termasuk penggunaan indeks rasional, pertanyaan yang dioptimumkan dan penggunaan cache. Amalan terbaik termasuk menggunakan urus niaga dan preparedStatemen

Mysql: Dari perniagaan kecil ke perusahaan besarMysql: Dari perniagaan kecil ke perusahaan besarApr 13, 2025 am 12:17 AM

MySQL sesuai untuk perusahaan kecil dan besar. 1) Perniagaan kecil boleh menggunakan MySQL untuk pengurusan data asas, seperti menyimpan maklumat pelanggan. 2) Perusahaan besar boleh menggunakan MySQL untuk memproses data besar dan logik perniagaan yang kompleks untuk mengoptimumkan prestasi pertanyaan dan pemprosesan transaksi.

Apa yang dibaca oleh Phantom dan bagaimana InnoDB menghalang mereka (kunci seterusnya)?Apa yang dibaca oleh Phantom dan bagaimana InnoDB menghalang mereka (kunci seterusnya)?Apr 13, 2025 am 12:16 AM

InnoDB secara berkesan menghalang pembacaan hantu melalui mekanisme utama. 1) Kekunci seterusnya menggabungkan kunci baris dan kunci jurang untuk mengunci rekod dan jurang mereka untuk mengelakkan rekod baru daripada dimasukkan. 2) Dalam aplikasi praktikal, dengan mengoptimumkan pertanyaan dan menyesuaikan tahap pengasingan, persaingan kunci dapat dikurangkan dan prestasi konkurensi dapat ditingkatkan.

MySQL: Bukan bahasa pengaturcaraan, tetapi ...MySQL: Bukan bahasa pengaturcaraan, tetapi ...Apr 13, 2025 am 12:03 AM

MySQL bukan bahasa pengaturcaraan, tetapi bahasa pertanyaannya SQL mempunyai ciri -ciri bahasa pengaturcaraan: 1. SQL menyokong penghakiman bersyarat, gelung dan operasi berubah -ubah; 2. Melalui prosedur, pencetus dan fungsi yang disimpan, pengguna boleh melakukan operasi logik yang kompleks dalam pangkalan data.

MySQL: Pengenalan kepada pangkalan data paling popular di duniaMySQL: Pengenalan kepada pangkalan data paling popular di duniaApr 12, 2025 am 12:18 AM

MySQL adalah sistem pengurusan pangkalan data relasi sumber terbuka, terutamanya digunakan untuk menyimpan dan mengambil data dengan cepat dan boleh dipercayai. Prinsip kerjanya termasuk permintaan pelanggan, resolusi pertanyaan, pelaksanaan pertanyaan dan hasil pulangan. Contoh penggunaan termasuk membuat jadual, memasukkan dan menanyakan data, dan ciri -ciri canggih seperti Operasi Join. Kesalahan umum melibatkan sintaks SQL, jenis data, dan keizinan, dan cadangan pengoptimuman termasuk penggunaan indeks, pertanyaan yang dioptimumkan, dan pembahagian jadual.

Kepentingan MySQL: Penyimpanan Data dan PengurusanKepentingan MySQL: Penyimpanan Data dan PengurusanApr 12, 2025 am 12:18 AM

MySQL adalah sistem pengurusan pangkalan data sumber terbuka yang sesuai untuk penyimpanan data, pengurusan, pertanyaan dan keselamatan. 1. Ia menyokong pelbagai sistem operasi dan digunakan secara meluas dalam aplikasi web dan bidang lain. 2. Melalui seni bina pelanggan-pelayan dan enjin penyimpanan yang berbeza, MySQL memproses data dengan cekap. 3. Penggunaan asas termasuk membuat pangkalan data dan jadual, memasukkan, menanyakan dan mengemas kini data. 4. Penggunaan lanjutan melibatkan pertanyaan kompleks dan prosedur yang disimpan. 5. Kesilapan umum boleh disahpepijat melalui pernyataan yang dijelaskan. 6. Pengoptimuman Prestasi termasuk penggunaan indeks rasional dan pernyataan pertanyaan yang dioptimumkan.

Mengapa menggunakan mysql? Faedah dan kelebihanMengapa menggunakan mysql? Faedah dan kelebihanApr 12, 2025 am 12:17 AM

MySQL dipilih untuk prestasi, kebolehpercayaan, kemudahan penggunaan, dan sokongan komuniti. 1.MYSQL Menyediakan fungsi penyimpanan dan pengambilan data yang cekap, menyokong pelbagai jenis data dan operasi pertanyaan lanjutan. 2. Mengamalkan seni bina pelanggan-pelayan dan enjin penyimpanan berganda untuk menyokong urus niaga dan pengoptimuman pertanyaan. 3. Mudah digunakan, menyokong pelbagai sistem operasi dan bahasa pengaturcaraan. 4. Mempunyai sokongan komuniti yang kuat dan menyediakan sumber dan penyelesaian yang kaya.

Huraikan mekanisme penguncian InnoDB (kunci yang dikongsi, kunci eksklusif, kunci niat, kunci rekod, kunci jurang, kunci seterusnya).Huraikan mekanisme penguncian InnoDB (kunci yang dikongsi, kunci eksklusif, kunci niat, kunci rekod, kunci jurang, kunci seterusnya).Apr 12, 2025 am 12:16 AM

Mekanisme kunci InnoDB termasuk kunci bersama, kunci eksklusif, kunci niat, kunci rekod, kunci jurang dan kunci utama seterusnya. 1. Kunci dikongsi membolehkan urus niaga membaca data tanpa menghalang urus niaga lain dari membaca. 2. Kunci eksklusif menghalang urus niaga lain daripada membaca dan mengubah suai data. 3. Niat Kunci mengoptimumkan kecekapan kunci. 4. Rekod Rekod Kunci Kunci Rekod. 5. Gap Lock Locks Index Rakaman Gap. 6. Kunci kunci seterusnya adalah gabungan kunci rekod dan kunci jurang untuk memastikan konsistensi data.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

mPDF

mPDF

mPDF ialah perpustakaan PHP yang boleh menjana fail PDF daripada HTML yang dikodkan UTF-8. Pengarang asal, Ian Back, menulis mPDF untuk mengeluarkan fail PDF "dengan cepat" dari tapak webnya dan mengendalikan bahasa yang berbeza. Ia lebih perlahan dan menghasilkan fail yang lebih besar apabila menggunakan fon Unicode daripada skrip asal seperti HTML2FPDF, tetapi menyokong gaya CSS dsb. dan mempunyai banyak peningkatan. Menyokong hampir semua bahasa, termasuk RTL (Arab dan Ibrani) dan CJK (Cina, Jepun dan Korea). Menyokong elemen peringkat blok bersarang (seperti P, DIV),

SecLists

SecLists

SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

EditPlus versi Cina retak

EditPlus versi Cina retak

Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

SublimeText3 Linux versi baharu

SublimeText3 Linux versi baharu

SublimeText3 Linux versi terkini

Dreamweaver Mac版

Dreamweaver Mac版

Alat pembangunan web visual