您的位置:首页 > 数据库

SQLServer: 用 ApexSQLLog 恢复 SQL Server 数据

2016-01-13 18:02 531 查看
LogExplorer最高只支持SQL Server2005, 而且使用也不方便。 

最近发现一款工具非常不错, 那就是 ApexSQLLog。

官网最新发布信息:点击打开链接

 ApexSQLLog2014ApexSQLLog2016
最高支持SQLServer版本20122016 CP3
测试SQLServer版本20052014
测试OSWin10,Win2003Win10,Win2008
结果基本能恢复,极少数连接不上官方体验版只能恢复10行;

其它版本在Win10上连接有异常,

在Win2008上试验成功。
备注 必须先安装framework4.5.2
官方体验版下载地址 点击打开链接
其它版下载地址点击打开链接点击打开链接
使用步骤:













测试脚本:

/*
以下代码要执行两次:
1. 将数据库恢复模式改为“完整”;
2. 将数据库恢复模式改为“简单”;
每次完成后用 ApexSqlLog 查看是否有相关的记录, 以及是否能生成恢复的脚本。
*/
USE test
GO
--创建测试表
IF OBJECT_ID('dbo.apexTest','U') IS NOT NULL
BEGIN
DROP TABLE dbo.apexTest
END
GO
CREATE TABLE dbo.apexTest (
[id] BIGINT,
[name] NVARCHAR(20),
[account] VARCHAR(20),
[birthday] DATETIME,
[isDeleted] BIT,
CONSTRAINT PK_apexTest PRIMARY KEY (
id ASC
)
)
GO
SET NOCOUNT ON
--1. 插入数据
INSERT INTO dbo.apexTest(id,name,account,[birthday],isDeleted) VALUES(1,'王明', 'ming', '2005-01-01', 0)
INSERT INTO dbo.apexTest(id,name,account,[birthday],isDeleted) VALUES(2,'张华', 'hua', '2006-02-02', 0)
INSERT INTO dbo.apexTest(id,name,account,[birthday],isDeleted) VALUES(3,'李梦', 'meng', '2007-03-03', 1)
INSERT INTO dbo.apexTest(id,name,account,[birthday],isDeleted) VALUES(4,'李小', 'xiao', '2008-04-04', 1)

--2. 更新数据
UPDATE dbo.apexTest SET [name]='张林' where id=2

--3. 删除数据
DELETE FROM dbo.apexTest WHERE isDeleted=1

/*
---------------------------- 下面是生成的恢复脚本 ----------------------------
-- 生成了两条插入脚本和一条更新脚本, 正好能对应
-- 第一次:完整 (恢复模式)

--	DELETE (0000002F:00000094:0004) done at 2016-01-13 14:32:45.770 by dba in transaction 0000:000004DC (Committed)
INSERT INTO [dbo].[apexTest] ([id], [name], [account], [birthday], [isDeleted]) VALUES (4, N'李小' COLLATE Chinese_PRC_CI_AS, N'xiao' COLLATE Chinese_PRC_CI_AS, '20080404 00:00:00.000', 1)

--	DELETE (0000002F:00000094:0002) done at 2016-01-13 14:32:45.770 by dba in transaction 0000:000004DC (Committed)
INSERT INTO [dbo].[apexTest] ([id], [name], [account], [birthday], [isDeleted]) VALUES (3, N'李梦' COLLATE Chinese_PRC_CI_AS, N'meng' COLLATE Chinese_PRC_CI_AS, '20070303 00:00:00.000', 1)
GO

--	UPDATE (0000002F:0000008F:0002) done at 2016-01-13 14:32:45.766 by dba in transaction 0000:000004DA (Committed)
BEGIN TRANSACTION

UPDATE [dbo].[apexTest] SET [name] = N'张华' COLLATE Chinese_PRC_CI_AS WHERE [id] = 2
IF @@ROWCOUNT <= 1 COMMIT TRANSACTION ELSE BEGIN ROLLBACK TRANSACTION; PRINT 'ERROR: STATEMENT AFFECTED MORE THAN ONE ROW. ALL THE CHANGES WERE ROLLED BACK.' END
GO

--  第二次:简单(恢复模式)
--	DELETE (0000002F:0000019A:0004) done at 2016-01-13 17:33:17.630 by dba in transaction 0000:000004F9 (Committed)
INSERT INTO [dbo].[apexTest] ([id], [name], [account], [birthday], [isDeleted]) VALUES (4, N'李小' COLLATE Chinese_PRC_CI_AS, N'xiao' COLLATE Chinese_PRC_CI_AS, '20080404 00:00:00.000', 1)
--	DELETE (0000002F:0000019A:0002) done at 2016-01-13 17:33:17.630 by dba in transaction 0000:000004F9 (Committed)
INSERT INTO [dbo].[apexTest] ([id], [name], [account], [birthday], [isDeleted]) VALUES (3, N'李梦' COLLATE Chinese_PRC_CI_AS, N'meng' COLLATE Chinese_PRC_CI_AS, '20070303 00:00:00.000', 1)
GO
--	UPDATE (0000002F:00000199:0002) done at 2016-01-13 17:33:17.630 by dba in transaction 0000:000004F8 (Committed)
BEGIN TRANSACTION
UPDATE [dbo].[apexTest] SET [name] = N'张华' COLLATE Chinese_PRC_CI_AS WHERE [id] = 2
IF @@ROWCOUNT <= 1 COMMIT TRANSACTION ELSE BEGIN ROLLBACK TRANSACTION; PRINT 'ERROR: STATEMENT AFFECTED MORE THAN ONE ROW. ALL THE CHANGES WERE ROLLED BACK.' END
GO
*/

但这毕竟不是常规的方法, 只能作为挽救数据的最后一招,特别是恢复模式设置为“简单”的情况下很可能是无法恢复的。 

平时应做好日常备份,有条件和需要的做镜像、Alwayson集群等。

对重要的业务数据表可以保存到CDC变更表(SQLSever2008+),查看和管理都会方便许多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: