我们将更详细地探讨每种还原类型。因此,让我们从基本类型开始-一个简单的恢复模型和一个完整的恢复模型。上文我们讲了简单恢复;下面接着讲解如何恢复数据库文件和文件组。
数据库恢复类型
- 数据库完全恢复表明整个数据库恢复到以前的状态,并进行恢复。请注意,在还原和恢复操作期间,数据库处于脱机模式。
- 数据库文件恢复建议将一个数据文件或一个文件组恢复到原来的状态,并进行恢复。在文件恢复过程中,所有包含处理过的文件的文件组都会在恢复的时候切换到脱机模式。任何使用离线文件和文件组的尝试都会导致错误。
- 数据页面恢复允许在使用完全恢复模式或不完全记录模式时恢复单独的数据库。页面恢复适用于任何数据库,无论文件组的数量如何。
我们将更详细地探讨每种还原类型。因此,让我们从基本类型开始-一个简单的恢复模型和一个完整的恢复模型。
上文我们讲了简单恢复;下面接着讲解如何恢复数据库文件和文件组。
恢复数据库文件和文件组
除此之外,我们可以使用以下脚本还原特定的数据库文件:
RESTORE DATABASE[JobEmplDB]FILE = N'JobEmplDB' FROM DISK = N'\SharedBackupFullJobEmplDB_2020_07_19_17_27_01.bak' WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 10; GO
在这里,我们还原JobEmplDB文件。还原它时,我们可以将WITH NORECOVERY设置为预设文件的事务日志备份的顺序。
同样,我们可以还原文件组并还原部分备份。要通过SSMS执行此操作,请右键单击“数据库”,然后选择“还原文件和文件组”选项:

图。8. 在SSMS中还原文件和文件组
在“常规”选项卡上,我们选择要还原的目标和还原源(部分备份的文件以及要还原的元素):

图。9. SSMS中的“常规”选项卡设置
然后,在“选项”选项卡上,我们需要配置必要的设置:

图。10. SSMS中的“选项”选项卡设置
数据库本身具有相同的快捷菜单:

图。11. SSMS中数据库的“还原”上下文菜单
请注意,仅当数据库处于NORECOVERY或STANDBY模式时,才可以还原事务日志备份。这就是为什么此选项在上面的屏幕截图中不可用。
此外,还可以还原页面。例如,下面的示例演示了如何还原具有以下标识符的页面:1:57、1:202、1:916和1:1016:
RESTORE DATABASE [JobEmplDB] PAGE='1:57, 1:202, 1:916, 1:1016' FROM DISK = '\SharedBackupFullJobEmplDB_Full_backup_2020_07_19_14_04_25.bak'WITH NORECOVERY; RESTORE LOG [JobEmplDB] FROM DISK = '\SharedBackupLogJobEmplDB_Log_backup_2020_07_19_17_04_56.trn' WITH NORECOVERY; RESTORE LOG [JobEmplDB] FROM DISK = '\SharedBackupLogJobEmplDB_Log_backup_2020_07_19_17_04_56.trn' WITH NORECOVERY; BACKUP LOG [JobEmplDB] TO DISK = '\SharedBackupLogJobEmplDB_Log_backup_2020_07_19_17_04_58.trn'; RESTORE LOG [JobEmplDB] FROM DISK = '\SharedBackupLogJobEmplDB_Log_backup_2020_07_19_17_04_58.trn' WITH RECOVERY; GO
如果您想了解更多有关该主题的信息,请阅读有关恢复页面的信息。
实施还原过程
既然我们已经考虑了恢复的基础,那么让我们继续执行该过程。
必须理解,旨在检查备份的例行还原通常是在其他服务器上执行的。数据库位置和还原数据库的位置是两个不同的服务器。
因此,至关重要的是命名备份文件,以便它清楚地定义备份,它属于哪个数据库以及还原的顺序。后者意味着我们需要定义最新的完整备份,最后的差异备份和事务日志备份链。
在当前文章探讨了恢复过程及其自动化的实施。但是,它没有考虑上面阐明的所有要点。特别是,它没有探讨完整的恢复过程。因此,我们将需要改进方法。
首先,除非在之前创建了该模式,否则我们将在相应的数据库中创建srv模式。然后,我们创建[srv]。[RestoreSettings]表以写入要还原的数据库:
CREATE TABLE [srv].[RestoreSettings]( [DBName] [nvarchar](255) NOT NULL, [FullPathRestore] [nvarchar](255) NOT NULL, [DiffPathRestore] [nvarchar](255) NOT NULL, [LogPathRestore] [nvarchar](255) NOT NULL, [InsertUTCDate] [datetime] NOT NULL,CONSTRAINT [PK_RestoreSettings_1] PRIMARY KEY CLUSTERED( [DBName] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON,FILLFACTOR = 95, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO ALTER TABLE [srv].[RestoreSettings]ADDCONSTRAINT [DF_RestoreSettings_InsertUTCDate] DEFAULT (getutcdate()) FOR [InsertUTCDate] GO
哪里:
- DBName是数据库名称。
- FullPathRestore是要还原的完整备份的位置的完整路径。
- DiffPathRestore是要还原的差异备份位置的完整路径。
- LogPathRestore是事务备份位置的完整路径。
- InsertUTCDate是UTC格式的条目创建的日期和时间。
现在,使用以下脚本将JobEmplDB数据库添加到创建的[srv]。[BackupSettings]表中:
INSERT INTO [srv].[RestoreSettings] ([DBName] ,[FullPathRestore] ,[DiffPathRestore] ,[LogPathRestore]) SELECT N'JobEmplDB', '\SharedBackupFull', '\SharedBackupDiff', '\SharedBackupLog'; GO
接下来,我们创建[srv]。[RestoreSettingsDetail]表以获取数据库还原的详细设置:
CREATE TABLE [srv].[RestoreSettingsDetail]( [Row_GUID] [uniqueidentifier] NOT NULL, [DBName] [nvarchar](255) NOT NULL, [SourcePathRestore] [nvarchar](255) NOT NULL, [TargetPathRestore] [nvarchar](255) NOT NULL, [Ext] [nvarchar](255) NOT NULL, [InsertUTCDate] [datetime] NOT NULL, CONSTRAINT [PK_RestoreSettingsDetail_1] PRIMARY KEY CLUSTERED ( [Row_GUID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 95, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO
ALTER TABLE [srv].[RestoreSettingsDetail] ADD CONSTRAINT [DF_RestoreSettingsDetail_Row_GUID] DEFAULT (newid()) FOR [Row_GUID] GO
ALTER TABLE [srv].[RestoreSettingsDetail] ADD CONSTRAINT [DF_RestoreSettingsDetail_InsertUTCDate] DEFAULT (getutcdate()) FOR [InsertUTCDate] GO
在这里,让我澄清一下:
- Row_GUID是表中的行ID。
- DBName是数据库名称。
- SourcePathRestore是源文件的全名。
- TargetPathRestore是目标文件的全名。
- Ext是文件扩展名。
- InsertUTCDate是条目创建的日期和时间,采用UTC格式。
请注意,必须在还原过程中为每个数据库文件设置SourcePathRestore和TargetPathRestore目标的位置。
现在,我们使用以下脚本将JobEmplDB数据库文件的详细还原数据添加到[srv]。[BackupSettingsDetail]表中:
INSERT INTO [srv].[RestoreSettingsDetail] ([DBName] ,[SourcePathRestore] ,[TargetPathRestore] ,[Ext]) SELECT N'JobEmplDB', N'JobEmplDB', N'D:Program FilesMicrosoft SQL ServerMSSQL15.MSSQLSERVERMSSQLDATAJobEmplDB2', N'mdf' UNION ALL SELECT N'JobEmplDB', N'JobEmplDB_log', N'D:Program FilesMicrosoft SQL ServerMSSQL15.MSSQLSERVERMSSQLDATAJobEmplDB2_log', N'ldf'; GO
之后,我们需要为MS SQL Server实例启用参数сonfigurations,以执行xp_cmdshell存储过程。为此,我们将使用以下脚本:
-- To allow advanced options to be changed. EXECUTE sp_configure 'show advanced options', 1; GO -- To update the currently configured value for advanced options. RECONFIGURE; GO -- To enable the feature. EXECUTE sp_configure 'xp_cmdshell', 1; GO -- To update the currently configured value for this feature. RECONFIGURE; GO
这样,[srv]。[RunFullRestoreDB]存储过程已被完全更改,因此它现在可以定义哪些备份以及如何还原。在备份名称格式如下的情况下:
<数据库名称> _ <备份类型(完整,差异,日志)> _ backup_YYYY_MM_DD_HH_MM_SS。<bak或trn>
[srv]。[RunFullRestoreDB]存储过程的完整调用如下:
EXEC [srv].[RunFullRestoreDB] @OnlyDBName=NULL, @IsNameAddRestore=1;
在这里,@OnlyDBName参数定义了要还原的数据库,而IsNameAddRestore参数设置了在已还原数据库的末尾添加_Restore行及其文件名的必要性。
的定义[SRV] [RunFullRestoreDB]存储过程表明,我们首先得到所有从[SRV]相关数据库的必要信息。[RestoreSettings]和[SRV] [RestoreSettingsDetail]表。
之后,我们将读取每个数据库的完整,差异和事务日志备份的完整路径。对于每个路径,我们读取其中的文件,而无需引用子目录。
最后,我们根据文件名格式,数据库所属和备份类型在这些文件中定义必要的文件。还原脚本是基于检索到的数据生成的。
[srv]。[RunFullRestoreDB]存储过程的一般原理如下:
- 查找最新的完整备份。
- 查找比最新完整备份副本晚创建的最新差异备份。
- 查找在最新差异备份之后创建的事务日志备份的顺序。
- 按照找到的严格严格的顺序备份,从最后一次完整备份开始,到最后一次事务日志备份结束,还原数据库。
如果在最新的差异备份创建之后没有创建事务日志,则还原过程将以差异备份还原结束。
如果不存在差异备份,则还原过程将从完整备份开始,并以不早于最新完整备份创建的所有事务日志备份的顺序进行。
如果只有完整备份可用,数据库将严格从中还原。如果没有完整备份,则数据库不会包含在还原过程中。
数据库还原仅涉及名称与以下格式匹配的文件:
<数据库名称> _ <备份类型(完整,差异,日志)> _备份_YYYY_MM_DD_HH_MM_SS。<bak或trn>
这些文件必须与备份类型和数据库名称匹配。当然,最好为每个数据库创建一个单独的子目录以提高生产力。因此,代替以下路径:
\ Shared Backup Full
\ Shared Backup Diff
\ Shared Backup Log
您最好使用:
\ Shared Backup Full JobEmplDB
\ Shared Backup Diff JobEmplDB
\ Shared Backup Log JobEmplDB
综上所述,我们从主要备份类型检查了还原过程的实现:
- 充分。
- 微分。
- 交易记录。
您可以根据特定的时间表通过代理任务或任何第三方方法和工具来调用这些存储过程。
还可以在[inf]。[RunAsyncExecute]存储过程的帮助下,通过动态创建代理任务来使恢复并行 化。此过程定义了四个参数:
- @sql是要在代理任务中执行的T-SQL代码。
- @jobname是代理程序任务的名称,我们将GUID添加到该名称(可选)。
- @database是执行@sql参数中设置的查询的数据库的名称。
- @owner建议哪个登录名执行代理程序的任务(如果未设置,则将使用sa)。
为了加快还原过程,可以利用dbForge Studio for SQL Server,它提供了一个有用的dbForge Restore Wizard,并允许您使用功能强大的SQL备份工具来保护数据库以防数据丢失。
结论
标签:
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!