数据库的表能通过日志还原到一定的时间点吗?

hmily821023 2009-05-18 11:07:01
对表误操作了
没有备份文件 能通过日志文件对某个表进行还原吗?
sql2005
...全文
109 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
takeshe 2009-05-18
  • 打赏
  • 举报
回复
可以的吧,具体的到数据库板去问比较好!
zzxap 2009-05-18
  • 打赏
  • 举报
回复
[CODE=SQL]
示例
下例在名为 mywind 的数据库中执行部分还原操作。mywind 使用的是完全恢复模型。数据库创建在两个文件组上,即包含文件 mywind_data_1 的 new_customers 和包含文件 mywind_data_2 的 sales。

CREATE DATABASE mywind
GO

ALTER DATABASE mywind ADD FILEGROUP new_customers
ALTER DATABASE mywind ADD FILEGROUP sales
GO

ALTER DATABASE mywind ADD FILE
(NAME='mywind_data_1',
FILENAME='g:\mw.dat1')
TO FILEGROUP new_customers
ALTER DATABASE mywind
ADD FILE
(NAME='mywind_data_2',
FILENAME='g:\mw.dat2')
TO FILEGROUP sales
GO

执行完整数据库备份。然后在 new_customers 上创建表 t1,在 sales 上创建表 t2。备份事务日志:

BACKUP DATABASE mywind
TO DISK ='g:\mywind.dmp'
WITH INIT
GO

USE mywind
GO

CREATE TABLE t1 (id int) ON new_customers
CREATE TABLE t2 (id int) ON sales
GO

BACKUP LOG mywind TO DISK='g:\mywind.dmp'
WITH NOINIT
GO

在某些时候,有必要还原 sales 文件组上的表 t2。RESTORE FILELISTONLY 语句列出数据库文件及其所在的文件组。RESTORE HEADERONLY 语句列出备份媒体的内容:

RESTORE FILELISTONLY FROM DISK='g:\mywind.dmp'
GO
RESTORE HEADERONLY FROM DISK='g:\mywind.dmp'
GO

RESTORE DATABASE 语句使用 WITH PARTIAL 和 NORECOVERY 选项以另一个名称还原数据库和 sales 文件组。另外,还将主文件和文件组 (mywind)、事务日志 (mywind_log) 和已还原的文件组中的所有文件(本例中 sales 中只有 mywind_data_2 文件)移到新位置。日志即得到恢复。

RESTORE DATABASE mywind_part
FILEGROUP = 'sales'
FROM DISK='g:\mywind.dmp'
WITH FILE=1,NORECOVERY,PARTIAL,
MOVE 'mywind' TO 'g:\mw2.pri',
MOVE 'mywind_log' TO 'g:\mw2.log',
MOVE 'mywind_data_2' TO 'g:\mw2.dat2'
GO

RESTORE LOG mywind_part
FROM DISK = 'g:\mywind.dmp'
WITH FILE = 2,RECOVERY
GO

Notice that t2 is accessible after the partial restore operation.
SELECT COUNT(*) FROM mywind_part..t2

下面是结果:

---------------
0

注意在部分还原操作后无法访问 t1。

SELECT COUNT(*) FROM mywind_part..t1

下面是所得到的消息:

The query processor is unable to produce a plan because
the table 'mywind_part..t1' is marked OFFLINE.

[/CODE]
zzxap 2009-05-18
  • 打赏
  • 举报
回复
[code=SQL]
部分数据库还原操作
应用程序或用户错误经常影响到数据库的某个孤立部分(如表)。为支持从这些事件中恢复,Microsoft® SQL Server™ 提供一种机制,将数据库的一部分还原到另一个位置,以使损坏或丢失的数据可以复制回原始数据库。例如,如果应用程序错误地除去了一个表,可能只想还原数据库中包含这个表的那部分。日志备份或差异备份可以将这个表还原到除去该表前的那一点。然后可以析取表的内容并重新装载到原始数据库中。

在下列情况中,执行部分还原操作也很有用:

出于开发和生成报表的目的在另一台服务器上创建数据库的一个子集。


还原存档数据。
部分还原操作使用数据库文件组。主要文件组始终同指定的文件及其相应的文件组一起还原。还原结果是数据库的一个子集。没有还原的文件组被标记为脱机,不能对其进行访问。



说明 由于还原了主文件,所有目录(全文目录除外)也得到还原,甚至与还原操作中所没有包括的文件相关联的目录也得到还原。


部分还原操作由 RESTORE 语句的 PARTIAL 子句完成。在还原完整数据库备份时,还可以使用 PARTIAL 选项。不支持文件备份的部分数据库还原。

执行部分还原操作

执行使用完整数据库备份的 RESTORE DATABASE 语句,并指定:
要还原的数据库名称。除非计划重写原始数据库或正在不同的服务器上还原数据库,否则给数据库指定一个新名称。


要从其中还原数据库备份的备份设备。


为每个要还原的文件或文件组指定 FILEGROUP 子句。


说明 如果指定一个文件,也将还原其文件组内的所有文件。

用于还原的 MOVE 子句(如果正将文件还原到新位置)。


PARTIAL 子句。


NORECOVERY 子句(如果有要应用的事务日志备份或差异备份)。否则指定 RECOVERY 子句。
可以选择执行 RESTORE DATABASE 语句以还原差异数据库备份,同时指定:
差异数据库备份将应用到的数据库的名称。


要从其中还原差异数据库备份的备份设备。


NORECOVERY 子句,前提是在还原差异数据库备份后,还要应用事务日志备份,否则应指定 RECOVERY 子句。
执行 RESTORE LOG 语句以应用每个事务日志备份,同时指定:
将对其应用事务日志的数据库名称。


要从其中还原事务日志备份的备份设备。


NORECOVERY 子句(如果有其它要应用的事务日志备份)。否则指定 RECOVERY 子句。
[/CODE]
zzxap 2009-05-18
  • 打赏
  • 举报
回复
[code=SQL]
工作中的一点小总结希望对大家有点帮助
一、利用sql语句或者存储过程操作
这个是我在csdn论坛上摘抄的
一种处理中用到的备份还原的存储过程

RESTORE DATABASE MyNwind
FROM MyNwind_1, MyNwind_2
WITH NORECOVERY
RESTORE LOG MyNwind
FROM MyNwindLog1
WITH NORECOVERY
RESTORE LOG MyNwind
FROM MyNwindLog2
WITH RECOVERY, STOPAT = 'Apr 15, 1998 12:00 AM'

--关闭用户进程处理
if @overexist=1 and @killuser=1
begin
declare hCForEach cursor for
select s='kill '+cast(spid as varchar) from master..sysprocesses
where dbid=db_id(@dbname)
exec sp_msforeach_worker '?'
end

优点:查询分析器直接操作数据库恢复数据,有良好的改装和适用性
缺点 :需要多次操作熟悉其过程,比较难达到企业安全统计审计要求

二、使用组件编程来实现
1、使用sqldmo.dll
C#语言书写的用于Microsoft SQL Server数据库备份和恢复的类:

using System;

namespace DbService
{
/// <summary>
/// DbOper类,主要实现对Microsoft SQL Server数据库的备份和恢复 ,注意使用了数据库时就必须杀死该进程
/// </summary>
public sealed class DbOper
{
/// <summary>
/// DbOper类的构造函数
/// </summary>
private DbOper()
{
}

/// <summary>
/// 数据库备份
/// </summary>
public static void DbBackup()
{
try
{
SQLDMO.Backup oBackup = new SQLDMO.BackupClass();
SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
oSQLServer.LoginSecure = false;
oSQLServer.Connect("localhost", "sa", "1234");
oBackup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
oBackup.Database = "Northwind";
oBackup.Files = @"d:\\Northwind.bak";
oBackup.BackupSetName = "Northwind";
oBackup.BackupSetDescription = "数据库备份";
oBackup.Initialize = true;
oBackup.SQLBackup(oSQLServer);
}
catch
{
throw;
}
}

/// <summary>
/// 数据库恢复
/// </summary>
public static void DbRestore()
{
try
{
SQLDMO.Restore oRestore = new SQLDMO.RestoreClass();
SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
oSQLServer.LoginSecure = false;
oSQLServer.Connect("localhost", "sa", "1234");
oRestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
oRestore.Database = "Northwind";
oRestore.Files = @"d:\\Northwind.bak";
oRestore.FileNumber = 1;
oRestore.ReplaceDatabase = true;
oRestore.SQLRestore(oSQLServer);
}
catch
{
throw;
}
}
}
}
[/CODE]
光宇广贞 2009-05-18
  • 打赏
  • 举报
回复
听说是可以……
我不懂电脑 2009-05-18
  • 打赏
  • 举报
回复
能,看看sql的增量备份吧。
wangxinli_nissan 2009-05-18
  • 打赏
  • 举报
回复
学习
wwwiii520 2009-05-18
  • 打赏
  • 举报
回复
看有沒有做日志備份咯.
如果要日志恢復的話
一般建立的數據庫有默認的備份的
rainsure333 2009-05-18
  • 打赏
  • 举报
回复
可以还原到某个时间
hecker728 2009-05-18
  • 打赏
  • 举报
回复
帮顶,
wuyq11 2009-05-18
  • 打赏
  • 举报
回复
wuyq11 2009-05-18
  • 打赏
  • 举报
回复
可以
参考
参考
jingkunli 2009-05-18
  • 打赏
  • 举报
回复
顶,应该可以的!

62,039

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧