Bu yazımızda, cdc özelliğine sahip veri tabanlarının, aynı ve farklı Instance üzerinde aynı ve farklı isimlerle oluşturulması sonrası bu özelliğin, oluşturulan database’lerde aktif olarak devam etmesi ilgili işlemleri uygulayacağız. Aynı zamanda bu konu ile ilgili karşılaşılan hatanın çözümü üzerine konuşacağız.
Konu hakkında daha detaylı bilgi almak için CHANGE DATA CAPTURE NEDİR? adlı makaleyi okumanızı tavsiye ederim.
1 2 3 |
-- İlk adımımız olan cdc'nin açık olduğu veri tabanlarını buluyoruz. select name,is_cdc_enabled from sys.databases |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
-- CDC_TestDB Database oluşturulur. CREATE DATABASE [CDC_TestDB] ON PRIMARY ( NAME = N'CDC_TestDB', FILENAME = N'F:\CDC_TestDB.mdf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ) LOG ON ( NAME = N'CDC_TestDB_Log', FILENAME = N'F:\CDC_TestDB_log.ldf' , SIZE = 3840KB , MAXSIZE = 2048GB , FILEGROWTH = 10%) GO |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
use [CDC_TestDB]; go -- tablo oluşturma create table Personel ( perID int constraint PK_Personel primary key Identity(1,1) ,perName varchar(20) ) |
1 2 3 4 5 6 7 |
--CDC_TestDB database üzerinde CDC Aktif Etme USE [CDC_TestDB] GO EXEC sys.sp_cdc_enable_db |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
-- Oluşturduğumuz Tablonun cdc özelliği aktif edilir. USE [CDC_TestDB] GO EXEC sys.sp_cdc_enable_table @source_schema = N'dbo', @source_name = N'Personel', @role_name = NULL GO |
1 2 3 |
--Personel Tablosuna Bir Değer Giriyoruz insert into Personel values('Serdar'),('Bayrak') |
1 2 3 |
-- CDC Tablosundaki değişiklikleri aşağıdaki sorgu ile görebiliriz. select * from cdc.dbo_Personel_CT |
1 2 3 |
--Restore Senaryosunu denemek için oluşturduğumuz veri tabanının yedeğini alıyoruz. backup database CDC_TestDB to disk = 'F:\CDC_TestDB.bak' |
1 2 3 4 5 6 7 8 9 |
--Aynı Instance altında Farklı Database ismi ile Restore ediyoruz. Restore Database [CDC_TestDB_NEW] from disk = 'F:\CDC_TestDB.bak' with move 'CDC_TestDB' to 'F:\CDC_TestDB1.mdf', move 'CDC_TestDB_Log' to 'F:\CDC_TestDB_log1.ldf',keep_cdc |
1 2 3 4 5 6 7 8 9 |
--Aynı Instance altında Farklı Database ismi ile ve cdc_keep seçeneği olmadan Restore ediyoruz. Restore Database [CDC_TestDB_Not] from disk = 'F:\Data01\CDC_TestDB.bak' with move 'CDC_TestDB' to 'F:\CDC_TestDB2.mdf', move 'CDC_TestDB_Log' to 'F:\CDC_TestDB_log2.ldf' |
1 2 3 |
--Farkli Instance üzerinde Aynı Database ismi ile Restore Ediyoruz. restore database CDC_TestDB from disk = 'F:\CDC_TestDB.bak' with keep_cdc |
1 2 3 4 5 6 7 |
--Farkli Instance üzerinde Farklı Database ismi ile Restore Ediyorum. restore database CDC_TestDB_Not from disk = 'F:\CDC_TestDB.bak' with move 'CDC_TestDB' to 'F:\CDC_TestDB3.mdf', move 'CDC_TestDB_Log' to 'F:\CDC_TestDB_log3.ldf' |
1 2 3 4 5 6 7 8 9 10 11 |
--cdc temizleme ve yakalama joblarını oluşturuyoruz. Use [CDC_TestDB] exec sys.sp_cdc_add_job 'capture' GO exec sys.sp_cdc_add_job 'cleanup' GO |
cdc özelliği açık bir database başka bir instance ortamında restore edilirken, keep_cdc özelliği ile aktif edilmez ve bu tablolar üzerinde cdc user ve schema yetkiye sahip ve bu tabloda isim değişikliği yapmak ve tabloyu drop etmek istediğinizde size izin vermeyecektir. Bu işlemi yaptığınızda size aşağıdaki hatayı dönecektir. Çözüm için aşağıdaki adımları sırayla izleyeniz.
Eğer database’nizde cdc özelliğini aktif olarak kullanıyorsanız disable ettikten sonra açmayı unutmayınız. Bu işlemleri SQL Server’ın log mekanizması ile bağlantılı olduğundan konunun uzmanından yardım almanızda fayda bulunmaktadır.
1 2 3 |
USE [TESTDB] drop table dbo.test_NEW |
Problem: Msg, Level 16, State 1, Procedure sys.sp_cdc_ddl_event_internal, Line 69 [Batch Start Line] Index ‘source_object_id_idx’ on table ‘cdc.change_tables’ (specified in the FROM clause) does not exists.
Çözüm:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
USE [TESTDB] GO exec sys.sp_cdc_disable_db @source_schema =N'dbo', @source_name = N'test_NEW' @capture_instance = N'test_NEW' GO drop table dbo.test_NEW |
veya
1 2 3 4 5 6 7 8 9 |
USE [TESTDB] GO exec sys.sp_cdc_disable_db GO drop table dbo.test_NEW |