用触发器实现两个数据库之间相同表的同步
- 格式:doc
- 大小:32.00 KB
- 文档页数:3
数据库实时同步技术研究与实现随着信息时代的来临,大量数据需要被处理,而数据库的实时同步技术在这个过程中显得尤为重要。
本文将介绍数据库实时同步技术的定义、分类以及实现方法。
一、定义数据库实时同步技术是指在多个数据库系统之间实现数据的实时更新,使得数据的一致性得到保障。
该技术广泛应用于企业信息化、金融系统、电子商务等领域,以满足数据交互、共享、备份等需求。
二、分类根据数据同步方式的不同,数据库实时同步技术可以分为以下几种:1. 基于应用程序的同步方式该方式主要是通过应用程序实现数据的同步。
这种方式主要应用于小规模系统间的数据同步,通常采用轮询的方式实现。
2. 基于触发器的同步方式该方式主要是通过触发器实现数据的自动同步。
当一个数据库的数据发生变化时,就会触发一个触发器,然后将更新后的数据传递到其他相关数据库中。
3. 基于日志的同步方式该方式主要是通过数据库的日志文件实现数据的实时同步。
若发生数据变更,该变更会被记录到日志文件中,然后该文件会被传送到其他相关数据库,以实现数据的同步。
三、实现方法1. 数据库复制数据库复制是通过将一个数据库的内容复制到其他数库中实现数据的同步。
主要应用于数据量较小,同步要求不是很高的场景。
2. 两套系统的交叉使用两套系统的交叉使用是通过将数据同时存储在两个不同的系统中,同步实现数据的更新。
当需要更新数据时,可以在两个系统中同时对数据进行更新,以保证数据的一致性。
3. 分布式处理分布式处理是通过在多个数据库之间划分固定区域,将数据分布到各个区域中,以实现数据的同步。
数据的更新会被同步到各个区域中,以保持数据的一致性。
四、结论数据库实时同步技术是企业信息化的重要组成部分,它可以有效地解决数据交互、共享、备份等问题。
同时本文还介绍了数据库实时同步技术的分类和实现方法,供读者参考使用。
在实际应用中,需要根据实际需求选择最合适的技术方案,以保证数据的及时同步和一致性。
有两个服务器,分别装有两个SQL Serv er A,BA,B的表结构a,b 相同A,B分别都会做一些INS ERT,U PDATE,DELE TE操作,要求AB的数据保持一致(即A新增一条数据,要求B也新增,A更改一条数据,B也更改相应的)是不是可以用触发器来实现例程/*--同步两个数据库的示例有数据srv1.库名..autho r有字段:id,na me,ph one,srv2.库名..a uthor有字段:i d,nam e,tel phone,adre ss要求:srv1.库名..auth or增加记录则srv1.库名..auth or记录增加srv1.库名..auth or的ph one字段更新,则s rv1.库名..au thor对应字段te lphon e更新--*/--大致的处理步骤--1.在srv1上创建连接服务器,以便在 sr v1 中操作 srv2,实现同步exe c sp_addli nkeds erver 'srv2','','SQL OLEDB','sr v2的sq l实例名或ip'e xec s p_add linke dsrvl ogin'srv2','fa lse',null,'用户名','密码'go--2.在srv1和 srv2 这两台电脑中,启动 msd tc(分布式事务处理服务),并且设置为自动启动我的电脑--控制面板--管理工具--服务--右键D istri buted Tran sacti on Co ordin ator--属性--启动--并将启动类型设置为自动启动go--3.实现同步处理--a.在srv1..au thor中创建触发器,实现数据即时同步--新增同步cre ate t rigge r tr_inser t_aut hor o n aut horf or in sertasse t xac t_abo rt oninse rt sr v2.库名.dbo.autho r(id,name,telph one)selec t id,name,telph one f rom i nsert edgo--修改同步cr eatetrigg er tr_upda te_au thoron au thorfor u pdateass et xa ct_ab ort o nupd ate b setname=i.nam e,tel phone=i.te lphon efro m srv2.库名.dbo.a uthor b,in serte d iw hereb.id=i.idgo--删除同步creat e tri ggertr_de lete_autho r onautho rfor dele teassetxact_abort ond elete bfr om sr v2.库名.dbo.autho r b,d elete d dw hereb.id=d.idgo--3.实现同步处理的方法2,定时同步--在srv1中创建如下的同步处理存储过程creat e pro c p_p roces sas--更新修改过的数据upda te bset n ame=i.name,telp hone=i.tel phone from srv2.库名.d bo.au thorb,aut hor iwher e b.i d=i.i d and(b.n ame<>i.nam e orb.tel phone<>i.t elpho ne)--插入新增的数据i nsert srv2.库名.d bo.au thor(id,na me,te lphon e)se lectid,na me,te lphon e fro m aut hor iwher e not exis ts(s elect * fr om sr v2.库名.dbo.autho r whe re id=i.id) --删除已经删除的数据(如果需要的话)del ete bfrom srv2.库名.d bo.au thorbwhe re no t exi sts(selec t * f rom a uthor wher e id=b.id)go。
同步数据库表结构"同步数据库表结构" 是指保持两个数据库之间表结构的同步。
在数据库设计中,经常需要将一个数据库的表结构复制到另一个数据库中,或者保持两个数据库的表结构始终一致。
这通常涉及到数据库迁移、备份、复制或版本控制等场景。
以下是几种同步数据库表结构的方法:1. 使用数据库管理系统(DBMS)自带工具:MySQL: 使用`mysqldump` 导出表结构,然后导入到另一个数据库。
```bash`mysqldump -u [username] -p --no-data [database_name] > ````PostgreSQL: 使用 `pg_dump` 导出表结构,然后导入到另一个数据库。
```bash`pg_dump -U [username] --schema-only [database_name] > ````2. 编程语言/脚本: 使用编程语言如Python、Java等来操作数据库,获取当前表结构,然后写入目标数据库。
3. 第三方工具: 有许多第三方工具和服务可以帮助同步数据库结构,例如Navicat、Toad、dbForge等。
4. 版本控制: 对于更复杂的场景,如团队共同维护一个数据库,可能需要使用版本控制系统(如Git)来跟踪和管理表结构的更改。
5. 持续集成/持续部署 (CI/CD): 对于开发环境,可以使用CI/CD工具链来自动同步源代码中的数据库结构更改到测试和生产环境。
6. 触发器和存储过程: 在某些情况下,可以使用数据库触发器和存储过程来自动检测和同步表结构更改。
7. 数据迁移工具: 有些工具专门用于数据迁移,它们可以识别源和目标数据库之间的差异,并自动应用必要的更改。
8. API: 一些数据库管理系统提供API来操作表结构。
通过编写脚本或应用程序,可以调用这些API来同步表结构。
无论使用哪种方法,都要确保在同步之前备份数据,并在测试环境中验证同步过程,以确保数据的完整性和一致性。
数据库技术的数据同步技巧数据库技术在现代软件开发中起着至关重要的作用。
随着应用程序的发展和数据规模的增加,数据库中数据的同步变得尤为重要。
数据同步指的是将一个数据库中的数据更新到另一个数据库中,确保两个数据库的数据保持一致。
在这篇文章中,我们将探讨一些数据库技术的数据同步技巧。
1. 实时数据同步技巧实时数据同步是指数据的变更在发生后立即被同步到其他的数据库中。
实现实时数据同步的技巧可以采用触发器、发布/订阅模式或基于日志的技术。
触发器是一种数据库对象,可以在特定的条件下触发先定义好的操作。
在数据变更前或后,触发器可以执行相应的同步操作,将数据更新到其他数据库中。
通过合理使用触发器,我们可以实现实时数据同步。
发布/订阅模式是一种广泛应用于数据同步的技术。
它基于“发布者”和“订阅者”的关系。
在该模式中,“发布者”负责将数据变更发布到一个或多个“订阅者”,然后“订阅者”会接收到相应的数据并进行同步操作。
这种模式支持异步操作,可以灵活应对数据同步的需求。
基于日志的技术是一种常见的数据同步技巧。
数据库服务器将所有的数据变更记录在一个事务日志中,同步的过程就是将日志文件中的变更应用到其他数据库中。
这种技术可以确保同步的数据变更的顺序和一致性。
2. 批量数据同步技巧除了实时数据同步,批量数据同步也是数据库技术中常见的数据同步需求。
批量数据同步一般发生在两个数据库之间的大量数据迁移或定期数据更新的场景下。
在批量数据同步中,我们可以使用数据库备份和还原的技巧。
首先,在源数据库上执行备份操作,将数据备份到一个文件中。
然后,在目标数据库上执行还原操作,将备份文件中的数据恢复到目标数据库中。
通过备份和还原的方式,可以高效地进行大规模数据的同步。
同样,基于ETL(Extract, Transform, Load)工具也是实现批量数据同步的良好选择。
ETL工具可以从一个或多个数据源中提取数据,对数据进行转换和清洗,然后将数据加载到目标数据库中。
使用MySQL进行数据迁移和同步的工具引言在今天的数据驱动时代,数据是企业最宝贵的资产之一。
当一个企业要迁移或同步其数据库时,选择合适的工具和方法变得至关重要。
MySQL是目前最流行的关系型数据库之一,本文将介绍一些常用的工具和方法来进行MySQL数据迁移和同步。
一、数据迁移工具1. mysqldumpmysqldump是MySQL自带的一个命令行工具,可以将一个MySQL数据库导出为一个可执行的SQL脚本。
它的使用非常简单,只需执行以下命令:```mysqldump -u <username> -p<password> <database_name> > <dump_file.sql> ```该命令将会将指定数据库导出为一个SQL脚本,并存储为一个文件。
然后,您可以使用以下命令将导出的SQL脚本导入到目标数据库中:```mysql -u <username> -p<password> <database_name> < <dump_file.sql>```这个工具十分灵活,可以支持在不同MySQL服务器之间迁移和同步数据。
2. MySQL WorkbenchMySQL Workbench是一种图形化的工具,由MySQL官方提供。
它不仅可以用于管理和查询MySQL数据库,还可以用于数据迁移和同步。
在MySQL Workbench中,您可以使用“数据导出和导入”功能将数据迁移到另一个服务器上。
只需选择要导出的数据库,并设置目标服务器的连接信息,然后点击开始导出按钮。
此外,MySQL Workbench还提供了一个可视化的数据同步工具,可以在两个MySQL服务器之间进行自动实时数据同步。
您只需设置源和目标服务器的连接信息,并选择要同步的表和字段,然后启动同步过程。
3. pt-archiverpt-archiver是Percona Toolkit的一部分,是一个功能强大的命令行工具,用于从源MySQL服务器中迁移和删除数据,并将其插入到目标服务器中。
sql数据同步的方法SQL数据同步是一种重要的技术,它可以帮助确保数据库中的数据保持一致性和完整性。
以下是几种常见的SQL数据同步方法:1. 触发器(Triggers): 触发器是一种特殊的存储过程,它会在对表进行插入、更新或删除操作时自动执行。
通过在源表和目标表上设置触发器,可以在数据发生变化时自动将更改同步到目标表。
2. 复制(Replication): 复制是一种将数据从一个数据库复制到另一个数据库的技术。
它可以通过两种方式实现:异步复制和同步复制。
异步复制在数据写入源数据库后立即将更改写入目标数据库,而同步复制则等待源数据库确认已将更改写入后才将更改写入目标数据库。
3. 事务(Transactions): 事务是一组一起执行的SQL语句,它们被视为一个单一的工作单元。
如果事务中的所有语句都成功执行,则事务被提交,更改将永久保存在数据库中。
如果事务中的任何一个语句失败,则事务将被回滚,所有更改都将被撤销。
通过使用事务,可以确保在多个数据库之间同步数据时的一致性和完整性。
4. 消息队列(Message Queues): 消息队列是一种用于在应用程序之间传递消息的中间件技术。
它可以将数据变更写入消息队列,然后由目标数据库从消息队列中读取并应用这些变更。
这种方法可以确保在数据同步过程中实现异步处理和故障转移。
5. 全文检索(Full-Text Search): 对于需要同步大量文本数据的情况,全文检索是一种非常有用的技术。
通过使用全文检索引擎(如Apache Lucene或Microsoft SQL Server的全文搜索功能),可以索引和搜索大量文本数据,并将查询结果同步到其他数据库或系统中。
这些是常见的SQL数据同步方法,每种方法都有其优点和适用场景。
选择哪种方法取决于具体的需求和环境。
数据库复制与同步实现多节点数据一致性的方案一、介绍数据库是现代应用程序中不可或缺的一部分,而随着数据规模的不断增大以及应用程序的高可用性要求,我们需要将数据库数据复制到多个节点,并保证这些节点中的数据始终保持一致。
本文将介绍数据库复制与同步实现多节点数据一致性的方案。
二、数据库复制数据库复制是指将一个数据库中的数据复制到一个或多个数据库服务器中的过程。
通过数据库复制,我们可以提高应用程序的可用性,并提供更好的读取性能。
1. 主从复制主从复制是最常见的数据库复制方案之一,它包括一个主数据库和多个从数据库。
主数据库是源数据库,从数据库通过复制主数据库的操作日志来保持数据一致性。
2. 主主复制与主从复制不同,主主复制中没有主数据库和从数据库的区别,每个节点都可以接收读取和写入请求,并将这些写入操作同步到其他节点,从而保持数据的一致性。
3.链式复制链式复制是一种多节点的复制方案,其中每个节点都可以复制其他节点的数据。
每个节点都有一个上游节点,用于接收来自上游节点的数据变更操作。
三、数据同步为了保持多节点数据的一致性,我们需要对数据进行同步。
数据同步是指将一个节点的数据变更操作应用到其他节点的过程。
1.同步触发器同步触发器是一种常见的数据同步方法,它可以在一个节点上的数据发生变化时,触发同步操作,将数据变更应用到其他节点。
2.日志传输日志传输是一种高效的数据同步方法,它将日志记录在主节点上,并定期将这些日志传输到其他节点,然后在其他节点上应用这些日志来保持数据一致性。
3.基于时间戳的数据同步基于时间戳的数据同步是一种通过记录数据变更操作的时间戳来实现数据同步的方法。
每个节点在执行数据变更操作时都会记录一个时间戳,并在同步操作时使用这些时间戳来判断数据的一致性。
四、实现多节点数据一致性的方案为了实现多节点数据的一致性,我们可以将数据库复制和数据同步结合起来。
1.使用主从复制进行数据复制首先,我们可以使用主从复制将主节点的数据复制到从节点。
两级触发器同步原理
两级触发器同步原理是指在数字电路中使用两个触发器来实现数据的同步传输。
这种设计方法可以解决时序问题,确保数据在传输过程中的稳定性和可靠性。
首先,让我们了解一下触发器的基本概念。
触发器是一种存储器件,可以存储一个位(0或1)。
它有两个重要的输入端:时钟输入和数据输入。
时钟输入控制着触发器的状态变化,当时钟信号的边沿到达触发器时,触发器可以根据数据输入的值来改变其状态。
同时,触发器还有一个输出端,用于输出存储的数据。
两级触发器同步原理包括两个关键步骤:数据的传输和时钟的同步。
首先,数据的传输是通过将数据输入到第一个触发器(称为"主触发器")中来实现的。
主触发器有一个时钟输入端和一个数据输入端,当时钟信号到达时,它会根据数据输入的值将数据存储起来。
然后,时钟的同步是通过将主触发器的时钟输出连接到第二个触发器(称为"从触发器")的时钟输入端来实现的。
从触发器也有一个数据输入端,当主触发器的时钟信号到达时,从触发器会根据主触发器的输出来更新自己的状态,并将数据输出。
这种设计方法的关键之处在于时钟的同步。
由于主触发器的时钟信号先到达从触发器,从触发器只在主触发器的时钟信号到达时才会更新自己的状态。
这样,可以确保数据在两级触发器之间的传输是同步的,避免了数据传输过程中的时序问题。
总之,两级触发器同步原理通过使用两个触发器和时钟的同步来实现数据的稳定传输。
它是一种常用的数字电路设计方法,可确保数据传输的可靠性和稳定性。
sqlserver之触发器调⽤C#CLR存储过程实现两个表的数据同步第⼀步:开启CLRsp_configure 'show advanced options', 1;GORECONFIGURE;GOsp_configure 'Ole Automation Procedures', 1;GORECONFIGURE;GOEXEC sp_configure 'show advanced options' , '1';goreconfigure;goEXEC sp_configure 'clr enabled' , '1'goreconfigure;-- Turn advanced options back offEXEC sp_configure 'show advanced options' , '1';go⼆、c#编写的存储过程,注意没有要放命名空间public class SyncDll{[SqlProcedure]public static void Sync(int atID, string atName, string atMemo, string atUpperID, string atIcon, string atFlow, string atFlowImage){System.Threading.ParameterizedThreadStart start = new System.Threading.ParameterizedThreadStart(SyncDll.Test2);System.Threading.Thread thread = new System.Threading.Thread(start);System.Collections.Hashtable par = new System.Collections.Hashtable();par["atID"] = atID;par["atName"] = atName;par["atMemo"] = atMemo;par["atUpperID"] = atUpperID;par["atIcon"] = atIcon;par["atFlow"] = atFlow;par["atFlowImage"] = atFlowImage;thread.Start(par);}public static void Test2(object obj){string strConn = "Data Source=192.168.6.68;Initial catalog=pdxzsp;uid=sa;pwd=123456;";SqlConnection conn = new SqlConnection(strConn);try{Hashtable par = (Hashtable)obj;conn.Open();string sql = String.Format("insert into sa_affair_theme values({0},'{1}','{2}','{3}','{4}','{5}','{6}')", (int)par["atID"],par["atName"].ToString(), par["atMemo"].ToString(), par["atUpperID"].ToString(), par["atIcon"].ToString(), par["atFlow"].ToString(), par["atFlowImage"].ToString());SqlCommand cmd = new SqlCommand(sql, conn);cmd.ExecuteNonQuery();}catch{}finally{conn.Close();}}}三、开启登陆权限,这⼀步应该也可以不要ALTER DATABASE pdxzsp SET TRUSTWORTHY ON;GOUSE masterGOCREATE ASYMMETRIC KEY sqldlldemoKeyFROM EXECUTABLE FILE ='D:\study\demo\SqlServerProject1\SqlServerProject1\bin\Debug\SqlServerProject1.dll'-- Create login and grant it with external access permissionCREATE LOGIN sqldllLogin FROM ASYMMETRIC KEY sqldlldemoKeyGRANT EXTERNAL ACCESS ASSEMBLY TO sqldllLoginGO四、部署ASSEMBLYUSE pdxzsp;GOIF OBJECT_ID('dbo.Sync') IS NOT NULLDROP PROC Sync;GODROP ASSEMBLY SqlServerProject1create ASSEMBLY SqlServerProject1 FROM 'D:\study\demo\SqlServerProject1\SqlServerProject1\bin\Debug\SqlServerProject1.dll' WITH PERMISSION_SET=UNSAFE五、创建存储过程CREATE PROCEDURE dbo.Sync(@atID int,@atName nvarchar(500),@atMemo nvarchar(3000),@atUpperID nvarchar(200),@atIcon nvarchar(200),@atFlow nvarchar(3000),@atFlowImage nvarchar(200))ASEXTERNAL NAME SqlServerProject1.SyncDll.SyncGo六、触发器⾥调⽤存储过程,然后在存储过程⾥做同步,存储过程⾥开了⼀个线程去做这些事情,原理:往本地数据库的表SA_AFFAIR_THEME⾥插⼊数据,然后触发器⾥获取这条数据,传⼊到CLR存储过程⾥,然后开个线程,写⼊到远程数据库的表SA_AFFAIR_THEME⾥DROP TRIGGER [tgr_Theme_insert]CREATE TRIGGER [tgr_Theme_insert]ON [dbo].[SA_Affair_Theme]after INSERT --插⼊触发ASBEGINDECLARE @atID INTDECLARE @atName NVARCHAR(500)DECLARE @atMemo NVARCHAR(3000)DECLARE @atUpperID NVARCHAR(200)DECLARE @atIcon NVARCHAR(200)DECLARE @atFlow NVARCHAR(3000)DECLARE @atFlowImage NVARCHAR(200)SELECT@atID=atID,@atName=atName,@atMemo=atMemo,@atUpperID=atUpperID,@atIcon=atIcon,@atFlow=atFlow,@atFlowImage=atFlowImage from insertedEXEC dbo.Sync @atID,@atName,@atMemo,@atUpperID,@atIcon,@atFlow,@atFlowImageEND最后插⼊数据看看:INSERT INTO dbo.sa_affair_theme VALUES(2, 'aa','bb','cc','dd','ee','ff')。
1,在目标机上建立Oracle DB Link:--在本地(目标机器)如下文件加入代码,连接到目标数据库上面1.1,在network/admin/tnsname.ora文件中加入源库的连接信息,如:AAA_10.5.1.3=(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 10.5.1.3)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = AAA)))说明: 10.5.1.3:源库ipAAA_10.5.1.3:创建的实例名(服务名)1,2,在目标机器上用sqlplus user/pwd登录:目标机器(本地)的用户名和密码,不是源库机器的用户名和密码。
1.3,在本地机器(目标库)上用如下命令建立DB Link:create public database link AAA_LINK connect to user identified by pwd using 'AA A_10.5.1.3';命令说明:AAA_LINK:dblink的名称user:源库的用户名pwd :源库的密码AAA_10.5.1.3:配置的实例名(服务名)说明:CREATE PUBLIC DATABASE LINK 数据库链接名 CONNECT TO 用户名 IDENTIFIED BY 密码USING ‘本地配置的数据的实例名’;如果建立成功,会提示:Database link created.1.4--测试使用链接的数据库(表名@dblink名称)select * from FA_CARD@ AAA_LINK;1.5创建一个测试表:在目标机器和原机器上都创建create table dblink_test(user_id NUMBER,user_name VARCHAR2(100));--在其中增加一条记录:insert into dblink_test (user_id, user_name)values (1, '钟德荣');4,使用如下脚本,即可同步数据表:2.1 将源库的数据插入到目标库方法一、truncate table dblink_test;--删除目标库的相应表数据--插入目标机器数据,来源于源库的数据insert into dblink_testselect * from cztbd.dblink_test@KNG_LINK; --#这里是指向要同步的来源表,表名必须是<表所有者(源库的用户)>.<表名(源库的表)>@<dblink name>commit;方法二、merge into dblink_test b using dblink_test@KNG_LINK c on(ER_ID=ER_ID)--如果pk(主键)值是相同则将目标库c将对应表的数据更新到源库b的对应表中when matched then update set ER_NAME=ER_NAME--如果pk(主键)值不一至,则将目标表中的数据整条插入到源表中when not matched theninsert values (ER_ID,ER_NAME);--记得merge后必须commit,否则更改未能提交commit;可以将以上语句作为sql脚本,然后写一个类似2.2的bat命令来作为任务执行2.2 将目标库的数据插入或者更新到源库--从目标库c将对应表的数据插入到源库b的对应表中方法一insert into cztbd.dblink_test@KNG_LINKselect * from dblink_test;方法二merge into dblink_test@KNG_LINK b using dblink_test c on(ER_ID=ER_ID)--如果pk(主键)值是相同则将目标库c将对应表的数据更新到源库b的对应表中when matched then update set ER_NAME=ER_NAME--如果pk(主键)值不一至,则将目标表中的数据整条插入到源表中when not matched theninsert values (ER_ID,ER_NAME);--记得merge后必须commit,否则更改未能提交commit;将以上脚本写入merge.sql中,然后建立merge.bat文件,双击运行merge.bat文件,那么系统会自动将目标库c将对应表的数据插入到源库b的对应表中,可以将merge.bat作为任务定期执行(也可以按照3创建存储过程和任务来做)merge.bat如下图所示merge.sql如下图所示5,实现数据同步方式一、通过2所描述的方式实现数据库数据同步(已测试)方法二、创建存储过程和任务(待测试)--创建一个存储过程create procedure proc_sjtbasbegindelete from swdx_gzryxx where is_tb='1';insert into swdx_gzryxx(gzrybh,mc,jgdm,phone,is_tb)selectdistinct(t.zgswry_dm),t.zgswry_mc,t.nsr_swjg_dm,t.tel_zgy,'1' from dxpt_sjtb@mydblink t;delete from gdzc_jg where is_tb='1';insert into gdzc_jg(jg_dm,jg_mc,is_tb)selectdistinct(t.nsr_swjg_dm),t.nsr_swjg_mc,'1' from dxpt_sjtb@mydblink t;delete from swdx_nsrxx where is_tb='1';insert into swdx_nsrxx(nsrsbh,nsrmc,jgdm,zgydm,is_tb)selectt.nsrsbh,t.nsrmc,t.nsr_swjg_dm,t.zgswry_dm,'1' from dxpt_sjtb@mydblink t;insert into swdx_nsrphone(nsrsbh,lbbh,tel) selectt.nsrsbh,'001',t.TEL_NSR_CW from dxpt_sjtb@mydblink t;insert into swdx_nsrphone(nsrsbh,lbbh,tel) selectt.nsrsbh,'002',t.TEL_NSR_FR from dxpt_sjtb@mydblink t;insert into swdx_nsrphone(nsrsbh,lbbh,tel) selectt.nsrsbh,'003',t.TEL_NSR_QT from dxpt_sjtb@mydblink t;delete from xt_czy where is_tb='1';insert into xt_czy(czy_id, czy_mc, jg_code, czy_lxdh,is_zgy,is_tb,is_jgczy,CZY_YXBZ) select distinct (t.zgswry_dm),t.zgswry_mc, t.nsr_swjg_dm, t.tel_zgy,'1','1','0','Y' fromdxpt_sjtb@mydblink t;insert into xt_czy(czy_id, czy_mc, jg_code,is_zgy,is_tb,is_jgczy,CZY_YXBZ) selectdistinct(t.nsr_swjg_dm),t.nsr_swjg_mc,t.nsr_swjg_dm,'0','1','1','Y' from dxpt_sjtb@mydblink t;end;--创建任务(每分钟执行一次)DECLARE X NUMBER;BEGINSYS.DBMS_JOB.SUBMIT(job => X,what => 'proc_sjtb;',next_date => to_date('09-12-2008 00:00:00','dd/mm/yyyyhh24:mi:ss'),interval => 'TRUNC(sysdate) + 1 +2 / (24)');END;--执行任务--RUN(参数)是我们建立任务的时候自动生成的,指定任务号方可启动任务和删除任务beginSYS.DBMS_JOB.RUN(25);end;--删除任务beginsys.DBMS_JOB.REMOVE(23);end;方法三、创建触发器实现实时同步(测试通过)--KNG_LINK 数据链名称--cztbd 源数据库的用户名--cztbd 源数据库的密码--KNG ORACLE SID实例名(源库)--1、在源数据库上,创建要同步表的快照日志(不是很确定是否是在源库建立这个快照日志)--DBLINK_TEST:源库表,LOG:快照名称,不虚伪log不能修改,否则不能创建成功Create snapshot LOG on DBLINK_TEST;--2、在目标数据库上创建快照(被同步(源)数据库服务必须启动) DB_LINK_KZ:快照名称Create snapshot DB_LINK_KZ as select * from DBLINK_TEST@KNG_LINK;--3、设置刷新快照时间:如下写法为每隔一分钟刷新一次Alter snapshot DB_LINK_KZ refresh fast Start with sysdate nextsysdate+1/1440;---删除快照的方法drop snapshot DB_LINK_KZ;DROP MATERIALIZED VIEW DB_LINK_KZ;---手动刷新快照begindbms_refresh.refresh('DB_LINK_KZ');end;---查看快照最后一次刷新时间SELECT NAME,LAST_REFRESH FROM ALL_SNAPSHOT_REFRESH_TIMES;---查看快照下次执行时间select last_date,next_date,what from user_jobs order by next_date;--4、创建触发器:在目标库创建未通过,创建用于同步本地表与远程表(源数据库)数据的触发器由于创建快照后,快照在目标数据库表现为会创建一个数据表DB_LINK_KZ,此表根据上一步骤设置的快照刷新时间自动与源数据库的表user同步,要想实现两个数据库的真正同步,只需针对DB_LINK_KZ表创建一个触发器即可解决,即通过触发器实现往目的数据库的指定数据表中插入数据,实现本地数据与目的数据库表的数据同步。
Oracle数据库数据同步⽅案
⼀、⽐较原始的⽅案:触发器/Job/快照+dblink的⽅式,可实现同步和定时刷新;
⼆台不同的数据库服务器,从⼀台数据库服务器A的⼀个⽤户读取另⼀台数据库服务器B下某个⽤户的数据,可以通过dblink来完成。
⼆、通过物化视图定时刷新来实现数据同步。
物化视图刷新⽅式有增量刷新和完全刷新两种模式;
三、⾼级复制,分为多主复制和物化视图复制两种模式。
其中多主复制能进⾏双向同步复制和异步复制;物化视图⽤于单向复制,定时刷新,与第⼆条类似;
四、流复制,可实现实时和⾮实时同步;
五、GoldenGate复制,Oracle新买的复制产品,后⾯应当会取代流复制。
它不仅能提供Oracle数据库之间的数据复制⽀持,还⽀持在不同种数据库之间的数据同步,也可设置实时和⾮实时同步;
六、DataGurd,此技术主要⽤于容灾备份,是整个库级别的备份。
其中第⼀、⼆和三采⽤的是Oracle数据库内部的机制来实现;⽽第四、五和六采⽤挖掘数据库⽇志的⽅式实现;后三种在性能上会更好⼀些。
数据库同步原理
《数据库同步原理》
数据库同步是指将两个或多个数据库中的数据进行一致化更新的过程。
在实际的应用中,数据
库同步通常有两种方式:一种是主从同步,即一个数据库作为主数据库,负责接收所有的写操作,其他数据库作为从数据库,负责接收主数据库的更新操作;另一种是双向同步,即两个数
据库之间进行双向数据同步,确保数据的一致性。
数据库同步的原理可以分为以下几个步骤:
1. 数据捕获:首先需要捕获源数据库中的数据变化,包括插入、更新和删除操作。
这可以通过
数据库的日志文件或者触发器来实现。
2. 数据传输:捕获到数据变化后,需要将数据传输到目标数据库中。
这一步可以通过网络传输,通常采用TCP/IP协议进行数据传输。
3. 数据应用:在传输到目标数据库后,需要将数据应用到目标数据库中,确保数据的一致性。
这一步通常可以通过事务来实现,保证数据的完整性和一致性。
在数据库同步过程中,还需要考虑到数据冲突和并发控制等问题,确保数据库同步过程的准确
性和可靠性。
总的来说,数据库同步的原理是通过捕获源数据库中的数据变化,将数据传输到目标数据库中,并确保数据的一致性和完整性,从而实现数据库之间的数据同步。
通过数据库同步技术,可以
在不同的数据库之间保持数据的一致性,提高系统的可用性和性能。
SQL表同步更新问题的触发器SQL表同步更新问题的触发器sql server 2000 触发器,表同步更新的问题有三个表,A ,B,CA、B表中含有: A1,B1,C1 三个字段,C 表中存放A、B表中的A1、B1、C1 的集合,字段类型都为nvarchar(10),当表A的数据被更新、删除、插⼊后要反映到C表。
当表B的数据被更新、删除、插⼊后要反映到C表。
假定A,B表中在a1,b1,c1上有唯⼀索引这个问题如果纯属从理论来说,是很容易解决的,因为从要求可知,实质上C表存放的数据即为A、B表的并集。
可以在A、B表上创建相同的trigger,⼀旦A、B表上有变化,⽐如插⼊、删除或更新时,即清空C表数据,然后把A、B表的数据union后插⼊C表中即可实现⽬的呵呵呵。
下⾯的trigger的实现原理是:当A表插⼊数据时,检查C表中是否有A表将要插⼊的数据,如果⽆,则将这⾏数据插⼊到C表中,反之,则不需要操作。
当A表update时, 检查B表中是否有更新前这⾏数据,如果有,则C表中应该保留这⾏数据且把A表中更新后的数据也插⼊到C表中去。
如果B表中没有A表更新前的这⾏数据且C表中没有A表更新后的这⾏数据,则需要⽤A表更新后的数据来更新C表中与A表更新前这⾏数据相同的数据;如果B表中没有A表更新的的这⾏数据且C表中有A表更新后的这⾏数据,则需要从C表中删除跟A表更新前相同的那⾏数据(因为更新A表后,A表和B表都没有A表更新前的那⾏数据了,则这⾏数据显然在C表中不应该再存在了)。
当A表中删除时,检查B表是否还存在A表要删除的这⾏数据,如果有,则不能删除C表中与A表要删除的数据相同的⾏。
反之,则执⾏删除操作。
B表中的trigger跟A表中的原理相同。
CREATE TRIGGER SYNC_C_BY_AON AAFTER INSERT,UPDATE,DELETEASDeclare @Dml TinyInt --1:Insert 2:Update 3:DeleteDeclare @RowsD IntDeclare @RowsI IntDeclare @A1_D nvarchar(10)Declare @B1_D Nvarchar(10)Declare @C1_D Nvarchar(10)--确定是哪⼀种dml操作Select @RowsD=Count(*) From DeletedSelect @RowsI=Count(*) From InsertedIf @RowsD=0 And @RowsI=0Goto Exit_If @RowsD=0 And @RowsI>0Set @Dml=1ElseIf @RowsD>0 And @RowsI>0Set @Dml=2ElseIf @RowsD>0 And @RowsI=0Set @Dml=3IF @DML=1BEGIN--检查c表中是否已经有A表中新插⼊的数据⾏,如果没有,则也插⼊IF NOT EXISTS(SELECT TOP 1 1 FROM c,inserted i where c.a1=i.a1 and c.b1=i.b1 and c.c1=i.c1)insert into c select * from insertedENDIF @DML=2BEGIN--检查B表中是否有A表中更新前的这⾏数据,如果有,则不需要更新C表中的数据,⽽是要把A表中更新后的这⾏数据插⼊到C表中IF NOT EXISTS(SELECT TOP 1 1 FROM B,DELETED d where b.a1=d.a1 and b.b1=d.b1 and b.c1=d.c1)BEGIN--如果C表中不存在A表更新后的这⾏数据,则更新C表中跟A表更新前那⾏数据相同的数据IF NOT EXISTS(SELECT TOP 1 1 FROM C,INSERTED I WHERE C.A1=I.A1 AND C.B1=I.B1 AND C.C1=I.C1)BEGINUPDATE C SET A1=I.A1,B1=I.B1,C1=I.C1 FROM C,INSERTED I,DELETED D WHERE C.A1=D.A1 AND C.B1=D.B1 AND C.C1=D.C1END--如果C表中存在A表更新后的这⾏数据,则需要删除C表中跟A表更新前相同的那⾏数据ELSEBEGINSELECT @A1_D=A1,@B1_D=B1,@C1_D=C1 FROM DELETEDDELETE FROM C WHERE @A1_D=A1 AND @B1_D=B1 AND @C1_D=C1ENDENDELSEinsert into c select * from inserted i where not exists(select 1 from c where i.a1=c.a1 and i.b1=c.b1 and i.c1=c.c1)ENDIF @DML=3BEGIN--如果B表中不存在A表要删除的这⾏数据,则需要从C表中删除这⾏数据IF not exists(select top 1 1 from b,deleted d where b.a1=d.a1 and b.b1=d.b1 and b.c1=d.c1)DELETE FROM C WHERE EXISTS(SELECT 1 FROM deleted d where c.a1=d.a1 and c.b1=d.b1 and c.c1=d.c1)ENDEXIT_:CREATE TRIGGER SYNC_C_BY_BON BAFTER INSERT,UPDATE,DELETEASDeclare @Dml TinyInt --1:Insert 2:Update 3:DeleteDeclare @RowsD IntDeclare @RowsI IntDeclare @A1_D nvarchar(10)Declare @B1_D Nvarchar(10)Declare @C1_D Nvarchar(10)--确定是哪⼀种dml操作Select @RowsD=Count(*) From DeletedSelect @RowsI=Count(*) From InsertedIf @RowsD=0 And @RowsI=0Goto Exit_If @RowsD=0 And @RowsI>0Set @Dml=1ElseIf @RowsD>0 And @RowsI>0Set @Dml=2ElseIf @RowsD>0 And @RowsI=0Set @Dml=3IF @DML=1BEGIN--检查c表中是否已经有B表中新插⼊的数据⾏,如果没有,则也插⼊IF NOT EXISTS(SELECT TOP 1 1 FROM c,inserted i where c.a1=i.a1 and c.b1=i.b1 and c.c1=i.c1)insert into c select * from insertedENDIF @DML=2BEGIN--检查B表中是否有A表中更新前的这⾏数据,如果有,则不需要更新C表中的数据,⽽是要把A表中更新后的这⾏数据插⼊到C表中IF NOT EXISTS(SELECT TOP 1 1 FROM A,DELETED d where a.a1=d.a1 and a.b1=d.b1 and a.c1=d.c1)BEGIN--如果C表中不存在B表更新后的这⾏数据,则更新C表中跟b表更新前那⾏数据相同的数据IF NOT EXISTS(SELECT TOP 1 1 FROM C,INSERTED I WHERE C.A1=I.A1 AND C.B1=I.B1 AND C.C1=I.C1)BEGINUPDATE C SET A1=I.A1,B1=I.B1,C1=I.C1 FROM C,INSERTED I,DELETED D WHERE C.A1=D.A1 AND C.B1=D.B1 AND C.C1=D.C1END--如果C表中存在更新B表后的这⾏数据,则需要删除C表中跟B表更新前相同的那⾏数据ELSEBEGINSELECT @A1_D=A1,@B1_D=B1,@C1_D=C1 FROM DELETEDDELETE FROM C WHERE @A1_D=A1 AND @B1_D=B1 AND @C1_D=C1EndENDELSEinsert into c select * from inserted i where not exists(select 1 from c where i.a1=c.a1 and i.b1=c.b1 and i.c1=c.c1) ENDIF @DML=3BEGIN--如果A表中不存在B表要删除的这⾏数据,则需要从C表中删除这⾏数据if not exists(select top 1 1 from a,deleted d where a.a1=d.a1 and a.b1=d.b1 and a.c1=d.c1)DELETE FROM C WHERE EXISTS(SELECT 1 FROM deleted d where c.a1=d.a1 and c.b1=d.b1 and c.c1=d.c1) ENDEXIT_:。
MySQL实现两张表数据的同步
mysql通过触发器实现两个表的同步,需要了解的朋友可以看⼀下。
有两张表A和B,要求往A⾥⾯插⼊⼀条记录的同时要向B⾥⾯也插⼊⼀条记录,向B⾥⾯插⼊⼀条记录的同时也向A插⼊⼀条记录。
两张表的结构不同,需要将其中⼏个字段对应起来。
可以⽤下⾯的触发器实现。
表A的触发器:
begin
set @disable=1;
if @disable=1 and NOT EXISTS(SELECT 1 FROM tableB where ID=new.ID) then
insert into tableB (ID,对应字段1) values(new.ID,new.对应字段1);
end if;
set @disable=0;
end
表B的触发器:
begin
set @disable=1;
if @disable=1 and NOT EXISTS(SELECT 1 FROM tableA where ID=new.ID) then
insert into tableA (ID,对应字段1) values(new.ID,new.对应字段1);
end if;
set @disable=0;
end
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
(10)MySQL触发器(同时操作两张表)什么是触发器触发器是与表有关的数据库对象,在满⾜定义条件时触发,并执⾏触发器中定义的语句集合。
触发器的这种特性可以协助应⽤在数据库端确保数据的完整性。
举个例⼦,⽐如你现在有两个表【⽤户表】和【⽇志表】,当⼀个⽤户被创建的时候,就需要在⽇志表中插⼊创建的log⽇志,如果在不使⽤触发器的情况下,你需要编写程序语⾔逻辑才能实现,但是如果你定义了⼀个触发器,触发器的作⽤就是当你在⽤户表中插⼊⼀条数据的之后帮你在⽇志表中插⼊⼀条⽇志信息。
当然触发器并不是只能进⾏插⼊操作,还能执⾏修改,删除触发器的事件:事件就是⽐如insert是插⼊指令,这时候只要定义好insert,那么就会在插⼊时候触发,其他的update等操作不会触发# 插⼊前CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROWBEGIN...END# 插⼊后CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROWBEGIN...END# 删除前CREATE TRIGGER tri_before_delete_tb1 BEFORE DELETE ON tb1 FOR EACH ROWBEGIN...END# 删除后CREATE TRIGGER tri_after_delete_tb1 AFTER DELETE ON tb1 FOR EACH ROWBEGIN...END# 更新前CREATE TRIGGER tri_before_update_tb1 BEFORE UPDATE ON tb1 FOR EACH ROWBEGIN...END# 更新后CREATE TRIGGER tri_after_update_tb1 AFTER UPDATE ON tb1 FOR EACH ROWBEGIN...END创建触发器的语法如下:CREATE TRIGGER 触发器名字 BEFORE DELETE ON 触发表的名字 FOR EACH ROWBEGINinsert into user_log (列名) values ('值');ENDtrigger_name:触发器的名称tirgger_time:触发时机,为BEFORE或者AFTERtrigger_event:触发事件,为INSERT、DELETE或者UPDATEtb_name:表⽰建⽴触发器的表明,就是在哪张表上建⽴触发器trigger_stmt:触发器的程序体,可以是⼀条SQL语句或者是⽤BEGIN和END包含的多条语句所以可以说MySQL创建以下六种触发器:1、BEFORE INSERT2、BEFORE DELETE3、BEFORE UPDATE4、AFTER INSERT5、AFTER DELETE6、AFTER UPDATE修改终⽌符创建触发器实例:DROP TRIGGER 触发器名字 #删除触发器show triggers \G; #查看触发器的指令*************************** 1. row ***************************Trigger: userlog #触发器的名字Event: INSERT #什么操作下触发,也就是监听的事件Table: user #触发表的名字Statement: BEGIN #触发器的开始insert into user_log (name) values ('xxxxx'); #sql指令END #触发器结束Timing: BEFORECreated: NULLsql_mode: NO_ENGINE_SUBSTITUTIONDefiner: root@localhostcharacter_set_client: utf8mb4collation_connection: utf8mb4_general_ciDatabase Collation: latin1_swedish_ci*************************** 2. row ***************************Trigger: demoEvent: DELETETable: userStatement: BEGINinsert into user_log (name) values ('xxxx');ENDTiming: BEFORECreated: NULLsql_mode: NO_ENGINE_SUBSTITUTIONDefiner: root@localhostcharacter_set_client: gbkcollation_connection: gbk_chinese_ciDatabase Collation: latin1_swedish_ci2 rows in set (0.01 sec)。
datasync实现原理
Data synchronization(数据同步)是指在不同系统之间保持
数据一致性的过程。
实现数据同步的方式有很多种,其中一个常见
的实现原理是通过触发器(Triggers)和日志(Logs)来实现。
触发器是一种在数据库中定义的特殊类型的存储过程,它会在
特定的数据操作(比如插入、更新、删除)发生时自动执行。
通过
在数据表上创建触发器,可以在数据发生变化时捕获这些变化,并
将变化的信息记录到一个日志中。
日志是记录数据库操作的详细信息的文件,它可以用来恢复数
据库到特定的时间点。
在数据同步中,日志可以被用来捕获数据的
变化,并将这些变化应用到其他系统中,从而保持数据的一致性。
另外,数据同步还可以通过定时轮询源系统的数据变化来实现。
这种方式会定期检查源系统中的数据变化,并将变化的数据同步到
目标系统中。
这种方式的实现原理相对简单,但是会增加系统的负
载和延迟。
除了上述提到的方式,还有基于消息队列、ETL(Extract,
Transform, Load)工具、数据库复制等方式来实现数据同步。
每种方式都有其适用的场景和实现原理,选择合适的方式来实现数据同步取决于具体的业务需求和系统架构。
总的来说,数据同步的实现原理涉及到数据库操作的捕获和应用,以及数据的传输和转换。
通过合理选择和组合这些技术手段,可以实现高效可靠的数据同步。
MySQL触发器例⼦(两张表同步增加和删除)例⼦1:创建两个表,⽬的是在⼀个表⾥添加⼀条记录,另⼀个表也添加⼀条记录:DROP TABLE IF EXISTS tab1;CREATE TABLE tab1(tab1_id varchar(11));DROP TABLE IF EXISTS tab2;CREATE TABLE tab2(tab2_id varchar(11));创建触发器:t_afterinsert_on_tab1作⽤:增加tab1表记录后⾃动将记录增加到tab2表中delimiter ||DROP TRIGGER IF EXISTS t_afterinsert_on_tab1 ||CREATE TRIGGER t_afterinsert_on_tab1AFTER INSERT ON tab1FOR EACH ROWBEGINinsert into tab2(tab2_id) values(new.tab1_id);END||delimiter ;测试:INSERT INTO tab1(tab1_id) values('0001');查看结果:SELECT * FROM tab1;SELECT * FROM tab2;例⼦2:创建两个表,⽬的是在⼀个表⾥删除⼀条记录,另⼀个表也删除⼀条记录:delimiter || //mysql 默认结束符号是分号,当你在写触发器或者存储过程时有分号出现,会中⽌转⽽执⾏DROP TRIGGER IF EXISTS t_afterdelete_on_tab1||CREATE TRIGGER t_afterdelete_on_tab1AFTER DELETE ON tab1FOR EACH ROWBEGINdelete from tab2 where tab2_id=old.tab1_id;END||测试:DELETE FROM tab1 WHERE tab1_id='0001';看看结果SELECT * FROM tab1;SELECT * FROM tab2;。
用触发器实现两个数据库之间相同表的同步
2008-06-13 14:20
近日单位建立OA服务器,要实现两台服务器间数据库表的同步。
一开始想采用订阅发布的模式,结果没有成功,连鸣大哥让我想一下怎么解决,结果我从网上找了用触发器实现的方法,觉得这种方法更适合我们的工作要求。
OA服务器更新较少,如果采用定时备份的方法会浪费服务器的效率,用触发器就可以在数据库发生变化的时候及时更新两台服务器的数据。
触发器的语法如下:
Trigger on an INSERT, UPDA TE, or DELETE statement to a table or view (DML Trigger) CREATE TRIGGER [ schema_name . ]trigger_name
ON { table | view }
[ WITH <dml_trigger_option> [ ,...n ] ]
{ FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS { sql_statement [ ; ] [ ...n ] | EXTERNAL NAME <method specifier [ ; ] > }
<dml_trigger_option> ::= [ ENCRYPTION ] [ EXECUTE AS Clause ]
<method_specifier> ::= assembly_name.class_name.method_name
对两个服务器之间的表进行同步,首先要建立链接服务器。
在server1 上创建连接服务器,以便在server1 中操作server2,实现同步
exec sp_addlinkedserver 'server2','','SQLOLEDB','server2的数据库实例名或ip'
exec sp_addlinkedsrvlogin 'server2','false',null,'用户名','密码'
go
trigger的代码如下:假设远程服务器的表是oa_user
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
CREATE TRIGGER Trigger_Add_user
ON [dbo].[oa_user]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
set xact_abort on
insert server2.hdoa.dbo.oa_user
select * from inserted
END
按照网上的攻略所说,建立了上述的触发器,就可以当oa_user表进行插入操作的时候,本地服务器中的表也会有这条记录。
但是在实际实施中,系统报了如下的错误。
服务器: 消息7391,级别16,状态1,行 1
该操作未能执行,因为OLE DB 提供程序'SQLOLEDB' 无法启动分布式事务。
[OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。
在网上找了找关于7391的错误还有dtc无法启动的错误描述,发现造成这种情况的的原因很多。
总结解决方法如下:
一、确保MSDTC 服务帐户登录为" 是NetworkService 帐户。
在运行对话框中,输入services.msc然后确定。
在服务窗口,找到DistributedTransactionCoordinator服务中检查登陆名为NetworkService 。
错误的情况是:登陆名为本地系统帐户,解决方式如下:
开始, 依次运行。
在运行对话框中, 键入cmd然后单击确定。
在命令提示符处, 键入Net stop msdtc 要停止MSDTC 服务。
在命令提示符处, 键入Msdtc –uninstall 要删除MSDTC。
在命令提示符处, 键入regedit 要打开注册表编辑器。
在注册表编辑器, 找到以下项:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC注册表项。
删除该项。
退出注册表编辑器。
在命令提示符处, 键入Msdtc –install 要安装MSDTC。
在命令提示符处, 键入Net start msdtc 要启动MSDTC 服务。
二、启用msdc以允许网络事务。
点击开始-管理工具-组件-组件服务-计算机-我的电脑。
右键-属性。
找到msdtc选项。
全部选中,验证的地方选择不需验证.最后确定生效。
三、防火墙设定。
dtc的端口是135,如果你打开了防火墙,就把135端口设为例外。
四、更改hosts文件(此处注意没有扩展名)
通常在c:\windows\system32\drivers\etc里面。
文件参考如下
========================================
# Copyright (c) 1993-1999 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol. #
# For example:
#
# 102.54.94.97 # source server
# 38.25.63.10 # x client host
127.0.0.1 localhost
192.168.1.2 中心
192.168.1.3 党政大楼
关键就是最后几行:前面写IP,后面写该电脑的名称。
上面4中情况,我在实施中遇到了第2种和第4种,由于本人小懒了下,把防火墙关闭了,没有测试第3种情况。
网上关于hosts文件的说明很少,大多数说明都是关于前3种情况的,看了很多文章,才看见hosts这种情况,貌似是分布式回掉的时候要看本地服务器的电脑名而不是IP,所以在hosts文件要建立一个对应。
终于,两台服务器间不同数据库的表进行复制的问题解决了。
下面所要做的具体工作就是:
1、在每个经常更新的表建立triger.
2、仿照上面的triger写出delete,update这两个triger
然后就可以休息啦。
哈哈!!!。