随笔分类 -  SQL SERVER 复制

sql server复制相关
摘要:执行原因:涉及2张表,其中一张表是excel ,被更新的表在数据库中,要更新的数据有80万,被更新的数据是近2千万的表,涉及同步到6个地方。按理来说批量更新也是可行的,但是由于时间限制,加上功能上的限制还是决定用别的方法(即复制存储过程)。之前的方法是:把excel的数据解析出来,然后每5000更新一次,间隔10s ,每个sheet为5万。中间会有阻塞的情况可以随时停掉重新执行。 麻烦的地方在于执行的时候需要监控分发数据库,避免堆积太多命令导致阻塞现在的方法是:把语句拆为分批的执行的,把excel的数据导入到一张表中,并将此表进行同步,然后把存储过程也进行同步,在发布属性 中 选择... 阅读全文
posted @ 2013-12-20 18:16 _cc 阅读(3127) 评论(0) 推荐(1) 编辑
摘要:在复制中,有的时候会出现订阅端被人修改,导致发布端插入数据的时候主键冲突,这个时候我们要做的不是直接的初始化太过暴力,而对于生产环境来说,这样的操作代价也会很大。下面会说几种方法来处理冲突:1、 查看出错的复制命令的具体内容如果在复制监视器的订阅详细信息中查看分发代理出错信息时,如果发错发生在应用复制命令时,则可以看到类似信息:尝试的命令: If @@TRANCOUNT > 0 rollback tran (事务序列号:.......) 错误消息: 违反了primary key 约束'%s'。不能在对象'%S'中插入重复键.如下例子:尝试的命令:if @@ 阅读全文
posted @ 2013-08-07 16:34 _cc 阅读(5674) 评论(0) 推荐(2) 编辑
摘要:1. tablediff 是什么?tablediff 实用工具用于比较两个非收敛的表中的数据,它对于排除复制拓扑中的非收敛故障非常有用。2. tablediff 用哪些用法?1) . 在充当复制发布服务器的 Microsoft SQL Server 实例中的源表与充当复制订阅服务器的一个或多个 SQL Server 实例中的目标表之间进行逐行比较。2) . 通过只比较行数和架构可以执行快速比较。3) . 执行列级比较。4) . 生成 Transact-SQL 脚本,用以修复目标服务器中的差异,以使源表和目标表实现收敛。5) . 将结果记录到输出文件或目标数据库的表中。 3. tablediff 阅读全文
posted @ 2013-08-05 18:00 _cc 阅读(6715) 评论(2) 推荐(2) 编辑
摘要:对于大批量的更新操作 又涉及同步,如果可以:a) 最好是使用最小粒度的维护,可以减少每次维护的工作量,也减少备份 (建立作业JOB批量操作,定期进行删除)b) 如果是急需,又涉及到同步,那么可以把同步拿掉进行删除,完成之后再建上(避免出现线上阻塞,影响性能。同步会同步大量日志,更新完成之后再重建同步使用的不是日志同步而是快照,所以速度要比用日志同步快很多。)监控:可以用 sp_who2 或者 可以通过查询 sysprocess 获取是否有阻塞,在更新的同时,查看同步的监控通常是看SqlMonitor,以便于对当前的情况进行随时的调整。1. 我们可以通过以下查询看到目前有多少的命令没有分发出去, 阅读全文
posted @ 2013-07-24 11:27 _cc 阅读(1480) 评论(2) 推荐(2) 编辑
摘要:复制中常用到的表:use distributiongoSELECT * FROM dbo.MSrepl_transactions WITH(NOLOCK) --表中每个重复事务占一行select * from dbo.MSrepl_commands with(nolock) --表包含复制命令行--比如一个更新语句,影响行数为行,transactions表里会有一行,commands表里多行select * from dbo.MSrepl_errors with( nolock) -- 表包含具有扩展分发代理和合并代理失败信息的行 select * fro... 阅读全文
posted @ 2013-07-24 10:48 _cc 阅读(457) 评论(0) 推荐(2) 编辑
摘要:Transact-SQL 参考sp_replication_agent_checkup检查每个分发数据库的复制代理程序,这些复制代理程序正在运行但在指定的心跳信号间隔内没有历史记录。此存储过程在分发服务器的任何数据库上执行。语法sp_replication_agent_checkup [ [ @heartbeat_interval = ] heartbeat_interval ]参数[@heartbeat_interval =] 'heartbeat_interval'是代理程序在不记录进度消息的情况下可以运行的最长分钟数。heartbeat_interval 的数据类型为 i 阅读全文
posted @ 2013-07-23 17:59 _cc 阅读(390) 评论(0) 推荐(0) 编辑
摘要:关于同步的错误:The subscription(S) have been marked inactive and must be reinitialized. NoSync subscriptions will need to be dropped and recreated.应该是之前的同步有错误,同步的命令如果同步失败的话,会保留小时,如果一个订阅出错,72 小时内没有处理的话,就会出现这种问题因为复制的命令过期被删除,所以同步的命令有缺少,这个时候订阅需要重新做MSdistribution_history 能够查到的最早数据是日期,如果一直是报这样的错误,应该在更早之前同步有有出错了u 阅读全文
posted @ 2013-07-23 17:58 _cc 阅读(674) 评论(1) 推荐(0) 编辑
摘要:复制代理说明: 复制代理执行许多与复制有关的任务,其中包括创建架构和数据副本、检测发布服务器或订阅服务器上的更新以及在服务器之间传播更改。 默认情况下,复制代理在 MicrosoftSQL Server 代理作业步骤下运行。 由于这些代理完全是可执行文件,因此可以从命令行和批处理脚本直接调用它们。 每个复制代理支持一组运行时参数,用于控制代理的运行方式;这些参数在代理配置文件或命令行中指定。可以通过下图来看复制代理相关的JOB与计划:清除作业说明默认调度代理历史记录清除:分发从分发数据库中删除复制代理历史记录。每十分钟运行一次分发清除:分发从分发数据库中删除复制的事务。 停用在最大分发保持期. 阅读全文
posted @ 2013-07-23 15:29 _cc 阅读(2410) 评论(2) 推荐(2) 编辑
摘要:SQL SERVER将复制方式分为三大类,每一个发布只能有一种复制类型,分别为:快照复制,事务复制和合并复制,如下图。快照复制快照复制将发布的数据库所有表的某个瞬间数据做成一个镜像,然后一次性复制到订阅服务器。中间的更新不会像其它复制类型那样自动传送到订阅服务器。由此可以看出选择快照复制的的合格环境是:1、用户允许订阅服务器使用相对己过时的数据副本并且需要复制的整体数据量较小。2、数据库在短期内出现了大量更改并且需要复制的整体数据量较小。事务复制 快照复制每次同步的是整个订阅的内容。如果发布包括非常大的表,那么势必每次同步都需要生成很大的快照文件夹并将这些快照文件夹逐一导入要订阅数据库中,因此 阅读全文
posted @ 2013-07-22 11:05 _cc 阅读(1752) 评论(0) 推荐(0) 编辑
摘要:SQL SERVER中复制的删除以下方法均为 事务复制 --PUSH方式1、删除单个的发布 : 复制--> 本地发布--> 右击--> 删除,如下图,然后再把对应的订阅服务器删除掉,或者等待执行:sp_MSdistribution_cleanup 的JOB(分发清除: distribution)默认订阅72小时失效之后自动删除。2、删除全部的发布: 复制--> 右击 --> 禁用发布和分发,如下图,这个会同时的把分发服务器的配置清掉,需要重新配置的哦。。其实只是执行了一个脚本use [master]exec sp_dropdistributor @no_check 阅读全文
posted @ 2013-07-19 15:56 _cc 阅读(5952) 评论(0) 推荐(1) 编辑
摘要:--============================================-- 在发布服务器执行--============================================-- ========================================-- 1. 标记分发服务器--use master--go--EXEC sp_adddistributor-- @distributor = @@SERVERNAME , -- 分发服务器名称 N'HOUYAJUN'-- @password = N'' ... 阅读全文
posted @ 2013-06-23 15:44 _cc 阅读(1018) 评论(0) 推荐(1) 编辑
摘要:--=========================================================-- 在分发服务器上执行--=========================================================/*-- 注意: 此处所有密码参数均使用 NULL 或空字符串代替。--*/use masterGO--========================================================-- 1. 将服务器标记为分发服务器DECLARE @server_name sysnameSELECT @server_n 阅读全文
posted @ 2013-06-23 15:37 _cc 阅读(1337) 评论(0) 推荐(1) 编辑
摘要:--1、分发服务器sp_adddistributor在 sys.sysservers 表中创建一个条目(如果该表中没有条目),将服务器条目标记为分发服务器,并存储属性信息。 此存储过程在分发服务器上对主数据库执行以注册服务器,并将其标记为分发服务器。 如果是远程分发服务器,此存储过程还在发布服务器上对主数据库执行以注册远程分发服务器。sp_adddistributiondb创建新的分发数据库并安装分发服务器架构。分发数据库存储过程、架构以及用于复制的元数据。此存储过程在分发服务器的主数据库中执行,以便创建分发数据库并安装启用复制分发所需的表和存储过程。--2、发布服务器 :adddistpub 阅读全文
posted @ 2013-06-22 21:46 _cc 阅读(476) 评论(0) 推荐(1) 编辑
摘要:创建发布的时候出现这个图:警告内容如下:无法为可更新的订阅设置发布服务器登录名。可能需要使用 sp_link_publication. 直接在订阅服务器计算机上设置它。其他信息:执行 Transact-SQL 语句或批处理时发生了异常。 (Microsoft.SqlServer.ConnectionInfo)服务器 'HOUYAJUN' 上的 MSDTC 不可用。已将数据库上下文更改为 'TEST'。 (Microsoft SQL Server,错误: 8501)有关帮助信息,请单击: http://go.microsoft.com/fwlink?ProdNam 阅读全文
posted @ 2013-05-30 16:22 _cc 阅读(1682) 评论(1) 推荐(0) 编辑