SQL Server 2017'de (CU3), TDE veritabanlarımdan birinde yedek sıkıştırmayı etkinleştirdiğimde, yedekleme işlemi her zaman veritabanındaki belirli bir sayfayı bozar. Yedeklemeyi sıkıştırma olmadan çalıştırırsam, bozulmaz. Bu sorunu doğrulamak ve yeniden oluşturmak için attığım adımlar şunlardır:
- DBCC CheckDB'yi "TDE_DB1" veritabanında çalıştırın; her şey iyi, hata yok;
- Sıkıştırma olmadan veritabanını başarıyla yedekleyin; RESTORE VERIFYONLY her şeyin iyi olduğunu söylüyor;
- Veritabanı "TDE_DB2" olarak başarıyla geri yüklendi; her şey iyi, DBCC CheckDB hiçbir hata göstermez;
- "TDE_DB1" veritabanını sıkıştırma ile başarıyla yedekleyin; RESTORE VERIFYONLY hataları, "Yedekleme setinde hasar tespit edildi" diyerek;
- Veritabanını "TDE_DB2" olarak geri yüklemeyi deneyin; "RESTORE veritabanında (1: 92454) sayfada bir hata algıladı"
- 1-3 arası adımları tekrarlayın; her şey yolunda;
- DROP "TDE_DB1" ve "TDE_DB2"; "TDE_DB1" yedekten geri yükleyin; her şey yolunda;
- 1-5 arasındaki adımları tekrarlayın; aynı sonuçları almak;
Özetlemek gerekirse: Veritabanı ve düzenli yedeklemeler iyi görünüyor, veritabanında CHECKDB ve yedeklemelerde VERIFYONLY çalıştırmak herhangi bir hata bildirmiyor. Veritabanını sıkıştırma ile yedeklemek bozulmaya neden gibi görünmektedir.
Hatalı kod örnekleri aşağıdadır. (Not: TDE veritabanıyla sıkıştırmayı kullanmak için MAXTRANSFERSIZE gerekir )
-- Good, completes with no corruption;
BACKUP DATABASE [TDE_DB1] TO DISK = N'E:\MSSQL\Backup\TDE_DB1a.bak' WITH CHECKSUM;
RESTORE VERIFYONLY FROM DISK = N'E:\MSSQL\Backup\TDE_DB1a.bak' WITH CHECKSUM;
RESTORE DATABASE [TDE_DB2]
FROM DISK = 'E:\MSSQL\Backup\TDE_DB1a.bak'
WITH MOVE 'DataFileName' to 'E:\MSSQL\Data\TDE_DB2.mdf'
,MOVE 'LogFileName' to 'F:\MSSQL\Log\TDE_DB2_log.ldf';
-- Bad, I haz corruption;
BACKUP DATABASE [TDE_DB1] TO DISK = N'E:\MSSQL\Backup\TDE_DB1b.bak' WITH CHECKSUM, COMPRESSION, MAXTRANSFERSIZE = 131072;
RESTORE VERIFYONLY FROM DISK = N'E:\MSSQL\Backup\TDE_DB1b.bak' WITH CHECKSUM;
-- ERROR
--Msg 3189, Level 16, State 1, Line 1
--Damage to the backup set was detected.
--Msg 3013, Level 16, State 1, Line 1
--VERIFY DATABASE is terminating abnormally.
RESTORE DATABASE [TDE_DB2]
FROM DISK = 'E:\MSSQL\Backup\TDE_DB1b.bak'
WITH MOVE 'DataFileName' to 'E:\MSSQL\Data\TDE_DB2.mdf'
,MOVE 'LogFileName' to 'F:\MSSQL\Log\TDE_DB2_log.ldf';
-- ERROR
--Msg 3183, Level 16, State 1, Line 7
--RESTORE detected an error on page (1:92454) in database "TDE_DB2" as read from the backup set.
--Msg 3013, Level 16, State 1, Line 7
--RESTORE DATABASE is terminating abnormally.
Daha sonra hata olduğu bildirilen sayfayı kontrol etmeye çalıştım (Her zaman aynı sayfa.), Ancak DBCC PAGE ObjectId 0 olduğunu bildirir. Paul Randal tarafından bu makaleye göre , hiçbir meta veri bulunamadı anlamına gelir ve nedenlerinden biri sayfanın kendisinin bozuk olması ve meta verileri aramak için yanlış değerlerin kullanılması olabilir. Onun tavsiyesi bozuk yedekleme geri yüklemez çünkü yapamam CHECKDB çalıştırmaktır.
Meta verileri sıfırlamak için bu SO Post (BACKUP komutuna INIT ve FORMAT ekleyerek) önerilerini denedim , ancak bu bir şey değişmedi gibi görünüyor, hala sıkıştırılmış yedekte bozulma olsun.
Bu yalnızca TDE veritabanımdan biriyle olur. Bu aynı sunucuda 4 başka TDE veritabanı var ve bu sorun yok. Bu bana bu özel veritabanı ile ilgili bir sorun olabileceğini söylüyor. Kolay çözümün sadece sıkıştırma kullanmak olmadığını anlıyorum, ancak bunun aslında yolda daha büyük bir sorun için erken bir uyarı olabileceğini hissediyorum.
Bunu daha önce gören veya sıkıştırmanın neden bu sayfayı bozacağına dair bir fikri olan var mı? Bu noktada, bir sonraki adımın ne olacağı konusunda biraz kayboldum. Sayfayı önceki bir yedekten geri yüklemeyi düşündüm, ancak normal veritabanındaki sayfa iyi göründüğü için bunun önemli olacağını düşünmüyorum.
GÜNCELLEME 1: Aşağıda, 0 seçeneğiyle DBCC PAGE sonuçları verilmiştir:
DBCC yürütmesi tamamlandı. DBCC hata mesajları yazdırdıysa, sistem yöneticinize başvurun.
SAYFA: (1: 92454)
TAMPON:
BUF @ 0x000002187AE55640
bpage = 0x000002184865E000 bhash = 0x0000000000000000
bpageno = (1: 92454) bdbid = 8 standart = 0 bcputicks = 563 bsampleCount = 1
bUse1 = 51429 bstat = 0x809 blog = 0x15a
bnext = 0x00000000000000000000000000SAYFA BAŞLIĞI:
Sayfa @ 0x000002184865E000
m_pageId = (1: 92.454) m_headerVersion = 111
m_type = 189 m_typeFlagBits = 0x2D m_level = 197
m_flagBits = 0x525e m_objId (AllocUnitId.idObj) = 788.815.194
m_indexId (AllocUnitId.idInd) = 515 Meta: AllocUnitId = 145011308798541824 Meta veri: PartitionID = 0 Meta Veri: IndexId = -1 Meta Veriler: ObjectId = 0 m_prevPage = (32842: 1881351155) m_nextPage = (13086: -560562340)
pminlen = 36067 m_slotCnt = 8149 m_freeCnt = 51871 m_freeData = 7295 m_reservedCnt = 4810 m19 = 4010 m12 14755
m_xdesId = (12811: 1559482793) m_ghostRecCnt =
12339 m_tornBits = -1381699202 DB Parça Kimliği = 1Tahsis Durumu
GAM (1: 2) =
TAHSİS EDİLMİŞ SGAM (1: 3) = TAHSİS EDİLMEYEN PFS (1: 88968) = 0x0 0_PCT_FULL FARK (1: 6) = DEĞİŞTİRİLMEDİ
ML (1: 7) = MIN_LOGGED DEĞİL
DBCC PAGE'i diğer seçeneklerle çalıştırmaya çalışırsam, aşağıdaki hataları alıyorum:
Seçenek 1 ile DBCC PAGE: Msg 0, Seviye 11, Durum 0, Satır 0 Geçerli komutta ciddi bir hata oluştu. Varsa sonuçlar atılmalıdır.
3. seçenekli DBCC PAGE: Msg 2514, Seviye 16, Durum 5, Satır 3 Bir DBCC PAGE hatası oluştu: Geçersiz sayfa türü - döküm stili 3 mümkün değil.
GÜNCELLEME 2: sys.dm_db_database_page_allocations DMO sonuçlarından bazıları:
object_id = 75 index_id = 1 rowset_id = 281474981625856 allocation_unit_id = 281474981625856
allocation_unit_type = 1 allocation_unit_type_desc = IN_ROW_DATA extent_file_id = 1 extent_page_id = 92.448
allocated_page_iam_file_id = 1 allocated_page_iam_page_id = 104
allocated_page_file_id = 1 allocated_page_page_id = 92.454
is_allocated = 0 is_iam_page = 0 is_mixed_page_allocation = 0