ceturtdiena, 2013. gada 11. jūlijs

Rezerves kopijas: daļēja atjaunošana (Piecemeal Restores)

SQL Server ir iespēja veidot rezerves kopijas ne tikai visai datu bāzei uz reiz, bet arī tikai tās daļām. Tas ir noderīgi, ja ir liela izmēra datu bāzes un tikai daļa no datiem būtiski mainās/tiek papildināti. Šādā veidā var būtiski samazināt laiku, kas vajadzīgs rezerves kopiju veidošanai, kā arī rezerves kopijas izmērus.


Datu bāzi ir iespējams atjaunot tikai daļēji. Pēc daļējas atjaunošanas pieejama kļūst tikai atjaunotā datu bāzes daļa. Šī iespēja savukārt ļauj būtiski samazināt atjaunošanas laiku kritiskām datu bāzes daļām. Protams, lietojumam jābūt spējīgam strādāt ar datu bāzi, kas pieejama tikai daļēji.

Par failiem un failu grupām: Faili, failu grupas SQL Server
Par daļēju failu atjaunošanu msdn: Piecemeal Restores

Pamēģināt var izmantojot šo skriptu (datu bāzes failu un rezerves kopiju ceļus var/vajag mainīt):

/* DATU BĀZES IZVEIDE */
USE [master]
GO
CREATE DATABASE [TestRestore] ON PRIMARY
    (NAME = N'TestRestore', FILENAME = 'C:\MSSQL11.MSSQLSERVER\MSSQL\DATA\TestRestore_log.mdf', SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ),
FILEGROUP [FGMy]  DEFAULT
    (NAME = N'FileFG1', FILENAME = N'C:\MSSQL11.MSSQLSERVER\MSSQL\DATA\FileFG1.ndf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ),
FILEGROUP [FGMy2]
    (NAME = N'FileFG2', FILENAME = N'C:\MSSQL11.MSSQLSERVER\MSSQL\DATA\FileFG2.ndf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
LOG ON
    (NAME = N'TestRestore_log', FILENAME = N'C:\MSSQL11.MSSQLSERVER\MSSQL\DATA\TestRestore_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
Use TestRestore;
Go
/* tabula failu grupā FGMy */
CREATE TABLE [dbo].[T1]
(
    [i] [int] NULL,
    [teksts] [nvarchar](100) NULL
) ON [FGMy]
GO
/* tabula failu grupā FGMy2 */
CREATE TABLE [dbo].[T2]
(
    [i] [int] NULL,
    [teksts] [nvarchar](100) NULL
) ON [FGMy2]
GO

/* REZERVES KOPIJAS */
/* Katrai failu grupai atsevišķi un LOG failam */
BACKUP DATABASE [TestRestore]
FILEGROUP = N'PRIMARY' TO
DISK = N'C:\MSSQL11.MSSQLSERVER\MSSQL\Backup\Primary_FG.bak' WITH NOFORMAT, NOINIT, 
NAME = N'Primary',
SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO
BACKUP DATABASE [TestRestore] FILEGROUP = N'FGMy' TO
 DISK = N'C:\MSSQL11.MSSQLSERVER\MSSQL\Backup\FGMy_FG.bak' WITH NOFORMAT, NOINIT, 
 NAME = N'FGMy',
 SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO
BACKUP DATABASE [TestRestore] FILEGROUP = N'FGMy2' TO
 DISK = N'C:\MSSQL11.MSSQLSERVER\MSSQL\Backup\FGMy2_FG.bak' WITH NOFORMAT, NOINIT, 
 NAME = N'FGMy2',
 SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO
BACKUP LOG [TestRestore] TO DISK = N'C:\MSSQL11.MSSQLSERVER\MSSQL\Backup\Log_F.bak'
Go

/* DB DZĒŠANA */
Use master;
Drop Database [TestRestore];

/*
    PARTIAL RESTORE
    Interesantā daļa. Datu bāze tiek atjaunota trijos soļos:
        * pirmajā solī tiek atjaunota tikai datu bāzes metadati (jo nekas cits nav Primary failu grupā)
        * otrajā solī tiek atjonota failu grupa FG1, padara pieejamu tabulu T1
            -> ar šo tabulu var sākt strādāt.
        * trešajā solī tiek atjonota failu grupa FG2, padara pieejamu tabulu T2
            -> datu bāze ir pilnībā funkcionējoša.

*/
Go
RESTORE DATABASE [TestRestore] FILEGROUP='Primary'
FROM  DISK = N'C:\MSSQL11.MSSQLSERVER\MSSQL\Backup\Primary_FG.bak'
   WITH PARTIAL, NORECOVERY; -- Atslēgvārds "PARTIAL!"

RESTORE LOG [TestRestore] FILEGROUP='Primary'
FROM  DISK = N'C:\MSSQL11.MSSQLSERVER\MSSQL\Backup\Log_F.bak'
   WITH RECOVERY;

Go
Use TestRestore;
exec sp_help 'T1' -- strādās, atgriež tabulas info
exec sp_help 'T2' -- strādās, atgriež tabulas info
--select * From dbo.T1 -- KĻŪDA! (jo atrodas FG, kas vēl nav atjaunota)
--select * From dbo.T2 -- KĻŪDA! (jo atrodas FG, kas vēl nav atjaunota)

Go
use master;
RESTORE DATABASE [TestRestore] FILEGROUP='FGMy'
FROM  DISK = N'C:\MSSQL11.MSSQLSERVER\MSSQL\Backup\FGMy_FG.bak'
   WITH NORECOVERY; -- NAV atslēgvārds "PARTIAL!" (to tikai 1.)

RESTORE LOG [TestRestore] FILEGROUP='FGMy'
FROM  DISK = N'C:\MSSQL11.MSSQLSERVER\MSSQL\Backup\Log_F.bak'
   WITH RECOVERY;

Go
Use TestRestore;
exec sp_help 'T1' -- strādās, atgriež tabulas info
exec sp_help 'T2' -- strādās, atgriež tabulas info
select * From dbo.T1 -- strādās!
--select * From dbo.T2 -- KĻŪDA! (jo atrodas FG, kas vēl nav atjaunota)

Go
use master;
RESTORE DATABASE [TestRestore] FILEGROUP='FGMy2'
FROM  DISK = N'C:\MSSQL11.MSSQLSERVER\MSSQL\Backup\FGMy2_FG.bak'
   WITH NORECOVERY;

RESTORE LOG [TestRestore] FILEGROUP='FGMy2'
FROM  DISK = N'C:\MSSQL11.MSSQLSERVER\MSSQL\Backup\Log_F.bak'
   WITH RECOVERY;
Go
Use TestRestore;
exec sp_help 'T1' -- strādās, atgriež tabulas info
exec sp_help 'T2' -- strādās, atgriež tabulas info
select * From dbo.T1 -- strādās!
select * From dbo.T2 -- strādās!

Nav komentāru:

Komentāra publicēšana