Right now I am in the middle of a project which is about moving an old 188.8.131.52 Oracle Enterprise Edition Database of roughly 1.5TB from the US to new hardware in Germany including an upgrade to 184.108.40.206 and a switch the Standard Edition 2. As you see, there are a couple of things to do and I am more than happy to do this challenging project. The basic plan is this:
- Create a new 220.127.116.11 database in Standard Edition 2
- Get an initial copy of the source database to Germany
- Restore that copy on the new hardware with an 18.104.22.168 Oracle Home
- Get the archivelogs on a regular basis from the source database in the US
- Recover the german copy of the database
- Repeat 4 and 5 until cut-over
- Open Resetlogs the german copy of the database
- Move the data to the new 22.214.171.124 database using transportable tablespace
According to the Licensing Guide it is allowed to plug in transportable tablespaces into a SE2 database. So I am completely happy with my approach.
But during the test phase of this migration I encountered a nasty error when plugging in the tablespace. I obfuscated some identifiers, so don’t be too strict:
Import: Release 126.96.36.199.0 - Production on Thu May 31 15:32:01 2018 Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved. ;;; Connected to: Oracle Database 12c Standard Edition Release 188.8.131.52.0 - 64bit Production Master table "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01" successfully loaded/unloaded Starting "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01": system/******** directory=copy_dump logfile=some_ts.impdp.log dumpfile=some_ts.dmpdp transport_datafiles=/u02/app/oracle/oradata/SOMEDB/SOMEDB/datafile/e*dbf Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK Processing object type TRANSPORTABLE_EXPORT/TABLE ORA-39083: Object type TABLE:"SOME_USER"."SOME_TABLE" failed to create with error: ORA-01647: tablespace 'SOME_TS' is read-only, cannot allocate space in it Failing sql is: CREATE TABLE "SOME_USER"."SOME_TABLE" (<Column list stripped>) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING TABLESPACE "SOME_TS"
Ok, the tablesapce is read only. That is supposed to be. A quick research at MOS revealed a note “ORA-39083 & ORA-01647 during TTS or EXPDP/IMPDP from Enterprise Edition to Standard Edition when deferred_segment_creation=True (Doc ID 2288535.1)” which states, that the deferred segment creation is the root cause. That makes sense somehow. The note further states, the workaround is either to use the version parameter of “impdp” during import TTS or to disable deferred segment creation at the source database before starting the TTS.
To cut a long story short, both workarounds do not work and end up with the exact same error. In my opinion this makes totally sense, because the segment for the table in question is simply not present in the transported tablespace. And it can’t be created during the TTS import since the tablespace is marked read only. It cannot be created when I use the version parameter for impdp nor it is being created when I disable deferred segment creation.
The only feasible solution is to create the segment at the source database before setting the tablespace to read only. A simple
SQL> alter table SOME_USER.SOME_TABLE allocate extent; Table altered.
does the trick. And that’s it. After creating a segment for this table the TTS import went fine without any further errors.
To make sure all objects do have a segment created, I use these queries:
SQL> select 'alter table ' || owner || '.' || table_name || ' allocate extent;' 2 from dba_tables where SEGMENT_CREATED='NO' 3* and owner='&USERNAME.';
So when using Transportable Tablespaces to move to a SE2 database and the source is 184.108.40.206 (the version when deferred segment creating was introduced) or higher, you better check that in advance. Hope that helps.