Tự động thực hiện thủ tục lưu trữ sau bất kỳ sự kiện RESTORE DATABASE


9

Có thể để SQL Server 2008 R2 Standard tự động thực hiện một thủ tục được lưu trữ trong bất kỳ cơ sở dữ liệu đã cho nào được khôi phục hoặc đính kèm vào thể hiện không?

Tôi đã tiến gần đến một giải pháp bằng cách tạo một trình kích hoạt cấp máy chủ thực thi một thủ tục được lưu trữ trong một cơ sở dữ liệu nhất định sau khi sự kiện DDL CREATE_DATABASEhoặc ALTER_DATABASEbị sa thải. Thật không may, điều này không hoạt động để khôi phục sao lưu databack.

Để giải thích, chúng tôi có một quy trình được lưu trữ 'dọn sạch' tồn tại trong mọi cơ sở dữ liệu mà chúng tôi khôi phục và tôi đang tìm cách để điều này được thực thi tự động mỗi khi sao lưu được khôi phục vào thể hiện.

Googling đã chỉ cho tôi cách định cấu hình Kiểm toán hoặc Chính sách trong SQL Server để có được chức năng này, nhưng những tính năng này thoạt nhìn khá áp đảo, vì vậy tôi không thể biết Kiểm toán hay Chính sách có phải là con đường để bắt đầu điều tra hay không.

Câu trả lời:


10

Liệu nó có phải thực thi ngay sau khi quá trình khôi phục kết thúc hay có thể bị trì hoãn trong thời gian ngắn không? Một ý tưởng tôi có là có một công việc chạy mỗi phút và kiểm tra Audit Backup/Restore Eventtheo dõi mặc định.

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

Bạn có thể lưu trữ các hoạt động dọn dẹp mà bạn đã thực hiện dựa trên StartTime và thậm chí giới hạn truy vấn theo dõi chạy mỗi phút (hoặc bất kể ngưỡng trì hoãn chấp nhận được của bạn là gì) chỉ nhìn vào các giá trị StartTime lớn hơn hàng cuối cùng bạn đã kéo hoặc cuối cùng thời gian công việc chạy, cái nào ít


1
Rất lắt léo, suy nghĩ tốt. +1
Thomas Stringer

Một chút chậm trễ sẽ được chấp nhận. Tôi sẽ thử nó.
Matthew Ruston

1
Lưu ý rằng tôi đã không xác nhận rằng trong mọi trường hợp, sự kiện thực sự đã kết thúc trước khi hàng dấu vết được viết. Tôi nghi ngờ rằng đó là một bài viết sau sự kiện nhưng tôi chỉ nghi ngờ vì EndTimedường như không bao giờ được đưa vào. Đây có thể là trường hợp bạn nên thử kết nối với cơ sở dữ liệu và, nếu bạn không thể, hãy bỏ qua nó và không ghi lại sự kiện khôi phục này, nhưng hãy thử lại vào lần tiếp theo khi công việc chạy. Tôi đã thử và xác thực nhưng trên các máy ảo cục bộ của tôi, tôi chỉ có SSD nhưng chúng không có dung lượng đĩa để tạo bản sao lưu đủ lâu để quan sát chính xác hành vi. :-)
Aaron Bertrand

6

Các database_started tổ chức sự kiện Extended là bắn sau một cơ sở dữ liệu được phục hồi.

Tạo một phiên sự kiện ghi lại database_idtrường với một vị từ tìm %RESTORE%trong sql_texttrường (lưu ý: Tôi tin rằng điều này là đủ - bạn sẽ muốn tự kiểm tra).

Tôi không đủ quen thuộc với Sự kiện mở rộng để cho bạn biết cách tốt nhất để phản hồi sự kiện. Sẽ thật tuyệt nếu bạn có thể thực hiện một thủ tục được lưu trữ trực tiếp; Tôi không biết nếu điều đó có thể, mặc dù. Tuy nhiên, bạn chắc chắn có thể thăm dò bộ đệm sự kiện và tốt nhất là quét theo dõi mặc định - không chỉ vì lý do hiệu suất, mà nếu máy chủ rất bận và khoảng thời gian bỏ phiếu quá dài, bạn có thể kết thúc thiếu các sự kiện. Với phương pháp Sự kiện mở rộng, việc bỏ lỡ một sự kiện sẽ rất khó xảy ra.


4

Như bạn có thể thấy trong danh sách các sự kiện DDL , trình kích hoạt DDL không thể đủ rõ ràng cho yêu cầu của bạn.

Tôi khuyên bạn nên viết tập lệnh PowerShell để thực hiện khôi phục hoặc đính kèm và sau đó thực hiện quy trình được lưu trữ ngay sau đây. Nhắc bạn, cửa hàng của bạn sẽ phải được hướng dẫn sử dụng cái này thay vì khôi phục hoặc đính kèm thông thường.

Thật không may, tôi không tin rằng có một cách tích hợp để thực hiện điều này.


4

Làm thế nào bạn đang chạy bản sao lưu của bạn? Nếu bạn chỉ muốn chạy SP sau khi sao lưu, bạn có thể thiết lập nó như một nhiệm vụ khác trong công việc, nếu bạn đang sử dụng chúng hoặc gói bảo trì.

Vì vậy, bạn có thể thiết lập Kiểm toán để ghi vào nhật ký sự kiện và sau đó tạo một cảnh báo sẽ thực thi công việc. Nó có vẻ phức tạp nhưng nó sẽ làm những gì bạn đang yêu cầu.

Hãy xem đoạn mã sau:

--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

Một công việc khôi phục nắm bắt điều này là một ý tưởng tốt. Tuy nhiên, tôi tự hỏi liệu đó có phải là một giải pháp hoàn chỉnh do OP muốn nắm bắt "bất kỳ" sự kiện khôi phục nào.
Nick Chammas

Có thể thực hiện một thủ tục được lưu trữ tùy ý sau khi bất kỳ sự kiện khôi phục nào hoàn thành thực sự là những gì chúng ta đang theo đuổi. Một đề nghị hợp lệ dù sao.
Matthew Ruston

Tôi đã xóa câu trả lời thứ hai của mình và chỉnh sửa phần trên để đưa thông tin vào. Cảm ơn @Shark cho lời khuyên về điều đó. Hoàn toàn không nghĩ về việc đó.
jgardner04

0

Làm thế nào bạn đang chạy bản sao lưu của bạn? Với Commvault, bạn có thể thiết lập một công việc khôi phục tự động và để nó chạy các kịch bản khôi phục trước và sau có thể là SQL hoặc powershell. Tôi làm điều này mọi lúc để chạy DDL vì sự khác biệt của phiên bản và để sao lưu và khôi phục quyền khi khôi phục giữa các môi trường.

Tôi tin rằng Netbackup có thể các sản phẩm khác có chức năng tương tự

Nếu bạn sử dụng SQL, chỉ cần thêm nó như một bước vào công việc khôi phục cơ sở dữ liệu

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.