Jalankan Prosedur Tersimpan Secara Otomatis Setelah Acara DATABASE RESTORE

9

Apakah mungkin untuk memiliki SQL Server 2008 R2 Standard secara otomatis menjalankan prosedur tersimpan dalam database yang diberikan yang dikembalikan atau dilampirkan ke instance?

Saya sudah dekat dengan solusi dengan membuat pemicu tingkat server yang mengeksekusi prosedur yang tersimpan dalam database yang diberikan setelah acara DDL CREATE_DATABASEatau ALTER_DATABASEdipecat. Sayangnya, ini tidak berfungsi untuk pemulihan cadangan databack.

Untuk menguraikan, kami memiliki prosedur tersimpan 'bersih' yang ada di setiap basis data yang kami pulihkan dan saya sedang mencari cara agar ini dijalankan secara otomatis setiap kali cadangan dikembalikan ke instance.

Googling telah menunjuk saya untuk mengonfigurasi Audit atau Kebijakan di SQL Server untuk mendapatkan fungsionalitas ini, tetapi fitur ini cukup luar biasa pada pandangan pertama, jadi saya tidak tahu apakah Audit atau Kebijakan adalah jalan untuk memulai investigasi.

Matthew Ruston
sumber

Jawaban:

10

Apakah harus dijalankan segera setelah pemulihan selesai, atau dapatkah ditunda sebentar? Satu ide yang saya miliki adalah memiliki pekerjaan yang berjalan setiap menit, dan memeriksa Audit Backup/Restore Eventjejak bawaannya.

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

Anda bisa menyimpan pembersihan yang telah Anda lakukan berdasarkan pada StartTime, dan bahkan membatasi kueri jejak yang berjalan setiap menit (atau apa pun ambang keterlambatan yang dapat diterima) adalah hanya melihat nilai StartTime lebih besar dari baris terakhir yang Anda tarik, atau yang terakhir waktu pekerjaan berjalan, mana yang lebih sedikit.

Aaron Bertrand
sumber
1
Sangat licin, pemikiran yang bagus. +1
Thomas Stringer
Sedikit keterlambatan bisa diterima. Saya akan mencoba ini.
Matthew Ruston
1
Perhatikan bahwa saya belum mengonfirmasi bahwa dalam semua kasus acara tersebut benar-benar selesai sebelum baris jejak ditulis. Saya menduga itu adalah post-event write tetapi saya curiga hanya karena EndTimesepertinya tidak pernah dihuni. Mungkin Anda harus mencoba menyambung ke database dan, jika tidak bisa, lewati dan jangan dokumentasikan acara pemulihan ini, tetapi coba lagi saat nanti pekerjaan berjalan. Saya akan mencoba dan memvalidasi tetapi pada VM lokal saya, saya hanya memiliki SSD tetapi mereka tidak memiliki ruang disk untuk membuat cadangan yang cukup lama untuk mengamati perilaku secara akurat. :-)
Aaron Bertrand
6

The database_started Diperpanjang Acara dipecat setelah database dipulihkan.

Buat sesi acara yang menangkap database_idbidang dengan predikat yang terlihat %RESTORE%di sql_textbidang (catatan: Saya yakin ini cukup - Anda akan ingin menguji sendiri).

Saya tidak cukup terbiasa dengan Acara yang Diperpanjang untuk memberi tahu Anda cara terbaik untuk merespons acara tersebut. Alangkah baiknya jika Anda bisa menjalankan prosedur yang tersimpan secara langsung; Saya tidak tahu apakah itu mungkin. Namun, Anda tentu dapat mensurvei buffer acara, dan itu lebih baik daripada memindai jejak default - tidak hanya karena alasan kinerja, tetapi jika server sangat sibuk dan interval pemungutan suara terlalu lama, Anda bisa berakhir dengan peristiwa yang hilang secara langsung. Dengan metode Extended Events, melewatkan acara akan sangat tidak mungkin.

Jon Seigel
sumber
4

Seperti yang Anda lihat dari daftar peristiwa DDL , pemicu DDL tidak bisa cukup eksplisit untuk kebutuhan Anda.

Saya akan merekomendasikan menulis skrip PowerShell untuk melakukan restore atau melampirkan dan kemudian jalankan prosedur tersimpan segera berikut. Pikiran Anda, toko Anda harus diinstruksikan untuk menggunakan ini daripada mengembalikan atau melampirkan khas.

Sayangnya saya tidak percaya ada cara bawaan untuk melakukannya.

Thomas Stringer
sumber
4

Bagaimana Anda menjalankan cadangan Anda? Jika Anda hanya ingin menjalankan SP setelah cadangan, Anda dapat mengaturnya sebagai tugas lain dalam pekerjaan, jika Anda menggunakannya, atau rencana pemeliharaan.

Jadi, Anda dapat mengatur Audit untuk menulis ke log peristiwa dan kemudian membuat lansiran yang akan melaksanakan pekerjaan. Tampaknya berbelit-belit tetapi akan melakukan apa yang Anda minta.

Lihatlah kode berikut:

--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
jgardner04
sumber
Pekerjaan pemulihan yang menangkap ini adalah ide yang bagus. Namun, saya bertanya-tanya apakah itu solusi lengkap mengingat OP ingin menangkap "setiap" acara pemulihan.
Nick Chammas
Mampu menjalankan prosedur tersimpan sewenang-wenang setelah semua peristiwa pemulihan selesai adalah benar-benar yang kita cari. Meskipun demikian, saran yang valid.
Matthew Ruston
Saya menghapus jawaban kedua saya dan mengedit di atas untuk memasukkan informasi. Terima kasih @ Hiark untuk tip yang satu itu. Sama sekali tidak berpikir untuk melakukan itu.
jgardner04
0

Bagaimana Anda menjalankan cadangan Anda? Dengan Commvault Anda dapat mengatur pekerjaan pemulihan otomatis dan menjalankannya sebelum dan pasca skrip pemulihan yang bisa berupa SQL atau PowerShell. Saya melakukan ini sepanjang waktu untuk menjalankan DDL untuk perbedaan versi dan untuk membackup dan mengembalikan izin ketika memulihkan antar lingkungan.

Saya percaya Netbackup dapat produk lain memiliki fungsi serupa

Jika Anda menggunakan SQL, tambahkan saja sebagai langkah ke pekerjaan yang mengembalikan database

Alen
sumber