Mencadangkan banyak basis data ke titik waktu yang sama

10

Biasanya ketika kita memulai cadangan kita tidak mengizinkan perubahan untuk melakukan atau database tidak akan dapat diakses. Maksud saya database akan berada dalam mode pengguna tunggal tetapi saya ingin memulai cadangan dan melepaskan db untuk digunakan. Juga, begitu saya memulai cadangan saya tidak ingin perubahan yang sedang berlangsung ditulis ke file cadangan. Saya ingin tahu bagaimana saya bisa mencapai ini di Microsoft SQL Server 2012. Tolong bantu saya.

Baiklah, izinkan saya menjelaskan masalah saya dulu. Saat ini saya sedang mengatur basis data ke mode satu pengguna sampai cadangan selesai. Mode ini akan membantu saya menghindari perubahan data saat cadangan sedang berlangsung. Tetapi aplikasi saya terikat dengan banyak basis data (setiap basis data saling terkait satu sama lain dan ada var dbs yang terus membuat setiap bulan). Jadi membuat cadangan semua database ini telah menjadi proses yang membosankan dan yang lebih penting saya harus menjaga pengguna keluar dari sistem ketika cadangan sedang berlangsung.

Jadi saya mencari mekanisme cadangan yang akan memenuhi persyaratan yang disebutkan di bawah ini.

  1. Mulai pencadangan semua dbs sekaligus dan lepaskan db untuk digunakan.
  2. Karena basis data saling terkait satu sama lain, saya ingin memiliki konsistensi data yang dipelihara dalam file cadangan. Jadi karena persyaratan konsistensi data ini saya tidak ingin ada perubahan yang dilakukan untuk file cadangan saya.

Yang saya inginkan adalah - cadangan semua dbs pada waktu tertentu.

Praveen
sumber
2
Anda tidak perlu mengatur basis data ke mode satu pengguna ketika Anda mengambil cadangan. SQL Server tidak akan pernah memasukkan transaksi yang tidak dikomit dalam cadangan Anda. Untuk jawaban yang lebih lengkap, silakan edit posting Anda untuk memasukkan perincian model pemulihan Anda, apakah yang Anda maksud cadangan transaksi log, cadangan penuh atau tambahan, serta masalah apa yang Anda alami. Seperti berdiri pertanyaan Anda agak tidak jelas.
Daniel Hutmacher
1
Apa yang ingin Anda capai dengan cadangan ini? Pemulihan penuh ke titik ini - atau sesuatu yang lain? Dengan kata lain ... Jika Anda harus memulihkan dari cadangan ini, apa yang harus dipulihkan --- ada perubahan DDL? Perubahan data, atau apa?
sevenyeightist
Apa yang Anda inginkan tidak mungkin di SQL 2012. Kembali ke SQL 7.0 hari, set cadangan database digunakan untuk membuat kembali database seperti pada saat pernyataan BACKUP dimulai. Mulai dari SQL 2000 dan selanjutnya, satu set cadangan database digunakan untuk membuat kembali database seperti pada saat pernyataan BACKUP selesai.
stacylaray
@DanielHutmacher Saya mencari cadangan lengkap.
Praveen

Jawaban:

13

Saya berasumsi bahwa tugas Anda adalah membuat satu set cadangan tempat Anda dapat mengembalikan semuanya ke satu titik statis (tanpa transaksi terbuka) (semuanya tersinkron). Mirip dengan apa yang akan dilakukan titik tenang untuk Anda di DB2. Sayangnya tidak ada dalam SQL Server yang melakukan hal itu. Namun, dengan asumsi database Anda dalam mode pemulihan LENGKAP, Anda dapat melakukan hal serupa.

Anda dapat membuat satu MARKEDtransaksi di semua basis data sekaligus . Kemudian Anda mengambil cadangan log transaksi dari setiap basis data. Dengan asumsi Anda mengikuti backup log Anda (yang seharusnya Anda lakukan) backup log tidak butuh waktu lama. Dan tidak perlu menghentikan siapa pun dari sistem (kecuali mungkin cukup lama bagi Anda untuk membuat transaksi yang ditandai).

Pada titik ini jika Anda perlu melakukan restore maka Anda melakukan RESTORE STOPBEFOREMARKpada setiap database Anda. Ini akan mengembalikan semua database ke titik yang sama (berdasarkan transaksi Anda). Catatan: Ada juga STOPATMARK jika Anda ingin memasukkan transaksi itu.

Jika Anda ingin contoh, saya punya satu di tautan di atas bersama dengan sedikit bacaan tambahan.

Saya menyadari ini tidak menjawab pertanyaan Anda, tetapi semoga bisa menyelesaikan masalah Anda.

Kenneth Fisher
sumber
2
Ini adalah bagaimana BizTalk mengelola backup point-in-time dari beberapa database. Jika ini berfungsi untuk Microsoft BizTalk, ini adalah fitur yang sudah teruji.
Max Vernon
Kami menggunakannya untuk database TFS dalam logshipping yang kami ubah menjadi alwaysOn.
Kin Shah
1
Satu detail (tersirat tetapi tidak terungkap) untuk mengarahkan rumah jawaban Ken: Anda tidak dapat memiliki cadangan LENGKAP yang konsisten di banyak DB. Yang paling dekat Anda dapat datang untuk mengambil putaran cadangan penuh, segera diikuti oleh transaksi yang ditandai, kemudian putaran cadangan log. Pencadangan log putaran pertama itu akan "meningkatkan" konsistensi ke titik waktu.
AMtwo
@ AMtwo secara teknis Anda bisa menggunakan metode OPs. Kunci semua orang keluar dari sistem, pastikan tidak ada koneksi aktif (mungkin tandai database sebagai hanya baca / dibatasi), lalu ambil cadangan penuh dari setiap database. Namun seperti yang dikatakan OP itu bukan metode terbaik di dunia.
Kenneth Fisher
7

Pertanyaan Anda serupa dengan yang saya jawab - Mencadangkan & memulihkan 10-20 database SQL Server ke kondisi ~ sinkron?

Dengan asumsi model pemulihan basis data Anda LENGKAP, Anda harus mengambil cadangan Penuh dan kemudian menggunakan Transaksi yang Ditandai .

Mari sanggah mitos Anda ...

Mulai pencadangan semua dbs sekaligus dan lepaskan db untuk digunakan.

Dari mitos cadangan (Sangat disarankan agar Anda membaca semua Mitos cadangan) :

Operasi pencadangan tidak mengambil kunci pada objek pengguna. Cadangan memang menyebabkan beban baca yang sangat berat pada subsistem I / O sehingga mungkin tampak seperti beban kerja sedang diblokir, tetapi sebenarnya tidak. Itu hanya diperlambat. Ada kasus khusus di mana cadangan yang harus mengambil luasan yang dicatat secara massal akan mengambil kunci file yang dapat memblokir operasi pos pemeriksaan - tetapi DML tidak pernah diblokir.

Karena basis data saling terkait satu sama lain, saya ingin memiliki konsistensi data yang dipelihara dalam file cadangan. Jadi karena persyaratan konsistensi data ini saya tidak ingin ada perubahan yang dilakukan untuk file cadangan saya.

Transaksi bertanda akan membantu Anda mengambil cadangan LOG yang konsisten dan Anda akan dapat mengembalikannya menggunakan RESTORE ... WITH STOPBEFOREMARK = '<mark_name>'

Ingatlah bahwa transaksi yang ditandai untuk semua database pada instance juga dicatat dalam dbo.logmarkhistorytabel dalam MSDBdatabase.

Kin Shah
sumber
-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

untuk lebih jelasnya: https://blogs.technet.microsoft.com/letsdothis/2013/11/06/backup-multiple-sql-databases-in-a-single-swoop/

thambu
sumber
Ini tidak menjamin cadangan titik waktu yang sama. Ini hanyalah urutan cadangan berurutan.
vonPryz