可以定期将MS-SQL表格导出到Linux上的另一个数据库格式,而无需完成转储?

我们有一个运行SQL-Server的生产服务器,它保存我们的后端数据,例如客户信息,销售发票等。这些数据的性质是“旧”数据可以改变,例如客户更新他们的地址。

目前,我们使用Windows Server 2008实例作为研究服务器,以便我们可以在其上运行MS-SQL从站,从事活动服务器以事务方式进行复制。 然后,我们每天从从机输出平面文件到我们的研究模式,这恰好是一个MySQL数据库。 我们通过将从数据读入一些algorithm来实现这一点,这些algorithm修改并将数据写入MySQL研究数据库。 我们删除研究数据库中的所有表格,并每天进行干净的导入以处理生产数据库和从属数据库中可能发生变化的“旧”数据。

因此,从实况数据库到我们的研究模式,实质上总是需要每天进行完整的转储和重新导入,这对我们来说是很好的,因为这些都是在本地完成的。

不幸的是,我们在MS-SQL复制和Windows服务器上都遇到了很多问题。 这些问题的来源实际上大多是以人为本而不是技术。 但是,我们增加了一些问题,我们不得不使用其他Linux应用程序服务器,因为在Windows上运行我们需要的一些平台/堆栈在Windows上很难。

我想把我们的研究服务器移动到一个我更熟悉的,能够正确pipe理和configuration的Linux机器上,但是我不知道最好的行动计划,从实时MS-SQL数据库到我们的研究MySQL模式,因为我们现在不会有活动复制到奴隶的选项。

基本上:

  • 大约有5个SQL Server表总共〜3GB
  • 我们的IT人员担心生产服务器上的IO负载,如果我们每天做3GB的出口(目前我们做事务复制到一个从机,然后从从机输出3GB)。

我们将SQL-Server数据更新到我们的研究模式的更新过程期望每天都进行整个导入,但是当然从平面文件/ SQL文件或表中导入并不重要。

所以,我们知道,无论如何,我们将会对SQL-Server数据进行平面文件导入,但问题是,是否有一种明智的方式来每天从MS-SQL表中导出数据,而不必做一个完整的转储?

不是在谈论复制,因为在接收端不会有MS-SQL实例,因为它是一个Linux服务器。 但是,是否可以从MS-SQL服务器只导出已经修改了字段的行? 也就是说,在不修改SQL-Server表的schema的情况下当然要标记编辑的行… 🙂

SQL服务器可以保存修改的行或任何东西的日志?

如果没有这一切,是否有人有一个关于是否预计在每次进行3GB导出时,预算不足的SQL Server实例会跌倒? 这一点我不是真的买…我们正在谈论在早上几个小时的数据库负载最小(我们是一个小型的B2B互联网零售商,所以不会期望在这些小时内进行) 。

谢谢!

我知道你提到你不想修改这些表,但是你有没有想过在表上添加一个更新/插入触发器来写一个drop文件,你的linux机器可以拿起并更新MySQL服务器?

就像是

USE [DatabaseName] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER TRIGGER [dbo].[trig_WriteDropfileOnChange] ON [dbo].[tableName] FOR INSERT, UPDATE AS -- declare vars DECLARE @RecordId bigint, @RetCode int, @FileSystem int, @FileHandle int, @MyDate varchar(255), @FileName varchar(255) -- build filename SET @MyDate = getDate() SET @MyDate = REPLACE(@MyDate, ':', '') SET @MyDate = REPLACE(@MyDate, ' ', '') SET @MyDate = REPLACE(@MyDate, '-', '') SET @MyDate = REPLACE(@MyDate, '.', '') SELECT @RecordID = myfield FROM INSERTED SET @FileName = '\\path\to\drop\directory\' + @MyDate + '.txt' EXECUTE @RetCode = sp_OACreate 'Scripting.FileSystemObject', @FileSystem OUTPUT IF (@@ERROR|@RetCode > 0 Or @FileSystem < 0) RAISEERROR('could not create FileSystemObject', 16, 1) EXECUTE @RetCode = sp_OAMethod @FileSystem, 'OpenTextFile', @FileHandle OUTPUT, @FileName, 2, 1 IF (@@ERROR|@RetCode > 0 Or @FileHandle < 0) RAISEERROR('Could not open file.', 16, 1) EXECUTE @RetCode = sp_OAMethod @FileHandle, 'WriteLine', NULL, CONVERT(varchar, @RecordId) IF (@@ERROR|@RetCode > 0 Or @FileHandle < 0) RAISEERROR('Could not write to file.', 16, 1) EXECUTE @RetCode = sp_OAMethod @FileHandle, 'Close', NULL IF (@@ERROR|@RetCode > 0) RAISEERROR('Could not close file.', 16, 1) EXEC sp_OADestroy @FileSystem 

如果你想保留这个“奴隶”的SQL Server,我会build议忘记复制只是每日备份到服务器上,或摆脱恢复事务日志备份。 数据库pipe理员应该有这些方便,你只需要说服他们帮助你将生产数据自动恢复到“奴隶”框。 但是,听起来,你宁愿奴隶的盒子消失。

我会详细查看“更改跟踪”和“更改数据捕获”function。 根据我所阅读的内容,“更改跟踪”通过提供主键值列表来标识已监视表中已更改的行。 “更改数据捕获”提供更多信息,包括捕获实际值前后的实际值,以进行全面审计。 这种手工波浪式的方式是,你会从SQL Server表中读取描述已经改变的内容,然后更新你的mysql数据库。 没有花哨的复制,或代理,或任何东西。 这里是MS的这些function的着陆页 。

在我看来,你可以使用更改跟踪,并用SQL Server中的当前好值覆盖mysql中的任何内容。 我希望更改数据捕获将更多的负载到框中比变化跟踪。

至于每日3GB的提取:我看到“过度configuration”的服务器性能不佳的SAN存储。 拥有大量内核并不能解决所有问题。 隔夜时段还经常有其他的事情发生,比如备份,碎片整理,其他摘录,大量报告等。对于我来说,“networking零售商”意味着您可以随时获得stream量。 数据库pipe理员可能只是谨慎的添加任何不必要的负载。