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
创建第一个同步项目
使用 HKROnline SyncNavigator 创建一个数据库同步项目。只需要通过简单的配置,创建完成后您可以随时执行数据库同步任务。
1.点击 “SyncNavigator(Client)” 图标进入系统。
2.在登录界面中输入连接到的服务器地址,点击 “确定” 按钮开始连接。
-
注意:这里不是登陆您的数据库,而是登陆到本软件的管理端。
-
默认情况下直接点击 “连接” 按钮即可(本机默认已经安装)。
-
默认服务器登录用户名为 “admin” 密码为空。
-
本机服务器地址 = 127.0.0.1 。
-
您可以使用域名或者IP地址作为服务器地址。如果指定了端口号可以使用 IP:Port 方式填写。
-
通常,需要创建SQL Server数据库的副本副本。例如,出于分离分析任务和操作任务的目的,可能需要这样做。第一个导致数据库上的高负载,并且为了减少负载,创建了主数据库的副本以执行分析性预期查询。
通常,可以使用内置DBMS工具创建以下重复副本:
但是,如果您不需要的整个数据库,而只需要其中的几个表怎么办?在这种情况下,您可以自己创建复制。只要数据采样是主要目标,那么在一个方向(主到从)的数据库复制就足够了。可以使用包括SSIS和.NET内部的几种方法来执行这种复制。
在这里中,我们将使用JobEmpl招聘服务数据库来演示如何使用T-SQL在主从方向上创建数据库复制。
使用T-SQL在一个方向上创建SQL Server复制
首先,让我们描述此复制的主要原理和算法。在多次中断期间,我们需要比较源数据库和目标数据库之间替换表中的数据。这意味着我们需要输入唯一的代理键来比较表。为了加快比较过程,我们还需要在该键上创建一个索引。并且还需要为每个复制表添加一个计算片段,闸为每一行计算CHECKSUM。
同样重要的是选择数据的固定部分,例如一次(多次重复)一次特定数量的行。
因此,我们需要执行以下步骤:
- 在源表上,创建一个REPL_GUID列和一个唯一的REPL_GUID索引,以在源表和目标表之间建立一对一的关系。您还应该创建一个计算出的CheckSumVal列,该列将为每一行计算CHECKSUM值。
- 创建一个称为Target的新目标数据库。
- 跨源数据库和目标数据库同步复制表的架构,并删除对不存在对象的所有引用。
- 补充目标数据库的外键。
- 运行复制并监视源数据库和目标数据库之间有多少行不同。
现在,让我们使用为雇用员工而创建的JobEmpl数据库详细查看每个步骤。
图1求职者数据库的架构
我们只需要复制Employee和JobHistory表。
然后,可以在以下脚本的帮助下执行上述算法的第一步。
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());'