【问题标题】:Sql Sync causing source server to run out of memory causing error during sync to client serverSql Sync 导致源服务器内存不足导致同步到客户端服务器期间出错
【发布时间】:2012-12-28 06:25:06
【问题描述】:

我正在使用 Microsoft Sync Framework 2.1 将我的生产 SQL Server 2008 R2 数据库与我的故障转移 SQL Server 2008 R2 Express 服务器同步,它工作了一段时间,然后在同步源(生产 SQL Server)几天后strong>由于同步而开始耗尽内存(RAM)。

它没有停止运行或任何事情或导致网站交易失败,但如果生产盒上的内存不足,同步框架开始抛出以下错误。

任何人都看到过这个或知道它为什么这样做以及是否有修复?

这是错误..

Microsoft.Synchronization.Data.DbSyncException:正在枚举的后台线程中发生意外异常 变化。有关详细信息,请参阅内部异常。

System.Data.SqlClient.SqlException:系统不足 资源池“内部”中的内存来运行此查询。

在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常, Boolean breakConnection, Action1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource
1 完成, Int32 超时, Task& 任务, 布尔 asyncWrite)
在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior、runBehavior、布尔返回流、字符串 方法)
在 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior 行为,字符串方法)
在 System.Data.SqlClient.SqlCommand.ExecuteReader()
在 System.Data.SqlClient.SqlCommand.DeriveParameters()
在 System.Data.SqlClient.SqlCommandBuilder.DeriveParameters(SqlCommand 命令)
在 Microsoft.Synchronization.Data.ManagementUtils.DeriveParameters(SqlCommand 命令,IEnumerable`1 列)
在 Microsoft.Synchronization.Data.SqlServer.SqlSyncAdapter.SetCommandSessionParameters(IDbCommand 命令,字符串命令名)
在 Microsoft.Synchronization.Data.RelationalSyncProvider.EnumerateChangesInBatchesInternal(对象 批量生产者)
--- 内部异常堆栈跟踪结束 ---

在 Microsoft.Synchronization.Data.DbSyncBatchProducer.DequeueBatch()
在 Microsoft.Synchronization.Data.RelationalSyncProvider.ConsumeBatchFromProducer(DbSyncScopeMetadata 范围元数据)
在 Microsoft.Synchronization.Data.RelationalSyncProvider.GetChanges(DbSyncScopeMetadata scopeMetadata, DbSyncSession DbSyncSession, UInt32 memoryBatchSize)
在 Microsoft.Synchronization.Data.RelationalSyncProvider.GetChangeBatch(UInt32 batchSize, SyncKnowledge destinationKnowledge, Object& 更改数据检索器)
在 Microsoft.Synchronization.KnowledgeProviderProxy.GetChangeBatch(UInt32 dwBatchSize, ISyncKnowledge pSyncKnowledge, ISyncChangeBatch& ppChangeBatch、对象和 ppUnkDataRetriever)
在 Microsoft.Synchronization.CoreInterop.ISyncSession.Start(CONFLICT_RESOLUTION_POLICY resolutionPolicy, _SYNC_SESSION_STATISTICS& pSyncSessionStatistics)
在 Microsoft.Synchronization.KnowledgeSyncOrchestrator.DoOneWaySyncHelper(SyncIdFormatGroup sourceIdFormats, SyncIdFormatGroup destinationIdFormats, KnowledgeSyncProviderConfiguration 目的地配置, SyncCallbacks DestinationCallbacks,ISyncProvider sourceProxy, ISyncProviderdestinationProxy,ChangeDataAdapter callbackChangeDataAdapter, SyncDataConverter conflictDataConverter, Int32& changesApplied, Int32& changesFailed)
在 Microsoft.Synchronization.KnowledgeSyncOrchestrator.DoOneWayKnowledgeSync(SyncDataConverter sourceConverter, SyncDataConverter destinationConverter, SyncProvider sourceProvider, SyncProviderdestinationProvider, Int32& changesApplied, Int32& changesFailed)
在 Microsoft.Synchronization.KnowledgeSyncOrchestrator.Synchronize()
在 Microsoft.Synchronization.SyncOrchestrator.Synchronize()

【问题讨论】:

  • 注意:如果我重新启动生产 SQL 框,它会再次开始工作。但我想知道它为什么会发生以及是否有修复(补丁明智或设置明智)

标签: sql-server-2008-r2 microsoft-sync-framework failover


【解决方案1】:

尝试通过设置 MemoryDataCacheSize 属性来启用批处理。

【讨论】:

  • 我想我做到了,但我稍后会检查
  • 我已经这样做了 uint memoryDataCacheSize = 524288; _SyncOrchestrator.LocalProvider = new SqlSyncProvider(scope, ClientConn) { MemoryDataCacheSize = memoryDataCacheSize }; // 将 orchestrator 的主 sql 提供程序设置为与 // 主服务器数据库中的范围关联的服务器同步提供程序 _SyncOrchestrator.RemoteProvider = new SqlSyncProvider(scope, ServerConn) { MemoryDataCacheSize = memoryDataCacheSize };
  • 您的 SQL Server 机器上有多少内存以及 SQL Server 的最大内存设置是什么?您的数据库有多大,您实际同步了多少数据?
  • 4G 内存。最大内存为:2147483647 MB​​(默认)。 DB 大小 = 数据文件 - 492MB,日志文件 = 14.1 GB。至于我实际同步了多少数据......我只是同步表与变化的数据,而不是永远不会改变的静态表。我的同步每 30 分钟只需要 5-20 秒。初始同步大约需要 15-20 分钟。
猜你喜欢
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多