Birden çok veritabanını aynı anda yedekleme


10

Genellikle yedeklemeyi başlattığımızda değişikliklerin yapılmasına izin vermiyoruz veya veritabanı erişilebilir olmayacak. Veritabanı tek kullanıcı modunda olacak ama yedek başlatmak ve kullanım için db serbest bırakmak istiyorum demek. Ayrıca, yedeklemeyi başlattığımda, devam eden değişikliklerin yedekleme dosyasına yazılmasını istemiyorum. Microsoft SQL Server 2012'de bunu nasıl başarabileceğimi bilmek istiyorum.

Önce sorunumu açıklayayım. Şu anda yedekleme tamamlanana kadar tek kullanıcı moduna veritabanı ayarlıyorum. Bu mod, yedekleme devam ederken veri değişikliklerinden kaçınmak amacına hizmet edecektir. Ama benim uygulama birden çok veritabanı ile bağlı (her veritabanları birbirine bağlı ve aylık bazda oluşturmaya devam var var dbs vardır). Bu nedenle, tüm bu veritabanlarını yedeklemek sıkıcı bir süreç haline geldi ve daha da önemlisi, yedekleme devam ederken kullanıcıları sistemden uzak tutmak zorundayım.

Bu yüzden aşağıda belirtilen gereksinimleri karşılayacak yedekleme mekanizması arıyorum.

  1. Bir seferde tüm dbs yedeklemesini başlatın ve db'yi kullanım için serbest bırakın.
  2. Veritabanları birbirine bağlı olduğundan yedekleme dosyalarında veri tutarlılığı sağlamak istiyorum. Bu nedenle, bu veri tutarlılığı gereksinimi nedeniyle değişikliklerin yedekleme dosyamda yapılmasını istemiyorum.

Tek istediğim - belirli bir zamanda tüm dbs yedekleme.


2
Yedekleme yaparken veritabanınızı tek kullanıcılı moda ayarlamanız gerekmez. SQL Server, yedeklemenize hiçbir zaman taahhüt edilmemiş işlemleri dahil etmez. Daha eksiksiz bir yanıt için, lütfen işlem günlüğü yedeklemeleri, tam veya artımlı yedeklemeler ve ne tür bir sorun yaşadığınızı ifade etmek için kurtarma modelinizin ayrıntılarını içerecek şekilde yayınınızı düzenleyin. Durduğu gibi sorunuz biraz belirsiz.
Daniel Hutmacher

1
Bu yedeklemeyle neyi başarmak istiyorsunuz? Bu noktaya tam kurtarılabilirlik mi yoksa başka bir şey mi? Başka bir deyişle ... Bu yedeklemeden geri yüklemeniz gerekiyorsa, nelerin geri yüklenmesi gerekir - DDL değişiklikleri nelerdir? Verideki değişiklikler ya da ne?
seventyeightist

SQL 7.0'da istediğiniz şey mümkün değildir. SQL 7.0 günlerinde, veritabanı yedekleme kümesi, BACKUP deyiminin başladığı zamanki gibi veritabanını yeniden oluşturmak için kullanıldı. SQL 2000 ve sonrasında, BACKUP deyimi tamamlandığında olduğu gibi veritabanını yeniden oluşturmak için bir veritabanı yedekleme kümesi kullanılır.
stacylaray

@DanielHutmacher Tam yedek arıyorum.
Praveen

Yanıtlar:


13

Ben senin görevin hepsini tek bir statik (açık işlem yok) noktasına (hepsi senkronize) geri yükleyebilirsiniz yedek bir dizi oluşturmak olduğunu varsayıyorum. DB2'de bir quiesce noktasının sizin için ne yapacağına benzer. Ne yazık ki SQL Server'da tam olarak bunu yapan bir şey yok. Ancak, veritabanlarınızın TAM kurtarma modunda olduğunu varsayarsak, benzer bir şey yapabilirsiniz.

Tüm veritabanlarında aynı anda tek bir MARKEDişlem oluşturabilirsiniz . Daha sonra her veritabanının işlem günlüğü yedeğini alırsınız. Günlük yedeklemelerinizi sürdürdüğünüzü varsayarsak (yine de olması gerekir) günlük yedeklemeleriniz çok uzun sürmez. Ve kimsenin sistemde olmasını engellemeye gerek yoktur (işaretli işleminizi oluşturmanız için yeterince uzun hariç).

Bu noktada bir geri yükleme yapmanız gerekiyorsa RESTORE STOPBEFOREMARK, veritabanlarınızın her birinde bir tane yaparsınız . Bu, tüm veritabanlarını aynı noktaya (işleminize bağlı olarak) geri yükler. Not: Bu işlemi dahil etmek istiyorsanız bir STOPATMARK da vardır.

Bir örnek istiyorsanız, yukarıdaki bağlantıda biraz ek okuma ile birlikte bir tane var.

Bunun sorunuza tam olarak cevap vermediğini, ancak umarım sorununuzu çözdüğünün farkındayım.


2
BizTalk, birden çok veritabanının zaman içinde yedeklemelerini bu şekilde yönetir. Microsoft BizTalk için çalışıyorsa, hemen hemen iyi test edilmiş bir özelliktir.
Max Vernon

Biz her zaman Açık olarak değiştirdi logshipping TFS veritabanları için kullanın.
Kin Shah

1
Ken'in cevabını eve götürmek için bir (ima edilen ama söylenmeyen) detay: Birden fazla DB'de tutarlı bir FULL yedeklemeniz olamaz. Size en yakın tam bir yedekleme turu, hemen ardından işaretli bir işlem, daha sonra bir dizi günlük yedekleme almaktır. Bu günlük yedeklemelerinin ilk turu tutarlılığı zaman içindeki noktaya "doğrular".
İki

@ AMtwo teknik olarak OPs yöntemini kullanarak yapabilirsiniz. Herkesi sistemden kilitleyin, etkin bağlantı olmadığından emin olun (veritabanlarını salt okunur / kısıtlanmış olarak işaretleyin), ardından her veritabanının tam yedeklerini alın. Ancak OP'nin belirttiği gibi, bu dünyadaki en iyi yöntem değildir.
Kenneth Fisher

7

Sorunuz cevap verdiğime benziyor - 10-20 SQL Server veritabanını yedekleme ve senkronize bir duruma geri yükleme?

Veritabanı kurtarma modelinizin DOLU olduğunu varsayarsak, Tam yedek almalı ve ardından İşaretli İşlemler kullanmalısınız .

Efsanelerinizi çözelim ...

Bir seferde tüm dbs yedeklemesini başlatın ve db'yi kullanım için serbest bırakın.

Gönderen yedekleme mitlere (Highly tüm yedekleme Mitleri okumanızı tavsiye) :

Yedekleme işlemleri kullanıcı nesnelerini kilitlemez. Yedeklemeler, G / Ç alt sisteminde gerçekten ağır bir okuma yüküne neden olur, bu nedenle iş yükü engellenmiş gibi görünebilir , ancak gerçekte değildir. Sadece yavaşlıyor. Toplu olarak kaydedilen uzantıları almak zorunda olan bir yedeklemenin, bir denetim noktası işlemini engelleyebilecek bir dosya kilidi alacağı özel bir durum vardır - ancak DML hiçbir zaman engellenmez.

Veritabanları birbirine bağlı olduğundan yedekleme dosyalarında veri tutarlılığı sağlamak istiyorum. Bu nedenle, bu veri tutarlılığı gereksinimi nedeniyle değişikliklerin yedekleme dosyamda yapılmasını istemiyorum.

işaretli İşlemler tutarlı LOG yedeklemesi almanıza yardımcı olacak ve bunları kullanarak geri yükleyebilirsiniz.RESTORE ... WITH STOPBEFOREMARK = '<mark_name>'

Örnek üzerindeki tüm veritabanları için işaretli işlemlerin de veritabanındaki dbo.logmarkhistorytabloya kaydedildiğini unutmayın MSDB.


-1
--]---- Begin Code ----[
--–declaring variables
DECLARE @dbname VARCHAR(100) -- database name
DECLARE @bupath VARCHAR(100) -- path for backup location
DECLARE @filename VARCHAR(100) -- filename used for backup files
DECLARE @datestamp VARCHAR(25) -- date used for backup file timestamp
-- specify database backup directory
SET @bupath = 'D:\DB Bkp\'
-- file date formatting
SELECT @datestamp = CONVERT(VARCHAR(20),GETDATE(),112) + REPLACE
(CONVERT(VARCHAR(20),GETDATE(),108),':','')
--specify databases to backup
DECLARE db_cursor CURSOR for
SELECT name
FROM master.dbo.sysdatabases
WHERE name not IN ('tempdb') -- excludes these databases, if excluding multiple databases, seprate them by a comma
--backup process
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @dbname
WHILE @@FETCH_STATUS = 0
BEGIN
   SET @filename = @bupath + @dbname + '_' + @datestamp + '.bak'
   BACKUP DATABASE @dbname TO DISK = @filename WITH INIT,
   CHECKSUM; --init overwrites existing files with the same name, and checksum verifies the backup
       FETCH NEXT from db_cursor INTO @dbname
END
CLOSE db_cursor
DEALLOCATE db_cursor

daha fazla ayrıntı için: https://blogs.technet.microsoft.com/letsdothis/2013/11/06/backup-multiple-sql-databases-in-a-single-swoop/


Bu , aynı zaman noktası yedeklemelerini garanti etmez . Sadece ardışık yedeklemeler dizisi.
vonPryz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.