tablediff工具實用


 

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+

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM