Saklanan yordamı herhangi bir RESTORE DATABASE olayından sonra otomatik olarak yürüt


9

O mümkün mü SQL Server 2008 R2 Standard otomatik olan herhangi bir veritabanında saklı bir yordamı çalıştırmak restore veya attachced örneğine?

Ben DDL olaydan sonra belirli bir veritabanında saklı yordam çalıştırılır sunucu düzeyi tetikleyici oluşturarak yakın çözüm lazım CREATE_DATABASEveya ALTER_DATABASEateşlenir. Ne yazık ki, bu databack yedekleme geri yüklemeleri için çalışmaz.

Ayrıntılı olarak, geri yüklediğimiz her veritabanında var olan bir 'temizleme' saklı yordam var ve ben bir örnek her geri yüklendiğinde bu otomatik olarak yürütülmesi için bir yol arıyorum.

Google, bu işlevselliği elde etmek için SQL Server'da Denetimler veya Politikalar yapılandırmamı işaret etti , ancak bu özellikler ilk bakışta oldukça ezici, bu yüzden Denetimlerin veya Politikaların araştırmaya başlamak için bir yol olup olmadığını söyleyemem.

Yanıtlar:


10

Geri yükleme işlemi bittikten hemen sonra yürütülmeli mi yoksa kısa bir süre için gecikebilir mi? Sahip olduğum bir fikir, her dakika çalışan Audit Backup/Restore Eventve varsayılan izinde kontrol eden bir işe sahip olmaktır .

DECLARE @fn VARCHAR(MAX);

SELECT @fn = SUBSTRING([path], 0, LEN([path])-CHARINDEX(CHAR(92), REVERSE([path]))+1) 
  + CHAR(92) + 'Log.trc'  
FROM sys.traces   
WHERE is_default = 1;  

SELECT 
    DatabaseName,
    StartTime, 
    TextData
FROM sys.fn_trace_gettable(@fn, DEFAULT)  
WHERE EventClass = 115
AND TextData LIKE '%RESTORE%'; -- since can't differentiate between backup/restore

Zaten yaptığınız temizleme işlemlerini StartTime'a göre depolayabilir ve hatta her dakika (veya kabul edilebilir gecikme eşiğiniz ne olursa olsun) çalışan izleme sorgusunu yalnızca son çektiğiniz satırdan veya son satırdan daha büyük StartTime değerlerine bakmak için sınırlayabilirsiniz. işin bittiğinde, hangisi daha azsa.


1
Çok kaygan, iyi düşünüyor. +1
Thomas Stringer

Hafif bir gecikme kabul edilebilir. Bunu deneyeceğim.
Matthew Ruston

1
Her durumda olayın izleme satırı yazılmadan önce tamamlandığını onaylamadığımı unutmayın. Olay sonrası bir yazma olduğundan şüpheleniyorum ama sadece EndTimehiç doldurulmamış gibi göründüğünden şüpheliyim . Veritabanına bağlanmaya çalışmanız gerekebilir ve eğer yapamıyorsanız, atlayın ve bu geri yükleme olayını belgelemeyin, ancak iş bir sonraki çalıştırıldığında tekrar deneyin. Ben denemek ve doğrulamak istiyorum ama yerel VM'lerimde sadece SSD'ler var ama bir yedekleme yapmak için disk alanı yok doğru davranışı doğru gözlemlemek için yeterince uzun sürebilir. :-)
Aaron Bertrand

6

database_started Genişletilmiş Olay bir veritabanı geri yüklendikten sonra ateşlenir.

Yakalar bir olay oturumu oluşturma database_idbir yüklemi alan için görünümün onun %RESTORE%içinde sql_text(: - Kendiniz için teste isteyeceksiniz bu yeterli olduğuna inanıyoruz notu) alanında.

Size, etkinliğe nasıl yanıt vereceğinizi en iyi şekilde anlatacak Genişletilmiş Etkinliklere aşina değilim. Depolanmış bir prosedürü doğrudan ateşleyebilmeniz iyi olurdu; Yine de bunun mümkün olup olmadığını bilmiyorum. Ancak olay arabelleğini kesinlikle yoklayabilirsiniz ve bu, varsayılan izlemeyi taramak için tercih edilir - yalnızca performans nedeniyle değil, sunucu çok meşgulse ve yoklama aralığı çok uzunsa, eksik olayları açıkça sonuçlandırabilirsiniz. Genişletilmiş Olaylar yöntemiyle, bir etkinliği kaçırmak pek olası değildir.


4

DDL olayları listesinde görebileceğiniz gibi , bir DDL tetikleyicisi gereksiniminiz için yeterince açık olamaz.

Geri yükleme veya ekleme yapmak için bir PowerShell betiği yazmanızı ve hemen ardından depolanan yordamı yürütmenizi öneririm . Dikkat edin, dükkanınıza bunu tipik bir geri yükleme veya ekleme yerine kullanma talimatı verilecektir.

Maalesef bunu başarmak için yerleşik bir yol olduğuna inanmıyorum.


4

Yedeklerinizi nasıl çalıştırıyorsunuz? Yedeklemenizden sonra SP'yi çalıştırmak istiyorsanız, bunları işte başka bir görev olarak veya bunları kullanıyorsanız, bakım planını ayarlayabilirsiniz.

Böylece Denetim'i olay günlüğüne yazacak ve daha sonra bir işi yürütecek bir uyarı oluşturacak şekilde ayarlayabilirsiniz. Kıvrık görünüyor ama istediğini yapacak.

Aşağıdaki koda bir göz atın:

--Create the Server Audit
USE master
GO
CREATE SERVER AUDIT BackupTrap
TO APPLICATION_LOG
WITH (QUEUE_DELAY = 0, ON_FAILURE = CONTINUE)
GO

--Turn the Audit On
ALTER SERVER AUDIT BackupTrap
WITH (STATE = ON)
GO

--Create the Database Audit Specification
USE AdventureWorks2012
GO
CREATE DATABASE AUDIT SPECIFICATION BackupTrapAdventureWorks
FOR SERVER AUDIT BackupTrap
    ADD (BACKUP_RESTORE_GROUP)
WITH (STATE = ON)
GO

--Create the job to run
USE msdb
GO
EXECUTE dbo.sp_add_job
    @job_name = N'BackupAlertJob'
GO

EXECUTE dbo.sp_add_jobserver
    @job_name = N'BackupAlertJob'
GO

EXECUTE dbo.sp_add_jobstep
    @job_name = N'BackupAlertJob',
    @step_name = N'RunSP',
    @subsystem = N'TSQL',
    @command = N'EXECUTE dbo.MyStoredProcedure',
    @database_name = N'AdventureWorks2012'
GO

Bunu yakalayan bir geri yükleme işi iyi bir fikirdir. Ancak, OP "herhangi bir" geri yükleme olayı yakalamak istiyor göz önüne alındığında bunun tam bir çözüm olup olmadığını merak ediyorum.
Nick Chammas

Herhangi bir geri yükleme olayı tamamlandıktan sonra rastgele bir saklı yordam yürütebilmek gerçekten peşinde olduğumuz şeydir. Yine de geçerli bir öneri.
Matthew Ruston

İkinci cevabımı kaldırdım ve bilgileri eklemek için yukarıdakileri düzenledim. Bu konuda bahşiş için @Shark'a teşekkürler. Tamamen bunu yapmayı düşünmemiştim.
jgardner04

0

Yedeklerinizi nasıl çalıştırıyorsunuz? Commvault ile otomatik bir geri yükleme işi ayarlayabilir ve SQL veya powershell olabilecek geri yükleme öncesi ve sonrası komut dosyalarını çalıştırmasını sağlayabilirsiniz. Bunu her zaman sürüm farklılıkları için DDL çalıştırmak ve ortamlar arasında geri yükleme yaparken izinleri yedeklemek ve geri yüklemek için yapıyorum.

Netbackup'un diğer ürünlerin benzer işlevlere sahip olabileceğine inanıyorum

SQL kullanıyorsanız, veritabanını geri yükleyen işe bir adım olarak eklemeniz yeterlidir

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.