Pre-Test Cross-Platform Migration Using RMA Backup and Transportable
Tablespaces
Downtime encountered: 0 seconds
Migration source host: poweredge
OS: RedHat LINUX AS 5
DB source: SID=orcl, 11.1.0.6, data stored in ASM diskgroup +DATA (previously
migrated from filesystem).
Tablespaces to be migrated to Windows: ITEMS, MARKET
RMAN repository: same host as source database, SID=test.
DB destination host: hp,
OS: Windows XP
DB destination: SID=orclhp, 11.1.0.6 data stored on file system in C:\apps\oracle\oradata
Note: this migration was performed from small endian to another small endian platform,
plus in 11g instead of 10g. As Figure 1 above shows both LINUX and Windows are
small endian platforms and simple file copy would do just fine, but the steps would be
identical in case of ALPHA to Integrity migration, as RMAN performs implicit
conversion. The point of this pre-test is to make sure we can avoid ANY downtime for
this transportable tablespaces migration, which we did. The rest will be done by RMAN
without explicit conversion of datafiles between platforms (a new feature available from
10gR2 and up).
2. This window shows that source database host poweredge is an 8CPU RedHat LINUX
server.
3. This window shows what platforms can be migrated to using transportable tablespaces.
4. This shows source database tablespaces. We will only transport ITEMS and
EXAMPLE. First we have to check that these tablespaces do not already exist in
destination platform. We do not transport UNDO, TEMP or SYSTEM tablespaces. We
also have to make sure all TTS pre-checks are done (self-containment, data types, etc.)
and source database users recreated in destination database.
Please note that this user ITEMS, for example, owns four tables SUPPLIERS,
CUSTOMERS, ITEM_MASTER and ITEM_SALE. We will later query the destination
database to make sure these tables have been transported successfully.
5. Backup source database and archivelogs by connecting to recovery catalog
6. Create transportdest and auxdest on source database
7. Run rman transport tablespaces script:
++++++++++++++++++++++++
[oracle@poweredge bin]$ rman
Recovery Manager: Release 11.1.0.6.0 - Production on Thu Feb 19
22:05:02 2009
Copyright (c) 1982, 2007, Oracle. All rights reserved.
RMAN> connect target sys/******@orcl
connected to target database: ORCL (DBID=1204707652)
RMAN> connect catalog rman/******@test
connected to recovery catalog database
RMAN> run {
2> transport tablespace items, market
3> tablespace destination '/u01/app/oracle/tts/transportdest'
4> auxiliary destination '/u01/app/oracle/tts/auxdest';
5> }
Creating automatic instance, with SID='accg'
initialization parameters used for automatic instance:
db_name=ORCL
compatible=11.1.0.0.0
db_block_size=8192
db_files=200
db_unique_name=tspitr_ORCL_accg
large_pool_size=1M
shared_pool_size=110M
processes=50
#No auxiliary parameter file used
db_create_file_dest=/u01/app/oracle/tts/auxdest
control_files=/u01/app/oracle/tts/auxdest/cntrl_tspitr_ORCL_accg.f
starting up automatic instance ORCL
Oracle instance started
Total System Global Area 205070336 bytes
Fixed Size 1298836 bytes
Variable Size 146804332 bytes
Database Buffers 50331648 bytes
Redo Buffers 6635520 bytes
Automatic instance created
contents of Memory Script:
{
# set the until clause
set until scn 3419451;
# restore the controlfile
restore clone controlfile;
# mount the controlfile
sql clone 'alter database mount clone database';
# archive current online log for tspitr to a resent until time
sql 'alter system archive log current';
# avoid unnecessary autobackups for structural changes during TSPITR
sql 'begin dbms_backup_restore.AutoBackupFlag(FALSE); end;';
# resync catalog after controlfile restore
resync catalog;
}
executing Memory Script
executing command: SET until clause
Starting restore at 19-FEB-09
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=44 device type=DISK
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: restoring control file
channel ORA_AUX_DISK_1: reading from backup piece
/u01/app/oracle/oradata/reco/ORCL/backupset/2009_02_19/o1_mf_ncsnf_TAG2
0090219T212726_4sw5db9b_.bkp
channel ORA_AUX_DISK_1: piece
handle=/u01/app/oracle/oradata/reco/ORCL/backupset/2009_02_19/o1_mf_ncs
nf_TAG20090219T212726_4sw5db9b_.bkp tag=TAG20090219T212726
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
output file name=/u01/app/oracle/tts/auxdest/cntrl_tspitr_ORCL_accg.f
Finished restore at 19-FEB-09
sql statement: alter database mount clone database
sql statement: alter system archive log current
sql statement: begin dbms_backup_restore.AutoBackupFlag(FALSE); end;
starting full resync of recovery catalog
full resync complete
contents of Memory Script:
{
# generated tablespace point-in-time recovery script
# set the until clause
set until scn 3419451;
# set an omf destination filename for restore
set newname for clone datafile 1 to new;
# set an omf destination filename for restore
set newname for clone datafile 3 to new;
# set an omf destination filename for restore
set newname for clone datafile 2 to new;
# set an omf destination tempfile
set newname for clone tempfile 2 to new;
# set a destination filename for restore
set newname for datafile 7 to
"/u01/app/oracle/tts/transportdest/items.272.677546641";
# set a destination filename for restore
set newname for datafile 10 to
"/u01/app/oracle/tts/transportdest/market.dbf";
# rename all tempfiles
switch clone tempfile all;
# restore the tablespaces in the recovery set plus the auxiliary
tablespaces
restore clone datafile 1, 3, 2, 7, 10;
switch clone datafile all;
#online the datafiles restored or flipped
sql clone "alter database datafile 1 online";
#online the datafiles restored or flipped
sql clone "alter database datafile 3 online";
#online the datafiles restored or flipped
sql clone "alter database datafile 2 online";
#online the datafiles restored or flipped
sql clone "alter database datafile 7 online";
#online the datafiles restored or flipped
sql clone "alter database datafile 10 online";
# make the controlfile point at the restored datafiles, then recover
them
recover clone database tablespace "ITEMS", "MARKET", "SYSTEM",
"UNDOTBS1", "SYSAUX" delete archivelog;
alter clone database open resetlogs;
}
executing Memory Script
executing command: SET until clause
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
renamed tempfile 2 to
/u01/app/oracle/tts/auxdest/TSPITR_ORCL_ACCG/datafile/o1_mf_temp_%u_.tm
p in control file
Starting restore at 19-FEB-09
using channel ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup
set
channel ORA_AUX_DISK_1: restoring datafile 00001 to
/u01/app/oracle/tts/auxdest/TSPITR_ORCL_ACCG/datafile/o1_mf_system_%u_.
dbf
channel ORA_AUX_DISK_1: restoring datafile 00003 to
/u01/app/oracle/tts/auxdest/TSPITR_ORCL_ACCG/datafile/o1_mf_undotbs1_%u
_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00002 to
/u01/app/oracle/tts/auxdest/TSPITR_ORCL_ACCG/datafile/o1_mf_sysaux_%u_.
dbf
channel ORA_AUX_DISK_1: restoring datafile 00007 to
/u01/app/oracle/tts/transportdest/items.272.677546641
channel ORA_AUX_DISK_1: restoring datafile 00010 to
/u01/app/oracle/tts/transportdest/market.dbf
channel ORA_AUX_DISK_1: reading from backup piece
/u01/app/oracle/oradata/reco/ORCL/backupset/2009_02_19/o1_mf_nnndf_TAG2
0090219T212726_4sw58nm0_.bkp
channel ORA_AUX_DISK_1: piece
handle=/u01/app/oracle/oradata/reco/ORCL/backupset/2009_02_19/o1_mf_nnn
df_TAG20090219T212726_4sw58nm0_.bkp tag=TAG20090219T212726
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:55
Finished restore at 19-FEB-09
datafile 1 switched to datafile copy
input datafile copy RECID=30 STAMP=679270183 file
name=/u01/app/oracle/tts/auxdest/TSPITR_ORCL_ACCG/datafile/o1_mf_system
_4sw7p0m8_.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=31 STAMP=679270183 file
name=/u01/app/oracle/tts/auxdest/TSPITR_ORCL_ACCG/datafile/o1_mf_undotb
s1_4sw7p0lt_.dbf
datafile 2 switched to datafile copy
input datafile copy RECID=32 STAMP=679270183 file
name=/u01/app/oracle/tts/auxdest/TSPITR_ORCL_ACCG/datafile/o1_mf_sysaux
_4sw7p0m0_.dbf
datafile 7 switched to datafile copy
input datafile copy RECID=33 STAMP=679270183 file
name=/u01/app/oracle/tts/transportdest/items.272.677546641
datafile 10 switched to datafile copy
input datafile copy RECID=34 STAMP=679270183 file
name=/u01/app/oracle/tts/transportdest/market.dbf
sql statement: alter database datafile 1 online
sql statement: alter database datafile 3 online
sql statement: alter database datafile 2 online
sql statement: alter database datafile 7 online
sql statement: alter database datafile 10 online
Starting recover at 19-FEB-09
using channel ORA_AUX_DISK_1
starting media recovery
archived log for thread 1 with sequence 200 is already on disk as file
/u01/app/oracle/oradata/reco/ORCL/archivelog/2009_02_19/o1_mf_1_200_4sw
5dck3_.arc
archived log file
name=/u01/app/oracle/oradata/reco/ORCL/archivelog/2009_02_19/o1_mf_1_20
0_4sw5dck3_.arc thread=1 sequence=200
media recovery complete, elapsed time: 00:00:00
Finished recover at 19-FEB-09
database opened
contents of Memory Script:
{
#mark read only the tablespace that will be exported
sql clone "alter tablespace ITEMS read only";
#mark read only the tablespace that will be exported
sql clone "alter tablespace MARKET read only";
# create directory for datapump export
sql clone "create or replace directory STREAMS_DIROBJ_DPDIR as ''
/u01/app/oracle/tts/transportdest''";
# export the tablespaces in the recovery set
host 'expdp userid=
'********'
transport_tablespaces= ITEMS,
MARKET dumpfile=
dmpfile.dmp directory=
STREAMS_DIROBJ_DPDIR logfile=
explog.log';
}
executing Memory Script
sql statement: alter tablespace ITEMS read only
sql statement: alter tablespace MARKET read only
sql statement: create or replace directory STREAMS_DIROBJ_DPDIR as
''/u01/app/oracle/tts/transportdest''
Export: Release 11.1.0.6.0 - Production on Thursday, 19 February, 2009
22:09:57
Copyright (c) 2003, 2007, Oracle. All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.1.0.6.0
- Production
With the Partitioning, OLAP, Data Mining and Real Application Testing
options
FLASHBACK automatically enabled to preserve database integrity.
Starting "SYS"."SYS_EXPORT_TRANSPORTABLE_01":
userid="/********@(DESCRIPTION=(ADDRESS=(PROTOCOL=beq)(PROGRAM=/u01/app
/oracle/product/11g/db_1/bin/oracle)(ARGV0=oracleaccg)(ARGS=\(DESCRIPTI
ON=\(LOCAL=YES\)\(ADDRESS=\(PROTOCOL=beq\)\)\))(ENVS=ORACLE_SID=accg))(
CONNECT_DATA=(SID=accg))) AS SYSDBA" transport_tablespaces= ITEMS,
MARKET dumpfile=dmpfile.dmp directory=STREAMS_DIROBJ_DPDIR
logfile=explog.log
Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
Processing object type TRANSPORTABLE_EXPORT/TABLE
Processing object type TRANSPORTABLE_EXPORT/CONSTRAINT/CONSTRAINT
Processing object type TRANSPORTABLE_EXPORT/INDEX_STATISTICS
Processing object type TRANSPORTABLE_EXPORT/CONSTRAINT/REF_CONSTRAINT
Processing object type TRANSPORTABLE_EXPORT/TABLE_STATISTICS
Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
Master table "SYS"."SYS_EXPORT_TRANSPORTABLE_01" successfully
loaded/unloaded
***********************************************************************
*******
Dump file set for SYS.SYS_EXPORT_TRANSPORTABLE_01 is:
/u01/app/oracle/tts/transportdest/dmpfile.dmp
***********************************************************************
*******
Datafiles required for transportable tablespace ITEMS:
/u01/app/oracle/tts/transportdest/items.272.677546641
Datafiles required for transportable tablespace MARKET:
/u01/app/oracle/tts/transportdest/market.dbf
Job "SYS"."SYS_EXPORT_TRANSPORTABLE_01" successfully completed at
22:10:26
host command complete
/*
The following command may be used to import the tablespaces.
Substitute values for <logon> and <directory>.
impdp <logon> directory=<directory> dumpfile= 'dmpfile.dmp'
transport_datafiles=
/u01/app/oracle/tts/transportdest/items.272.677546641,
/u01/app/oracle/tts/transportdest/market.dbf
*/
--------------------------------------------------------------
-- Start of sample PL/SQL script for importing the tablespaces
--------------------------------------------------------------
-- creating directory objects
CREATE DIRECTORY STREAMS$DIROBJ$1 AS
'/u01/app/oracle/tts/transportdest/';
CREATE DIRECTORY STREAMS$DIROBJ$DPDIR AS
'/u01/app/oracle/tts/transportdest';
/* PL/SQL Script to import the exported tablespaces */
DECLARE
-- the datafiles
tbs_files dbms_streams_tablespace_adm.file_set;
cvt_files dbms_streams_tablespace_adm.file_set;
-- the dumpfile to import
dump_file dbms_streams_tablespace_adm.file;
dp_job_name VARCHAR2(30) := NULL;
-- names of tablespaces that were imported
ts_names dbms_streams_tablespace_adm.tablespace_set;
BEGIN
-- dump file name and location
dump_file.file_name := 'dmpfile.dmp';
dump_file.directory_object := 'STREAMS$DIROBJ$DPDIR';
-- forming list of datafiles for import
tbs_files( 1).file_name := 'items.272.677546641';
tbs_files( 1).directory_object := 'STREAMS$DIROBJ$1';
tbs_files( 2).file_name := 'market.dbf';
tbs_files( 2).directory_object := 'STREAMS$DIROBJ$1';
-- import tablespaces
dbms_streams_tablespace_adm.attach_tablespaces(
datapump_job_name => dp_job_name,
dump_file => dump_file,
tablespace_files => tbs_files,
converted_files => cvt_files,
tablespace_names => ts_names);
-- output names of imported tablespaces
IF ts_names IS NOT NULL AND ts_names.first IS NOT NULL THEN
FOR i IN ts_names.first .. ts_names.last LOOP
dbms_output.put_line('imported tablespace '|| ts_names(i));
END LOOP;
END IF;
END;
/
-- dropping directory objects
DROP DIRECTORY STREAMS$DIROBJ$1;
DROP DIRECTORY STREAMS$DIROBJ$DPDIR;
--------------------------------------------------------------
-- End of sample PL/SQL script
--------------------------------------------------------------
Removing automatic instance
shutting down automatic instance
Oracle instance shut down
Automatic instance removed
auxiliary instance file
/u01/app/oracle/tts/auxdest/cntrl_tspitr_ORCL_accg.f deleted
auxiliary instance file
/u01/app/oracle/tts/auxdest/TSPITR_ORCL_ACCG/datafile/o1_mf_system_4sw7
p0m8_.dbf deleted
auxiliary instance file
/u01/app/oracle/tts/auxdest/TSPITR_ORCL_ACCG/datafile/o1_mf_undotbs1_4s
w7p0lt_.dbf deleted
auxiliary instance file
/u01/app/oracle/tts/auxdest/TSPITR_ORCL_ACCG/datafile/o1_mf_sysaux_4sw7
p0m0_.dbf deleted
auxiliary instance file
/u01/app/oracle/tts/auxdest/TSPITR_ORCL_ACCG/datafile/o1_mf_temp_4sw7r0
pv_.tmp deleted
auxiliary instance file
/u01/app/oracle/tts/auxdest/TSPITR_ORCL_ACCG/onlinelog/o1_mf_1_4sw7qyv7
_.log deleted
auxiliary instance file
/u01/app/oracle/tts/auxdest/TSPITR_ORCL_ACCG/onlinelog/o1_mf_2_4sw7qz75
_.log deleted
auxiliary instance file
/u01/app/oracle/tts/auxdest/TSPITR_ORCL_ACCG/onlinelog/o1_mf_3_4sw7qzj9
_.log deleted
RMAN>
++++++++++++++++++++++++
8. Make sure tablespace copies, import files and import script are created.
9. ftp created folders to destination host (from LINUX to Windows)
10. create users items and market on destination and grant them privileges
11. SQL> create or replace directory pumpdir as 'C:\tts\tts\pupdest'; on source
12. Contents of C:\tts\transportdest\impscrpt.sql (modify pump directory,
transport_datafiles= and
user):
++++++++++++++++++
/*
The following command may be used to import the tablespaces.
Substitute values for <logon> and <directory>.
impdp sys/******* directory=pumpdir dumpfile= 'dmpfile.dmp'
transport_datafiles= C:\tts\transportdest\items.272.677546641,
C:\tts\transportdest\market.dbf
*/
--------------------------------------------------------------
-- Start of sample PL/SQL script for importing the tablespaces
--------------------------------------------------------------
-- creating directory objects
CREATE DIRECTORY STREAMS$DIROBJ$1 AS 'C:\tts\transportdest\';
CREATE DIRECTORY STREAMS$DIROBJ$DPDIR AS 'C:\tts\transportdest\';
/* PL/SQL Script to import the exported tablespaces */
DECLARE
-- the datafiles
tbs_files dbms_streams_tablespace_adm.file_set;
cvt_files dbms_streams_tablespace_adm.file_set;
-- the dumpfile to import
dump_file dbms_streams_tablespace_adm.file;
dp_job_name VARCHAR2(30) := NULL;
-- names of tablespaces that were imported
ts_names dbms_streams_tablespace_adm.tablespace_set;
BEGIN
-- dump file name and location
dump_file.file_name := 'dmpfile.dmp';
dump_file.directory_object := 'STREAMS$DIROBJ$DPDIR';
-- forming list of datafiles for import
tbs_files( 1).file_name := 'items.272.677546641';
tbs_files( 1).directory_object := 'STREAMS$DIROBJ$1';
tbs_files( 2).file_name := 'market.dbf';
tbs_files( 2).directory_object := 'STREAMS$DIROBJ$1';
-- import tablespaces
dbms_streams_tablespace_adm.attach_tablespaces(
datapump_job_name => dp_job_name,
dump_file => dump_file,
tablespace_files => tbs_files,
converted_files => cvt_files,
tablespace_names => ts_names);
-- output names of imported tablespaces
IF ts_names IS NOT NULL AND ts_names.first IS NOT NULL THEN
FOR i IN ts_names.first .. ts_names.last LOOP
dbms_output.put_line('imported tablespace '|| ts_names(i));
END LOOP;
END IF;
END;
/
-- dropping directory objects
DROP DIRECTORY STREAMS$DIROBJ$1;
DROP DIRECTORY STREAMS$DIROBJ$DPDIR;
--------------------------------------------------------------
-- End of sample PL/SQL script
--------------------------------------------------------------
++++++++++++++++++
13. On destination database, run the import script:
14. Alter users on destination to switch their default tablespaces to the transported ones.
Log on as one of the transported users and query table names