
Oracle has introduced revolutionary Exascale technology last year . Customers can leverage the new technology using Exadata Database Service on Exascale Infrastructure (ExaDB-XS).
But …how do you get there ?
We can use simple Refreshable PDB feature to migrate the pluggable database in Oracle Base Database to ExaDB-XS.
Here is my demo environment.
Source Database : Oracle Base Database RAC.
Source DB Version : 23.6
Target Database : Oracle Exadata Database Service on Exascale Infrastructure
Target DB version : 23.6
I have divided the steps in to multiple sections as below so that it is easy to navigate.
Let’s explore one step at a time.
Step 0 – Prerequisites
All the requirements for Refreshable PDB applies here.
Please note that ExaDB-XS only supports 23ai databases.
ExaDB-XS databases uses Enterprise Edition – Extreme Performance .
Step 1 – Create Target CDB in ExaDB-XS (No Downtime)
Navigate to Container Databases section in ExaDB-XS console and click on Create Container Database as shown below.

Fill in the details as required on the new window as shown below.

We have the option to select an existing Oracle Home or create a new one.
I have selected an existing Oracle Home with 23.6 version which I had created earlier.
Enter the SYS user password as shown below.

Expand the advanced options and select same Database and National Character set as your Source Database and click on Create container database to proceed with creation of Target CDB.

We will have a CDB with a default PDB (PDB1 here) after successful creation.
Below is sample output of the existing PDBs.

Step 2 – Create Database Link (No Downtime)
We need a database link to create a refreshable PDB in target CDB from the source PDB.
Follow below steps.
Source Database
Create a user with below privileges on the Source CDB.
We will use this user while creating database link.
CREATE USER c##clone IDENTIFIED BY some-password CONTAINER=ALL;
GRANT CREATE SESSION, CREATE PLUGGABLE DATABASE, SELECT_CATALOG_ROLE TO c##clone CONTAINER=ALL;
GRANT READ ON sys.enc$ TO c##clone CONTAINER=ALL;
Target Database
On target CDB in ExaDB-XS , create a database link pointing to source CDB using below SQL.
CREATE DATABASE LINK <source_db_name> CONNECT TO c##clone IDENTIFIED BY <password> USING '(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = <source_db_scan_name>)(PORT = 1521))
(CONNECT_DATA =(SERVER = DEDICATED)(SID= <SID>)))';
Please note that it is important to use the above format (with SID) otherwise you might face error similar to below while creating Refreshable PDB.
Unable to determine the traces files directory for entry <entry in config file>
This is because service based connection(instead of SID) can redirect the database link to any available database instance and this error will be reported whenever database link tries to connect to the instance which is running on a different node than the node from which you are executing any refreshable PDB related activity.
Refer MOS note : 3044069.1 for more details.
Verify the database link using below SQL , you should be able to get source database name as output.
select name from v$database@<db_link_name>;
If you are interested in using a database link name other than the source database name , you will have to set init parameter global_names to false on the target CDB.
I had to set global_names to false.
Step 3 – Create Refreshable PDB (No Downtime)
We can create a Refreshable PDB on Target CDB using command similar to below one.
CREATE PLUGGABLE DATABASE <PDB_Name> FROM <Source_PDB_Name>@<db_link_name> REFRESH MODE MANUAL KEYSTORE IDENTIFIED BY <keystore_password>;
PDB_Name – Name of the new PDB in Exascale.
Source_PDB_Name – Name of PDB in Source which we would like to migrate.
db_link_name – Name of the database link created in Step 2.
keystore_password – Password of Source TDE keystore.
Below is sample output.

We can see the new PDB in mount mode as shown below.

How about PDB plug in violations , let’s use below command to check.
select con_id,type,message,status from pdb_plug_in_violations where con_id=<container_id_of_pdb>;
I could see lot of violations as below.

Let’s ignore them for now and proceed with next step.
Step 4 – Refresh the PDB (No Downtime)
We have created a refreshable PDB with manual refresh in previous step.
let’s manually refresh the PDB on regular intervals so that the target PDB is in sync with the source PDB until we decide to cutover.
Issue the below command to refresh the PDB.
alter pluggable database <PDB_NAME> refresh;
We can monitor the alert log to see more details about the refresh.

We can also skip this step if we had created the PDB with auto refresh.
Step 5 – Final refresh and cutover (Downtime window)
Proceed to shutdown the applications pertaining to Source PDB so that there are no more transactions coming to Source PDB.
Perform a final refresh using the command given in step 4.
We can now convert the refreshable PDB to a regular PDB using below command.
alter pluggable database <PDB_NAME> refresh mode none;
Now we can open the pluggable database in read write.
Use the below command.
alter pluggable database <PDB_NAME> open;
Below is sample outout.

We have completed the migration of the PDB to ExaDB-XS now , however we will perform additional steps mentioned in next step to ensure we are good with migration.
Step 6 – Post checks
a. PDB Plug in violations.
Let’s see what happened to the plug in violations we had noticed earlier.
Surprise , there are no more violations now.

b. PDB availability.
We will check whether the new PDB is up on all nodes by issuing below command.
srvctl status pdb -db <db_unique_name> -pdb <pdb_name>
Below is sample output.

As we can see PDB is up only on one node.
Let’s bring it up on all nodes using below command.
srvct start pdb -db <db_unique_name> -pdb <pdb_name>
Check the status again using previous command to ensure PDB is up on all nodes.
Below is sample output.

c. PDB service
We will check whether there is any service associated with the newly created PDB.
Let’s check the services of existing for the default PDB (PDB1) which got created along with CDB creation.
We will use below command.
srvctl status service -db <db_unique_name> -pdb <pdb_name>
Below is sample output.

Let’s check the services for the migrated PDB.

We can see that there are no services created for the migrated PDB . This can be issue when we restart our CDB since a PDB won’t be open if there are no associated services for it.
Let’s create a service for our PDB using below command.
srvctl add service -db <db_unique_name> -pdb <pdb_name> -service <service_name> -preferred <instance1,instance2>
I have used a service name similar to the service name of existing PDB . Please note that you can also use a different service name.
Below is sample output.

We also have to start the service using below command.
srvctl start service -db <db_unique_name> -service <service_name>
d. TDE encryption.
Check the wallet status using below command.
select CON_ID,STATUS,WALLET_TYPE,WALLET_ORDER,KEYSTORE_MODE from v$encryption_wallet;
Below is sample output.

All looks good in the above output.
Let’s check the master encryption key also.
select con_id,key_id,key_use from v$encryption_keys where con_id=<container_id>;
Below is sample output.

Again , output looks good.
We will find that this is the same key of the source PDB.
e. Init parameters
We have seen that there were PDB plug in violations for the PDB before we converted to a regular PDB.
Please note that even though there are no violations now , new PDB has adopted some of the parameter of the target CDB.
There are many parameter changes , some of them are based on the target memory and ECPU.
However , one major thing that caught my attention is the change in compatibility.
My source database (23.6) has compatibility of 23.0.0 where as the PDB after migration has compatibility of 23.6.0 which might have an impact on your database .
There are of course other changes like replacing ASM with Storage Vault . I haven’t tested any impact due to that change , however you should definitely test your database and application before an actual Production Database migration.
Happy Migration!
Leave a Reply