Merhaba,
Bu makalemde undocumented komut ve fonksiyonlar yardımıyla SQL Server’da bir tablodaki bir kayıt satırının fiziksel konumunu nasıl bulunacağını ve fiziksel konumdan nasıl okunacağını aktaracağım.
SQL Server veritabanı sisteminde her bir kayıt için kayıtın tutulduğu file_id (dosya numarası), page_id(sayfa numarası) ve slot_id(slot numarası) üçlüsünden oluşan RID(Row ID) bilgisi tutulmaktadır. Bu bilgiye SQL Server 2005 ile birlikte gelen %%lockres%% komutu ile ulaşabiliyorduk.Bazı zamanlarda hata kodlarında görüntülediğimiz kodlara benzerdir elde edeceğimiz sonuç ve şimdi ise Satırın bulunduğu fiziksel konumu bulmak için bir test veritabanı ve test tablosu oluşturalım:
create database test_dbcc go use test_dbcc go create table dbo.WebSites (id int identity(1,1), webadress varchar(64), siteowner varchar(32)) go insert into dbo.WebSites(webadress,siteowner) values('www.caglarozenc.com','Çağlar Özenç') go insert into dbo.WebSites(webadress,siteowner) values('www.caglarozenc.com','Çağlar Özenç') go
Oluşturduğumuz tablodaki kayıtların fiziksel konumuna bakalım:
select id, webadress, %%lockres%% FileId_PageId_SlotId from dbo.WebSites
Yukarıdaki resimde; en sağdaki sütun bize ilgili kayıtın bulunduğu file_id, page_id ve slot_id numarasını vermektedir. 1. Satır için file_id 1, page_id 120 ve slot_id 0 değerlerine sahip.
SQL Server 2008 ile birlikte %%lockres%% komutuna benzer işi yapan %%physloc%% komutu geldi. %%physloc%% komutu hex değer döndürür. WebSites tablosundaki kayıtların fiziksel adreslerini hex olarak bulalım:
select id, webadress, %%physloc%% HexAdress from dbo.WebSites
HexAdress kolonun ilk 4 byte’ın kombinasyonu page_id değerini; sonraki 2 byte’ın kombinasyonu file_id değerini; en sondaki 2 byte’ın kombinasyonu ise slot_id değerini verir.
%%physloc%% komutunun döndürdüğü hex değeri kolayca okuyabilmek için undocumented olan sys.fn_PhysLocFormatter() fonksiyonu da kullanılabilir:
select id,webadress, %%physloc%% HexAdress, sys.fn_PhysLocFormatter(%%physloc%%) Adress from dbo.WebSites
%%physloc%% komutunun döndürdüğü hex değerini okuyabileceğimiz undocumented bir diğer fonksiyonumuz sys.fn_physloccracker() fonksiyonudur. Aynı sorguyu sys.fn_physloccracker() fonksiyonunu kullanarak fiziksel adres bilgilerini bulalım:
select w.id, w.webadress, %%lockres%% HexAdress, plc.file_id, plc.page_id, plc.slot_id from dbo.WebSites w cross apply sys.fn_physloccracker(%%physloc%%) plc
Data Page yapısını okumak için dbcc page komutu kullanılır.
dbcc page( {dbid|dbname}, pagenum [,print option] [,cache] [,logical] )
Parametreler:
Dbid|dbname : Veritabanı Id yada Veritabanı Adı
Pagenum : Page numarası
Print option : 0, 1, 2 veya 3 değerini alabilen içerik detayını görüntüleme seçenekleridir. 0 – (Default) : Sadece page header bilgisi için
1 – Page Header ile birlikte her satırın hex bilgisi için
2 – Page Header ve Page seviyesinde detay bilgi için
3 – Page Header ve satır seviyesinde detay bilgi için
Konu için Mehmet Güzel‘in websayfası kullanılmıştır.
Kendisine bilgilendirmesi için teşekkür ederim.
Faydalı bir yazı teşekkürler 🙂