SqlServer迁移基础 --生成所迁移数据库所有表的tablediff脚本

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介: tablediff 实用工具用于比较两个非收敛表中的数据,它对于排除复制拓扑中的非收敛故障非常有用。

https://docs.microsoft.com/zh-cn/sql/tools/tablediff-utility
https://docs.microsoft.com/zh-cn/sql/relational-databases/replication/administration/compare-replicated-tables-for-differences-replication-programming
tablediff 实用工具用于比较两个非收敛表中的数据,它对于排除复制拓扑中的非收敛故障非常有用。
借助SQLSERVER自带的tablediff工具,当初微软制作这个工具的目的就是用于比较复制中发布表和订阅表的数据一致

tablediff工具所在目录
C:Program FilesMicrosoft SQL Server100COMtablediff.exe
1

C:Program FilesMicrosoft SQL Server110COMtablediff.exe
2

C:Program FilesMicrosoft SQL Server120COMtablediff.exe
3

USE AdventureWorks2012
GO

-- declare public variables, need to init by user
DECLARE @source_Instance sysname,
        @source_Database sysname,
        @source_User sysname,
        @source_Passwd sysname,
        @destination_Instance sysname,
        @destination_Database sysname,
        @destination_User sysname,
        @destination_Passwd sysname,
        @diff_table_list NVARCHAR(MAX);

-- Public variables init.
SELECT @source_Instance = 'localhost',   -- Source Instance Name
       @source_Database = 'AdventureWorks2012',       -- Source Database is current database.
       @source_User = 'sa',                             -- Source Instance Connect User Name
       @source_Passwd = N'123456',                    -- Source Instance User Password
       @destination_Instance = N'127.0.0.1,2433',       -- Destination Instance Name
       @destination_Database = N'AdventureWorks2012', -- Destination Database name: NULL/empty: Keep the same as source db
       @destination_User = 'sa',                        -- Destination Instance User Name
       @destination_Passwd = N'123456',                -- Destination Instance User Password
       @diff_table_list = N''                     --NULL/empty: ALL Tables are needed to be diff.
;


-- Private variables, there is no need to init.
DECLARE @diff_table_list_xml XML,
        @timestamp CHAR(14);

-- correct the variables init by user.
SELECT @source_Instance = RTRIM(LTRIM(@source_Instance)),
       @source_Database = RTRIM(LTRIM(@source_Database)),
       @source_User = RTRIM(LTRIM(@source_User)),
       @source_Passwd = RTRIM(LTRIM(@source_Passwd)),
       @destination_Instance = RTRIM(LTRIM(@destination_Instance)),
       @destination_Database = CASE
                                   WHEN ISNULL(@destination_Database, N'') = N'' THEN
                                       @source_Database
                                   ELSE
                                       @destination_Database
                               END,
       @destination_User = RTRIM(LTRIM(@destination_User)),
       @destination_Passwd = RTRIM(LTRIM(@destination_Passwd)),
       @diff_table_list_xml
           = '<V><![CDATA['
             + REPLACE(
                          REPLACE(
                                     REPLACE(@diff_table_list, CHAR(10), ']]></V><V><![CDATA['),
                                     ',',
                                     ']]></V><V><![CDATA['
                                 ),
                          CHAR(13),
                          ']]></V><V><![CDATA['
                      ) + ']]></V>',
       @timestamp = REPLACE(REPLACE(REPLACE(CONVERT(CHAR(19), GETDATE(), 120), N'-', ''), N':', N''), CHAR(32), N'');

IF OBJECT_ID('tempdb..#tb_list', 'U') IS NOT NULL
DROP TABLE #tb_list;
CREATE TABLE #tb_list
(
    RowId INT IDENTITY(1, 1) NOT NULL PRIMARY KEY,
    TableName sysname NOT NULL
);

IF ISNULL(@diff_table_list, '') = ''
BEGIN
    INSERT INTO #tb_list
    SELECT name
    FROM sys.tables AS tb
    WHERE tb.is_ms_shipped = 0;
END;
ELSE
BEGIN
    INSERT INTO #tb_list
    SELECT table_name = T.C.value('(./text())[1]', 'sysname')
    FROM @diff_table_list_xml.nodes('./V') AS T(C)
    WHERE T.C.value('(./text())[1]', 'sysname') IS NOT NULL;
END;


SELECT 'tablediff.exe -sourceserver '+ @source_Instance+' -sourceuser '+@source_User+'  -sourcepassword '+ @source_Passwd+' -sourcedatabase ' +@source_Database+' -sourceschema '+sch.name+' -sourcetable '+ tb.name+' -destinationserver '+ @destination_Instance+' -destinationuser '+@destination_User+' -destinationpassword '+@destination_Passwd+' -destinationdatabase '+@destination_Database+' -destinationschema '+sch.name+' -destinationtable '+ tb.name+' -c -o '+@source_Database+'_TableDiff_'+ @timestamp + N'.txt' 
AS table_diff
FROM sys.tables AS tb
    LEFT JOIN sys.schemas AS sch
        ON tb.schema_id = sch.schema_id
WHERE tb.is_ms_shipped = 0
      AND tb.name IN (
                         SELECT TableName COLLATE Chinese_PRC_CI_AS FROM #tb_list
                     );

DROP TABLE #tb_list;

screenshot

保存执行结果中table_diff列所有内容到文件table_diff.bat
执行table_diff.bat文件
检查table_diff.bat执行的日志文件

table_diff.bat批处理文件执行后会生成一个日志文件,日志文件的命名格式是:DatabaseName_TableDiff_YYYYMMDDHHMMSS.txt,比如:AdventureWorks2012_TableDiff_20171122230836.txt

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
13天前
|
SQL Oracle 关系型数据库
担心YashanDB异构数据库迁移踩“坑”?听听大咖们怎么说
文章围绕异构数据库迁移展开,探讨了避免数据丢失、保障数据完整性、注意兼容性、提升迁移效率、做好反向演练等问题。包括迁移前完整性检查与备份,YashanDB 从内核设计和配套工具保障数据,对兼容性进行大量测试,通过合理评估和技术手段提升迁移效率,以及处理回退等内容。
|
17天前
|
SQL Oracle 关系型数据库
迁移方案详解 | 使用YMP从异构数据库迁移到YashanDB
迁移方案详解 | 使用YMP从异构数据库迁移到YashanDB
|
13天前
|
Oracle 关系型数据库 网络安全
崖山异构数据库迁移利器YMP初体验-Oracle迁移YashanDB
文章是作者小草对崖山异构数据库迁移利器 YMP 的初体验分享,包括背景、YMP 简介、体验环境说明、YMP 部署(含安装前准备、安装、卸载、启动与停止)、数据迁移及遇到的问题与解决过程。重点介绍了 YMP 功能、部署的诸多细节和数据迁移流程,还提到了安装和迁移中遇到的问题及解决办法。
|
13天前
|
关系型数据库 Shell 网络安全
定期备份数据库:基于 Shell 脚本的自动化方案
本篇文章分享一个简单的 Shell 脚本,用于定期备份 MySQL 数据库,并自动将备份传输到远程服务器,帮助防止数据丢失。
|
13天前
|
SQL 关系型数据库 MySQL
MySQL生产环境迁移至YashanDB数据库深度体验
这篇文章是作者将 MySQL 生产环境迁移至 YashanDB 数据库的深度体验。介绍了 YashanDB 迁移平台 YMP 的产品相关信息、安装步骤、迁移中遇到的各种兼容问题及解决方案,最后总结了迁移体验,包括工具部署和操作特点,也指出功能有优化空间及暂不支持的部分,期待其不断优化。
|
24天前
|
SQL 数据库
数据库数据恢复—SQL Server报错“错误 823”的数据恢复案例
SQL Server数据库附加数据库过程中比较常见的报错是“错误 823”,附加数据库失败。 如果数据库有备份则只需还原备份即可。但是如果没有备份,备份时间太久,或者其他原因导致备份不可用,那么就需要通过专业手段对数据库进行数据恢复。
|
27天前
|
SQL 数据建模 BI
【YashanDB 知识库】用 yasldr 配置 Bulkload 模式作单线程迁移 300G 的业务数据到分布式数据库,迁移任务频繁出错
问题描述 详细版本:YashanDB Server Enterprise Edition Release 23.2.4.100 x86_64 6db1237 影响范围: 离线数据迁移场景,影响业务数据入库。 外场将部分 NewCIS 的报表业务放到分布式数据库,验证 SQL 性能水平。 操作系统环境配置: 125G 内存 32C CPU 2T 的 HDD 磁盘 问题出现的步骤/操作: 1、部署崖山分布式数据库 1mm 1cn 3dn 单线启动 yasldr 数据迁移任务,设置 32 线程的 bulk load 模式 2、观察 yasldr.log 是否出现如下错
|
11天前
|
SQL 关系型数据库 数据库连接
|
6月前
|
SQL 数据库
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
SQL Server附加数据库出现错误823,附加数据库失败。数据库没有备份,无法通过备份恢复数据库。 SQL Server数据库出现823错误的可能原因有:数据库物理页面损坏、数据库物理页面校验值损坏导致无法识别该页面、断电或者文件系统问题导致页面丢失。
153 12
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例