TabelDiff实用工具
1. tablediff是什么?
tablediff 实用工具用于比较两个非收敛的表中的数据,它对于排除复制拓扑中的非收敛故障非常有用。 后来发现SSIS中的Lookup控件同样可以实现对表的比较,而且不限于tabel column一致的情况;具体实现可以参照另外一篇博文:http://zalman.blog.51cto.com/5251664/1396468
2. tablediff用哪些用法?
1) . 在充当复制发布服务器的 Microsoft SQL Server 实例中的源表与充当复制订阅服务器的一个或多个 SQL Server 实例中的目标表之间进行逐行比较。
2) . 通过只比较行数和架构可以执行快速比较。
3) . 执行列级比较。
4) . 生成 Transact-SQL 脚本,用以修复目标服务器中的差异,以使源表和目标表实现收敛。
5) . 将结果记录到输出文件或目标数据库的表中。
3. tablediff 语法
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 ][ -b large_object_bytes ] [ -bf number_of_statements ] [ -c ] [ -dt ] [ -et table_name ] [ -f [ file_name ] ] [ -o output_file_name ] [ -q ] [ -rc number_of_retries ] [ -ri retry_interval ] [ -strict ][ -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 身份验证连接到源服务器时所使用的登录帐户的密码。
可能的话,请在运行时提供安全凭据。 如果必须在脚本文件中存储凭据,则应保护文件以防止未经授权的访问。 |
可能的话,请在运行时提供安全凭据。 如果必须在脚本文件中存储凭据,则应保护文件以防止未经授权的访问。 |
4. tablediff 注意事项
tablediff 默认存放路径(SQL SERVER 2008) : C:\Program Files\Microsoft SQL Server\100\COM
tablediff 实用工具不能用于非SQL SERVE服务器
若要比较表,您必须要有比较表对象的 SELECT ALL 权限
5. tablediff 使用举例
参数 -c : 比较列差异
a.两个表结构完全相同且数据相同
b. 我们来在HOUYAJUN\JHIDCSDBS005上面的表加10行数据
insertinto RepTest.dbo.personselect't_04', 't_05' ,'t_06'go10再执行上面同样的命令可以看到以下不同:
在此处我们可以看到我对B表修改的列的主键,我们可以根据这些可对表进行操作。在下面会讲述如此对这些数据不一致进行生动生成脚本
c. 如果我们再对表结构进行修改
altertable RepTest.dbo.person add te01 int再执行上述语句可以看到以下情况:
d. 在此处我们可以看到不同,但不能看到具体的不同,我们再来把刚才多余的数据进行删除看看有什么
deletefrom RepTest.dbo.person where id in (4 ,5 ,6 ,7 ,8 ,9 ,10,11 ,12,13)可以看到和上面一样的错误,但是没有出现错误到底是什么不同哦。
参数 -q : 通过只比较行数和架构可以执行较快速比较
和上面-c的基本是一样。我们再来把多出的一列删除掉,插入2条记录看一下。
altertable reptest.dbo.person dropcolumn te01goinsertinto RepTest.dbo.personselect't_04', 't_05' ,'t_06'go2
现在应该是表结构一样,数据多了2个
可以看到这个是把2个表的数据行写出来了,一个为3,另外一个为5,没有指定那些不同,但是可以到出2个表是不一样的。
参数 –f: 生成T-SQL脚本,以使目标服务器上的表与源服务器上的表实现收敛
参数 –o: 输出文件的完整名称和路径。可以输出日志信息。
在这里我们没有看到错误信息了,因为错误信息已经写在了log里面,而persondiff则为对应的SQL修改语句。
log 信息为:
Table[test].[dbo].[person]on houyajun andTable[reptest].[dbo].[person]on houyajun\jhidcdbs005 have 2 differences.Fix SQL written to d:persondiff.sql.Err id ColDest. Only14 Dest. Only15 The requested operation took 0.154 seconds.persondiff.sql 的信息为:
-- Host: houyajun\jhidcdbs005-- Database: [reptest]-- Table: [dbo].[person]SETIDENTITY_INSERT[dbo].[person]ONDELETEFROM[dbo].[person]WHERE[id]=14DELETEFROM[dbo].[person]WHERE[id]=15SETIDENTITY_INSERT[dbo].[person]OFF附一个查询,可以直接粘在dos下,然后修改一下对应的参数:
DECLARE@sourceserver sysnameDECLARE@sourcedatabase sysnameDECLARE@sourceschema sysnameDECLARE@sourcetablenvarchar(1000)DECLARE@destinationserver sysnameDECLARE@destinationdatabase sysnameDECLARE@destinationschema sysnameDECLARE@destinationtablenvarchar(1000)select@sourceserver='HOUYAJUN' ,@sourcedatabase='TEST',@sourceschema='dbo',@sourcetable='REPET',@destinationserver='HOUYAJUN\SS005',@destinationdatabase='TEST',@destinationschema='dbo',@destinationtable='REPET'SELECT'tablediff -sourceserver '+@sourceserver+' -sourcedatabase '+@sourcedatabase+' -sourceschema '+@sourceschema+' -sourcetable '+@sourcetable+' -destinationserver '+@destinationserver+' -destinationdatabase '+@destinationdatabase+
摘自:http://www.cnblogs.com/zerocc/p/3233277.html
转载于:https://blog.51cto.com/zalman/1396465
总结
以上是生活随笔为你收集整理的TabelDiff实用工具的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: f_bfree和f_bavail的区别
- 下一篇: Shell 第二天