1. 程式人生 > >實現跨資料庫表同步的方法

實現跨資料庫表同步的方法

描述:資料庫A中的表table1,實時同步到資料庫B

1、在資料庫A中設定訪問資料庫B的連結伺服器。

2、在兩個資料庫之間表中,選擇一個表,對其新增、刪除、修改操作設定觸發器,通過觸發器實現資料同步到其他資料庫的表。

-建立觸發器,同步遠端表_新增操作
CREATE TRIGGER SYN_RemoteTable_Insert
   ON Table
   AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;

    INSERT [vRemoteTable]    SELECT * FROM inserted

END
GO

--建立觸發器,同步遠端表_同步操作
CREATE TRIGGER [dbo].[SYN_RemoteTable_Update]
   ON Table
   AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;

    UPDATE vRemoteTable set ID=u.ID,Name=u.Name
   FROM inserted u where u.ID=vRemoteTable.ID

END

--建立觸發器,同步遠端表_刪除操作
CREATE TRIGGER [dbo].[SYN_RemoteTable_Delete]
   ON Table
   AFTER DELETE
AS
BEGIN
SET NOCOUNT ON;

DECLARE @ID int;
select top 1 @ID=IsNull(ID,-1) from deleted;
delete   vRemoteTable   where  

[email protected]
END
GO

1.        雙方啟動MSDTC服務
MSDTC服務提供分散式事務服務,如果要在資料庫中使用分散式事務,必須在參與的雙方伺服器啟動MSDTC(Distributed Transaction Coordinator)服務。

2.        開啟雙方135埠
MSDTC服務依賴於RPC(Remote Procedure Call (RPC))服務,RPC使用135埠,保證RPC服務啟動,如果伺服器有防火牆,保證135埠不被防火牆擋住。  

使用“telnet IP 135 ”命令測試對方埠是否對外開放。也可用埠掃描軟體(比如Advanced Port Scanner)掃描埠以判斷埠是否開放。

3.        保證連結伺服器中語句沒有訪問發起事務伺服器的操作
在發起事務的伺服器執行連結伺服器上的查詢、檢視或儲存過程中含有訪問發起事務伺服器的操作,這樣的操作叫做環回(loopback),是不被支援的,所以要保證在連結伺服器中不存在此類操作。

4.        在事務開始前加入set xact_abort ON語句
對於大多數 OLE DB 提供程式(包括 SQL Server),必須將隱式或顯示事務中的資料修改語句中的 XACT_ABORT 設定為 ON。唯一不需要該選項的情況是在提供程式支援巢狀事務時。

5.        MSDTC設定
開啟“管理工具――元件服務”,以此開啟“元件服務――計算機”,在“我的電腦”上點選右鍵。在MSDTC選項卡中,點選“安全配置”按鈕。

在安全配置視窗中做如下設定:

l選中“網路DTC訪問”

l在客戶端管理中選中“允許遠端客戶端”“允許遠端管理”

l在事務管理通訊中選“允許入站”“允許出站”“不要求進行驗證”

l保證DTC登陸賬戶為:NT   Authority/NetworkService

6.        連結伺服器和名稱解析問題
建立連結sql server伺服器,通常有兩種情況:

l第一種情況,產品選”sql server”

EXEC sp_addlinkedserver

   @server='linkServerName',

   @srvproduct = N'SQL Server'

這種情況,@server (linkServerName)就是要連結的sqlserver伺服器名或者ip地址。

l第二種情況,訪問介面選“Microsoft OLE DB Provider Sql Server”或“Sql Native Client”

EXEC sp_addlinkedserver  

   @server=' linkServerName ',

   @srvproduct='',

   @provider='SQLNCLI',

   @datasrc='sqlServerName'

這種情況,@datasrc(sqlServerName)就是要連結的實際sqlserver伺服器名或者ip地址。

Sql server資料庫引擎是通過上面設定的伺服器名或者ip地址訪問連結伺服器,DTC服務也是通過伺服器名或者ip地址訪問連結伺服器,所以要保證資料庫引擎和DTC都能通過伺服器名或者ip地址訪問到連結伺服器。

資料庫引擎和DTC解析伺服器的方式不太一樣,下面分別敘述

6.1       資料庫引擎
第一種情況的@server或者第二種情況的@datasrc設定為ip地址時,資料庫引擎會根據ip地址訪問連結伺服器,這時不需要做名稱解析。

第一種情況的@server或者第二種情況的@datasrc設定為sql server伺服器名時,需要做名稱解析,就是把伺服器名解析為ip地址。

有兩個辦法解析伺服器名:

一是在sql server客戶端配置中設定一個別名,將上面的伺服器名對應到連結伺服器的ip地址。

二是在“C:/WINDOWS/system32/drivers/etc/hosts”檔案中增加一條記錄:

xxx.xxx.xxx.xxx   伺服器名

作用同樣是把伺服器名對應到連結伺服器的ip地址。

6.2       DTC
不管哪一種情況,只要@server設定的是伺服器名而不是ip地址,就需要進行名稱解析,辦法同上面第二種辦法,在hosts檔案中增加解析記錄,上面的第一種辦法對DTC不起作用。

如果@server設定的是ip地址,同樣不需要做域名解析工作。

 

相關推薦

實現資料庫同步方法

描述:資料庫A中的表table1,實時同步到資料庫B 1、在資料庫A中設定訪問資料庫B的連結伺服器。 2、在兩個資料庫之間表中,選擇一個表,對其新增、刪除、修改操作設定觸發器,通過觸發器實現資料同步到其他資料庫的表。 -建立觸發器,同步遠端表_新增操作CREATE TRIGG

使用Navicat實現MySQL資料庫 結構同步

專案開發時,一般會有兩個(或以上)的資料庫,一個開發庫和一個正式庫,在開發庫修改的表結構如何才能快速同步到正式庫中呢?如果手動一個個欄位或屬性去修改,實在太麻煩,而且容易遺漏,這更不是一個搞IT的人該用的手段! 有了Navicat,就能快速實現資料庫的同步,包括結構同步,資

java程式碼實現MySQL資料庫千萬條資料去重

  準備工作: 1.資料庫表:datatest5 2.欄位: id 主鍵自增,val 重複值欄位併為val建立索引 3.設定innodb緩衝池大小 show variables like "%_buffer%"; SET GLOBAL innod

SQL語句實現資料庫訪問

SQL語句實現跨資料庫訪問 第一步: 啟用Ad Hoc Distributed Queries語句:  exec sp_configure 'show advanced options',1  reconfigure  exec sp_configure 'Ad

SA_JOB_QUEUE查詢佇列狀態(查詢資料庫方法

SA_JOB_QUEUE查詢佇列狀態表 今天突然有人問了我一個問題,我們系統的佇列狀態表在哪一個表中,瞬間懵逼,這對一個時刻操縱著資料庫的人來說是多麼大的打擊。然後我立馬找到user_tables的這個表(這個是查詢當前使用者下的所有的表)。 select * from user_table

PowerDesigner 連線oracle直接生成資料庫方法

創建於 2012-05-08 遷移自個人的百度空間 -------------------------------- 首先機子要裝有oracle驅動程式(在裝oracle伺服器端或客戶端就自動安裝上的oracle的驅動程式)  然後依據下面步驟: 1、database-

(Java實現資料庫結構掃描,壞行壞列掃描實現

(Java實現)Cache資料庫表結構掃描,壞行壞列掃描實現 最近接觸了Cache資料庫,需要將海量資料通過sqoop抽取到hadoop平臺。但是發現一個問題,Cache資料庫是一個後關係型資料,底層是按照global進行存存的,表結構的定義通過preside

QueryRunner類實現資料庫中資料的增刪改查以及八種結果集

update()方法實現增刪改        QueryRunner的update方法 update(Connection conn, String sql, Object… params) 能夠實現對錶中資料的增刪改,返回int型別的數值,表

SQL SERVER 資料庫同步複製 筆記 SqlServer2008 資料庫同步的兩種方式 (釋出、訂閱)

SQL SERVER 資料庫表同步複製 筆記 同步複製可執行在不同版本的SQL Server服務之間 環境模擬需要兩臺資料庫192.168.1.1(釋出),192.168.1.10(訂閱) 1、在釋出和訂閱機中建立兩個相同的賬戶(如: sqladmin),使用者名稱和密碼都一致,隸屬於administr

南瓜先生-------java三種實現域請求的方法

1.第一種:JQuery中的getJson,簡單明瞭。 $.getJson(url+'callback=?',data, function(data){ callback(data); }) 2.帶jsonp的ajax非同步請求。 $(function()

php 如何在HTML頁面中實現資料庫資料的增刪改查

  上一篇詳細說明了如何將資料庫中的資料列印到html頁面上,本篇將介紹如何在HTML頁面的表格裡進行對資料庫內容的增刪改查還是借用上一篇的頁面,在此基礎上增加了操作按鈕:<!doctype html><html><head><meta charset="utf-8"

SqlYog 匯出mysql資料庫結構方法

工具:sqlyog   01.連線需要匯出資料結構的庫   02.選擇資料庫,---右擊-----在建立資料庫架構html       03.選擇要匯出的表-----建立

PHP實現域的解決方法

PHP實現跨域解決方法  如果要實現跨域通過設定Access-Control-Allow-Origin來實現跨域。 例如:客戶端的域名是client.runoob.com,而請求的域名是server.runoob.com。 如果直接使用ajax訪問,會有以下錯誤: XMLHtt

(JDBC)利用Java反射編寫一個萬能的資料庫查詢方法

        在用JDBC的過程中,我們可能會根據實際需求來編寫N個查詢方法(特別是新手),這樣雖然簡單,但是會產生大量的重複程式碼。且不容易維護。那麼有沒有辦法,只編寫一個方法呢?         通過分析,不難發現,對於查詢,我們發現除了SQL語句的變動意外,就是實體

SqlYog 匯出mysql資料庫結構方法

工具:sqlyog 01.連線需要匯出資料結構的庫 02.選擇資料庫,---右擊-----在建立資料庫架構html   03.選擇要匯出的表-----建立 04.選擇儲存位置 05.正在匯出   06.匯出成功   07.彈出視窗,-----可以點選每個連線, --

JS工具函式封裝:使用隱藏iframe實現單提交

程式碼如下: /* * 使用隱藏的iframe傳送表單提交 * Author: 鄧智容 * Created: 2017-06-19, Last-Modified: 2017-06-19 * 依賴 jQuery或者 Zepto * * * o

利用oracle快照dblink解決資料庫同步問題

本例項已完全通過測試,單向,雙向同步都可使用. --名詞說明:源——被同步的資料庫            目的——要同步到的資料庫 前6步必須執行,第6以後是一些輔助資訊. --1、在目的資料庫上,建立dblinkdrop public database link dblink_orc92_182;Crea

shell指令碼實現mysql資料庫結構的對比

在專案維護和開發中,經常需要知道兩個資料庫之間有哪些差異,如兩個資料庫中資料表有什麼不同(表的名稱,數量),相同的表字段是否相同(欄位數目,約束,欄位型別,大小等),有各種資料庫管理工具可以實現這一點,但是別人的東西用起來總是沒有自己的順手(比如有的工具直接生成

利用ES6-Promise()方法封裝原始jsonp實現域請求公用方法(告別使用JQuery封裝好的jsonp)

在專案中,經常需要用到jsonp實現跨域請求,假如使用JQuery封裝好的jsonp方法,是很容易實現的,缺點:需要引入JQuery庫。 $.ajax({ url : './package.json', type : 'get',

利用JDBC連線實現伺服器資料庫資料傳輸

  如題  我現在有兩個伺服器 A和B 我現在要把A伺服器上的某一個庫裡面的所有的表及結構及資料 匯入另外一個伺服器上,實現原理利用原始JDBC 完成 程式碼類:  回家再擼 目前在公司 。。 下班    哈哈 晚上吃了點飯 就回來