大型软件公司.Net面试题(二)
6、答案
一個中型或大型公司往往由地理上分散的部門所組成,這些部門通常需要進行數(shù)據(jù)共享。針對這些共享數(shù)據(jù),可以將其存儲在某個站點上,需要的用戶都從這個站點上存取。這種方案的優(yōu)點是數(shù)據(jù)的一致性容易保證,但其缺點也是很突出的,那就是該站點的負載大、網(wǎng)絡(luò)負載大,遠程用戶的數(shù)據(jù)響應(yīng)遲緩。數(shù)據(jù)復制技術(shù)可以有效地解決這個問題,它通過將這些共享數(shù)據(jù)復制到位于不同地點的多個數(shù)據(jù)庫中,從而實現(xiàn)數(shù)據(jù)的本地訪問,減少了網(wǎng)絡(luò)負荷,并提高了數(shù)據(jù)訪問的性能,而且通過對數(shù)據(jù)庫中的數(shù)據(jù)定期同步(通常是每天晚上),從而確保了所有的用戶使用同樣的、最新的數(shù)據(jù)。該技術(shù)適用于用戶數(shù)量較大、地理分布較廣、而且需要實時地訪問相同數(shù)據(jù)的應(yīng)用模式。
數(shù)據(jù)復制的概念及特點
1、數(shù)據(jù)復制的概念及分類
數(shù)據(jù)復制,就是將數(shù)據(jù)庫中的數(shù)據(jù)拷貝到另外一個或多個不同的物理站點上,從而保持源數(shù)據(jù)庫與目標數(shù)據(jù)庫中指定數(shù)據(jù)的一致性。
按照數(shù)據(jù)復制的實時性,數(shù)據(jù)復制可分為同步數(shù)據(jù)復制和異步數(shù)據(jù)復制。同步數(shù)據(jù)復制是指將本地生產(chǎn)數(shù)據(jù)以完全同步的方式復制到異地,每一本地IO交易均需等待遠程復制的完成方予以釋放。異步數(shù)據(jù)復制則是指將本地生產(chǎn)數(shù)據(jù)以后臺同步的方式復制到異地,每一本地IO交易均正常釋放,無需等待遠程復制的完成。同步復制實時性強,遠端數(shù)據(jù)與本地數(shù)據(jù)完全同步。但這種方式受帶寬影響較大,數(shù)據(jù)傳輸距離較短。異步復制不影響本地交易,傳輸距離長,但其數(shù)據(jù)比本地數(shù)據(jù)略有延遲。在異步復制環(huán)境中,對于所有應(yīng)用最關(guān)鍵的就是要確保數(shù)據(jù)的一致性。
按照復制站點的類型,數(shù)據(jù)復制可分為多主控站點復制、物化視圖復制及混合復制。多主控站點復制也稱為對等站點復制,其中每個站點都是主控站點,都需要與其他站點進行信息交流,各站點之間是平等的。物化視圖復制包含一個主控站點、一個或多個物化視圖站點,
物化視圖中的內(nèi)容可以為目標主對象在某個時間點的全部拷貝或部分拷貝,其中目標主對象既可以是主控站點上的表也可以是物化視圖站點上的主物化視圖。混合復制包含多個主控站點和多個物化視圖站點,是主控站點復制和物化視圖復制的結(jié)合體,適合于復雜的業(yè)務(wù)情況。
2、數(shù)據(jù)復制的特點
數(shù)據(jù)復制通過在多個站點上建立備份,能夠提高數(shù)據(jù)的安全性,同時也提高了數(shù)據(jù)的可用性,這是因為如果一個站點出現(xiàn)了問題,用戶可以選擇其他站點繼續(xù)進行操作,應(yīng)用系統(tǒng)還可繼續(xù)運行,從而數(shù)據(jù)復制提供了容錯保護機制。
然而數(shù)據(jù)復制最基本的功能是提高數(shù)據(jù)庫的性能。它通過將遠程數(shù)據(jù)庫中的數(shù)據(jù)復制到本地,使得應(yīng)用能夠就近訪問數(shù)據(jù),從而降低網(wǎng)絡(luò)傳輸負載,提高效率。而且在數(shù)據(jù)復制系統(tǒng)中,可以提供多個站點之間的負載平衡,讓這幾個用戶使用這個服務(wù)器,另外幾個用戶可以
使用其他的服務(wù)器,以避免某些站點負載過重。
物化視圖還提供了按子集進行復制,這樣各站點就可只復制自己需要的數(shù)據(jù),也能減輕網(wǎng)絡(luò)的傳輸量。
數(shù)據(jù)復制的實現(xiàn)方法
在具體的實現(xiàn)之前,首先要做好設(shè)計與規(guī)劃。這就需要細致分析具體的業(yè)務(wù)情況,設(shè)計出一套能夠滿足業(yè)務(wù)需要的方案。通常在設(shè)計過程中,需要確定出要建立的數(shù)據(jù)庫站點,各站點的類型,需要復制的數(shù)據(jù)對象,以及同步方式、沖突解決方案等內(nèi)容。
在設(shè)計完成之后,就可具體來實現(xiàn)數(shù)據(jù)復制,實現(xiàn)主要包括以下幾步:
(1)創(chuàng)建復制站點
(2)創(chuàng)建組對象
(3)配置沖突解決方案
下面我們舉一個例子來說明各步具體需要完成的工作。在這個例子中我們采用多主控站點復制方式,設(shè)有兩個主控站點和兩個共享數(shù)據(jù)表。兩個主控站點分別為:處理站點(cl.world)和解釋站點(js.wo rld);兩個數(shù)據(jù)表為測區(qū)( survey)和測線( line)。
STEP1 創(chuàng)建復制站點
(1)首先以SYSTEM身份登陸主站點數(shù)據(jù)庫cl.worldCONNECT system/manager@cl.world
(2)創(chuàng)建用戶—復制管理員,并為該用戶授權(quán)復制管理員負責復制站點的創(chuàng)建和管理,每個復制站點都必須創(chuàng)建復制管理員:
CREATE USER repadmin IDENTIFIED BY repadmin;
BEGIN
DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA (username => ’repadmin’);
END;
(3)為本站點指定傳播者
傳播者負責將本地最新更新的數(shù)據(jù)傳播到其他站點上:
BEGIN
DBMS_DEFER_SYS.REGISTER_PROPAGATOR (username => ’repadmin’);
END;
(4)為本站點指定接收者
接收者負責接收其他站點上的傳播者傳送過來的數(shù)據(jù):
BEGIN
DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
username => ’repadmin’,
privilege_type => ’receiver’,
list_of_gnames => NULL);
END;
(5)確定清除時間
為了使傳送過來事務(wù)隊列不致過大,需要將成功加載的事務(wù)從事物隊列里清除掉,這里設(shè)定每小時清除一次。
CONNECT repadmin/repadmin@cl.world
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PURGE (
next_date => SYSDATE,
interval => ’SYSDATE + 1/24’,
delay_seconds => 0);
END;
在建立好站點cl.world后,以同樣的方法創(chuàng)建站點js. world。
(6)創(chuàng)建各主控站點之間的調(diào)度鏈接
創(chuàng)建各主控站點之間的調(diào)度鏈接需要先在各主控站點間建立數(shù)據(jù)庫鏈接,之后為每個數(shù)據(jù)庫鏈接定義調(diào)度時間。
首先,在處理站點上建立與解釋站點的數(shù)據(jù)庫鏈接,這里需要先建立一個公用數(shù)據(jù)庫鏈接,供其他私有數(shù)據(jù)庫鏈接來使用。
CONNECT SYSTEM/MANAGER@cl.world
CREATE PUBLIC DATABASE LINK js.world USING ’js.world’;
CONNECT repadmin/repadmin@cl.world
CREATE DATABASE LINK js.world CONNECT TO repadmin
IDENTIFIED BY repadmin;
同樣,在解釋站點上建立與處理站點的數(shù)據(jù)庫鏈接
CONNECT SYSTEM/MANAGER@js.world
CREATE PUBLIC DATABASE LINK cl.world USING ’cl.world’;
CONNECT repadmin/repadmin@js.world
CREATE DATABASE LINK cl.world CONNECT TO repadmin
IDENTIFIED BY repadmin;
調(diào)度鏈接確定本站點上的事務(wù)向其他站點發(fā)送的頻度,下面的代碼為10分鐘一次:
CONNECT repadmin/repadmin@cl.world
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PUSH (
destination => ’js.world’,
interval => ’SYSDATE + (1/144)’,
next_date => SYSDATE,
parallelism => 1,
execution_seconds => 1500,
delay_seconds => 1200);
END;
在解釋站點上做相同的工作STEP2 創(chuàng)建主控組在復制環(huán)境中,Oracle用組來管理復制對象。通過將相關(guān)的復制對象放在一個組里,從而方便對大量數(shù)據(jù)對象的管理。
這里我們假設(shè)用戶模式integr ation 在處理站點和解釋站點都已存在,而且表測區(qū)(survey )和測線(line)也已經(jīng)創(chuàng)建。
(1)創(chuàng)建主控組對象
CONNECT repadmin/repadmin@cl.world
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPGROUP (
gname => ’inte_repg’);
END;
(2)向主控組中添加數(shù)據(jù)對象,將測區(qū)表survey加入到組inte_repg中
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
gname => ’inte_repg’,
type => ’TABLE’,
oname => ’survey’,
sname => ’integration’,
use_existing_object => TRUE,
copy_rows => FALSE);
END;
以同樣的方法將測線表line 加入到組inte_repg中
(3)在主控組中添加其他參與復制的站點,數(shù)據(jù)庫之間的同步方式在此指定
BEGIN
DBMS_REPCAT.ADD_MASTER_DATABASE (
gname => ’inte_repg’,
master => ’js.world’,
use_existing_objects => TRUE,
copy_rows => FALSE,
propagation_mode => ’ASYNCHRONOUS’);
END;
(4)如果可能出現(xiàn)沖突,則需要配置沖突解決方案。沖突解決方案將在后面介紹。
(5)為每個對象生成復制支持
BEGIN
DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT (
sname => ’integration’,
oname => ’survey’,
type => ’TABLE’,
min_communication => TRUE);
END;
測線表line也一樣
(6)重新開始復制
BEGIN
DBMS_REPCAT.RESUME_MASTER_ACTIVITY (
gname => ’inte_repg’);
END;
以同樣的方式設(shè)置解釋站點。設(shè)置成功后,數(shù)據(jù)復制過程就宣告完畢,庫中的數(shù)據(jù)就可進行復制。
數(shù)據(jù)復制中沖突的解決方案
在復制環(huán)境中,盡管在數(shù)據(jù)庫和應(yīng)用程序設(shè)計過程中,會盡量避免各站點間沖突的發(fā)生,但完全避免沖突的可能性還是比較小的,那么一旦沖突發(fā)生,就需要一個按照具體業(yè)務(wù)規(guī)則的沖突解決機制,來使得各站點的數(shù)據(jù)保持一致。
首先需要分析哪些對象容易出現(xiàn)沖突。通常來說,靜態(tài)的數(shù)據(jù)變化少,沖突出現(xiàn)的可能性也小;而有些數(shù)據(jù)變化非常大,沖突出現(xiàn)的可能性也大。確定了沖突易發(fā)的對象后,需要確定怎樣解決沖突,比如在各站點之間建立優(yōu)先次序,在數(shù)據(jù)不一致時,以某個站點上的為
準;或以某個站點上最新的修改為準。
Oracle提供了多中沖突解決方案,具體包括:針對更新沖突的方案、針對唯一性沖突的方案、針對刪除沖突的方案。除了這些方案以外,用戶還可以自定義沖突解決方法。每種方案都有自己的適用情況,那么我們需要根據(jù)具體的業(yè)務(wù)來選擇合適的沖突解決方案。
結(jié)束語
本文詳細介紹了分布式系統(tǒng)Oracle中的數(shù)據(jù)復制技術(shù),在具體應(yīng)用中,還有許多比較復雜的問題需要解決,比如主控組中如果包含循環(huán)依賴的表或自相關(guān)的表時如何處理;如何利用模版機制來創(chuàng)建物化視圖站點;如何對數(shù)據(jù)復制環(huán)境進行管理與維護。這些問題需要在實際
應(yīng)用中逐步探索,深入研究。
7、答案
select a.* from b.b a
8、答案
對于oracle數(shù)據(jù)庫來說,可能出現(xiàn)的問題包括:
1. 回滾區(qū)間空間不足 --- 解決方法,增加表空間
2. 數(shù)據(jù)表空間不足 ---- 增加數(shù)據(jù)表空間
3. 表空間不足 ---- 增加表空間(oracle數(shù)據(jù)表有空間限制)
4. 臨時表空間不足 --- 因為計算索引使用臨時表空間,增加表空間或者暫時不使用索引,數(shù)據(jù)導入完畢再重新建立索引
5.另外一些原因,主要是垃圾數(shù)據(jù)造成的,比如外鍵匹配,主鍵沖突,單一索引沖突等。
9、答案
DELETE FROM TABLE_NAME
WHERE ROWID!=(SELECT MAX(ROWID) FROM TABLE_NAME D
WHERE TABLE_NAME.COL1=D.COL1 AND TABLE_NAME.COL2=D.COL2);
總結(jié)
以上是生活随笔為你收集整理的大型软件公司.Net面试题(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 家常红烧肉土豆做法?
- 下一篇: 正腾烤箱烤泡芙要多久?