客戶需要,將windows下10g(10.2.0.3)32位數據庫遷移到11g64位。不過主要目的是為10g32位windows打補丁,怕出問題做的遷移。這里自己先做下測試。
參考文章:
測試環境:
Win server 2003 32位,先安裝oracle10.2.0.1,然后升級到10.2.0.5(因為10.2.0.1不能升到11g,所以得升級到10.2.0.2以上),最后遷移到11.2.0.1(Win server 2008 64位)。
安裝就不詳述了。
1、升級數據庫10.2.0.1到10.2.0.5
㈠升級前准備
打開命令行關閉EM:d:\> emctl stop dbconsole
關閉監聽:d:\> lsnrctl stop
進入sql提示符關閉數據庫:d:\> sqlplus / as sysdba
SQL> shutdown immediate
關閉服務:開始菜單》管理工具》服務,停止所有ORACLE開始的服務
備份:可直接復制或者壓縮,包括Oracle Inventory、Oracle HOME和數據庫
升級前檢查:sql提示符下
SQL> spool d:\logs\utlu102i.log --保留日志信息,以便查看
SQL> @?/rdbms/admin/utlu102i.sql ---@?默認的ORACLE HOME目錄
㈡升級
與安裝基本一致,指定ORACLE HOME目錄時,覆蓋原來HOME即可,我的是:E:\oracle\product\10.2.0\db_1
開戶OracleserviceSID服務
開啟監聽:d:\> lsnrctl start
升級數據字典:
SQL> startup upgrade
SQL> spool d:\logs\catupgrd.log
SQL> @?/rdbms/admin/catupgrd.sql
SQL> shutdown immediate
SQL> startup
SQL> spool d:\logs\utlrp.log
SQL> @?/rdbms/admin/utlrp.sql
㈢升級后檢查
SQL> SELECT COMP_NAME, VERSION, STATUS FROM SYS.DBA_REGISTRY;
status輸出都為VALID說明升級成功
設置compatible參數,不是必須的,重啟后生效
SQL> alter system set compatible='10.2.0.5.0' scope=spfile;
使用catalog備份的可升級一下:
d:\> rman catalog username/passwd@alias
RMAN> upgrade catalog;
升級完成。
2、10.2.0.5(源庫)的數據遷移到11.2.0.1(目標庫)
因為是32位到64位,所以可分為四步:
㈠備份
備份前在源庫執行一個腳本,否則在目標庫recover后升級數據字典時報錯
SQL> spool e:\logs\utlu112i.log
SQL> @?/rdbms/admin/utlu112i.sql ---此文件從目標庫復制過來的,避免出問題也可以在完成升級后先進行備份
備份:
RMAN> run{
backup as compressed backupset database format 'e:\backup\%d_%s_%T.db';
sql 'alter system switch logfile';
backup archivelog all format 'e:\backup\%d_%s_%T.arch';
backup spfile format 'e:\backup\%d_%s_%T.sp';
backup current controlfile format 'e:\backup\%d_%s_%T.ctl';
}
SQL> create pfile='d:\backup\inittest.ora' from spfile; ---目標庫上實例名為test,所以使用pfile並修改相關參數和目錄(不使用restore spfile)
然后把備份文件上傳到目標庫服務器上。
查看源庫DBID
SQL> select dbid from v$database;
DBID
---------------
274060241
㈡恢復
修改后的pfile文件
*.compatible='10.2.0.5.0'
*.control_files='d:\controlfile\control01.ctl'
*.db_block_size=8192
*.db_name='prod'
*.db_unique_name='test'
SQL> startup nomount pfile='d:\share\inittest.ora';
D:\>rman target /
連接到目標數據庫: PROD (未裝載) --因為沒有Mount,不識別庫,需要設置dbid
RMAN> set dbid=274060241
RMAN> restore controlfile from 'd:\share\prod_20_20141030.ctl'; --恢復控制文件
RMAN> mount database;
SQL> create spfile from pfile='d:\share\inittest.ora';--生成spfile,然后重啟到mount狀態
SQL> startup mount force;
RMAN> catalog start with 'd:\share'; ---源庫的備份目錄為d:\backup,restore時不識別此目錄,可以catalog下,當然也可以使目錄一致。
恢復,因為不完全恢復,可以設置恢復到某個日志號(從源庫查看備份完成后的當前日志序列):
RMAN> run{
set newname for datafile 1 to 'd:\ORADATA\SYSTEM01.DBF'; --數據文件目錄一致可以不用newname
set newname for datafile 2 to 'd:\ORADATA\UNDOTBS01.DBF';
set newname for datafile 3 to 'd:\ORADATA\SYSAUX01.DBF';
set newname for datafile 4 to 'd:\ORADATA\USERS01.DBF';
set newname for datafile 5 to 'd:\ORADATA\EXAMPLE01.DBF';
set until sequence 60;
restore database;
switch datafile all;
recover database;
}
目錄一致可以不用如下操作,不一致需要rename下:
SQL> alter database rename file 'e:\onlinelog\prod\redo01.log' to 'd:\onlinelog\redo01.log';
SQL> alter database rename file 'e:\onlinelog\prod\redo02.log' to 'd:\onlinelog\redo02.log';
SQL> alter database rename file 'e:\onlinelog\prod\redo03.log' to 'd:\onlinelog\redo03.log';
以升級模式打開:
SQL> alter database open resetlogs upgrade;
添加臨時表空間文件:
SQL> alter tablespace temp add tempfile 'd:\oradata\temp01.dbf' size 500m autoextend on next 50m;
SQL> select name from v$tempfile;
NAME
----------------------------------------------------------------------
E:\ORADATA\PROD\TEMP01.DBF
D:\ORADATA\TEMP01.DBF
目錄不一致的要刪除,因數據文件目錄不一致所致,否則之后執行腳本會報錯:
SQL> alter tablespace temp drop tempfile 'e:\oradata\prod\temp01.dbf';
㈢升級
下面腳本執行時間很長,一個小時:
SQL> spool d:\share\catupgrd.log
SQL> @?/rdbms/admin/catupgrd.sql
跑完庫關閉了,要重新打開
修改一下compatible參數
SQL> alter system set compatible='11.2.0.1.0' scope=spfile;
如下腳本可選擇執行:
SQL> spool d:\share\utlu112s.log
SQL> @?/rdbms/admin/utlu112s.sql
因需位數轉換,可到最后再編譯無效對象。
㈣64位的轉換
SQL> shutdown immediate
SQL> startup migrate
SQL> spool d:\logs\utlirp.log
SQL> @?/rdbms/admin/utlirp.sql
最后重啟數據庫,重新編譯無效對象
SQL> shutdown immediate
SQL> startup
SQL> spool d:\logs\utlrp.logSQL> @?/rdbms/admin/utlrp.sql
重啟下,總體檢查一下,主要查看是否還有無效對象。
select count(*) from dba_invalid_objects;