求救:极高难度恢复数据库数据

xwx520 2009-07-08 08:22:17
7月7号更新数据库表数据,少了WHERE,把一个表的几个字段的值都设置为XX了,目前只有6月20的数据库备份,请教如何将数据库数据回滚到7月6号?
...全文
36 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xwx520 2009-07-08
  • 打赏
  • 举报
回复
还没有没别的办法呢?我的备份LOG只有1.5M,而数据库大小有几G啊.
zzz1975 2009-07-08
  • 打赏
  • 举报
回复
没有差异备份,估计有点难度了

2008还是大家不熟啊
xwx520 2009-07-08
  • 打赏
  • 举报
回复
回复一楼: 我的数据库是2008,没办法使用LOG EXPLORER

回复二,三楼: 你们的办法是马上备份和还原,但我的备份是很久以前的.而已我的数据是要还原到前一天而已.
ks_reny 2009-07-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 htl258 的回复:]
可以通过日志还原,参考:
SQL code SQL事务日志还原实例收藏USE masterGO-- 创建测试数据库CREATEDATABASE db_testGO-- 对数据库进行备份BACKUPDATABASE db_testTODISK='c:\db_test.bak'WITH FORMATGO-- 创建测试表CREATETABLE db_test.dbo.tb_test(
IDint)-- 延时 1 秒钟,再进行后面的操作(这是由于SQL Server的时间精度最大为百分之三秒,不延时的话,可能会导致还原到时间点的操作失败)WAITFOR DELAY'00:00:01'GO-- 假设我们现在误操作删除了 db_test.dbo.tb_test 这个表DROPTABLE db_test.dbo.tb_testGO--在删除操作后,发现不应该删除表 db_test.dbo.tb_test--下面演示了如何恢复这个误删除的表 db_test.dbo.tb_test--首先,备份事务日志(使用事务日志才能还原到指定的时间点)BACKUPLOG db_testTODISK='c:\db_test_log.bak'WITH FORMATGO-- 获取可尝试的时间范围IFOBJECT_ID(N'tempdb..#')ISNOTNULLDROPTABLE #CREATETABLE #(
BackupNamenvarchar(128) ,
BackupDescriptionnvarchar(255) ,
BackupTypesmallint ,
ExpirationDatedatetime ,
Compressedtinyint ,
Positionsmallint ,
DeviceTypetinyint ,
UserNamenvarchar(128) ,
ServerNamenvarchar(128) ,
DatabaseNamenvarchar(128) ,
DatabaseVersionint ,
DatabaseCreationDatedatetime ,
BackupSize numeric(20,0) ,
FirstLSN numeric(25,0) ,
LastLSN numeric(25,0) ,
CheckpointLSN numeric(25,0) ,
DatabaseBackupLSN numeric(25,0) ,
BackupStartDatedatetime ,
BackupFinishDatedatetime ,
SortOrdersmallint ,
CodePagesmallint ,
UnicodeLocaleIdint ,
UnicodeComparisonStyleint ,
CompatibilityLeveltinyint ,
SoftwareVendorIdint ,
SoftwareVersionMajorint ,
SoftwareVersionMinorint ,
SoftwareVersionBuildint ,
MachineNamenvarchar(128) ,
Flagsint ,
BindingIDuniqueidentifier ,
RecoveryForkIDuniqueidentifier ,
Collationnvarchar(128) ,
FamilyGUIDuniqueidentifier ,
HasBulkLoggedDatabit ,
IsSnapshotbit ,
IsReadOnlybit ,
IsSingleUserbit ,
HasBackupChecksumsbit ,
IsDamagedbit ,
BeginsLogChainbit ,
HasIncompleteMetaDatabit ,
IsForceOfflinebit ,
IsCopyOnlybit ,
FirstRecoveryForkIDuniqueidentifier ,
ForkPointLSN numeric(25,0)NULL,
RecoveryModelnvarchar(60) ,
DifferentialBaseLSN numeric(25,0)NULL,
DifferentialBaseGUIDuniqueidentifier ,
BackupTypeDescriptionnvarchar(60) ,
BackupSetGUIDuniqueidentifierNULL
)INSERT #EXEC(N'
RESTORE HEADERONLY
FROM DISK =''c:\db_test.bak''
WITH FILE = 1
RESTORE HEADERONLY
FROM DISK =''c:\db_test_log.bak''
WITH FILE = 1')--SELECT
-- *
--FROM #-- 定义尝试的时间范围,以及尝试时间点的间隔DECLARE@start_datedatetime,@stop_datedatetime,@try_step_millsecondint,@msgnvarchar(1000)SELECT@start_date=MIN(BackupFinishDate),-- 尝试查找误删除数据的开始时间@stop_date=MAX(BackupFinishDate),-- 尝试查找误删除数据的结束时间@try_step_millsecond=500-- 每 500 毫秒为一个时间点找一次数据FROM #-- 还原完全备份RESTOREDATABASE db_testFROMDISK='c:\db_test.bak'WITHREPLACE,
NORECOVERY-- 还原日志备份到各点,以寻找出所需数据WHILE@start_date<@stop_dateBEGINSELECT@start_date=DATEADD(ms,@try_step_millsecond,@start_date),@msg= N'尝试时间点:'+CONVERT(varchar(50),@start_date,121)RAISERROR(@msg,10,1)WITH NOWAITBEGIN TRY-- 还原日志到指定的点,并通过 STANDBY 使数据库能只读访问RESTORELOG db_testFROMDISK='c:\db_test_log.bak'WITH STOPAT=@start_date,
STANDBY='c:\db_test_redo.bak'-- 检查需要的数据是否存在IFOBJECT_ID(N'db_test.dbo.tb_test')ISNOTNULLBEGIN-- 显示还原的时间点SELECT Restoreto=@start_date-- 完成数据库还原,使数据库可读写RESTORELOG db_testWITH RECOVERYSELECT@start_date=@stop_dateENDEND TRYBEGIN CATCHEND CATCHENDGO--最后删除测试环境DROPDATABASE db_testDROPTABLE #




本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/htl258/archive/2009/04/03/4041741.aspx
[/Quote]
mark.
htl258_Tony 2009-07-08
  • 打赏
  • 举报
回复
可以通过日志还原,参考:
 SQL事务日志还原实例收藏
USE master
GO
-- 创建测试数据库
CREATE DATABASE db_test GO

-- 对数据库进行备份
BACKUP DATABASE db_test
TO DISK = 'c:\db_test.bak'
WITH FORMAT
GO

-- 创建测试表
CREATE TABLE db_test.dbo.tb_test(
ID int)

-- 延时 1 秒钟,再进行后面的操作(这是由于SQL Server的时间精度最大为百分之三秒,不延时的话,可能会导致还原到时间点的操作失败)
WAITFOR DELAY '00:00:01'
GO

-- 假设我们现在误操作删除了 db_test.dbo.tb_test 这个表
DROP TABLE db_test.dbo.tb_test
GO

--在删除操作后,发现不应该删除表 db_test.dbo.tb_test

--下面演示了如何恢复这个误删除的表 db_test.dbo.tb_test

--首先,备份事务日志(使用事务日志才能还原到指定的时间点)
BACKUP LOG db_test
TO DISK = 'c:\db_test_log.bak'
WITH FORMAT
GO

-- 获取可尝试的时间范围
IF OBJECT_ID(N'tempdb..#') IS NOT NULL
DROP TABLE #
CREATE TABLE #(
BackupName nvarchar(128) ,
BackupDescription nvarchar(255) ,
BackupType smallint ,
ExpirationDate datetime ,
Compressed tinyint ,
Position smallint ,
DeviceType tinyint ,
UserName nvarchar(128) ,
ServerName nvarchar(128) ,
DatabaseName nvarchar(128) ,
DatabaseVersion int ,
DatabaseCreationDate datetime ,
BackupSize numeric(20,0) ,
FirstLSN numeric(25,0) ,
LastLSN numeric(25,0) ,
CheckpointLSN numeric(25,0) ,
DatabaseBackupLSN numeric(25,0) ,
BackupStartDate datetime ,
BackupFinishDate datetime ,
SortOrder smallint ,
CodePage smallint ,
UnicodeLocaleId int ,
UnicodeComparisonStyle int ,
CompatibilityLevel tinyint ,
SoftwareVendorId int ,
SoftwareVersionMajor int ,
SoftwareVersionMinor int ,
SoftwareVersionBuild int ,
MachineName nvarchar(128) ,
Flags int ,
BindingID uniqueidentifier ,
RecoveryForkID uniqueidentifier ,
Collation nvarchar(128) ,
FamilyGUID uniqueidentifier ,
HasBulkLoggedData bit ,
IsSnapshot bit ,
IsReadOnly bit ,
IsSingleUser bit ,
HasBackupChecksums bit ,
IsDamaged bit ,
BeginsLogChain bit ,
HasIncompleteMetaData bit ,
IsForceOffline bit ,
IsCopyOnly bit ,
FirstRecoveryForkID uniqueidentifier ,
ForkPointLSN numeric(25,0) NULL,
RecoveryModel nvarchar(60) ,
DifferentialBaseLSN numeric(25,0) NULL,
DifferentialBaseGUID uniqueidentifier ,
BackupTypeDescription nvarchar(60) ,
BackupSetGUID uniqueidentifier NULL
)
INSERT # EXEC(N'
RESTORE HEADERONLY
FROM DISK = ''c:\db_test.bak''
WITH FILE = 1
RESTORE HEADERONLY
FROM DISK = ''c:\db_test_log.bak''
WITH FILE = 1
')
--SELECT
-- *
--FROM #

-- 定义尝试的时间范围,以及尝试时间点的间隔
DECLARE
@start_date datetime,
@stop_date datetime,
@try_step_millsecond int,
@msg nvarchar(1000)
SELECT
@start_date = MIN(BackupFinishDate), -- 尝试查找误删除数据的开始时间
@stop_date = MAX(BackupFinishDate), -- 尝试查找误删除数据的结束时间
@try_step_millsecond = 500 -- 每 500 毫秒为一个时间点找一次数据
FROM #

-- 还原完全备份
RESTORE DATABASE db_test
FROM DISK = 'c:\db_test.bak'
WITH REPLACE,
NORECOVERY

-- 还原日志备份到各点,以寻找出所需数据
WHILE @start_date < @stop_date
BEGIN
SELECT
@start_date = DATEADD(ms, @try_step_millsecond, @start_date),
@msg = N'尝试时间点: ' + CONVERT(varchar(50), @start_date, 121)

RAISERROR(@msg, 10, 1) WITH NOWAIT
BEGIN TRY
-- 还原日志到指定的点,并通过 STANDBY 使数据库能只读访问
RESTORE LOG db_test
FROM DISK = 'c:\db_test_log.bak'
WITH STOPAT = @start_date,
STANDBY = 'c:\db_test_redo.bak'

-- 检查需要的数据是否存在
IF OBJECT_ID(N'db_test.dbo.tb_test') IS NOT NULL
BEGIN
-- 显示还原的时间点
SELECT Restoreto = @start_date
-- 完成数据库还原,使数据库可读写
RESTORE LOG db_test
WITH RECOVERY

SELECT
@start_date = @stop_date
END
END TRY
BEGIN CATCH
END CATCH
END
GO

--最后删除测试环境
DROP DATABASE db_test
DROP TABLE #




本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/htl258/archive/2009/04/03/4041741.aspx
huangqing_80 2009-07-08
  • 打赏
  • 举报
回复
用Log Explorer for SQL Server可以将日志回滚

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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