⑴ 兩個一樣的oracle 資料庫怎麼實現數據定期同步
為方便完成指定數據表的同步操作,可以採用dblink與merge結合的方法完成。
操作環境: 此資料庫伺服器ip為192.168.196.76,有center與branch兩個庫,一般需要將center的表數據同步到branch,center為源庫,branch為目標庫,具體步驟如下:
1.在源庫創建到目標庫的dblink
create database link branch --輸入所要創建dblink的名稱,自定義 connect to dbuser identified by 「password」 --設置連接遠程資料庫的用戶名和密碼 using '192.168.196.76/branch'; --指定目標資料庫的連接方式,可用tns名稱
正常情況下,如果創建dblink成功,可採用該方式訪問到遠程資料庫的表.
3.通過merge語句完成表數據同步
此例中需要將center庫中的tb_sys_sqlscripe表同步到branch,簡單的語法如下:
merge into tb_sys_sqlscripe@branch b using tb_sys_sqlscripe c on (b.pk=c.pk) --從center將表merge到branch,同步的依據是兩個表的pk
when matched then update set b.sqlscripe=c.sqlscripe,b.author=c.author --如果pk值是相同則將指定表的值更新到目標表
when not matched then --如果pk值不一至,則將源表中的數據整條插入到目標表中
insert values (c.pk, c.fk, c.createtime, c.lastmodifytime,c.author,c.mole,c.deleteflag, c.scripttype);
commit; --記得merge後必須commit,否則更改未能提交
4.為方便每次需要同步時自動完成同步工作,可將該語句做成存儲過程或腳本來定時執行或按要求手動執行,簡單說一下創建腳本的方法:
a.創建merge文件夾
b.先將merge語句寫完整後,存到merge.sql文件中
c.新建merge.bat文件,編輯後寫入以下內容
sqlplus user/password@serverip/database @"%cd%merge.sql"
⑵ 如何同步ORACLE和sqlserver的數據
1.在Oracle中建立對應的contract 和 contract_project表,需要同步哪些欄位我們就建那些欄位到Oracle表中。
這里需要注意的是Oracle的數據類型和SQLServer的數據類型是不一樣的,那麼他們之間是什麼樣的關系拉?我們可以在SQLServer下運行:
SELECT *
FROM msdb.dbo.MSdatatype_mappings
SELECT *
FROM msdb.dbo.sysdatatypemappings
來查看SQLServer和其他資料庫系統的數據類型對應關系。第一個SQL語句是看SQL轉Oracle的類型對應,而第二個表則更詳細得顯示了各個資料庫系統的類型對應。根據第一個表和我們的SQLServer中的欄位類型我們就可以建立好Oracle表了。
SQLServer和Oracle的對應
2.建立鏈接伺服器。我們將Oracle系統作為SQLServer的鏈接伺服器加入到SQLServer中。
具體做法參見我以前的文章http://www.cnblogs.com/studyzy/archive/2006/12/08/690307.html
3.使用SQL語句通過鏈接伺服器將SQLServer數據寫入Oracle中。
比如我們建立了鏈接伺服器MIS,而Oracle中在MIS用戶下面建立了表contract_project,那麼我們的SQL語句就是:
DELETE FROM MIS..MIS.CONTRACT_PROJECT
--清空Oracle表中的數據
INSERT into MIS..MIS.CONTRACT_PROJECT--將SQLServer中的數據寫到Oracle中
SELECT contract_id,project_code,actual_money
FROM contract_project
如果報告成功,那麼我們的數據就已經寫入到Oracle中了。用
SELECT *
FROM MIS..MIS.CONTRACT_PROJECT
查看Oracle資料庫中是否已經有數據了。
4.建立SQLAgent,將以上同步SQL語句作為執行語句,每天定時同步兩次。
這樣我們的同步就完成了。
這里需要注意的是MIS..MIS.CONTRACT_PROJECT 這里必須要大寫,如果是小寫的話會造成同步失敗。
⑶ 如何使用navicat從oracle單表同步數據至mysql並定時更新添加過的數據
可以用navicat的工具中,數據同步功能手動同步,選擇源庫oracle,目標庫mysql。但是無法定時同步
⑷ 一台生產機oracle資料庫 和 測試環境資料庫 怎麼實現定期同步一下 並且生產環境不能停
我們現在用的解決方案是,寫個package,實現數據的同步更新過,每15分鍾執行一次,同步更新上意個15分鍾內的transaction!
⑸ 如何跨Oracle資料庫實現表級別的實時同步
一. 前言
這個問題是上一篇文章《Oracle跨資料庫實現定時同步指定表中的數據》中所提問題的進一步延伸。考慮到對數據的實時性要求比較高,設置成定時同步,有點不妥,需要改善升級更改為實時同步。
下面介紹到的方式,嚴格意義上說,並沒有實現實時同步。是通過Oracle資料庫創建同義詞+DBlink的方式,來建立遠程映射。在查看數據時,直接去遠程查詢源庫中的表。
而我一直關注的是如何進行同步數據,卻沒有考慮到可以建立映射。另外,還有一點就是需要交代,就是同步到目標資料庫中的表,不進行增刪改操作,只進行查詢的操作,這也是可以使用同義詞方式解決問題的關鍵。
這種解決思路的出現,多虧了在CSDN問答時,熱心網友的回答,下面就是問題詳情描述。
二. 問題描述
有兩個Oracle資料庫,分別布置在不同的伺服器上,系統均為windows2003;
這里暫且說成是一個主資料庫和從資料庫:
(1) 主資料庫:oracle_A;
(2) 從資料庫:oracle_B;
在oracle_A中有一個表table_A與oracle_B中的表table_B結構相同;
我是處在oracle_B,oracle_A資料庫分配給我有一個訪問oracle_A表table_A的用戶,該用戶只擁有查詢的許可權;
另外,需要說明的一點,就是在oracle_B處,只需對table_B表進行查詢的操作,不進行其他增刪改的操作。
場景介紹完了,我的問題的是,如何在oracle_A中表table_A發生變化時,實時更新同步到oracle_B的table_B中?
我原來的處理方式:
通過建立遠程連接DBLink+JOB定時任務+存儲過程的方式,實現了定時同步更新,但不能做到實時同步。
三. 採用同義詞+DB_Link的方式結果步驟
之所以能夠選擇採用同義詞的方式,處理這個問題。主要還是源於在問題描述中提到一個點,那就是我們只需要對同步後的表進行查詢操作。這點是使用同義詞方式的重要要素。
下面詳細模擬一下整個實驗測試的過程:
(1)首先在Oracle_A端創建一個對table_A只有查詢功能的用戶
<1> 創建用戶
sqlplus /nolog
conn /as sysdba;
create user username identified by password;
<2> 查看所有的用戶列表
用戶創建完成後,查看用戶是否創建成功
select * from all_users;
<3>授予許可權
為了能夠保證能夠登陸,必須賦予如下許可權
--授予username用戶創建session的許可權,即登陸許可權
grant create session to username;
--授予username用戶使用表空間的許可權
grant unlimited tablespace to username;
--oracle對許可權管理比較嚴謹,普通用戶之間也是默認不能互相訪問的,需要互相授權.
--如果scott用戶要授權給username用戶查看自己的test表的許可權;
sqlplus scott/tiget@localhost:1521/orcl
--授予username用戶查看指定的許可權
grant select on test to username;
--撤銷許可權
基本語法同grant,關鍵字為revoke;
(2)驗證用戶是否可以成功登錄,並進行訪問授權的表
--使用sqlplus登錄,並進行查詢
sqlplus username/password@localhost:1521/orcl;
select * from scott.test;
注意:查詢表時,務必帶上用戶名,說明是哪個用戶下的表。
(3)創建遠程連接DB_Link
<1> 創建遠程連接 db_link
create public database link db32connect to tian_test identified by "tian_test" using '192.168.56.6:1521/ORCL'
<2> 測試遠程連接是否成功
select * from tian_smart.zh_item_news@db32;
(4)在Oracle_B端創建同義詞
<1> 使用sqlplus登錄自己的用戶
sqlplus tian_smart/tian_smart@localhost:1521/orcl
<2> 創建同義詞
create or replace public synonym TEST1130 for scott.TEST@db32;
<3> 查詢測試
select * from TEST1130;
可以看到這與在Oracle_A源資料庫中查到的table_A表中的數據一樣.
注意事項:
當遠程查詢的資料庫中包含BLOB欄位時,會報出如下錯誤.
ORA-22992: 無法使用從遠程表選擇的 LOB 定位器
當出現這個錯誤的時候,那是因為跨庫連接查詢中的表中存在BLOB類型的欄位,所以一定要注意,所有表中存在blob類型欄位,
不能用 select * from 連接的表
不能將blob類型的欄位出現在腳本中。
如果這些blob類型的欄位一定要導過來,可以先建立臨時表再插入本地表,方法如下.在pl/sql中執行
第一步 建臨時表
create global temporary table foo ( X BLOB )
on commit delete rows;
第二步 插入本地表
insert into foo select blobcolumn from remoteTable@dl_remote ;
⑹ Etl工具將sqlserver數據同步到oracle設計說明
軟體說明
通過etl工具定時將SqlServer指定的表數據同步到oracle資料庫
在資料庫建立增刪改的觸發器。觸發器將變更放到臨時表裡。
通過etl工具讀取臨時表同步給oracle
優點:比較實時
缺點:影響到業務系統,因為需要在業務系統建立觸發器
實例說明:
例如在sqlserver有一張用戶表(sys_user)需定時同步oracle資料庫的用戶表,
包括新增、刪除、修改同步
給同步的表建三類觸發器:
insert觸發器:向表中插入數據時被觸發;
update觸發器:修改表中數據時被觸發;
delete觸發器:從表中刪除數據時被觸發。
以sqlserver的用戶表舉例,
Sqlserver的sys_user表,有兩個欄位id,name
具體流程:
以新增數據舉例
Ø 一、在sqlserver新建觸發器trigger_sysuser_insert
if (object_id('trigger_sysuser_insert') is not null)
drop trigger trigger_sysuser_insert
go
create trigger trigger_sysuser_insert
on sys_user --表名
for insert --插入後觸發
--instead of insert --插入前觸發,使用插入前觸發時,不執行默認插入
as
--開始執行邏輯
declare @id int, @name varchar(20);
select @id = id, @name = name from sys_user; -------------- inserted 存放了當前插入的值
--select @name,@age
---創建臨時表
if not exists (select * from sysobjects where id = object_id('##sys_user_insert')
and OBJECTPROPERTY(id, 'IsUserTable') = 1)
create table ##sys_user_insert
(
id int,
name varchar(32)
);
insert into ##sys_user_insert (id,name) values(@id,@name);
go
在sys_user新增數據時會被觸發,將新增的數據加入臨時表##sys_user_insert,此時
的臨時表 ##sys_user_insert會增加一條記錄
Ø 二、配置elt流程
節點1 從臨時表讀取數據,寫入數據流
節點2 從數據流獲取數據寫入oracle
節點3 從sqlserver的臨時表刪除已經被同步的記錄
Ø 三、建立作業調度
設置調度周期
適用增量數據同步
在要同步的源表裡有時間戳欄位,每當數據發生新增,時間戳會記錄發生變化的時間,etl工具根據時間范圍定時同步數據
優點:基本不影響業務系統
缺點:要求源表必須有時間戳這一列,適用增量場景,修改、刪除不太適用
定時清空oracle數據源,將sqlserver的數據全盤拷貝到oracle數據源。一般用於數據量不大,實時性要求不高的場景。
優點:基本不影響業務系統,開發、部署都很簡單
缺點:效率低
Etl流程
結論
准能現場數據同步,涉及增、刪、改的同步,比較適用觸發器的方式進行數據同步,但觸發器仍會存在失效的情況,若現場有數據質量系統,定期數據稽核,查缺補漏,保證兩邊資料庫的一致性;
⑺ 關於 ORACLE 資料庫 數據同步(實時同步和非同步同步)
做個資料庫鏈接,A表插入數據以後就往B表插入,用觸發器實現
在任何實時數據同步和復制中,需要考慮如下幾個關鍵問題:
事務一致性:在復制目標端需要按照源端相同的事務環境進行提交,確保目標上數據一致性。
檢查點機制:在抽取和負責時都需要記錄檢查點位置,確保網路故障或GG本身故障下仍然能夠完整復制。
可靠數據傳輸:需要保證數據傳輸的完整性,請求和應答,同時提供數據加密和傳輸過程中的壓縮。
⑻ 如何定時同步oracle表到sql server
1、兩台不同伺服器;
2、從oracle10g定時同步(每天凌晨2:00)到sqlserver2005;
3、處於安全性考慮,客服方不提供sqlserver2005的賬戶密碼,只需我們提供數據集;
4、雙方程序語言都為java;
在這些前提下我提出了幾套方案,僅供參考:
a:如果oracle能在客戶伺服器上訪問,由oracle方提供介面給客戶伺服器實現,返回給客戶伺服器所需同步數據,並由客戶伺服器操作數據存儲到sqlserver2005中,介面代碼描述:遠程建立jdbc連接oracle(臨時帳戶),查詢oracle方提供的視圖,並訪問客戶所需數據集,打成jar包,由客戶方調用介面實現方法獲得數據。
b:如果oracle方不能被客戶伺服器訪問,則將需同步數據置入xml中,並由客服伺服器方訪問其xml(http or socket),並有oracle方提供解析機制,返回數據集。
c:通過開源資料庫同步軟體實現不同(google結果:symmetricds、opendbdiff(針對sqlserver))
前面三種方案均可實現從oracle同步到sqlserver2005,不過如果數據量較大時可能導致中途數據丟失或者同步速度較慢等情況,於是制定如下方案:
建立同步表,將客戶方所需數據表中欄位放入到同步表中,如:
用戶表:wid,userid,password
用戶同步表:wid,userid,password,no,operationtype,operationdate
可以看到同步表中多了三個欄位:no,operationtype,operationdate
no為序號,由oracle序列生成,operationtype為操作類型,0為新增,1為修改,2為刪除,operationdate為操作日期,取當前完整時間(年月日分秒)
建立用戶表觸發器,如果用戶表有操作則將客戶方所需用戶表欄位放入同步表中,如果新增將operationtype的值插入0,以此類推
在客服伺服器方,oracle方提供介面查詢同步表得到結果集,並和客服商議如何操作這些數據
這樣就可以實現哪些數據修改過就同步哪些數據,減免了雙方伺服器的壓力
⑼ oracle資料庫同步
昏。樓上所說的所有方法,統統不適用於樓主的情況。
樓主你也是沒經驗吧。你要及時同步做什麼。你的測試伺服器不修改數據么?不修改表結構么?你修改了怎麼可能還從生產上同步過來。
最好最簡單的一種方法,就是邏輯導出和落導入。而且支持跨版本。
具體的方法就是,在你的生產資料庫上執行
exp userid=system/password file=exp.dmp log=exp.log statistics=none buffer=800000 full=y
這樣就生成了一個叫exp.dmp的導出文件。此時需要注意你的環境變數,包括NLS之類的。如果你懂了就看下一步,否則自己去研究一下。如果沒看清到時候出了亂碼別怪我。
把那個exp.dmp拷貝到你的測試伺服器上去,然後在同一個目錄下執行
imp userid=system/password file=exp.dmp log=imp.log statistics=none
buffer=800000 full=y
做完就可以了,你的測試庫就和生產庫同步了。相同用戶密碼一樣。
這才是最簡單最行之有效的資料庫同步辦法。
當然,如果是我我現在還喜歡用熱備份直接恢復。也很好很強大。可惜不能跨平台跨版本。