SQLServer: 用 ApexSQLLog 恢复 SQL Server 数据

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+),查看和管理都会方便许多。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值