用數(shù)據(jù)庫快照就能實現(xiàn)啊.
成都創(chuàng)新互聯(lián)從2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目網(wǎng)站設(shè)計、網(wǎng)站制作網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元武漢做網(wǎng)站,已為上家服務(wù),為武漢各地企業(yè)和個人服務(wù),聯(lián)系電話:18982081108
Oracle快照原理及實現(xiàn)總結(jié)
Oracle數(shù)據(jù)庫的快照是一個表,它包含有對一個本地或遠程數(shù)據(jù)庫上一個或多個表或視圖的查詢的結(jié)果。對于中大型數(shù)據(jù)庫,業(yè)務(wù)數(shù)據(jù)庫里所有的數(shù)據(jù)同步到另外一個處理服務(wù)器上最佳的選擇還是使用SnapShot方式,即快照的方式。
由于工作需要,今天需要將業(yè)務(wù)數(shù)據(jù)庫里所有的數(shù)據(jù)同步到另外一個處理服務(wù)器上。在做方案的時候,想了很多方法,當然最快的辦法還是使用物理熱備的方式。
但是我個人認為如果對于中大型數(shù)據(jù)庫(我們的數(shù)據(jù)庫有300G左右)最佳的選擇還是使用SnapShot方式,即快照的方式。
Oracle數(shù)據(jù)庫的快照是一個表,它包含有對一個本地或遠程數(shù)據(jù)庫上一個或多個表或視圖的查詢的結(jié)果。也就是說快照根本的原理就是將本地或遠程數(shù)據(jù)庫上的一個查詢結(jié)果保存在一個表中。
以下是我建立的Snapshot,目的是從業(yè)務(wù)數(shù)據(jù)庫上將數(shù)據(jù)Copy到處理數(shù)據(jù)庫上,是不同的兩個服務(wù)器之間對數(shù)據(jù)copy。
第一步:在處理服務(wù)器上的Oracle終端,建立database link,業(yè)務(wù)數(shù)據(jù)庫服務(wù)器SID為TEST
create database link TEST_DBLINK.US.ORACLE.COM
connect to AMICOS identified by AMICOS
using 'test';
第二步:在業(yè)務(wù)數(shù)據(jù)庫上對應(yīng)的表建立快照日志
Create snapshot log on A_Table;
第三步:建立Snapshot 快照名稱為:Test_SnapShot
Create snapshot Test_SnapShot
REFRESH COMPLETE START WITH SYSDATE NEXT SYSDATE+1/24
as select * from A_Table@TEST_DBLINK
說明:REFRESH是刷新方法
刷新方式有:COMPLETE和FAST兩種,而START WITH是說明開始執(zhí)行的時間。
Next是下次執(zhí)行的時間
而AS以后是構(gòu)成快照的查詢方法。
相關(guān)的方法:
更改快照
ALTER SNAPSHOT Test_SnapShot
REFRESH COMPLETE START WITH SYSDATE NEXT SYSDATE+1/2;
手動刷新快照 在命令界面執(zhí)行:
EXEC DBMS_SNAPSHOT.REFRESH('Test_SnapShot ','C');
第一個參數(shù)是要刷新的快照名
第二個參數(shù)是刷新的方式,F(xiàn)----FAST, C---COMPLETE
查看快照最后刷新的日期
SELECT NAME,LAST_REFRESH
FROM ALL_SNAPSHOT_REFRESH_TIMES;
最后非常的方案:
1:為需要做Snapshot的表建立Snapshot日志
create snapshot log on t1 with rowid; 這里使用ROWID建立日記的參數(shù)
2:采用Fast的方式建立快照,使用rowid做為參考參數(shù)
create snapshot fb_test_b refresh fast with rowid start with sysdate next sysdate+1/1440 as select * from fb_test_b@my_dblink;
最好能按照rowid來建立快照。要不然就必須要為表建立Primary Key。
用copy吧,簡單明了。
句法如下:
COPY {FROM database | TO database
| FROM database TO database}
destination_table [(column, column, column, ...)]
USING query
例子:
copy from scott/tiger@lsj to scott/tiger@lsj create dept1 using select * from dept;
分部分來解釋一下:
From Database – 源數(shù)據(jù)庫。
To Database – 目標數(shù)據(jù)庫。
此處注意花括號中有三種可選的寫法(以”|”隔開),如果源數(shù)據(jù)表和目標數(shù)據(jù)表在同一個Schema中,則可以只寫From Database,也可以只寫To Database,當然還可以是第三種寫法,把From Database和To Database寫全。但如果源數(shù)據(jù)表和目標數(shù)據(jù)表不在同一個Schema中,則必須用第三種寫法,即把From Database和To Database都寫全,格式相同:USERID/PASSWORD@SID。
– 聲明操作數(shù)據(jù)的方式
Append – 向已有的目標表中追加記錄,如果目標表不存在,自動創(chuàng)建,這種情況下和Create等效。
Create – 創(chuàng)建目標表并且向其中追加記錄,如果目標表已經(jīng)存在,則會返回錯誤。
Insert – 向已有的目標表中插入記錄,與Append不同的是,如果目標表不存在,不自動創(chuàng)建而是返回錯誤。
Replace – 用查詢出來的數(shù)據(jù)覆蓋已有的目標表中的數(shù)據(jù),如果目標表不存在,自動創(chuàng)建。
destination_table – 目標表的名字
[(column, column, column, ...)] – 可以指定目標表中列的名字,如果不指定,則自動使用Query中的列名。
USING query – 查詢語句,交流的數(shù)據(jù)來自這兒。
為方便完成指定數(shù)據(jù)表的同步操作,可以采用dblink與merge結(jié)合的方法完成。
操作環(huán)境: 此數(shù)據(jù)庫服務(wù)器ip為192.168.196.76,有center與branch兩個庫,一般需要將center的表數(shù)據(jù)同步到branch,center為源庫,branch為目標庫,具體步驟如下:
1.在源庫創(chuàng)建到目標庫的dblink
create database link branch???? --輸入所要創(chuàng)建dblink的名稱,自定義?
connect to dbuser identified by “password”? --設(shè)置連接遠程數(shù)據(jù)庫的用戶名和密碼?
using '192.168.196.76/branch';? --指定目標數(shù)據(jù)庫的連接方式,可用tns名稱
在創(chuàng)建dblink時,要注意,有時候可能會報用戶名和密碼錯誤,但實際上我們所輸入的賬戶信息是正確的,此時就注意將密碼的大小寫按服務(wù)器上所設(shè)置的輸入,并在賬號密碼前號加上雙引號(服務(wù)器版本不同造成的)。
2.成功后驗證dblink
select * from tb_bd_action@branch; --查詢創(chuàng)建好的brach庫
正常情況下,如果創(chuàng)建dblink成功,可采用該方式訪問到遠程數(shù)據(jù)庫的表.
3.通過merge語句完成表數(shù)據(jù)同步
此例中需要將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,同步的依據(jù)是兩個表的pk
when matched then? update set b.sqlscripe=c.sqlscripe,b.author=c.author? --如果pk值是相同則將指定表的值更新到目標表
when not matched then ? --如果pk值不一至,則將源表中的數(shù)據(jù)整條插入到目標表中
insert values (c.pk, c.fk, c.createtime, c.lastmodifytime,c.author,c.module,c.deleteflag, c.scripttype);
commit;?????????????? --記得merge后必須commit,否則更改未能提交
4.為方便每次需要同步時自動完成同步工作,可將該語句做成存儲過程或腳本來定時執(zhí)行或按要求手動執(zhí)行,簡單說一下創(chuàng)建腳本的方法:
a.創(chuàng)建merge文件夾
b.先將merge語句寫完整后,存到merge.sql文件中
c.新建merge.bat文件,編輯后寫入以下內(nèi)容
sqlplus user/password@serverip/database @"%cd%\merge.sql"
首先你要明白,你的表都是都是被分在了不同的方案,不是表空間。而每個用戶的創(chuàng)建自動回創(chuàng)建對應(yīng)的方案 這是一一對應(yīng)的。你用 某一個用戶連接,那么自動的就是在這個方案下面。當你以另外的身份連接時,自然要加方案名了。
就像你經(jīng)常用的 scott 方案下的 emp 你如果用system 連接的話
自然是 打 scott.emp 是吧 就是這個道理。這樣的管理機制好的,更加清晰,更加安全哈。也不麻煩 啊 是不是?
最好的辦法就是用DB_LINK
加物化視圖來實現(xiàn)數(shù)據(jù)同步。
當然還有像
ORACLE
STREAM
和
GLODEN
GATE來實現(xiàn)同步,不過這兩個用在這里有點大材小用了!