oracle有多个整个数据库备份集 如何选择恢复的备份集
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle有多个整个数据库备份集 如何选择恢复的备份集相关的知识,希望对你有一定的参考价值。
参考技术A 您好,两方法:1、指定恢复时间点,RMAN会自动寻找最合适的备份集来恢复。
2、使用备份集的TAG来来恢复。
可以通过set until time来指定。RMAN会自动找指定时间前最近的一个FULL备份来恢复。
a.instance由一些ORACLE进程和内存组成,用来连接数据库
b.oracle跟mysql,sqlserver的设计思想不一样,不要把mysql的架构套用到学习oracle架构上
c.表空间是个逻辑概念,表逻辑上存在于表空间中,而物理上存在于数据文件中。一个表空间可以有多个数据文件。建表时指定表空间,真实数据就是通过dbwr进程写到相应数据文件中。
d.备份分物理备份跟逻辑备份。物理备份就是备份数据文件,可以是备份集或者COPY,工具比如RMAN。逻辑备份就是备份的一些DDL,DCL,DML操作,相当于mysqldump,工具比如EXP,EXPDP。本回答被提问者和网友采纳 参考技术B 你是通过exp、expd还是rman备份的啊???
当 .bak 文件中有多个备份点时使用 SMO 还原类
【中文标题】当 .bak 文件中有多个备份点时使用 SMO 还原类【英文标题】:Using SMO Restore Class when there are multiple backup points in .bak file 【发布时间】:2014-10-04 22:19:40 【问题描述】:我正在尝试使用 SMO 编写一个简单的实用程序来备份/恢复数据库。当备份文件中只有一个时间点时,这非常有效。但是,当一个备份文件定义了多个备份点(不是备份集)时,SMO 总是选择最早的,而 SSMS 总是选择最新的。
这会导致数据恢复不正确,我想知道是否有一个我可以设置的属性将强制恢复类始终使用最新的备份点。
我已经尝试设置 Restore.ToPointInTime,但由于数据库的恢复模型很简单,因此无法设置。
我找到了一篇 MSDN 文章,描述了如何选择恢复时间,其中包括将数据库设置为完全恢复模式:
http://technet.microsoft.com/en-us/library/ms179451(v=sql.105).aspx
在使用 SMO 时是否需要这样做,有没有办法使用纯 SMO(无 C# sql 命令)来做到这一点?我已经使用了 Restore.ReadBackupHeaders,从中我能够及时提取可用的备份点,但无法将其设置为在任何地方恢复。
编辑:
这是我正在使用的代码,包括最近尝试通过 smo 设置数据库恢复模式的更改:
public void RestoreDatabase(string databaseName, string backupPath)
var server = new Server(GetServerConnection());
//If the database doesn't exist, create it so that we have something
//to overwrite.
if (!server.Databases.Contains(databaseName))
var database = new Database(server, databaseName);
database.Create();
var targetDatabase = server.Databases[databaseName];
targetDatabase.RecoveryModel = RecoveryModel.Full;
targetDatabase.Alter();
Restore restore = new Restore();
var backupDeviceItem = new BackupDeviceItem(backupPath, DeviceType.File);
restore.Devices.Add(backupDeviceItem);
restore.Database = databaseName;
restore.ReplaceDatabase = true;
restore.Action = RestoreActionType.Database;
var fileList = restore.ReadFileList(server);
var dataFile = new RelocateFile();
string mdf = fileList.Rows[0][1].ToString();
dataFile.LogicalFileName = fileList.Rows[0][0].ToString();
dataFile.PhysicalFileName = server.Databases[databaseName].FileGroups[0].Files[0].FileName;
var logFile = new RelocateFile();
string ldf = fileList.Rows[1][1].ToString();
logFile.LogicalFileName = fileList.Rows[1][0].ToString();
logFile.PhysicalFileName = server.Databases[databaseName].LogFiles[0].FileName;
restore.RelocateFiles.Add(dataFile);
restore.RelocateFiles.Add(logFile);
var backupHeaderInfo = GetBackupHeaderInformation(restore, server);
var latestBackupDate = backupHeaderInfo.Max(backupInfo => backupInfo.BackupStartDate);
restore.ToPointInTime = latestBackupDate.ToString();
server.KillAllProcesses(databaseName);
restore.SqlRestore(server);
看起来这应该可以解决问题,但是行
targetDatabase.RecoveryModel = RecoveryModel.Full
似乎没有做任何事情来改变恢复模式,导致我仍然得到以下异常:
使用简单恢复模型的数据库不支持 STOPAT 选项。 RESTORE DATABASE 异常终止。
编辑 2:
我加了一行
targetDatabase.Alter();
它修复了不更新的问题。但是它现在恢复但使数据库处于恢复模式,因此无法查询。
编辑 3:
我通过将 Restore.FileNumber 属性设置为 BackupHeaders 中位置的最大值来使代码正常工作,这似乎可以解决问题,尽管我仍然不确定为什么备份文件有多个备份头,但是只有一个备份集。
工作代码如下。
public void RestoreDatabase(string databaseName, string backupPath)
var server = new Server(GetServerConnection());
//If the database doesn't exist, create it so that we have something
//to overwrite.
if (!server.Databases.Contains(databaseName))
var database = new Database(server, databaseName);
database.Create();
var targetDatabase = server.Databases[databaseName];
targetDatabase.RecoveryModel = RecoveryModel.Full;
targetDatabase.Alter();
Restore restore = new Restore();
var backupDeviceItem = new BackupDeviceItem(backupPath, DeviceType.File);
restore.Devices.Add(backupDeviceItem);
restore.Database = databaseName;
restore.ReplaceDatabase = true;
restore.NoRecovery = false;
restore.Action = RestoreActionType.Database;
var fileList = restore.ReadFileList(server);
var dataFile = new RelocateFile();
dataFile.LogicalFileName = fileList.Rows[0][0].ToString();
dataFile.PhysicalFileName = server.Databases[databaseName].FileGroups[0].Files[0].FileName;
var logFile = new RelocateFile();
logFile.LogicalFileName = fileList.Rows[1][0].ToString();
logFile.PhysicalFileName = server.Databases[databaseName].LogFiles[0].FileName;
restore.RelocateFiles.Add(dataFile);
restore.RelocateFiles.Add(logFile);
var backupHeaderInfo = GetBackupHeaderInformation(restore, server);
restore.FileNumber = backupHeaderInfo.Where(backupInfo => backupInfo.BackupType == BackupType.Database).Max(backupInfo => backupInfo.Position);
server.KillAllProcesses(databaseName);
restore.SqlRestore(server);
targetDatabase.SetOnline();
【问题讨论】:
【参考方案1】:尽管您说您没有多个备份集,但我认为您有。从备份集表的文档中:
备份集包含来自单个成功备份操作的备份。
因此,如果您在单个备份文件中有“多个还原点”,那么您就有多个备份集。通过查询 msdb 中的 dbo.backupset 表来验证这一点
撇开迂腐不谈,我认为您正在寻找 Restore 对象上的 FileNumber 属性。这对应于 T-SQL 恢复命令中的 FILE = n
备份集选项。为了获得最后一个,只需从 ReadBackupHeaders 调用中拉出最后一行。
要自己测试,请通过 SSMS 执行恢复操作,然后点击顶部附近的“脚本”按钮,而不是点击“确定”。我怀疑你会在某处看到FILE = <some number>
。
【讨论】:
我以为是这种情况,但我对备份执行了 Restore.ReadFileList(),它只返回 2 个条目:mdf 和 ldf。当我在 SSMS 中选择文件时,我只看到一个结果集,当我编写备份脚本时(如您所建议的那样),它被设置在文件 1 中。 那么您如何评估备份文件有多个还原点? 我通过 Restore.ReadBackupHeader() 方法返回的多行进行了评估。此外,如果您在选择 SSMS 中的媒体集时选择“时间线...”选项,则可以看到备份,该选项位于标有“恢复到...”的框旁边。这表明备份文件包含多个备份,但只有一个备份集。很混乱。在任何一种情况下,我都通过设置 Restore.FileNumber = 备份标头的最大“位置”来使其工作:backupHeaderInfo.Where(backupInfo => backupInfo.BackupType == BackupType.Database).Max(backupInfo => backupInfo.Position);
因为我使用 Restore.FileNumber 属性使其正常工作,所以我会将您的答案标记为正确,并将更新后的代码发布给任何路过的人,但我仍然对备份文件如何有多个备份标头,但只有一个备份集。
你用什么来定义“备份集”?文件系统上的单个备份文件可以包含多个备份集。此外,据我了解,restore headeronly from disk…
语句将在提供的文件中显示每个备份集一行。根据您所描述的所有内容,您有多个备份集。以上是关于oracle有多个整个数据库备份集 如何选择恢复的备份集的主要内容,如果未能解决你的问题,请参考以下文章