sql恢复修改前数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql恢复修改前数据相关的知识,希望对你有一定的参考价值。
sql 2000 修改数据的时候改错了,问如何恢复到修改前?顺便问怎么可以实时本分数据库到另一个磁盘,实时的哦
1、首先运行Recovery for SQL Server。
2、点击:Next > Next--》进入 Recovery Configuration 界面。
3、接着选中 Search for deleted records,并选择要恢复的数据库的日志文件路径log file path。
4、点击next-》开始恢复。
5、点击:Next,选择被恢复数据存放的目标数据库。
6、最后点击Finish,然后就完成数据的恢复数据。
参考技术A 一,如果是oracle数据库,且刚删除不久,那么可以执行下面语句insert into 表名 select * from 表名 as of timestamp to_timestamp('2007-07-23 10:20:00', 'yyyy-mm-dd hh24:mi:ss');
语句中的日期时间改成你误操作之前的最近时间
二,如果是sqlserver数据库,那么
1、首先对误删后的数据库做个日志备份;
backup log 数据库名 to disk='路径及日志备份文件名'
2、把数据库恢复到最近一次全库备份的日期;
RESTORE DATABASE 数据库名 FROM DISK='路径及数据库备份文件名'
WITH REPLACE,NORECOVERY
3、用步骤1的日志备份把数据库恢复到你误删的那一刻之前;
RESTORE LOG 数据库名 FROM DISK='路径及日志备份文件名'
WITH RECOVERY,STOPAT='2009-4-24 16:40:10'
语句中的日期时间改成你误操作之前的最近时间
三,如果修改之前有做数据库备份,可以新建一个库,把备份还原上去,导出表数据,再导入到现在用的库中去。.
实时备份数据库到另一个磁盘,有多种不同的实现方式,例如:
1,有两台服务器的话可以做双机热备
2,只有一台服务器可以做磁盘镜像
3,也可以用专门的数据库备份软件本回答被提问者采纳 参考技术B sql2000修改错误的值无法恢复,除非在修改之前有备份,可以将备份恢复。数据库实时备份到另一个磁盘的问题较复杂,sql2000本身有计划任务可以实现在某个时间,例如每天晚上12点,将数据备份到可访问的任意磁盘位置。如果必须要求实时备份,则考虑购买专业的数据备份软件,或可上网搜索共享的实时备份软件。 参考技术C 完全备份恢复数据库,并使其为日志恢复做好准备。
RESTORE DATABASE pubs FROM DISK = N'C:\Backups\Fullbackup.bak' WITH NORECOVERY
现在您可以将日志前滚到合适的时间点,并使数据库可供使用。请注意,STOPAT在数据库正在执行大容量日志时禁止执行。
RESTORE LOG pubs FROM DISK=N'C:\Backups\Logbackup.bak' WITH RECOVERY,STOPAT='02/11/2002 17:35:00'
例2:使用数据库标记将日志恢复到预定义时间点的语句
在事务日志中置入一个标记。请注意,被标记的事务至少须提交一个更新,以标记该日志。
BEGIN TRAN MyMark WITH MARK
UPDATE pubs.dbo.LastLogMark SET MarkTime = GETDATE()
COMMIT TRAN MyMark
按照您常用的方法备份事务日志。
BACKUP LOG pubs TO DISK='C:\Backups\Fullbackup.bak' WITH INIT
现在您可以将数据库恢复至日志标记点。首先恢复数据库,并使其为接受日志恢复做好准备。
RESTORE DATABASE pubs FROM DISK=N'C:\Backups\Fullbackup.bak' WITH NORECOVERY
现在将日志恢复至包含该标记的时间点,并使其可供使用。请注意,STOPAT在数据库正在执行大容量日志时禁止执行。
RESTORE LOG pubs FROM DISK=N'C:\Backups\Logbackup.bak' WITH RECOVERY,
STOPAT='02/11/2002 17:35:00'
—Microsoft SQL Server 开发团队 参考技术D 试试看把,我在oracle里用的...
create table tableName_bak
as
select * from tableName as of TIMESTAMP to_timestamp('20081126 103435','yyyymmdd hh24miss');
/*tableName是你要恢复的表,tableName_bak 是tableName的备份表,讲tableName_bak的数据恢复到tableName里面
'20081126 103435'根据你自己的情况改,改成你删掉数据之前的时间,不过这个办法只能查出2天左右的数据,时间久了估计不行 */
SQL Server数据恢复准备之TRUNCATE TABLE理解
当truncate table发生时,如何进行恢复,相信大部分人都会选择通过还原备份到truncate table前,然后将数据重新导入正式表中。
那么在SQL Server中是不是真的只有这种方法呢,当然不是,这也是本文即将介绍的内容,前提条件是SQL Server完整恢复模式(大容量日志模式未做测试,暂不介绍)。
首先,了解一下truncate table的一些相关知识
官档:
TRUNCATE TABLE 通过释放用于存储表数据的数据页删除数据,且仅在事务日志中记录页释放。
这句话包含的信息量是很大的,通过实验进行验证,解释如下:
truncate table时,数据库日志中不会记录确切的已删除值,只记录截断记录的页的ID,并且这些记录所占用的空间会被标识为可重写,
mdf中会暂时保留这些页内的数据,当有新事务写入这些页时,truncate table的数据将会被覆盖。
测试:
创建一张表,并插入数据
create table test_truncate(id int,name varchar(20),address varchar(20)) go insert into test_truncate select 1,'zhangsan','first road' go insert into test_truncate select 2,'wangxiao','second road' go
利用dbcc ind找到该表的数据页,如下PageType=1为数据页,即为:288
使用dbcc page查看数据页内容
PAGE: (1:288) BUFFER: BUF @0x000000000563C600 bpage = 0x0000000150020000 bhash = 0x0000000000000000 bpageno = (1:288) bdbid = 9 breferences = 0 bcputicks = 0 bsampleCount = 0 bUse1 = 56673 bstat = 0x10b blog = 0x7adb21cc bnext = 0x0000000000000000 PAGE HEADER: Page @0x0000000150020000 m_pageId = (1:288) m_headerVersion = 1 m_type = 1 m_typeFlagBits = 0x0 m_level = 0 m_flagBits = 0x8000 m_objId (AllocUnitId.idObj) = 489 m_indexId (AllocUnitId.idInd) = 256 Metadata: AllocUnitId = 72057594069975040 Metadata: PartitionId = 72057594062241792 Metadata: IndexId = 0 Metadata: ObjectId = 935674381 m_prevPage = (0:0) m_nextPage = (0:0) pminlen = 8 m_slotCnt = 2 m_freeCnt = 8021 m_freeData = 167 m_reservedCnt = 0 m_lsn = (49:7380:2) m_xactReserved = 0 m_xdesId = (0:0) m_ghostRecCnt = 0 m_tornBits = 0 DB Frag ID = 1 Allocation Status GAM (1:2) = ALLOCATED SGAM (1:3) = ALLOCATED PFS (1:1) = 0x61 MIXED_EXT ALLOCATED 50_PCT_FULL DIFF (1:6) = CHANGED ML (1:7) = NOT MIN_LOGGED Slot 0 Offset 0x60 Length 35 Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP VARIABLE_COLUMNS Record Size = 35 Memory Dump @0x000000006DDF8060 0000000000000000: 30000800 01000000 03000002 00190023 007a6861 0..............#.zha 0000000000000014: 6e677361 6e666972 73742072 6f6164 ngsanfirst road Slot 0 Column 1 Offset 0x4 Length 4 Length (physical) 4 id = 1 Slot 0 Column 2 Offset 0x11 Length 8 Length (physical) 8 name = zhangsan Slot 0 Column 3 Offset 0x19 Length 10 Length (physical) 10 address = first road Slot 1 Offset 0x83 Length 36 Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP VARIABLE_COLUMNS Record Size = 36 Memory Dump @0x000000006DDF8083 0000000000000000: 30000800 02000000 03000002 00190024 0077616e 0..............$.wan 0000000000000014: 67786961 6f736563 6f6e6420 726f6164 gxiaosecond road Slot 1 Column 1 Offset 0x4 Length 4 Length (physical) 4 id = 2 Slot 1 Column 2 Offset 0x11 Length 8 Length (physical) 8 name = wangxiao Slot 1 Column 3 Offset 0x19 Length 11 Length (physical) 11 address = second road DBCC execution completed. If DBCC printed error messages, contact your system administrator.
可以看到数据页中存在的记录
Slot 0 Column 1 Offset 0x4 Length 4 Length (physical) 4 id = 1 Slot 0 Column 2 Offset 0x11 Length 8 Length (physical) 8 name = zhangsan Slot 0 Column 3 Offset 0x19 Length 10 Length (physical) 10 address = first road Slot 1 Column 1 Offset 0x4 Length 4 Length (physical) 4 id = 2 Slot 1 Column 2 Offset 0x11 Length 8 Length (physical) 8 name = wangxiao Slot 1 Column 3 Offset 0x19 Length 11 Length (physical) 11 address = second road
执行truncate table后
可以看到数据页中仍保留着truncate table的相关记录。
那么,truncate table的第二种恢复方法就显而易见了,在这些数据被覆盖之前,从页面中将数据提取出来,并恢复到表中。
以上是关于sql恢复修改前数据的主要内容,如果未能解决你的问题,请参考以下文章