To πρώτο πράγμα που θα πρέπει να κάνεις, είναι να φτιάξεις τα dump devices. Αυτή είναι μια διαδικασία που θα την κάνεις μία μόνο φορά και ως εκ τούτου δεν χρειάζεται να ορίσεις κάποιο job.
Τα dump devices είναι αρχεία που ο SQL Server τα βλέπει ως λογικές συσκευές. Ένα dump device μπορεί να περιέχει μέσα του πολλαπλά backup και είναι καθαρά δικό σου θέμα το πώς θα οργανώσεις τα περιεχόμενα τους. Συνήθως, κάνουμε backup σε dump device και κατόπιν χρησιμοποιούμε το backup utility για να παίρνουμε backup του dump device σε tape ή σε άλλον δίσκο.
Για να φτιάξουμε τα dump devices τρέχουμε την stored procedure sp_addumpdevice.
USE master
GO
EXEC sp_addumpdevice 'disk', 'MyDatabaseDataDevice',
'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\BACKUP\MyDatabaseData.bak'
GO
EXEC sp_addumpdevice 'disk', 'MyDatabaseDataDiffDevice',
'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\BACKUP\MyDatabaseDataDiff.bak'
GO
EXEC sp_addumpdevice 'disk', 'MyDatabaseLogDevice',
N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\MyDatabaseLog.bak'
GO
Εδώ φτιάχνουμε τρία dump devices, ένα για το κάθε είδος backup. Μπορείς να τα οργανώσεις με διαφορετικό τρόπο, πχ ένα dump device για κάθε ημέρα της εβδομάδας. Αυτό που μας ενδιαφέρει να συγκρατήσουμε από κάθε ένα dump device είναι το λογικό όνομα που έχει για θα το χρησιμοποιήσουμε κατά το backup και restore. Φυσικά, θα πρέπει να αλλάξεις το path κατά το δοκούν
Τώρα, χρειαζόμαστε να μαζέψουμε τις εντολές για το backup.
Πριν φτάσουμε στη δημιουργία job, μπορούμε να δοκιμάσουμε πλήρως το σενάριό μας χρησιμοποιώντας τον Query Analyzer. Αποφασίζουμε πόσα Differential και Log θα έχουμε μεταξύ δύο Full και αυτός θα είναι ο κύκλος backup. Αργότερα, όταν καθορίσουμε τα Jobς μπορούμε να θέσουμε την διάρκεια του κύκλου να είναι μία μέρα ή μια βδομάδα. Οι εντολές είναι ίδιες!
Στο δικό μας παράδειγμα, ο κύκλος θα είναι
1 2 3 4 5 6 7 8 9 10
F - L - L - D - L – L - D - L - L | F
(Ο δεύτερο κύκλος ξεκινάει στο βήμα 10)
Ξεκινάμε με το Full Database Backup.
-- Step #1
BACKUP DATABASE [MyDatabase] TO MyDatabaseDataDevice WITH NOFORMAT, INIT, NAME = N'MyDatabase-Full Database Backup', SKIP, NOREWIND,
NOUNLOAD, STATS = 10
To σημαντικό στο πρώτο βήμα είναι το “WITH INIT”. Αυτό θα σβήσει όλα τα προηγούμενα backups από το dump device πράγμα πολύ λογικό αφού εφόσον έχουμε ένα full backup ό,τι έχουμε πάρει backup μέχρι τότε είναι πλέον άχρηστο (εκτός βέβαια αν θέλουμε να έχουμε backup archive αλλά αυτό υποτίθεται ότι επιτυγχάνουμε όταν ρίχνουμε τα backup devices σε tape).
Συνεχίζουμε με τα δύο log backup:
-- Step #2
BACKUP LOG [MyDatabase] TO MyDatabaseLogDevice WITH NOFORMAT, INIT, NAME =
N'MyDatabase-Transaction Log Backup', SKIP, NOREWIND,
NOUNLOAD, STATS = 10
GO
-- Step #3
BACKUP LOG [MyDatabase] TO MyDatabaseLogDevice WITH NOFORMAT, NOINIT,
NAME = N'MyDatabase-Transaction Log Backup', SKIP, NOREWIND,
NOUNLOAD, STATS = 10
Παρατήρησε ότι το πρώτο έχει “WITH INIT” ενώ το δεύτερο έχει “WITH NOINIT”. Κατόπιν, έρχεται το differential. Επειδή θα είναι το πρώτο, θα έχει “WITH INIT”
-- Step #4
BACKUP DATABASE [MyDatabase] TO MyDatabaseDataDiffDevice WITH
DIFFERENTIAL, NOFORMAT, INIT, NAME =
N'MyDatabase-Differential Database Backup', SKIP, NOREWIND,
NOUNLOAD, STATS = 10
Και μετά τα δύο log
-- Step #5
BACKUP LOG [MyDatabase] TO MyDatabaseLogDevice WITH NOFORMAT, NOINIT, NAME =
N'MyDatabase-Transaction Log Backup', SKIP, NOREWIND,
NOUNLOAD, STATS = 10
GO
-- Step #6
BACKUP LOG [MyDatabase] TO MyDatabaseLogDevice WITH NOFORMAT, NOINIT,
NAME = N'MyDatabase-Transaction Log Backup', SKIP, NOREWIND,
NOUNLOAD, STATS = 10
Έχουμε φτάσει στο βήμα 6, οπότε μας μένουν τα υπόλοιπα τρία βήματα. Τώρα το δεύτερο differential θα είναι “WITH NOINIT”:
-- Step #7
BACKUP DATABASE [MyDatabase] TO MyDatabaseDataDiffDevice WITH
DIFFERENTIAL, NOFORMAT, ΝΟINIT, NAME =
N'MyDatabase-Differential Database Backup', SKIP, NOREWIND,
NOUNLOAD, STATS = 10
-- Step #8
BACKUP LOG [MyDatabase] TO MyDatabaseLogDevice WITH NOFORMAT, NOINIT, NAME =
N'MyDatabase-Transaction Log Backup', SKIP, NOREWIND,
NOUNLOAD, STATS = 10
GO
-- Step #9
BACKUP LOG [MyDatabase] TO MyDatabaseLogDevice WITH NOFORMAT, NOINIT,
NAME = N'MyDatabase-Transaction Log Backup', SKIP, NOREWIND,
NOUNLOAD, STATS = 10
Κι έτσι φτιάξαμε σε script το backup cycle. Από άποψη T-SQL κώδικα, χρειαζόμαστε μόνο τα βήματα 1, 2, 3, 4 και 7 γιατί τα 5, 6, 8 και 9 είναι ίδια με κάποιο προηγούμενο.
Πλέον, το μόνο πράγμα που χρειάζεται είναι να καθορίσουμε τα jobs. Μέσα από τον Enterprise Manager, φτιάχνουμε ένα job για κάθε βήμα και κατόπιν το προγραμματίζουμε την επιθυμητή χρονική στιγμή.
Μόλις τελειώσαμε ένα μικρό κομμάτι της DR (Disaster Recovery) στρατηγικής. Υπάρχει πολύ δουλεία ακόμη. Θα πρέπει να δοκιμαστούν τα βήματα αυτά για διάφορους λόγους. Για παράδειγμα:
- Να επιβεβαιωθεί ότι δουλεύουν σωστά
- Να μετρηθούν χρόνοι που απαιτούνται για να ολοκληρωθούν
- Να δοκιμασθεί το Restore (αν περιμένεις να μάθεις το restore όταν χτυπήσει η βάση… χαιρετίσματα στα data...)
- Να δοκιμαστεί ότι τα backup binaries είναι σωστά (και όχι corrupted)
Ιδεατά, θα πρέπει να έχεις έναν δεύτερο server ώστε να δοκιμάζεις ότι το backup-restore σενάριο παίζει σωστά. Είναι απαραίτητο να προλάβεις το οποιοδήποτε πρόβλημα πριν την κρίσιμη ώτα του restore.
PS: Mόλις σου γλύτωσα 500€. Τόσα είχα χρεώσει τελευταία φορά για να φτιάξω backup plan J
Vir prudens non contra ventum mingit