国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > Oracle > 正文

Oracle不同數(shù)據(jù)庫間對比分析腳本

2024-08-29 13:46:28
字體:
供稿:網(wǎng)友
Oracle數(shù)據(jù)庫開發(fā)應(yīng)用中經(jīng)常對數(shù)據(jù)庫治理員有這樣的需求,對比兩個不同實例間某模式下對象的差異或者對比兩個不同實例某模式下表定義的差異性,這在涉及到數(shù)據(jù)庫軟件的開發(fā)應(yīng)用中是經(jīng)常碰到的。 一般數(shù)據(jù)庫軟件的開發(fā)都是首先在開發(fā)數(shù)據(jù)庫上進(jìn)行,開發(fā)到一定程度后,系統(tǒng)投入運(yùn)行,此時軟件處于維護(hù)階段。針對在系統(tǒng)運(yùn)行中碰到的錯誤、bug等,還有應(yīng)用系統(tǒng)的升級,經(jīng)常需要調(diào)整后臺程序,數(shù)據(jù)庫開發(fā)人員經(jīng)常碰到這樣一種尷尬的事情,維護(hù)到一定時期,開發(fā)庫和運(yùn)行庫之間出現(xiàn)了一些差異,而這些差異又是什么。還有一種情況就是假如應(yīng)用在很多地方同時使用,每次的后臺升級,那些數(shù)據(jù)庫作了升級,那些還沒有作升級,假如沒有具體記錄的話,也會造成我們的尷尬事情。

  另外,假如要搭建Oracle的高級表復(fù)制環(huán)境,在規(guī)劃好了復(fù)制的架構(gòu)以及復(fù)制的表后,在正式將需要復(fù)制的表加入到復(fù)制組之前,一個重要工作就是檢查這些需要復(fù)制的表在主節(jié)點和主定義節(jié)點間的差異性。假如這些表定義間存在任何細(xì)微的差別,如某個字段在一個節(jié)點是答應(yīng)Null,而在另一個節(jié)點是Not Null,在將表加入到復(fù)制組時都會出現(xiàn)這樣的錯誤,“ORA-23309 object string.string of type string exists”,其實造成這個錯誤的原因就是復(fù)制主定義節(jié)點和主節(jié)點之間表的定義存在某些差異,系統(tǒng)認(rèn)為是兩個不同的表,但是在兩個數(shù)據(jù)庫中具有同樣的名稱。假如需要復(fù)制的表很多,手工對比兩個節(jié)點復(fù)制表之間的差異是需要很大工作量,而且不一定準(zhǔn)確。

  業(yè)界有名的數(shù)據(jù)庫軟件輔助產(chǎn)品提供商美國Embarcadero公司(www.embarcadero.com)在其全套數(shù)據(jù)庫解決方案中就相應(yīng)提供了一個叫Change Manager的產(chǎn)品,該產(chǎn)品一個很大的用途就是對比分析不同實例間的差異。Oracle公司的OEM(oracle enterPRise manager)包中也相應(yīng)提供了一個工具叫做DB-Diff,也用來比較兩個數(shù)據(jù)庫間的差異。

  其實對于普通的數(shù)據(jù)庫開發(fā)在某種程度上說根本不需要上面提到的這些工具軟件,況且這些產(chǎn)品不是隨便可以得到并且使用的。針對上面提到的這些問題,提供了兩個SQL腳本,可以輕松實現(xiàn)對比分析兩個不同數(shù)據(jù)庫實例間對象的差異以及表定義的差異。

  一、對比兩個不同實例下某模式中對象差異

  在運(yùn)行下面的腳本之前,必須首先創(chuàng)建當(dāng)然數(shù)據(jù)庫用戶和需要對比的兩個實例間的數(shù)據(jù)庫聯(lián)接。下面是運(yùn)行該腳本的一個例子。在SQL/PLUS下運(yùn)行該腳本,系統(tǒng)出現(xiàn)如下提示:

  對象屬主(模式): repadmin

  第一個實例的數(shù)據(jù)庫聯(lián)接名稱 (包括 @):@ora_zs

  第一個實例的數(shù)據(jù)庫聯(lián)接名稱 (包括 @):@ora_sjjk 其中程序要求輸入對象屬主,也就是對比那個用戶,這里是repadmin用戶。然后是需要對比的實例聯(lián)接名稱,這里是ora_zs和ora_sjjk,最后給出對比報告。

  附:PL/SQL程序腳本清單: set linesize 80
set verify off
set feedback off
set pause off;
accept obj_owner prompt '對象屬主(模式): '
accept inst_1_dblink prompt '第一個實例的數(shù)據(jù)庫聯(lián)接名稱 (包括 @):'
accept inst_2_dblink prompt '第一個實例的數(shù)據(jù)庫聯(lián)接名稱 (包括 @):'
clear breaks
ttitle off
set heading off
column datetime noprint new_value datetime
column inst_code1_name noprint new_value inst_code1_name
column inst_code2_name noprint new_value inst_code2_name
select to_char(sysdate,'MM/DD/YY') datetime from dual
/
select global_name inst_code1_name from global_name&inst_1_dblink
/
select global_name inst_code2_name from global_name&inst_2_dblink
/
set feedback on
set heading on
set newpage 0
ttitle col 25 '對象比較結(jié)果報告單' -
col 53 '日期: ' datetime -
skip 1 col 60 '頁: ' sql.pno -
skip 1 col 10 '屬主: ' obj_owner -
skip 1 center '對象在 &inst_code1_name 但不在 &inst_code2_name ' -
skip 2
column object_type format a15 heading '對象類型';
column object_name format a35 heading '對象名稱';
column status format a10 heading '狀態(tài)';
SELECT OBJECT_NAME, OBJECT_TYPE, STATUS
FROM ALL_OBJECTS&inst_1_dblink
WHERE OWNER = UPPER('&OBJ_OWNER')
AND OBJECT_TYPE != 'SYNONYM'
MINUS
SELECT OBJECT_NAME, OBJECT_TYPE, STATUS
FROM ALL_OBJECTS&inst_2_dblink
WHERE OWNER = UPPER('&OBJ_OWNER')
AND OBJECT_TYPE != 'SYNONYM'
ORDER BY 2,3
/
ttitle col 25 '對象比較結(jié)果報告單' -
col 53 '日期: ' datetime -
skip 1 col 60 '頁: ' sql.pno -
skip 1 col 10 '屬主: ' obj_owner -
skip 1 center '對象在 &inst_code2_name 但不在 &inst_code1_name ' -
skip 2
SELECT OBJECT_NAME, OBJECT_TYPE, STATUS
FROM ALL_OBJECTS&inst_2_dblink
WHERE OWNER = UPPER('&OBJ_OWNER')
AND OBJECT_TYPE != 'SYNONYM'
MINUS
SELECT OBJECT_NAME, OBJECT_TYPE, STATUS
FROM ALL_OBJECTS&inst_1_dblink
WHERE OWNER = UPPER('&OBJ_OWNER')
AND OBJECT_TYPE != 'SYNONYM'
ORDER BY 2,3
/
  二、對比兩個不同模式下表定義的差異

  運(yùn)行方法和前面第一個腳本一樣,這里不再詳述。下面是一個運(yùn)行實例結(jié)果:

  對象屬主(模式): db_zgxt

  第一個實例的數(shù)據(jù)庫聯(lián)接名稱 (包括 @):@ora_cx

  第一個實例的數(shù)據(jù)庫聯(lián)接名稱 (包括 @):@ora_zs

  附:PL/SQL程序腳本清單: SET PAGESIZE 60
SET LINESIZE 110
SET VERIFY OFF
SET FEEDBACK OFF
SET PAUSE OFF
ACCEPT obj_owner PROMPT '對象屬主(模式): '
ACCEPT inst_1_dblink PROMPT '第一個實例的數(shù)據(jù)庫聯(lián)接名稱 (包括 @):'
ACCEPT inst_2_dblink PROMPT '第一個實例的數(shù)據(jù)庫聯(lián)接名稱 (包括 @):'
clear breaks
TTITLE off
SET HEADING off
COLUMN datetime noprint new_value datetime
COLUMN inst_code1_name noprint new_value inst_code1_name
COLUMN inst_code2_name noprint new_value inst_code2_name
SELECT TO_CHAR(SYSDATE,'MM/DD/YY') datetime FROM DUAL
/
SELECT global_name inst_code1_name FROM global_name&inst_1_dblink
/
SELECT global_name inst_code2_name FROM global_name&inst_2_dblink
/
SET feedback ON
SET HEADING ON
TTITLE COL 30 '對象比較結(jié)果報告單' -
COL 63 '日期: ' datetime -
SKIP 1 COL 68 '頁: ' sql.pno -
SKIP 1 COL 10 '屬主: ' obj_owner -
SKIP 1 CENTER '&inst_code1_name 和 &inst_code2_name 之間表定義的差別明細(xì)' -
SKIP 2
COLUMN table_name format a25 HEADING '表名';
COLUMN column_name format a25 HEADING '列名';
COLUMN data_type format a8 HEADING '數(shù)據(jù)類型';
COLUMN data_length format 999 HEADING '長度';
COLUMN data_precision format 999 HEADING '精度';
COLUMN nullable format a5 HEADING '是否可空';
COLUMN inst_code format a15 HEADING '實例';
SELECT '&inst_code1_name' inst_code, table_name, column_name, data_type, data_length, data_precision, nullable
FROM all_tab_COLUMNs&inst_1_dblink
WHERE owner = UPPER('&obj_owner')
AND table_name in (SELECT table_name FROM all_tables&inst_2_dblink
WHERE owner = UPPER('&obj_owner'))
MINUS
SELECT '&inst_code1_name' inst_code, table_name, column_name, data_type, data_length, data_precision, nullable
FROM all_tab_columns&inst_2_dblink
WHERE owner = UPPER('&obj_owner')
UNION
SELECT '&inst_code2_name' inst_code, table_name, column_name, data_type, data_length, data_precision, nullable
FROM all_tab_COLUMNs&inst_2_dblink
WHERE owner = UPPER('&obj_owner')
AND table_name in (SELECT table_name FROM all_tables&inst_1_dblink
WHERE owner = UPPER('&obj_owner'))
MINUS
SELECT '&inst_code2_name' inst_code, table_name, column_name, data_type, data_length, data_precision, nullable
FROM all_tab_columns&inst_1_dblink
WHERE owner = UPPER('&obj_owner')
ORDER BY 2, 3
/

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 永寿县| 如东县| 赞皇县| 涿鹿县| 广州市| 开封市| 逊克县| 井陉县| 句容市| 仙桃市| 苗栗市| 吴旗县| 东阿县| 田阳县| 乐陵市| 高平市| 正安县| 磐安县| 城步| 从化市| 渭源县| 孙吴县| 樟树市| 含山县| 衡南县| 万州区| 井研县| 深泽县| 边坝县| 三原县| 红河县| 田阳县| 阜宁县| 永年县| 双柏县| 霍林郭勒市| 苏州市| 江北区| 高青县| 辉县市| 舟山市|