Oracle to Oracle版本的
平時給客戶生產環境部署參考的文檔,總結的比較詳細,主要是詳細的說明了資料初始化的過程,參數各個環境不同,所以只是寫了比較簡單的,根據實際條件添加吧。
1. 前期準備 1.1. 系統層面
windows需要安裝c\c++ 2005運行庫 1.2. 資料庫層面
運行full-DB_CheckOracle.sql 查看結果,檢查是否有不支援的對象 2. 源端資料庫配置 2.1. 開啟歸檔模式
檢查源端資料庫是否為歸檔模式
SQL>archive log list;
若為非歸檔模式,在資料庫mount狀態下將其改為歸檔模式
SQL> alter database archivelog;
確認歸檔已經開啟
SQL>archive log list; 2.2. 開啟庫層級最小附加日誌
檢查源端資料庫附加日誌是否開啟
SQL>select supplemental_log_data_min from v$database;
開啟資料庫附件日誌
SQL>alter database add supplemental log data;
切換日誌以使附加日誌生效
SQL>ALTER SYSTEM ARCHIVE LOG CURRENT;
或
SQL>alter system switch logfile;
確認最小附加日誌已經開啟
select supplemental_log_data_min from v$database; 2.3. 建立GoldenGate專有使用者
建立goldengate資料表空間:
SQL>create tablespace goldengate datafile '/oracle/oracle/oradata/ora11/goldengate.dbf' size 100m;
註:不開啟DDL的話源端goldengate不會在資料庫中建立任何錶,儲存任何資料,所以這個資料表空間給較少空間即可
建立goldengate使用者並授權:
SQL>create user goldengate identified by goldengate default tablespace goldengate;
給使用者授權:
如果客戶對於許可權管理不嚴格,直接賦予DBA許可權即可:
SQL>grant dba to goldengate;
如果管理嚴格請參考各版本OGG文檔進行授權
註:如開啟DDL必須需要DBA許可權 3. 源端部署GoldenGate 3.1. 下載並將GoldenGate上傳到伺服器
Linux\Unix傳到Oracle使用者即可,windows傳到Oracle的安裝使用者下 3.2. 配置環境變數
主要配置以下三個變數:
ORACLE_SID ORACLE_HOME LD_LIBRARY_PATH(LINUX環境)
其中D_LIBRARY_PATH寫ogg的安裝目錄
export LD_LIBRARY_PATH=/ggs/11.0:$LD_LIBRARY_PATH 3.3. 配置啟動mgr
windows環境需要加入到服務中
.\install addservice
./ggsci
create subdirs
配置mgr參數
edit params mgr
port 7809
DYNAMICPORTLIST 7840-7898
autostart er *
autorestart er *, retries 5, waitminutes 3
PURGEOLDEXTRACTS ./dirdat/*,USECHECKPOINTS, MINKEEPDAYS 7
啟動mgr
start mgr
確認mgr啟動成功
info all 3.4. 增加trandata
ggsci登入到資料庫
dblogin userid goldengate,password goldengate
增加trandata
add TRANDATA ajdbo.passenger
確認trandata添加成功
info trandata ajdbo.passenger
在資料庫中確認已經添加trandata的表
select * from dba_log_groups where owner='xxx' and table_name='xxx'; 3.5. 配置、啟動extract進程
增加extract進程
add extract ext_ynkg, tranlog, begin now
增加exttrail
add exttrail ./dirdat/ld,extract ext_ynkg, MEGABYTES 100
配置extract進程
edit params ext_ynkg
EXTRACT ext_ynkg
SETENV(NLS_LANG=AMERICAN_AMERICA.ZHS16GBK)
USERID goldengate, PASSWORD goldengate
TRANLOGOPTIONS EXCLUDEUSER goldengate
EXTTRAIL ./dirdat/ld
--GETTRUNCATES
--GETUPDATEBEFORES
EOFDELAY 3
NUMFILES 5000
DISCARDFILE ./dirrpt/ext_ynkg.dsc, APPEND, MEGABYTES 1000
DYNAMICRESOLUTION
table ajdbo.passenger;
talle ajdbo.channel;
table ajdbo.validate_info;
table ajdbo.bord_info;
啟動extract進程
start ext_ynkg
確認進程啟動成功
info ext_ynkg 3.6. 擷取基準SCN 3.6.1. 方法一
如果客戶環境歸檔保留的比較多,則可採用這種方法:
首先確認系統中最早的transaction的啟動時間
sql> select min(start_time) from gv$transaction;
MIN(START_TIME)
--------------------
02/08/16 19:21:38
之後在指定extract進程的begin時間時,指定一個比這個早的時間,讓extract從這裡開始抽取:
add extract <ext_name> tranlog threads 2 begin 2016-02-08 19:20:00
最後再查詢當前SCN號
select current_scn from v$database;
則該SCN則為基準SCN(SCN3),如使用匯入匯出的方法,這個SCN即為最終確定的SCN時間點,如果使用RMAN則最終RMAN恢複的SCN要大於等於這個SCN。 3.6.2. 方法二
如果客戶環境歸檔保留的比較少,則可採用這種方法
查詢當前SCN號(SCN1)
select current_scn from v$database;
查看當前資料庫系統中最早transaction的scn號(SCN2)
select min(start_scn) from gv$transaction;
多次查詢系統中最早的transaction的啟動時間,一直到這個值大於SCN1。(如果大的transaction一直在運行,可以考慮殺死這個transaction對應的進程,尋找該進程的語句如下:
select p.INST_ID,p.SPID,t.start_scn
from gv$transaction t,gv$process p,gv$session s
where s.taddr=t.addr and p.addr=s.paddr and t.start_scn<=&1;)
重新查詢當前SCN號(SCN3)
select current_scn from v$database;
則該SCN則為基準SCN(SCN3),如使用匯入匯出的方法,這個SCN即為最終確定的SCN時間點,如果使用RMAN則最終RMAN恢複的SCN要大於等於這個SCN。 3.7. 歸檔當前日誌(可選)
這一步僅當使用RMAN做初始化並使用的是之前的全備時需要,是為了拷貝過去的歸檔能恢複到之前確定的SCN。
查詢當前日誌號:
select INST_ID,GROUP#,SEQUENCE#,ARCHIVED,STATUS from gv$log;
歸檔當前日誌:
ALTER SYSTEM ARCHIVE LOG CURRENT;
之後確認第一次為current的SEQUENCE已經歸檔
select INST_ID,SEQUENCE#,ARCHIVED from gv$archived_log where SEQUENCE#=&1;
註:RAC環境下兩個節點都要進行確認 3.8. 配置pump進程
增加pump進程
add extract pmp_ynkg, exttrailsource ./dirdat/ld
增加rmttail檔案
add rmttrail ./dirdat/rd,EXTRACT pmp_ynkg,MEGABYTES 100
配置pump進程
edit params pmp_ynkg
EXTRACT pmp_ynkg
USERID goldengate,PASSWORD goldengate
PASSTHRU
RMTHOST 10.1.0.50,MGRPORT 7809
RMTTRAIL ./dirdat/rd
--REPORT AT 01:59
--REPORTROLLOVER AT 02:00
DISCARDFILE ./dirrpt/pmp_ynkg.dsc, APPEND, MEGABYTES 1000
--PURGEOLDEXTRACTS ./dirdat/*,USECHECKPOINTS, MINKEEPDAYS 7
DYNAMICRESOLUTION
table ajdbo.*; 4. 資料初始化 4.1. 匯入匯出方式 4.1.1. 確定兩端字元集
查詢兩端字元集:
select userenv('language') from dual;
如果相同則沒有問題
如果不同
(1)需要使用csscan工具對源端資料進行檢測,查看資料匯入到目標端後是否會出現欄位長度不足,亂碼等情況。csscan使用方法見附錄。
(2)需要在extract進程和replicat進程中設定環境變數NLS_LANG,均和源端資料庫字元集一致即可。具體是否會出現亂碼還需要測試。 4.1.2. 源端匯出目標表
建立directory
create directory oggd as '/home/oracle';
匯出目標表,FLASHBACK_SCN為之前確定的SCN3
expdp XPADB/XPADB DIRECTORY=oggd DUMPFILE=xpadb.`date '+%Y%m%d_%H%M'`.dmp.%U LOGFILE=xpadb.`date '+%Y%m%d_%H%M'`.log parallel=4 FLASHBACK_SCN=xxxxx 4.1.3. 調整目標端job_queue_processes
調整job_queue_processes為0
SQL>show parameter job (記錄下來,之後還會調整回來)
SQL>alter system set job_queue_processes=0 scope=memory;
再次確認一下修改成功
SQL>show parameter job 4.1.4. 目標端資料庫匯入
impdp XPADRPT/xpadrpt DIRECTORY=oggd DUMPFILE=xpadb.20130620_1525.dmp.%U LOGFILE=impdp.xpadb.20160220_1525.log parallel=4 REMAP_SCHEMA=xpadb:xpadrpt REMAP_TABLESPACE=xpaddat:xpaddata
4.2. RMAN方式 4.2.1. 備份資料庫
備份資料庫、歸檔、控制檔案:
$rman target /
run {
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
allocate channel c4 type disk;
crosscheck backupset;
delete noprompt expired backupset;
backup as backupset full database tag='db_bak' format '/u01/backup/db_%U_%T';
sql 'alter system archive log current';
backup archivelog all tag='arc_bak' format='/u01/backup/arc_%U_%T' filesperset 6;
backup current controlfile tag='ctl_bak' format='/u01/backup/ctl_file_%U_%T';
release channel c1;
release channel c2;
release channel c3;
release channel c4;
} 4.2.2. 確定最終SCN
在源端剛備份完的資料庫執行:
SQL>select GROUP# ,THREAD#,SEQUENCE#,ARCHIVED,STATUS,FIRST_CHANGE# from gv$log;
GROUP# THREAD# SEQUENCE# ARC STATUS FIRST_CHANGE#
---------- ---------- ---------- --- ---------------- -------------
1 1 240 YES INACTIVE 1697423
3 1 241 NO CURRENT 1718793
2 1 239 YES INACTIVE 1690905
擷取不活動的已歸檔日誌的最後一個SCN號,如果有多個已歸檔的INACTIVE的組,取最大的FIRST_CHANGE#,這裡取1697423,該SCN號(SCN4)即為最終rman恢複和啟動replicat的scn號。(這個SCN4一定要比基準SCN(SCN3)大)
註:如果是RAC環境要確保這個SCN號對應的日誌兩邊都已經歸檔。 4.2.3. 拷貝備份、PFILE、密碼檔案到目標端 4.2.4. 目標端執行恢複
啟動資料庫到nomount狀態
sqlplus '/ as sysdba'
SQL>startup nomount
啟動RMAN恢複控制檔案
rman target /
RMAN>restore controlfile from '/u01/backup/ctl_file_757366280381.dbf';
將資料庫更改為mount狀態
sqlplus '/ as sysdba'
SQL>alter database mount;
啟動RMAN恢複資料庫
rman target /
RMAN>restore database;
RMAN>
run
{
set archivelog destination to '/u01/arch';
SET UNTIL SCN 218412; –前邊確定的scn號 SCN4
RECOVER DATABASE;
} 4.2.5. 調整目標端job_queue_processes
調整job_queue_processes為0
SQL>show parameter job (記錄下來,之後還會調整回來)
SQL>alter system set job_queue_processes=0 scope=memory;
再次確認一下修改成功
SQL>show parameter job
4.2.6. 目標端開啟資料庫
開庫
SQL>alter database open resetlogs; 5. 目標端資料庫配置 5.1. 禁用所有job 5.1.1. dbms_job
禁用job
declare
v_sql number;
CURSOR c_job IS SELECT job from
dba_jobs where schema_user in
('JP');
BEGIN
OPEN c_job;
LOOP
FETCH c_job INTO v_sql;
EXIT WHEN c_job%NOTFOUND;
dbms_ijob.broken(v_sql,true);
end loop;
close c_job;
commit;
end;
/
驗證job確實被禁用
select job,LOG_USER,PRIV_USER,SCHEMA_USER,broken from dba_jobs where schema_user in ('JP'); 5.1.2. schedule job
禁用job
declare
v_sql varchar2(200);
CURSOR c_job IS SELECT OWNER||'.'||JOB_NAME from
DBA_SCHEDULER_JOBS where OWNER in
('JP');
BEGIN
OPEN c_job;
LOOP
FETCH c_job INTO v_sql;
EXIT WHEN c_job%NOTFOUND;
dbms_scheduler.disable(NAME =>v_sql);
end loop;
close c_job;
commit;
end;
/
驗證job確實被禁用
SELECT OWNER,JOB_NAME,STATE FROM DBA_SCHEDULER_JOBS WHERE OWNER IN('JP'); 5.1.3. 調整目標端job_queue_processes
將目標端job_queue_processes值調整回原值 5.2. 禁用所有trigger
關閉trigger
declare
v_sql varchar2(2000);
CURSOR c_trigger IS SELECT 'alter trigger '||owner||'.'||trigger_name||' disable' from
dba_triggers where owner in
('JP');
BEGIN
OPEN c_trigger;
LOOP
FETCH c_trigger INTO v_sql;
EXIT WHEN c_trigger%NOTFOUND;
execute immediate v_sql;
end loop;
close c_trigger;
end;
/
確認trigger已經全部關閉
select distinct status from dba_triggers where owner in ('JP'); 5.3. 禁用所有外鍵
禁用外鍵
declare
v_sql varchar2(2000);
CURSOR c_con IS SELECT 'alter table '||owner||'.'||table_name||' disable constraint
'||constraint_name from dba_constraints where constraint_type='R' and owner in
('JP');
BEGIN
OPEN c_con;
LOOP
FETCH c_con INTO v_sql;
EXIT WHEN c_con%NOTFOUND;
execute immediate v_sql;
end loop;
close c_con;
end;
/
確認外鍵已經被禁用
select OWNER,CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS
from dba_CONSTRAINTS
where CONSTRAINT_TYPE='R' and status = 'ENABLED' and owner in ('JP'); 5.4. 確認目標端目標表的主鍵可用
select T1.STATUS,T1.VALIDATED,T2.status,T1.constraint_name,T1.owner
from dba_constraints T1,dba_objects T2
where T2.OBJECT_NAME=T1.constraint_name AND T1.OWNER IN ('JP');
確認查詢結果:
T1.STATUS為ENABLED
T1.VALIDATED為VALIDATED
T2.status為VALID
如果不是,需要修改為開啟狀態。 6. 目標端部署GoldenGate 6.1. 下載並將GoldenGate上傳到伺服器
Linux\Unix傳到Oracle使用者即可,windows傳到Oracle的安裝使用者下 6.2. 配置環境變數
主要配置以下三個變數:
ORACLE_SID ORACLE_HOME LD_LIBRARY_PATH(LINUX環境)
其中D_LIBRARY_PATH寫ogg的安裝目錄
export LD_LIBRARY_PATH=/ggs/11.0:$LD_LIBRARY_PATH 6.3. 配置啟動mgr
windows環境需要加入到服務中
.\install addservice