tablediff 实用工具/数据同步
--------------------
tablediff 实用工具
tablediff 实用工具用于比较两个非收敛的表中的数据,它对于排除复制拓扑中的非收敛故障非常有用。可以从命令提示符或在批处理文件中使用该实用工具执行以下任务:
在充当复制发布服务器的 Microsoft SQL Server 实例中的源表与充当复制订阅服务器的一个或多个 SQL Server 实例上的目标表之间进行逐行比较。
通过只比较行数和架构可以执行快速比较。
同时比较多个目标服务器上的目标表。
执行列级比较。
生成 Transact-SQL 脚本,用以修复目标服务器上的差异,以使源表和目标表实现收敛。
将结果记录到输出文件或目标数据库的表中。
语法
tablediff
[ -? ] |
{
-sourceserver source_server_name[\instance_name]
-sourcedatabase source_database
-sourcetable source_table_name
[ -sourceschema source_schema_name ]
[ -sourcepassword source_password ]
[ -sourceuser source_login ]
[ -sourcelocked ]
{
-destinationserver destination_server_name[\instance_name]
-destinationdatabase subscription_database
-destinationtable destination_table
[ -destinationschema destination_schema_name ]
[ -destinationpassword destination_password ]
[ -destinationuser destination_login ]
[ -destinationlocked ]
[ , ... n ]
}
[ -b large_object_bytes ]
[ -c ]
[ -dt ]
[ -et table_name ]
[ -f ]
[ -o output_file_name ]
[ -q ]
[ -t connection_timeouts ]
}
参数
[ -? ]
返回受支持参数的列表。
-sourceserver source_server_name[\instance_name]
源服务器的名称。指定 SQL Server 默认实例的 source_server_name。指定 SQL Server 命名实例的 source_server_name\instance_name。
-sourcedatabase source_database
源数据库的名称。
-sourcetable source_table_name
正在检查的源表的名称。
-sourceschema source_schema_name
源表的架构所有者。默认情况下,表所有者假定为 dbo。
-sourcepassword source_password
使用 SQL Server 身份验证连接到源服务器时所使用的登录帐户的密码。
安全性 注意:
可能的话,请在运行时提供安全凭据。如果必须在脚本文件中存储凭据,则应保护文件以防止未经授权的访问。
-sourceuser source_login
使用 SQL Server 身份验证连接到源服务器时所使用的登录帐户。如果未提供 source_login,则连接到源服务器时使用 Windows 身份验证。
-sourcelocked
在使用 TABLOCK 和 HOLDLOCK 表提示的比较过程中锁定源表。
-destinationserver destination_server_name[\instance_name]
目标服务器的名称。指定 SQL Server 默认实例的 destination_server_name。指定 SQL Server 命名实例的 destination_server_name\instance_name。
-destinationdatabase subscription_database
目标数据库的名称。
-destinationtable destination_table
目标表的名称。
-destinationschema destination_schema_name
目标表的架构所有者。默认情况下,表所有者假定为 dbo。
-destinationpassword destination_password
使用 SQL Server 身份验证连接到目标服务器时所使用的登录帐户的密码。
安全性 注意:
可能的话,请在运行时提供安全凭据。如果必须在脚本文件中存储凭据,则应保护文件以防止未经授权的访问。
-destinationuser destination_login
使用 SQL Server 身份验证连接到目标服务器时所使用的登录帐户。如果未提供 destination_login,则连接到该服务器时使用 Windows 身份验证。
-destinationlocked
在使用 TABLOCK 和 HOLDLOCK 表提示的比较过程中锁定目标表。
-b large_object_bytes
要比较的大型对象数据类型列的字节数,包括:text、ntext、varchar(max)、nvarchar(max) 和 varbinary(max)。默认值是 1000 字节,最大值是 8000 字节。任何大于 large_object_bytes 的数据将不进行比较。
-c
比较列级差异。
-dt
删除 table_name 指定的结果表(如果该表已经存在)。
-et table_name
指定要创建的结果表的名称。如果该表已经存在,则必须使用 -DT,否则操作将失败。
-f
生成 Transact-SQL 脚本,以使目标服务器上的表与源服务器上的表实现收敛。
-o output_file_name
输出文件的完整名称和路径。
-q
通过只比较行数和架构可以执行快速比较。
-t connection_timeouts
设置与源服务器和每个目标服务器连接时的连接超时时间(秒)。
备注
tablediff 实用工具不能用于非 SQL Server 服务器。
通过将每组订阅参数用逗号 (,) 或为 custom_destination_delimiter 指定的字符分隔开来,即可同时比较多个订阅中的表。必须为每个订阅指定同一组订阅参数。有关详细信息,请参阅How to: Compare Replicated Tables for Differences (Replication Programming)。
权限
若要比较表,您必须有要比较的表对象的 SELECT ALL 权限。
若要使用 -et 选项,您必须是 db_owner 固定数据库角色的成员,或者在订阅数据库中至少有 CREATE TABLE 权限,并且对目标服务器上的目标所有者架构拥有 ALTER 权限。
若要使用 -dt 选项,您必须是 db_owner 固定数据库角色的成员,或者至少对目标服务器上的目标所有者架构拥有 ALTER 权限。
若要使用 -o 选项,您必须对指定的文件目录位置拥有写入权限。
-------------------------------------------------------------------------------------------------
use master
Go
IF DB_ID('DatabaseA') IS NOT NULL DROP DATABASE DatabaseA
GO
IF DB_ID('DatabaseB') IS NOT NULL DROP DATABASE DatabaseB
GO
CREATE DATABASE DatabaseA
GO
CREATE DATABASE DatabaseB
GO
USE DatabaseA
GO
CREATE TABLE SourceTable
( IDCol INT IDENTITY(1,1), Field1 SMALLINT, Field2 SMALLINT, Field3 SMALLINT, Field4 SMALLINT
)
GO
USE DatabaseB
GO
CREATE TABLE SourceTable
( IDCol INT IDENTITY(1,1), Field1 SMALLINT, Field2 SMALLINT, Field3 SMALLINT, Field4 SMALLINT
)
GO
USE DatabaseA
GO
INSERT INTO SourceTable
(Field1, Field2, Field3, Field4)
SELECT 1, 1, 1, 2
UNION
SELECT 1, 1, 2, 2
UNION
SELECT 1, 3, 2, 2
UNION
SELECT 1, 3, 2, 2
UNION
SELECT 4, 3, 2, 2
GO
USE DatabaseB
GO
INSERT INTO SourceTable
(Field1, Field2, Field3, Field4)
SELECT 1, 1, 1, 2
UNION
SELECT 1, 3, 2, 1
UNION
SELECT 1, 3, 2, 2
UNION
SELECT 1, 3, 2, 2
UNION
SELECT 5, 3, 2, 2
UNION
SELECT 5, 4, 3, 2
GO
"C:\Program Files\Microsoft SQL Server\100\COM\tablediff.exe " -sourceserver ".\sql2005" -sourcedatabase "DatabaseA" -sourcetable "SourceTable" -destinationserver ".\sql2005" -destinationdatabase "DatabaseB" -destinationtable "SourceTable" -f "C:\diffs.txt" -destinationlocked
pause
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器