遷移Oracle數據的兩個方案(待續)
方案一:採用物理standby進行遷移,該方法適用於在相同操作系統平臺,相同數據庫版本之間進行數據遷移。在Oracle11G中可以實現,從 10G到11G的物理Standby的遷移,而且可以實現從Windows平臺到Linux平臺的遷移。 步驟: 要首先具有主備數據庫結構(如DataGuard環境),本方案針對Oracle10GR2版本。 1、在32Bit的OS上,利用RMAN或者是其他方式備份住數據庫。 2、產生備份數據庫的控制文件、以及參數文件、並把備用控制文件和參數文件拷貝到備用機器上。 3、把備份恢復到備用機器上(可以是64Bit機器),如果是普通文件備份,只拷過去即可,如果是RMAN備份,需要先拷貝備份集(或NFS) 過去,然後在備份機器上恢復。32Bit OS上的數據庫可以直接恢復到64Bit的OS上。 4、配置監聽與tnsnames.ora,使備庫可以接收日誌。(分別針對主備機上配置) 5、恢復備用庫,適用如下命令 recover automatic standby database; 或者 recover managed standby database disconnect from session; 6、等到日誌全部恢復完畢後,執行如下命令做切換: 主:alter database commit to switchover to physical standby with session shutdown; 備:alter database commit to switchover to primary; 7、等切換完畢後,關閉新主庫,如果是RAC先關閉RAC環境參數: alter system set cluster_database=false scope=spfile; shutdown immediate; 8、使用UPGRADE方式打開新主庫: startup upgrade; 9、執行數據庫格式轉換腳本,此時不要執行DDL spool utlirp.log /u01/oracle/ora10g/rdbms/admin/utlirp.sql(具體路徑會有差異) spool off 10、重新啓動主庫,如果是RAC環境,先打開RAC參數: alter system set cluster_database=true scope=spfile; shutdown immediate; startup open; 11、編譯經過上面過程可能失效的包: spool utlrp.log /u01/oracle/ora10g/rdbms/admin/utlrp.sql(具體路徑會有差異) spool off 12、檢驗是否還存在失效對象: select distinct object_name from dba_objects where status='INVALID'; 13、等原來的主庫成爲備用庫後,在其上完成如下操作: srartup monut; recover managed standby database disconnect from session;(恢復日誌)
方案二:使用prebuilt MV 進行數據遷移,該方法適用於在短時間內,對大數據量表進行遷移,要求被遷移表具有主鍵,可以實現跨平臺、跨 數據庫的版本遷移,而且可以實現重組優化,但是不能實現跨字符集的遷移,並且被遷移表不要頻繁的被更新。 步驟: 1、進行表的分級,如100M以上的表作爲大表,100M以下的表作爲小表,對於小表可以使用 insert /*+append+*/ into...... from table@db_link; 進行插入。 2、對於大表在表上創建MV日誌: create materialized view log on tablename; 3、在目標數據庫上創建於該表具有相同結構的表,並且在表上創建主鍵或者唯一約束,其他索引或者約束,可以在全刷新後再創建。最後 使用如下命令在目標數據庫的新表上創建prebuilt mv: create materialized view table_name on prebuilt table refresh fast as select * from table_name@db_link; 4、執行全刷新與增量刷新: exec dbms_mview.refresh('table_name','complete'); exec dbms_mview.refresh('table_name'); 執行後創建相關索引:create index index_name on table_name(filed_name); 5、創建一個數據庫JOB,定時同步增量日誌,如下定義每一分鐘同步一次: declare jobid number; begin sys.dbms_job.submit(job=>jobid, what=>'dbms_mview.refresh(''table_name'');', next_date=>sysdate, interval=>'sysdate+1/1440'); commit; end; / 6、依次處理完所有大表。 7、在目標數據庫創建好於小表相同結構的表包括索引等,整理好insert into腳本。 8、預先創建好除序列外的其他對象,如function,procedure,type等。 9、停機切換: .停止原數據庫一切活動,包括任何DML與DDL。 .等待最後一批日誌刷新完畢。 .運行insert into腳本遷移小表數據。 .等大表刷新完成,刪除相關MV信息 在原數據庫上執行:drop materialized view log on table_name; 在目標數據庫上執行:drop materialized view table_name; 10、創建與表有依賴關係的對象,如序列。