1. tablediff 是什么?
tablediff 實用工具用於比較兩個非收斂的表中的數據,它對於排除復制拓撲中的非收斂故障非常有用。
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 身份驗證連接到源服務器時所使用的登錄帳戶的密碼。
-
安全說明
可能的話,請在運行時提供安全憑據。 如果必須在腳本文件中存儲憑據,則應保護文件以防止未經授權的訪問。
- -sourceuser source_login 使用 SQL Server 身份驗證連接到源服務器時所使用的登錄帳戶。 如果未提供 source_login,則連接到源服務器時使用 Windows 身份驗證。 請盡可能使用 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 身份驗證。 請盡可能使用 Windows 身份驗證。
- -destinationlocked 在使用 TABLOCK 和 HOLDLOCK 表提示的比較過程中鎖定目標表。
- -b large_object_bytes 大型對象數據類型列中要比較的字節數,這些數據類型包括:text、ntext、image、varchar(max)、nvarchar(max) 和 varbinary(max)。 large_object_bytes 默認為列的大小。 任何大於 large_object_bytes 的數據將不進行比較。
- -bf number_of_statements 使用 -f 選項時要寫入到當前 Transact-SQL 腳本文件中的 Transact-SQL 語句數。 當 Transact-SQL 語句數超過 number_of_statements 時,將創建一個新的 Transact-SQL 腳本文件。
- -c 比較列級差異。
- -dt 刪除 table_name 指定的結果表(如果該表已經存在)。
- -et table_name 指定要創建的結果表的名稱。 如果該表已經存在,則必須使用 -DT,否則操作將失敗。
- -f [ file_name ] 生成 Transact-SQL 腳本,以使目標服務器中的表與源服務器中的表實現收斂。 (可選)可以指定生成的 Transact-SQL 腳本文件的名稱和路徑。 如果未指定 file_name,則會在運行實用工具的目錄中生成 Transact-SQL 腳本文件。
- -o output_file_name 輸出文件的完整名稱和路徑。
- -q 通過只比較行數和架構可以執行快速比較。
- -rc number_of_retries 實用工具重試失敗操作的次數。
- -ri retry_interval 兩次重試之間的等待間隔(秒)。
- -strict 對源架構和目標架構進行嚴格比較。
- -t connection_timeouts 設置與源服務器和目標服務器連接時的連接超時時間(秒)。
4. tablediff 注意事項
tablediff 默認存放路徑(SQL SERVER 2008) : C:\Program Files\Microsoft SQL Server\100\COM
tablediff 實用工具不能用於非SQL SERVE服務器
若要比較表,您必須要有比較表對象的 SELECT ALL 權限
5. tablediff 使用舉例
--SERVER :HOUYAJUN use TEST go create table person ( id int identity(1,1), name varchar(50) default('guoqiang'), [address] varchar(100) default('anhui hefei'), infro varchar(100) ) go insert into person(infro) select 'test1' union select 'test2' union select 'test3' go select * from TEST.dbo.person with(nolock) -- SERVER: HOUYAJUN\JHIDCDBS005 use RepTest go create table person ( id int identity(1,1), name varchar(50) default('guoqiang'), [address] varchar(100) default('anhui hefei'), infro varchar(100) ) go alter table RepTest.dbo.person add t1 int insert into person(infro) select 'test1' union select 'test2' union select 'test3' go 2 select * from TEST.dbo.person with(nolock)
參數 -c : 比較列差異
a.兩個表結構完全相同且數據相同
b. 我們來在HOUYAJUN\JHIDCSDBS005上面的表加10行數據
insert into RepTest.dbo.person select 't_04', 't_05' ,'t_06' go 10
再執行上面同樣的命令可以看到以下不同:
在此處我們可以看到我對B表修改的列的主鍵,我們可以根據這些可對表進行操作。在下面會講述如此對這些數據不一致進行生動生成腳本
c. 如果我們再對表結構進行修改
alter table RepTest.dbo.person add te01 int
再執行上述語句可以看到以下情況:
d. 在此處我們可以看到不同,但不能看到具體的不同,我們再來把剛才多余的數據進行刪除看看有什么
delete from RepTest.dbo.person where id in (4 ,5 ,6 ,7 ,8 ,9 ,10,11 ,12,13)
可以看到和上面一樣的錯誤,但是沒有出現錯誤到底是什么不同哦。
參數 -q : 通過只比較行數和架構可以執行較快速比較
和上面-c的基本是一樣。我們再來把多出的一列刪除掉,插入2條記錄看一下。
alter table reptest.dbo.person drop column te01
go insert into RepTest.dbo.person select 't_04', 't_05' ,'t_06' go 2
現在應該是表結構一樣,數據多了2個
可以看到這個是把2個表的數據行寫出來了,一個為3,另外一個為5,沒有指定那些不同,但是可以到出2個表是不一樣的。
參數 –f: 生成T-SQL腳本,以使目標服務器上的表與源服務器上的表實現收斂
參數 –o: 輸出文件的完整名稱和路徑。可以輸出日志信息。
在這里我們沒有看到錯誤信息了,因為錯誤信息已經寫在了log里面,而persondiff則為對應的SQL修改語句。
log 信息為:
Table [test].[dbo].[person] on houyajun and Table [reptest].[dbo].[person] on houyajun\jhidcdbs005 have 2 differences. Fix SQL written to d:persondiff.sql. Err id Col Dest. Only 14 Dest. Only 15 The requested operation took 0.154 seconds.
persondiff.sql 的信息為:
-- Host: houyajun\jhidcdbs005 -- Database: [reptest] -- Table: [dbo].[person] SET IDENTITY_INSERT [dbo].[person] ON DELETE FROM [dbo].[person] WHERE [id] = 14 DELETE FROM [dbo].[person] WHERE [id] = 15 SET IDENTITY_INSERT [dbo].[person] OFF
附一個查詢,可以直接粘在dos下,然后修改一下對應的參數:
DECLARE @sourceserver sysname DECLARE @sourcedatabase sysname DECLARE @sourceschema sysname DECLARE @sourcetable nvarchar(1000) DECLARE @destinationserver sysname DECLARE @destinationdatabase sysname DECLARE @destinationschema sysname DECLARE @destinationtable nvarchar(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+