Data Transfer and Loop Delete with Linked Server

Bu yazımızda büyük bir tablodan başka bir tabloya veri aktarıp, aktarılan verinin o tablodan silinmesi adımlarını bulabilirsiniz. Yazıda aktarım işlemi ayrı sunucularda yapılmıştır. Bu sebeple linked server kullanılmıştır. Özellikle devamlılığı olan bu tür işlemleri, aşağıdaki paylaştığımız scripti bir store procedure yapıp ve bu procedure bir job ile tetiklenirse otomatik olarak işlem sürekli olarak yapılacaktır. Bu işlemin bize en büyük faydası birden fazla transcation işleminin bir arada veri kaybı  olmadan yapılması sağlar. Ayrıca performanslı bir aktarım sağlar ve delete işlemini loop yaptığımız için canlı sistemde ldf’in büyümeden rahatça yapmasına imkan sunar.   use AdminDB   CREATE TABLE #TempTable (Id INT NOT NULL INDEX idx_Id Clustered) /*1-Verilerin tutarlı ve hızlı aktarımı yapılması için temp tablo oluşturuyoruz.*/     DECLARE @SixMonthDate DATETIME   SET @SixMonthDate = (SELECT DATEADD(MONTH,-6,GETDATE())) /**2-6 aydan eski verilerin taşınması için Tarih belirliyoruz**/     DECLARE @SourceTblName VARCHAR(255)   SET @SourceTblName  ='TransferData'   DECLARE @DestinationTblName NVARCHAR(255)   SET @DestinationTblName = '[LinkedServerInstanceName].[TransferDB].dbo.[TransferData]' […]

Data Transfer and Loop Delete with Linked Server

Bu yazımızda büyük bir tablodan başka bir tabloya veri aktarıp, aktarılan verinin o tablodan silinmesi adımlarını bulabilirsiniz. Yazıda aktarım işlemi ayrı sunucularda yapılmıştır. Bu sebeple linked server kullanılmıştır.

Özellikle devamlılığı olan bu tür işlemleri, aşağıdaki paylaştığımız scripti bir store procedure yapıp ve bu procedure bir job ile tetiklenirse otomatik olarak işlem sürekli olarak yapılacaktır.

Bu işlemin bize en büyük faydası birden fazla transcation işleminin bir arada veri kaybı  olmadan yapılması sağlar. Ayrıca performanslı bir aktarım sağlar ve delete işlemini loop yaptığımız için canlı sistemde ldf’in büyümeden rahatça yapmasına imkan sunar.

 

use AdminDB

  CREATE TABLE #TempTable (Id INT NOT NULL INDEX idx_Id Clustered) /*1-Verilerin tutarlı ve hızlı aktarımı yapılması için temp tablo oluşturuyoruz.*/

 

  DECLARE @SixMonthDate DATETIME

  SET @SixMonthDate = (SELECT DATEADD(MONTH,-6,GETDATE())) /**2-6 aydan eski verilerin taşınması için Tarih belirliyoruz**/

 

  DECLARE @SourceTblName VARCHAR(255)

  SET @SourceTblName  ='TransferData'

  DECLARE @DestinationTblName NVARCHAR(255)

  SET @DestinationTblName = '[LinkedServerInstanceName].[TransferDB].dbo.[TransferData]'

 

  DECLARE @QueryParameters NVARCHAR(4000)

  SET @QueryParameters = '@FirstDateParam datetime'

 

  DECLARE @SelectInsertQuery NVARCHAR(MAX) =

                N'

                      BEGIN

                                        

                          INSERT INTO #TempTable

                          SELECT

                          TOP 3 [Id]

                          FROM '+ @SourceTblName +' WITH (NOLOCK)

                          WHERE Date <= @FirstDateParam

                                                      

                      END '

      

       exec sp_executesql @SelectInsertQuery, @QueryParameters,@FirstDateParam = @SixMonthDate /*3-Ana tablodaki 6 aydan eski verilerin Id'lerini temp tablosuna Insert ediyoruz.*/

      

  DECLARE @SelectInsertQuery2 NVARCHAR(MAX) =

                 N'

                      BEGIN

                                                         

                          INSERT INTO '+ @DestinationTblName +'([Id], [Date])

                          SELECT [Id], [Date]

                          FROM '+ @SourceTblName +' WITH (NOLOCK)

                          WHERE '+ @SourceTblName +'.Id in (select #TempTable.Id from #TempTable)

                                                           

                      END '

 

        execsp_executesql @SelectInsertQuery2 /*4-Adimda Temp Tablosuna bastığımız Id'leri Ana tablo ile eşleştirip Ana tablo'dan siliyoruz.*/

      

  DECLARE @DeleteQuery NVARCHAR(MAX) =

                           N' 

                             BEGIN

                                 

                                DECLARE  @RowCount INT;

                                SET @RowCount = 1;

                            

                                WHILE (@RowCount > 0)

                                      BEGIN

                                             

                                             SET @Rowcount = 0

 

                                                     DELETE TOP (1)

                                                     FROM '+ @SourceTblName +'

                                                     WHERE '+ @SourceTblName +'.Id in (select #TempTable.Id from #TempTable)

 

                                              SET @RowCount = @@ROWCOUNT      

                            

                                      END

                            

                                END '

                                

     exec sp_executesql @DeleteQuery /*4.Adimda Linked server'la bastığımız verileri ana tablodan temp tablodaki Id'ler ile sağlamasını yaparak siliyoruz.*/

 

        Droptable #TempTable
Benzer Yazılar

TAIL-LOG BACKUP İLE DATABASE’E ATILAN SON COMMIT’E GERİ DÖNME

SQL Server 2 ay önce

Bu yazımızda “.LDF” dosyası üzerinden tail-log backup alarak database’in son commit olan haline kadar geri dönme işlemi nasıl yapılıyor bu konuyu anlatacağım. Ama ondan önce tail-log backup ne için kullanılır ve nedir onu bir açıklayalım; Bir database’i başka bir yere taşımak istediğimizde aşağıdaki görsel’de olduğu gibi bir tail-log backup alırız ve database restoring state düşer işlem yapılamaz olur. Sonrasında aldığımız tail-log’u yeni ayağa kaldırmak istediğimiz instance üzerinde, önceden restore edilen backup zinciri üzerine işleyerek ayağa kaldırırız. Bu şekilde hem veri bütünlüğü korunur(veri kaybı olmaz) hemde kısa süreli kesinti ile db’yi başka bir instance’de ayağa kaldırmış oluruz. Ama ben bu yazıda size daha farklı bir senaryo üzerinde size tail-log’u anlatacağım. DİPNOT OLARAK; tail-log backup alındığında DB restoring state’e düşer, aynı tail-log restore edildiğinde db restoring state’ten Online state’e geçer. Tail-log backup aslında .LDF dosyasını truncate etmeyen bir log backup türevidir.   Basit bir senaryo üzerinde anlatacak olursak; Öncelikle bir adet full […]

SQL DATE FUNCTIONS

T-SQL 9 ay önce

SQL Server’da kullanmış olduğumuz bir çok fonksiyon vardır. Bu fonksiyonlardan bir taneside tarih ile alakalı olarak kullanmış olduğumuz  “DATE” fonksiyonlarıdır. Bu yazımızda sizlere; DATEDIFF DATEPART VE DATENAME DATEADD DATEDIFF_BIG GETDATE Fonksiyolarını anlatacağım. DATEDIFF(interval, date1, date2) FUNCTIONS DATEDIFF() fonksiyonun temel kullanım amacı girilen iki tarih arasında geçen zaman farkı yıl, ay veya gün olarak “INT” türünden almamızı sağlamaktadır. Bu fonksiyon 3 adet parametreden oluşur. Bulmak istediğiniz zaman farkını hangi zaman diliminden istediğiniz(Year-Month-Day) Başlangıç tarihi Bitiş tarihi DATEDIFF_BIG(datepart,startdate,enddate)FUNCTIONS DATEDIFF_BIG fonksiyonu, verilen iki tarih arasındaki farkı “BIGINT” türünden hesaplamaktadır. DATEDIFF fonksiyonuda verilen iki tarih arasındaki farkı hesaplamaktadır fakat “INT” türünden hesap yapar ve bizim yapacağımız çalışma “INT (max=2,147,483,647)”türünden büyük ise yetersiz kalacaktır. Yukarıdaki sorgumuzda DATEDIFF fonksiyonunun yapabileceği işlem limitinden fazla bir değer aralığı yaptık ve hata aldık. Aynı sorguyu DATEDIFF_BIG ile yaptığımızda ise herhangi bir hata almadık DATEPART&DATENAME(datepart , date) FUNCTIONS DATENAME ve DATEPART fonksiyonları belli bir zaman dilimindeki tarihlerin belirtilen bir bölümünü döndürür. Aralarındaki […]

Used and Allocated Data Size Calculate for LOB and Regular Data

T-SQL 12 ay önce

SQL Server’da data boyutlarını hesaplamak için aşağıdaki yöntemi izleyebilirsiniz. Data boyutlarını hesaplarken özellikle allocate edilmiş data ve kullanılan data boyutları farklı olacaktır. Bunun sebebi ise bir veri tabanında oluşturulan bir tablonan boşaltılması veya index’in kaldırılması gibi bir çok etken vardır. SQL Server’da allocate edilen boyutu kullanılan boyuta düşürmek için shrink yapmak gerekir. Fakat data dosyalarında(mdf,ndf) shrink yapmak, özellikle yoğun transaction olan yerlerde büyük risk içermektedir.   –1.Adımda Instance altındaki tüm veri tabanlarının İmage ve Image olmayan dataların boyutlarının bilgisini aşağıdaki tabloya yazılmaktadır. USE [master] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[useddata]( [allocation_type] [varchar](12) NOT NULL, [used_mb] [numeric](36, 2) NULL, [allocated_mb] [numeric](36, 2) NULL ) ON [PRIMARY] GO –2.Adımda oluşturmuş olduğumuz tabloya Instance’daki tüm database’lerin bilgilerinin toplandığı script. –Kullanımda olan database'lerinizde . veya başka bir işaret var ise ? yerine [?] yazmanız gerekmektedir. declare @cmd nvarchar(max) set @cmd =' use [?]; insert into master..useddata select case […]

0 Yorum

Yorum Yaz

Rastgele