Aracılığıyla paylaş


Transact-SQL anlık görüntü yedeklemesi oluşturma

Şunlar için geçerlidir: SQL Server 2022 (16.x)

Bu makalede, Transact-SQL anlık görüntü yedeklemelerinin ne, neden ve nasıl kullanılacağı açıklanmaktadır. Transact-SQL (T-SQL) anlık görüntü yedeklemeleri SQL Server 2022'de (16.x) kullanıma sunulmuştur.


Veritabanları her gün daha da büyüyor. Geleneksel olarak, SQL Server yedeklemeleri akış yedeklemeleridir. Akış yedeklemesi, veritabanının boyutuna bağlıdır. Yedekleme işlemleri, yedekleme sırasında eşzamanlı OLTP iş yükünün aktarım hızını etkileyen kaynakları (CPU, bellek, G/Ç, ağ) kullanır. Verilerin boyutuna bağlı olmak yerine yedekleme performansını sabit hale getirmenin bir yolu, temel alınan depolama donanımı veya hizmeti tarafından sağlanan mekanizmaları kullanarak anlık görüntü yedeklemesi gerçekleştirmektir.

Yedeklemenin kendisi donanım düzeyinde gerçekleştiğinden, bu özellik saf bir SQL Server çözümü değildir. SQL Server,anlık görüntü için verileri ve günlük dosyalarını hazırlamalıdır, böylece dosyaların daha sonra geri yüklenebilen bir durumda olması garanti edilir. Bu adım tamamlandıktan sonra, yazma işlemleri SQL Server'da duraklatılır (okuma isteklerine izin verilir) ve anlık görüntüyü tamamlamak için denetim yedekleme uygulamasına devredilir. Anlık görüntü başarıyla tamamlandıktan sonra, uygulamanın denetimi yazma işlemlerinin devam ettiği SQL Server'a geri döndürmesi gerekir.

Anlık görüntü işlemi sırasında yazma işlemlerini dondurmamız gerektiğinden, sunucudaki iş yükünün uzun bir süre kesintiye uğramaması için anlık görüntünün hızlı bir şekilde gerçekleşmesi önemlidir. Geçmişte kullanıcılar, anlık görüntü yedeklemelerini tamamlamak için SQL Yazıcı hizmetinin üzerinde oluşturulan Microsoft dışı çözümlere dayanırdı. SQL Yazıcı hizmeti, SQL Server ile disk düzeyinde anlık görüntü arasındaki düzenlemeyi gerçekleştirmek için SQL Server VDI(Sanal Cihaz Arabirimi) ile birlikte Windows VSS'ye (Birim Gölge Hizmeti) bağlıdır.

SQL Yazıcı hizmetini temel alan yedekleme istemcileri karmaşık olma eğilimindedir ve yalnızca Windows üzerinde çalışır. T-SQL anlık görüntü yedeklemeleri ile düzenlemenin SQL Server tarafı bir dizi T-SQL komutuyla işlenebilir. Bu işlevsellik, kullanıcıların kendi küçük yedekleme uygulamalarını Windows veya Linux üzerinde çalıştırabilmelerine veya, temel depolama anlık görüntü başlatmak için bir betik arabirimini desteklediği takdirde, betikli çözümler oluşturabilmelerine olanak tanır.

Azure SQL IaaS Sanal Makinesinde veritabanını yedeklemeye ve geri yüklemeye yönelik uçtan uca bir çözümü gösteren örnek PowerShell betiğiaşağıda verilmiştir. Örnek, SQL Server 2022'de (16.x) sunulan T-SQL anlık görüntü yedekleme özelliklerini kullanır.

İş Akışı

T-SQL anlık görüntü yedekleme söz dizimi, satıcıya bağımlı anlık görüntü mekanizmasını askıya alma ve yedekleme işlemlerinden ayrıştırıyor. Bu söz dizimi ile şunları yapabilirsiniz:

  1. Veritabanını ALTER komutuyla dondurun. Bu komut, temel alınan depolamanın anlık görüntüsünü gerçekleştirmenize olanak sağlar. Bundan sonra veritabanını çözebilir ve BACKUP komutuyla anlık görüntüyü kaydedebilirsiniz.

  2. Yeni BACKUP GROUP ve BACKUP SERVER komutlarıyla birden çok veritabanının anlık görüntülerini aynı anda gerçekleştirin. Bu seçenekle, anlık görüntüler temel alınan depolamanın anlık görüntü ayrıntı düzeyinde gerçekleştirilebilir ve bu da aynı diskin anlık görüntüsünü birden çok kez gerçekleştirme gereksinimini ortadan kaldırır.

  3. FULL yedeklemeleri ve COPY_ONLY FULL yedeklemeleri gerçekleştirin. Bu yedeklemeler de msdb'de kaydedilmektedir.

  4. Anlık görüntü FULL yedeklemesinden sonra normal akış yöntemini kullanarak alınan log yedeklemeleriyle belirli bir zaman dilimine kurtarma gerçekleştirin. İsterseniz akış değişiklik yedeklemeleri de desteklenir.

Not

Diferansiyel bitmapler, veritabanını ALTER komutuyla askıya alırken ilk aşamada temizlenir. Kullanıcı, anlık görüntü alma başarısız olduğundan veya başka bir nedenle yedekleme gerçekleştirmeden veritabanını çözmeye karar verirse, farklılık bit haritası geçersiz olur. Fark yedeklemelerini yapmak için veritabanının tamamını taramaları gerektiğinden, sonraki farklı yedeklemeler daha yoğun G/Ç kullanır. Fark bit eşlemi başarılı bir anlık görüntü yedeklemesinin ardından yeniden geçerli olur.

Aşağıdaki diyagramda T-SQL anlık görüntü yedeklemelerinin üst düzey iş akışı gösterilmektedir:

Askıya alma işleminden anlık görüntüye ve yedeklemeye kadar süreci gösteren Diyagramı.

Anlık görüntü oluşturma adımı, ilgili depolama üzerinde anlık görüntü alma işlemini başlatmanızı gerektirir. Aşağıdaki diyagramda, anlık görüntü yedekleme işlemini tamamlamak için bir yedekleme betiğinin SQL Server ile nasıl çalışabileceğine ilişkin bir örnek gösterilmektedir:

Diyagramı, yedekleme işlemini tamamlamak için yedekleme betiğinin SQL Server ile nasıl çalışabileceğini gösteren bir örnek gösterir.

Benzer şekilde, bir geri yükleme betiği aşağıdaki gibi çalışabilir:

Diyagramı, geri yükleme betiğinin SQL Server ile birlikte çalışarak geri yükleme görevini anlık görüntü yedeklemesinden nasıl tamamlayabildiğini gösterir.

Sınırlama

Bu özellik ile yedekleyebileceğiniz veritabanı sayısı üst sınırı 64'tür. Sunucuda 64'ten fazla veritabanı varsa aşağıdaki hatayı görürsünüz:

Error message:
Msg 925, Level 19, State 1, Line 4
Maximum number of databases used for each query has been exceeded. The maximum allowed is 64.

Örnekler

Aşağıdaki bölümlerde diske anlık görüntü yedeklemesi gerçekleştirmek için kullanılan farklı T-SQL komutları gösterilmektedir. Bir anlık görüntü yedeklemesi diske yazıldığında, dosyaya yalnızca anlık görüntü yedeklemesine bağlı meta veriler yazılır. Çıktı, üst bilgi ve dosya içeriği dışında veritabanı içeriğini içermez. Anlık görüntü yedeklemesi gerçekleştirmenin bir parçası olarak oluşturulan kabuk dosyası, tam bir yedekleme yapmak için gerçek anlık görüntü URI'siyle kullanılmalıdır. Bu dosyadaki bir veritabanının RESTORE, kullanıcının RESTORE komutunu vermeden önce veritabanı dosyalarını anlık görüntü URI'sinden bağlama noktasına kopyalamasını gerektirir. Kullanıcılar, RESTORE HEADERONLY ve RESTORE FILELISTONLYgibi tüm geleneksel T-SQL komutlarını RESTORE DATABASEile birlikte bu anlık görüntü yedekleme meta veri dosyasında çalıştırabilir. Söz dizimi, anlık görüntü yedekleme meta verilerinin DISK veya URL'e yazılmasını destekler. Anlık görüntü yedekleme kümeleri, akış yedekleme kümeleri gibi tek bir dosyaya da eklenebilir.

Not

URL'ye yedekleme için blok blobları tercih edilir, ancak sayfa blobları Windows'da SQL Server için desteklenir. Linux ve kapsayıcılardaki SQL Server için yalnızca blok blobları desteklenir.

A. Anlık görüntü yedeklemesi için tek bir kullanıcı veritabanını askıya alma ve veritabanı yedeklemesi kaydetme

ALTER DATABASE testdb1
SET SUSPEND_FOR_SNAPSHOT_BACKUP = ON;

BACKUP DATABASE testdb1
TO DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY, FORMAT;

B. Anlık görüntü yedekleme için birden çok kullanıcı veritabanını askıya alma

Aynı temel diskte birden çok veritabanı varsa, aşağıdaki komutla birden çok veritabanını askıya alabilirsiniz.

ALTER SERVER CONFIGURATION
SET SUSPEND_FOR_SNAPSHOT_BACKUP = ON
(GROUP = (testdb1, testdb2));

BACKUP GROUP testdb1, testdb2
TO DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY, FORMAT;

C. Anlık görüntü yedekleme için sunucudaki tüm kullanıcı veritabanlarını askıya alma

Sunucudaki tüm kullanıcı veritabanlarının askıya alınması gerekiyorsa aşağıdaki komutu kullanın.

ALTER SERVER CONFIGURATION
SET SUSPEND_FOR_SNAPSHOT_BACKUP = ON;

BACKUP SERVER
TO DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY, FORMAT;

Not

Bu komutların hiçbiri, anlık görüntü yedeklemesi için sistem veritabanlarının (master, modelve msdb) askıya alınmasına destek sağlamaz.

D. Tek bir komutla birden çok kullanıcı veritabanını askıya alma

Sunucudaki tüm kullanıcı veritabanlarının anlık görüntüsünü tek bir yedekleme kümesine kaydedin:

ALTER SERVER CONFIGURATION
SET SUSPEND_FOR_SNAPSHOT_BACKUP = ON
(GROUP = (testdb1, testdb2));

BACKUP GROUP testdb1, testdb2
TO DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY, FORMAT;

Not

Varsayılan olarak, SUSPEND_FOR_SNAPSHOT_BACKUP komutları değişiklik bit eşlemini temizler. Yalnızca kopyalama yedeklemesi gerçekleştirmeyi tercih ediyorsanız, aşağıdaki örneklerde gösterildiği gibi COPY_ONLY anahtar sözcüğünü kullanın.

E. Kopya anlık görüntü yedekleri gerçekleştirin

Değişiklik bit eşlemi donmadan önce temizlendiğinden, SUSPEND_FOR_SNAPSHOT_BACKUP dondurmadan önce diferansiyel bit eşlemi temizlememe seçeneği (COPY_ONLY) sağlar.

ALTER DATABASE testdb1
SET SUSPEND_FOR_SNAPSHOT_BACKUP = ON
(MODE = COPY_ONLY);

BACKUP DATABASE testdb1
TO DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY, FORMAT;

ALTER SERVER CONFIGURATION
SET SUSPEND_FOR_SNAPSHOT_BACKUP = ON
(GROUP = (testdb1, testdb2), MODE = COPY_ONLY);

BACKUP GROUP testdb1, testdb2
TO DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY, FORMAT;

ALTER SERVER CONFIGURATION
SET SUSPEND_FOR_SNAPSHOT_BACKUP = ON
(MODE = COPY_ONLY);

BACKUP SERVER
TO DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY, FORMAT;

Not

Veritabanını anlık görüntü yedeklemesi için askıya alırken önceden belirtildiği gibi, BACKUP komutunda COPY_ONLY kullanılması gerekmez.

F. Farklı sürücülerde veri ve günlük dosyalarını yedekleyin.

Birden çok sürücüde veri dosyaları (.mdf ve .ndf) içeren bir veritabanınız ve farklı bir sürücüde işlem günlüğü dosyanız (.ldf) varsa, aşağıdaki gibi bir anlık görüntü yedeklemesi gerçekleştirebilirsiniz:

  1. Veritabanını askıya alın (hem veri hem de günlük dosyalarındaki yazma işlemlerini dondurur).

    ALTER SERVER CONFIGURATION
    SET SUSPEND_FOR_SNAPSHOT_BACKUP = ON;
    
  2. Veritabanı verilerinin ve günlük dosyalarının bulunduğu tüm temel disklerin anlık görüntüsünü alın. Bu adım donanıma bağlıdır.

  3. Anlık görüntü yedekleme meta verilerini (.bkm) içeren çıkışı oluşturan METADATA_ONLY seçeneğini kullanarak yedeklemeyi gerçekleştirin.

    BACKUP DATABASE testdb1
    TO DISK = 'D:\Temp\db.bkm'
    WITH METADATA_ONLY;
    

Bu yedeklemeyi daha sonraki bir aşamada geri yüklemek için şu adımları izleyin:

  1. Anlık görüntü disklerini, geri yüklemek istediğiniz VM'ye ekleyin veya bağlayın.

  2. Veritabanı geri yükleme işlemi gerçekleştirirken .bkm dosyasını (önceki listedeki 3. adımda) kullanın.

  3. Geri yükleme sırasında sürücüler farklıysa, mantıksal dosyaları gerekli hedefe yerleştirmek için MOVE seçeneğini kullanın. Örnek için bkz. Örnek N.

G. Yedekleme kümesini etiketle

Anlık görüntüyle ilişkili URI'yi etiketlemek için yedekleme komutundaki MEDIANAME ve MEDIADESCRIPTION seçeneklerini kullanabilirsiniz. Bu kullanım, yedekleme dosyasının veritabanı meta verileriyle birlikte temel alınan anlık görüntü bilgilerini taşımasına olanak tanır. URI'yi tek tek yedekleme kümesi anlık görüntüsüyle etiketlemek için NAME ve DESCRIPTION seçeneklerini de kullanabilirsiniz.

SQL Server, LABEL bilgilerini hiçbir şekilde yorumlamaz. Ancak kullanıcının RESTORE LABELONLY komutuyla anlık görüntü yedeklemesiyle ilişkili URI'yi görüntülemesine yardımcı olur.

Ardından anlık görüntüyü geri yüklemek için URI'de bulunan anlık görüntü disklerini VM'ye ekleyebilirsiniz. MEDIANAME ve MEDIADESCRIPTION'de depolanan anlık görüntü URI'si, msdb veritabanı tablosu dbo.backupmediaset'te de görüntüleme için kullanılabilir.

H. Anlık görüntü yedeklemenin RESTORE HEADERONLY ile çıktısı

veritabanı, grup ve sunucu sırayla yürütülür ve aynı çıkış dosyasına yazılırsa, RESTORE HEADERONLY içeren çıkış aşağıdaki örneğe benzer:

RESTORE HEADERONLY
FROM DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY;

Ben. RESTORE FILELISTONLY ile anlık görüntü yedekleme çıktısı

RESTORE FILELISTONLY olan çıktı varsayılan olarak ilk yedekleme kümesini görüntüler:

RESTORE FILELISTONLY
FROM DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY;

J. RESTORE FILELISTONLY çıkışını bir yedekleme kümesine filtrele

RESTORE FILELISTONLYiçeren birden çok yedekleme kümesinden belirli bir yedekleme kümesini seçmek için, RESTORE FILELISTONLYüzerinde zaten desteklenen FILE yan tümcesini kullanın.

RESTORE FILELISTONLY
FROM DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY, FILE = 3;

Sorgudan yedekleme kümesine SSMS çıktısının ekran görüntüsü.

K. VERİTABANINA RESTORE FILELISTONLY ÇIKIŞINI FİLTRELEME

RESTORE FILELISTONLYile seçili yedekleme kümesindeki birden çok veritabanından tek bir veritabanı seçmek için DBNAME yan tümcesiyle FILE yan tümcesini kullanın. DBNAME yan tümcesi yalnızca anlık görüntü yedekleme kümelerinde kullanılabilir.

RESTORE FILELISTONLY
FROM DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY, FILE = 3, DBNAME = 'testdb3';

RESTORE FILELISTONLY çıkışını veritabanına filtrelemenin sonuçlarının ekran görüntüsü.

L. Anlık görüntü veritabanını geri yükleme

Bir veritabanını anlık görüntü yedeklemesinden geri yüklemek, veritabanına eklemeye benzer. Veritabanının kurtarma olmadan eklenmesi gerekiyorsa geri yükleme komutunu RECOVERY seçeneği olmadan çalıştırın. Varsayılan olarak, RESTORE anlık görüntü yedekleme kümesindeki ilk veritabanını seçer. Aşağıdaki örnek, testdb1'ı geri yükler. Sunucuda zaten testdb1 varsa, REPLACE yan tümcesini ekleyin. RESTOREçalıştırmadan önce veritabanı dosyalarını bağlamanız gerekir.

RESTORE DATABASE testdb1
FROM DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY, FILE = 3, REPLACE, --> no DBNAME clause - restore first database in backup set
MOVE 'testdb1' TO 'D:\Temp\snap\testdb1.mdf',
MOVE 'testdb1_log' TO 'D:\Temp\snap\testdb1_log.ldf';

M. Ortada listelenen bir anlık görüntü veritabanını geri yükleme

RESTORED olması gereken veritabanı aradaysa, DBNAME yan tümcesiyle geri yüklenecek olan veritabanını belirtin. Aşağıdaki söz dizimi, DBNAME yan tümcesinde belirtilen veritabanını geri yükler.

RESTORE DATABASE testdb3
FROM DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY, FILE = 3, DBNAME = 'testdb3', --> restores testdb3 database
MOVE 'testdb3' TO 'D:\Temp\snap\testdb3.mdf',
MOVE 'testdb3_log' TO 'D:\Temp\snap\testdb3_log.ldf',
NORECOVERY;

N. Veritabanını farklı bir adla geri yükleme

Veritabanını farklı bir adla geri yükleyebilirsiniz. Ortadaki veritabanı RESTORED olması gerekiyorsa, geri yüklenecek veritabanını DBNAME şartıyla belirtin. Aşağıdaki söz dizimi, belirtilen veritabanını DBNAME yan tümcesiyle geri yükler ve testdb33olarak yeniden adlandırır.

RESTORE DATABASE testdb33 --> renames the specified database testdb3 to testdb33.
FROM DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY, FILE = 3, DBNAME = 'testdb3', --> original name specified here
MOVE 'testdb3' TO 'D:\Temp\snap\testdb3.mdf',
MOVE 'testdb3_log' TO 'D:\Temp\snap\testdb3_log.ldf',
NORECOVERY;

O. Birden çok veritabanı içeren bir yedekleme kümesinden veritabanları ayıklamak için RESTORE BACKUPSETONLY kullanma

Bir grup veya sunucu anlık görüntüsünden birden çok veritabanı içeren bir anlık görüntü yedekleme kümesi, RESTORE BACKUPSETONLY komutuyla bölünebilir. Bu komut, veritabanı başına bir yedekleme kümesi oluşturur.

Bir sunucu anlık görüntüsü tek bir yedekleme kümesi içeren bir yedekleme dosyasında üç veritabanı içeriyorsa, aşağıdaki komut her veritabanı için bir tane olmak üzere üç yedekleme kümesi oluşturur. Çıkış dosyaları için <file_name_prefix>_<unique_time_stamp> içeren bir dizin oluşturur.

RESTORE BACKUPSETONLY
FROM DISK = 'D:\Temp\db1.bkm'
WITH METADATA_ONLY;

P. Birden çok veritabanı içeren bir yedekleme kümesindeki belirli bir veritabanını ayıklamak için BACKUPSETONLY GERI YÜKLEME özelliğini kullanma

RESTORE BACKUPSETONLY, kullanıcı yedekleme kümesindeki üç veritabanından bir veritabanının çıktısını almak istiyorsa DBNAME parametresini destekler. Ayrıca, yedekleme dosyasındaki birden çok yedekleme kümesini filtrelemek için FILE parametresini destekler.

RESTORE BACKUPSETONLY
FROM DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY, FILE = 3, DBNAME = 'testdb2';

Q. Askıya alma durumunu ve edinilen kilitleri izle

Aşağıdaki dinamik yönetim görünümlerini (DMV' ler) kullanabilirsiniz:

  • sys.dm_server_suspend_status (askıya alma durumunu görüntüleme)
  • sys.dm_tran_locks (alınan kilitleri görüntüleyin)

R. Yedekleme kümesi ayrıntılarını listeleme

Aşağıdaki örnek betik, Transact-SQL anlık görüntü yedeklemeleri için yedekleme kümesi bilgilerini listeler.

SELECT database_name,
    type,
    backup_size,
    backup_start_date,
    backup_finish_date,
    is_snapshot
FROM msdb.dbo.backupset
WHERE is_snapshot = 1;

S. Veritabanının anlık görüntü yedekleme için askıya alındığını denetleme

Aşağıdaki örnek betik, anlık görüntü yedeklemesi için askıya alınan veritabanları için veritabanı düzeyinde özellikler oluşturur.

SELECT SERVERPROPERTY('SuspendedDatabaseCount');
SELECT SERVERPROPERTY('IsServerSuspendedForSnapshotBackup');
SELECT DATABASEPROPERTYEX('db1', 'IsDatabaseSuspendedForSnapshotBackup');

T. Örnek T-SQL sorun giderme betiği

Aşağıdaki örnek betik, sunucudaki askıya alınmış veritabanlarını algılar ve gerekirse bunları geri alır.

IF (SERVERPROPERTY('IsServerSuspendedForSnapshotBackup') = 1)
BEGIN
    --full server suspended, requires server level thaw
    PRINT 'Full server is suspended, requires server level thaw'

    ALTER SERVER CONFIGURATION
    SET SUSPEND_FOR_SNAPSHOT_BACKUP = OFF
END
ELSE
BEGIN
    IF (SERVERPROPERTY('SuspendedDatabaseCount') > 0)
    BEGIN
        DECLARE @curdb SYSNAME
        DECLARE @sql NVARCHAR(500)

        DECLARE mycursor CURSOR FAST_FORWARD
        FOR
        SELECT db_name
        FROM sys.dm_server_suspend_status;

        OPEN mycursor

        FETCH NEXT
        FROM mycursor
        INTO @curdb

        WHILE @@FETCH_STATUS = 0
        BEGIN
            PRINT 'unfreezing DB ' + @curdb

            SET @sql = 'ALTER DATABASE ' + @curdb + ' SET SUSPEND_FOR_SNAPSHOT_BACKUP = OFF'

            EXEC sp_executesql @SQL

            FETCH NEXT
            FROM mycursor
            INTO @curdb
        END

        PRINT 'All DB unfrozen'

        CLOSE mycursor;

        DEALLOCATE mycursor;
    END
    ELSE
        -- no suspended database, thus no user action needed.
        PRINT 'No database/server is suspended for snapshot backup'
END