ดำเนินการตามขั้นตอนการจัดเก็บโดยอัตโนมัติหลังจากเหตุการณ์ฐานข้อมูลเรียกคืนใด ๆ


9

เป็นไปได้หรือไม่ที่จะให้SQL Server 2008 R2 Standardดำเนินการขั้นตอนการจัดเก็บโดยอัตโนมัติในฐานข้อมูลใดก็ตามที่มีการคืนค่าหรือเชื่อมต่อกับอินสแตนซ์

ฉันเข้าใกล้โซลูชันด้วยการสร้างทริกเกอร์ระดับเซิร์ฟเวอร์ที่ดำเนินการขั้นตอนการจัดเก็บในฐานข้อมูลที่กำหนดหลังจากเหตุการณ์ DDL CREATE_DATABASEหรือALTER_DATABASEถูกเรียกใช้ น่าเสียดายที่วิธีนี้ใช้ไม่ได้กับการสำรองข้อมูล databack

ในการทำอย่างละเอียดเรามีขั้นตอนการจัดเก็บ 'ล้างข้อมูล' ที่มีอยู่ในทุกฐานข้อมูลที่เรากู้คืนและฉันกำลังมองหาวิธีที่จะดำเนินการนี้โดยอัตโนมัติเมื่อใดก็ตามที่การสำรองข้อมูลถูกเรียกคืนไปยังอินสแตนซ์

Googling ได้ชี้ให้ฉันกำหนดค่าการตรวจสอบหรือนโยบายใน SQL Server เพื่อรับฟังก์ชั่นนี้ แต่ฟีเจอร์เหล่านี้ค่อนข้างล้นหลามในตอนแรกดังนั้นฉันไม่สามารถบอกได้ว่า Audits หรือ Polices เป็นถนนที่เริ่มสืบสวน

คำตอบ:


10

ต้องดำเนินการทันทีหลังจากการกู้คืนเสร็จสิ้นหรือสามารถล่าช้าในเวลาสั้น ๆ ได้หรือไม่ หนึ่งความคิดที่ฉันมีคือการมีงานที่ทำงานทุกนาทีและตรวจสอบAudit Backup/Restore Eventในการติดตามเริ่มต้น

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

คุณสามารถจัดเก็บสะสางที่คุณได้ทำไปแล้วตาม StartTime และแม้แต่ จำกัด คิวรีสืบค้นข้อมูลที่ทำงานทุกนาที (หรืออะไรก็ตามที่เกณฑ์การหน่วงเวลาที่ยอมรับได้ของคุณ) เพื่อดูเฉพาะค่า StartTime ที่มากกว่าแถวสุดท้ายที่คุณดึงมาหรือสุดท้าย เวลางานวิ่งแล้วแต่จำนวนใดจะน้อยกว่า


1
ลื่นมากคิดดี +1
Thomas Stringer

ความล่าช้าเล็กน้อยจะเป็นที่ยอมรับได้ ฉันจะลองทำดู
Matthew Ruston

1
โปรดทราบว่าฉันไม่ได้ยืนยันว่าในทุกกรณีเหตุการณ์จะเสร็จสิ้นก่อนที่จะเขียนแถวการติดตาม ฉันสงสัยว่ามันเป็นโพสต์เหตุการณ์ที่เขียน แต่ฉันสงสัยเพียงเพราะEndTimeดูเหมือนจะไม่เคยมีประชากร อาจเป็นกรณีที่คุณควรพยายามเชื่อมต่อกับฐานข้อมูลและหากไม่สามารถข้ามได้และไม่บันทึกเหตุการณ์การกู้คืนนี้ แต่ลองอีกครั้งในครั้งถัดไปที่งานรัน ฉันพยายามและตรวจสอบความถูกต้อง แต่ใน VMs ในพื้นที่ของฉันฉันมี SSD แต่ไม่มีพื้นที่ดิสก์ในการสำรองข้อมูลใช้เวลานานพอที่จะสังเกตเห็นพฤติกรรมที่ถูกต้อง :-)
Aaron Bertrand

6

database_started เหตุการณ์ขยายถูกไล่ออกหลังจากฐานข้อมูลมีการเรียกคืน

สร้างเซสชันกิจกรรมที่รวบรวมdatabase_idฟิลด์ด้วยเพรดิเคตที่ค้นหา%RESTORE%ในsql_textฟิลด์ (หมายเหตุ: ฉันเชื่อว่านี่เพียงพอแล้วคุณจะต้องทดสอบด้วยตัวเอง)

ฉันไม่คุ้นเคยกับ Extended Events ที่จะบอกวิธีที่ดีที่สุดในการตอบกลับเหตุการณ์ มันจะดีถ้าคุณสามารถยิงขั้นตอนการจัดเก็บโดยตรง แต่ฉันก็ไม่รู้ว่าเป็นไปได้ไหม อย่างไรก็ตามคุณสามารถสำรวจความคิดเห็นบัฟเฟอร์เหตุการณ์ได้อย่างแน่นอนและนั่นเป็นวิธีที่ดีกว่าในการสแกนการติดตามเริ่มต้น - ไม่เพียง แต่สำหรับเหตุผลด้านประสิทธิภาพการทำงาน แต่หากเซิร์ฟเวอร์ไม่ว่างมากและช่วงเวลาการสำรวจนานเกินไป ด้วยวิธีการที่ขยายเหตุการณ์เหตุการณ์ที่หายไปจะไม่น่าเป็นไปได้มาก


4

ดังที่คุณเห็นได้จากรายการกิจกรรม DDL ทริกเกอร์ DDL จะไม่ชัดเจนเพียงพอสำหรับความต้องการของคุณ

ฉันขอแนะนำให้เขียนสคริปต์PowerShellเพื่อทำการกู้คืนหรือเชื่อมต่อจากนั้นดำเนินการขั้นตอนการจัดเก็บทันทีต่อไป โปรดทราบว่าร้านค้าของคุณจะต้องได้รับคำแนะนำให้ใช้สิ่งนี้แทนการเรียกคืนหรือติดทั่วไป

น่าเสียดายที่ฉันไม่เชื่อว่ามีวิธีการในการทำสิ่งนี้ในตัว


4

คุณใช้งานข้อมูลสำรองอย่างไร หากคุณเพียงแค่เรียกใช้ SP หลังจากการสำรองข้อมูลคุณสามารถตั้งค่าเป็นงานอื่นในงานหากคุณกำลังใช้งานหรือวางแผนการบำรุงรักษา

ดังนั้นคุณสามารถตั้งค่าการตรวจสอบเพื่อเขียนลงในบันทึกเหตุการณ์แล้วสร้างการแจ้งเตือนที่จะดำเนินการงาน ดูเหมือนว่าซับซ้อน แต่จะทำสิ่งที่คุณถาม

ดูรหัสต่อไปนี้:

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

งานการกู้คืนที่รวบรวมสิ่งนี้เป็นความคิดที่ดี อย่างไรก็ตามฉันสงสัยว่านี่เป็นวิธีแก้ปัญหาที่สมบูรณ์หรือไม่หาก OP ต้องการเก็บเหตุการณ์การเรียกคืน "ใด ๆ "
Nick Chammas

ความสามารถในการดำเนินการตามขั้นตอนการจัดเก็บโดยพลการหลังจากเหตุการณ์การคืนค่าใด ๆ เสร็จสมบูรณ์เป็นสิ่งที่เราเป็นจริง ข้อเสนอแนะที่ถูกต้องอย่างไรก็ตาม
Matthew Ruston

ฉันลบคำตอบที่สองและแก้ไขด้านบนเพื่อรวมข้อมูล ขอบคุณ @Shark สำหรับคำแนะนำในอันนั้น ทั้งหมดไม่ได้คิดเกี่ยวกับการทำเช่นนั้น
jgardner04

0

คุณใช้งานข้อมูลสำรองอย่างไร ด้วย Commvault คุณสามารถตั้งค่างานคืนค่าอัตโนมัติและเรียกใช้งานก่อนและหลังการเรียกคืนสคริปต์ซึ่งอาจเป็น SQL หรือ PowerShell ฉันทำเช่นนี้ตลอดเวลาเพื่อเรียกใช้ DDL สำหรับความแตกต่างของรุ่นและการสำรองข้อมูลและคืนค่าสิทธิ์เมื่อเรียกคืนระหว่างสภาพแวดล้อม

ฉันเชื่อว่า Netbackup ผลิตภัณฑ์อื่น ๆ สามารถมีฟังก์ชั่นที่คล้ายกัน

หากคุณใช้ SQL เพียงเพิ่มเป็นขั้นตอนในงานที่กู้คืนฐานข้อมูล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.