如何为预先数据库创建自定义SQL Server复制

如何为预先数据库创建自定义SQL Server复制

  SyncNavigator是一款功能强大的数据库同步软件,适用于SQL SERVER, MySQL,具有自动/定时同步数据、无人值守、故障自动恢复、同构/异构数据库同步、断点续传和增量同步等功能,支持Windows xp以上所有操作系统,适用于大容量数据库快速同步。

安装包下载地址:https://www.syncnavigator.cn/Setup.zip

帮助文档地址:https://www.syncnavigator.cn/Help_zh-CN.chm

Web文档地址:https://www.syncnavigator.cn/chm/index.htm

如何为预先数据库创建自定义SQL Server复制

如何为预先数据库创建自定义SQL Server复制


创建第一个同步项目


使用 HKROnline SyncNavigator 创建一个数据库同步项目。只需要通过简单的配置,创建完成后您可以随时执行数据库同步任务。

1.点击 “SyncNavigator(Client)” 图标进入系统。

2.在登录界面中输入连接到的服务器地址,点击 “确定” 按钮开始连接。

  • 注意:这里不是登陆您的数据库,而是登陆到本软件的管理端。
  • 默认情况下直接点击 “连接” 按钮即可(本机默认已经安装)。
  • 默认服务器登录用户名为 “admin” 密码为空。
  • 本机服务器地址 = 127.0.0.1 。
  • 您可以使用域名或者IP地址作为服务器地址。如果指定了端口号可以使用 IP:Port 方式填写。
  • 通常,需要创建SQL Server数据库的副本副本。例如,出于分离分析任务和操作任务的目的,可能需要这样做。第一个导致数据库上的高负载,并且为了减少负载,创建了主数据库的副本以执行分析性预期查询。

    通常,可以使用内置DBMS工具创建以下重复副本:

    1. 日志传送
    2. SQL Server复制
    3. AlwaysOn可用组

    但是,如果您不需要的整个数据库,而只需要其中的几个表怎么办?在这种情况下,您可以自己创建复制。只要数据采样是主要目标,那么在一个方向(主到从)的数据库复制就足够了。可以使用包括SSIS和.NET内部的几种方法来执行这种复制。

    在这里中,我们将使用JobEmpl招聘服务数据库来演示如何使用T-SQL在主从方向上创建数据库复制。

    使用T-SQL在一个方向上创建SQL Server复制

    首先,让我们描述此复制的主要原理和算法。在多次中断期间,我们需要比较源数据库和目标数据库之间替换表中的数据。这意味着我们需要输入唯一的代理键来比较表。为了加快比较过程,我们还需要在该键上创建一个索引。并且还需要为每个复制表添加一个计算片段,闸为每一行计算CHECKSUM。

    同样重要的是选择数据的固定部分,例如一次(多次重复)一次特定数量的行。

    因此,我们需要执行以下步骤:

    1. 在源表上,创建一个REPL_GUID列和一个唯一的REPL_GUID索引,以在源表和目标表之间建立一对一的关系。您还应该创建一个计算出的CheckSumVal列,该列将为每一行计算CHECKSUM值。
    2. 创建一个称为Target的新目标数据库。
    3. 跨源数据库和目标数据库同步复制表的架构,并删除对不存在对象的所有引用。
    4. 补充目标数据库的外键。
    5. 运行复制并监视源数据库和目标数据库之间有多少行不同。

    现在,让我们使用为雇用员工而创建的JobEmpl数据库详细查看每个步骤。

    如何为预先数据库创建自定义SQL Server复制

    图1求职者数据库的架构

    我们只需要复制EmployeeJobHistory表。

    然后,可以在以下脚本的帮助下执行上述算法的第一步。

    USE JobEmpl
    GO
    
    SET QUOTED_IDENTIFIER ON;
       
    DECLARE @src NVARCHAR(255) = N‘JobEmpl‘;
    DECLARE @sch NVARCHAR(255) = N‘dbo‘;
    DECLARE @sql NVARCHAR(MAX);
    DECLARE @name NVARCHAR(255);
    DECLARE @listcols NVARCHAR(MAX);
    CREATE TABLE #cols (
        [Name] NVARCHAR(255)
    );
      
    SELECT
        [Name] INTO #tbl
    FROM sys.tables
    WHERE [Name] IN (
    N‘Employee‘,
    N‘JobHistory‘
    );
       
    DECLARE sql_cursor CURSOR LOCAL FOR SELECT
        [Name]
    FROM #tbl;
       
    OPEN sql_cursor;
       
    FETCH NEXT FROM sql_cursor
    INTO @name;
       
    WHILE (@@fetch_status = 0)
    BEGIN
        DELETE FROM #cols;
       
        SET @sql = N‘SET QUOTED_IDENTIFIER ON; select N‘‘COALESCE(CAST([‘‘+col.[name]+N‘‘] AS NVARCHAR(MAX)), N‘‘‘‘‘‘‘‘)‘‘ ‘ +
        N‘from [‘ + @src + N‘].sys.columns as col ‘ +
        N‘inner join [‘ + @src + N‘].sys.tables as tbl on col.[object_id]=tbl.[object_id] ‘ +
        N‘where tbl.[name]=‘‘‘ + @name + ‘‘‘ and col.[is_identity]=0‘;
       
        INSERT INTO #cols ([Name])
        EXEC sys.sp_executesql @sql;
       
        SET @listcols = N‘‘;
       
        SELECT
            @listcols = @listcols + CAST([Name] AS NVARCHAR(MAX)) + N‘+ ‘
        FROM #cols;
       
        SET @listcols = SUBSTRING(@listcols, 1, LEN(@listcols) - 1);
      
        SET @sql=N‘SET QUOTED_IDENTIFIER ON; ALTER TABLE [‘+@sch+N‘].[‘+@name+N‘] ADD [CheckSumVal] AS CHECKSUM(‘+@listcols+N‘);‘
       
        --PRINT @sql;
        EXEC sys.sp_executesql @sql;
      
        SET @sql=N‘SET QUOTED_IDENTIFIER ON; ALTER TABLE [dbo].[‘+@name+N‘] ADD [REPL_GUID] [uniqueidentifier] ROWGUIDCOL NOT NULL CONSTRAINT [‘+@name+N‘_DEF_REPL_GUID] DEFAULT (NEWSEQUENTIALID());‘;
      
        
上一篇:数据库同步工具


下一篇:如何终止与MySQL数据库的某些连接