[翻译]当分发数据库增长到25G时如何解决

有时候,分发数据库(Distribution Database)会增长得非常大,那么如何解决呢,请看Chris Skorlinski,  Microsoft SQL Server Escalation Services 的解决方案。

原文地址:How to resolve when Distribution Database is growing huge (+25gig), 本人翻译水平有限,如果有什么地方翻译不当或不对的地方,请不吝指教!

是的,我当然知道大数据库是相对的,但总体来
说,如果你看到分发数据库越来越大增长到25G,这意味着清理进程很难删除复制事务,后面我将介绍如何以及为什么清理过程会这样。但是现在我想介绍一种我
们经常用的技巧从分发数据清除数据行。这个解决方案包括修改SQL复制存储过程,以及增加每笔事务删除的行数,如果你对代码修改感到不舒服,直接跳到
STEP 7吧。

第一篇发布出来的是“保守”的方法,接下来,我会发表一些更“激进”的解决方案。

1) 保存清理删除msrepl_commands对象的srepl_commands存储过程的原始脚本

              sp_helptext  sp_MSdelete_publisherdb_trans

2) 将CREATE改为ALTER

              ALTER PROCEDURE sp_MSdelete_publisherdb_trans

3)改变三处DELETE操作,从2000改为100000行

              DELETE TOP(2000) MSrepl_commands . . .

4) 保存msrepl_transaction 清理存储过程sp_MSdelete_dodelete的原始代码

             sp_helptext sp_MSdelete_dodelete

5)将CREATE关键字改为ALTER

             ALTER PROCEDURE sp_MSdelete_dodelete

6)改变两处删除MSrepl_transactions记录的地方,将5000改为100000行。

           delete TOP(5000) MSrepl_transactions . . .

7) Determine oldest day containing transactions 决定保留事物多少天

Code Snippet

  1. --(shows breakout by day, by hour.  Took 2 hours on 350million rows, 100gb distribtuion db)
  2. SELECT T.[publisher_database_id]
  3.     ,  datepart(mm,[entry_time]) 'month'
  4.     ,  datepart(dd,[entry_time]) 'day'
  5.     ,  datepart(hh,[entry_time]) 'hour'
  6.     ,  count(C.[xact_seqno]) 'count of commands'
  7. FROM [distribution].[dbo].[MSrepl_transactions](nolock) T
  8. JOIN [MSrepl_commands](nolock) C
  9. ON T.[xact_seqno] = C.[xact_seqno]
  10. GROUP BY T.[publisher_database_id]
  11.   ,datepart(mm,[entry_time])
  12.   , datepart(dd,[entry_time])
  13.   , datepart(hh,[entry_time])
  14. order by 1,2,3,4
  15.  
  16. --Or, just select oldest 10 rows and note the entry_time stamp.
  17. --(select took 5 minutes on 350million rows, 100gb distribtuion db)
  18. SELECT TOP 10 * FROM [distribution].[dbo].[MSrepl_transactions](nolock)

8)通过SSMS或TSQL作业执行清理以前的事务(24小时*5天=120),然后继续执行减少@max_distretention的执行

Code Snippet

  1. EXEC dbo.sp_MSdistribution_cleanup @min_distretention = 0, @max_distretention = 120
  2.  
  3. Example output: (4 hours to removed 340million rows)
  4.  
  5. Removed 3493 replicated transactions consisting of 343877158 statements in 15043 seconds (22859 rows/sec).

Hope you found this helpful,

希望这个对你有用。

Chris Skorlinski,  Microsoft SQL Server Escalation Services

时间: 2024-10-24 17:51:29

[翻译]当分发数据库增长到25G时如何解决的相关文章

数据库日志文件丢失时的恢复步骤

恢复|数据|数据库 The information in this article applies to: - Microsoft SQL Server 7.0,2000      数据库日志文件丢失时的恢复步骤Revision History:Version Date Creator Description 1.0.0.1 2003-3-25 郑昀 草稿        Implementation Scope:本文是用于向Microsoft SQL Server维护人员描述我误删除了数据库的事

SQL Server中聚合历史备份信息对比数据库增长的方法_MsSql

很多时候,在我们规划SQL Server数据库的空间,或向存储方面要空间时,都需要估算所需申请数据库空间的大小,估计未来最简单的办法就是看过去的趋势,这通常也是最合理的方式. 通常来讲,一个运维良好的数据库都需要做定期基线(baseline),有了基线才会知道什么是正常.一个简单的例子例如,一些人的血压平常偏低,那么80的低压对他来说就是不正常了.但现实情况是大多数系统并没有采集基线的习惯,因此在需要规划空间想要看历史增长时,就没有过去精确的数据了. 一个解决办法就是通过查看历史备份的大小来看过

SQL Server中聚合历史备份信息对比数据库增长的方法

很多时候,在我们规划SQL Server数据库的空间,或向存储方面要空间时,都需要估算所需申请数据库空间的大小,估计未来最简单的办法就是看过去的趋势,这通常也是最合理的方式. 通常来讲,一个运维良好的数据库都需要做定期基线(baseline),有了基线才会知道什么是正常.一个简单的例子例如,一些人的血压平常偏低,那么80的低压对他来说就是不正常了.但现实情况是大多数系统并没有采集基线的习惯,因此在需要规划空间想要看历史增长时,就没有过去精确的数据了. 一个解决办法就是通过查看历史备份的大小来看过

sqlite删除数据库中的数据时偶尔会出现错误

问题描述 sqlite删除数据库中的数据时偶尔会出现错误 java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed. 求助,connection pool 是啥啊,求大神指教. 解决方案 如果确定不是连接被关闭,那还有可能就是多线程访问sqlite,sqlite数据库是单线程操作的,那么当N多个Thread同时调用的时候,可能报这错误.这也就

ofbiz+oracle-刚学习ofbiz,将ofbiz的数据库改成oracle时,出现如下错误,求帮忙

问题描述 刚学习ofbiz,将ofbiz的数据库改成oracle时,出现如下错误,求帮忙 刚学习ofbiz ,想将ofbiz数据库改成oracle,我改了配置文件之后,ant load-demo ,没有报错,然后ant start后抱如下错,改怎么解决啊.谢谢 2013-12-11 13:41:21,694 (catalina-startup-0) [ UtilXml.java:1060:ERROR] XmlFileLoader: File file:/E:/Project 10/ofbiz/s

建立数据库链的同义词时所应注意的问题

建立包含数据库链的同义词时需要额外的注意,否则很可能会出现问题. 如果同义词指向当前用户的对象,那么不会存在任何问题: SQL> CONN YANGTK/YANGTK@YTK已连接.SQL> CREATE DATABASE LINK TEST2 CONNECTTO TEST IDENTIFIED BY TEST USING 'TEST2';数据库链接已创建.SQL> SELECT COUNT(*)FROM TEST@TEST2;COUNT(*)----------5SQL>CREA

mysql-再往数据库中添加数据时,起初可以添加进去,之后不知道是把电脑关了还是怎么老报错,而且添加不进去了

问题描述 再往数据库中添加数据时,起初可以添加进去,之后不知道是把电脑关了还是怎么老报错,而且添加不进去了 Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if

java-当用JDBC向数据库中插入数据或从数据库中提取数据时,为何有时中文字符会显示为乱码?

问题描述 当用JDBC向数据库中插入数据或从数据库中提取数据时,为何有时中文字符会显示为乱码? 当用JDBC向数据库中插入数据或从数据库中提取数据时,为何有时中文字符会显示为乱码? 怎么才能解决问题,跟jdbc driver Manager的设置有关系吗? 解决方案 数据库字符集 与 页面编码 都使得 是 uft-8?得统一 解决方案二: 建议编码格式采用UTF-8的格式 解决方案三: 在使用数据的每一个节点上,其编码方式必须要一致否则就会出现乱码.特别是使用MySQL时,客户端,连接器.数据库

从数据库生成edmx 运行时出错,无法映射

问题描述 从数据库生成edmx运行时出错错误信息:Thetype'neosoft_nnil.users'wasnotmapped.CheckthatthetypehasnotbeenexplicitlyexcludedbyusingtheIgnoremethodorNotMappedAttributedataannotation.Verifythatthetypewasdefinedasaclass,isnotprimitive,nestedorgeneric,anddoesnotinherit