Skip to content
ujangja edited this page Oct 28, 2022 · 22 revisions

Demo: Oracle to EDB AS migration

1. Summary:

Data Flow:

oracle (source) --> xdb publisher --> xdb replication server --> xdb subscriber --> edb database (target)

Target: minimize downtime

Component:

xdb replication server --> replicate oracle db to postgres

EDB MTK (migration tool kit) --> import all other schema's objects

livecompare --> compare migrated data between oracle and edb postgres

2. Preparation:

2.1 install required pkgs:

dnf install -y libaio-devel sysstat wget elinks bzip2 perl compat-openssl10 policycoreutils-python-utils ksh libnsl make gcc bzip2 unzip java-1.8.0-openjdk

2.2 disable fw

systemctl stop firewalld
systemctl disable firewalld

2.3 download oracle pkgs:

wget https://yum.oracle.com/repo/OracleLinux/OL8/appstream/x86_64/getPackage/oracle-database-preinstall-21c-1.0-1.el8.x86_64.rpm
wget https://download.oracle.com/otn-pub/otn_software/db-express/oracle-database-xe-21c-1.0-1.ol8.x86_64.rpm

2.4 download hr sample schema:

see ERD at: https://i.stack.imgur.com/RbULW.png

su - oracle
cd /home/oracle
wget https://github.com/bbrumm/oracle_sample/archive/refs/heads/main.zip

2.5 install oracle XE

rpm -ivh oracle-database-preinstall-21c-1.0-1.el8.x86_64.rpm
rpm -ivh oracle-database-xe-21c-1.0-1.ol8.x86_64.rpm

2.6 Create oracle database

2.6.1 create oradata dir

mkdir /home/oracle/oradata
chown -R oracle:oinstall /home/oracle/oradata

2.6.2 modify oracle config

cp /etc/sysconfig/oracle-xe-21c.conf /etc/sysconfig/oracle-xe-21c.conf.ori
sed -i 's/LISTENER_PORT=/LISTENER_PORT=1521/g' /etc/sysconfig/oracle-xe-21c.conf
sed -i 's/DBFILE_DEST=/DBFILE_DEST=\/home\/oracle\/oradata/g' /etc/sysconfig/oracle-xe-21c.conf
sed -i 's/DB_DOMAIN=/DB_DOMAIN=demo/g' /etc/sysconfig/oracle-xe-21c.conf
diff /etc/sysconfig/oracle-xe-21c.conf /etc/sysconfig/oracle-xe-21c.conf.ori

2.6.3 configure oracle as root:

/etc/init.d/oracle-xe-21c configure

2.6.4 output something like this, password is oracle_4U

be used for SYS, SYSTEM and PDBADMIN accounts: oracle_4U
Confirm the password: oracle_4U
Database Information:
-------------------------
Global Database Name:XE.demo
System Identifier(SID):XE
Pluggable database: pgdev/XEPDB1
Multitenant container database: pgdev
Use https://localhost:5500/em to access Oracle Enterprise Manager for Oracle Database XE

2.6.5 create oracle profile

su - oracle
echo "export ORACLE_HOME=/opt/oracle/product/21c/dbhomeXE" >> .xe
echo "export ORACLE_SID=XE" >> .xe
echo "export PDB_NAME=XEPDB1" >> .xe
echo "export PATH=$ORACLE_HOME/bin:$PATH" >> .xe
echo "alias sq='sqlplus / as sysdba'" >> .xe

2.7 Deploy sample schema

2.7.1 Prepare sample schema script

. .xe
unzip main.zip
mv '01 account.sql' 01.sql
mv '02 create tables.sql' 02.sql
mv '03 populate tables.sql' 03.sql
mv '04 others.sql' 04.sql
sed -i 's/ORCLPDB1/XEPDB1/g' 01.sql

2.7.2 Deploy sample schema

sq
alter session set container=XEPDB1;
@01.sql
exit

sqlplus hr/hrpass@//localhost:1521/XEPDB1.demo
@02.sql
@03.sql
@04.sql
exit

2.7.3 Grant privileges needed by xdb replication server

sq
show pdbs
alter session set container=XEPDB1;
grant connect,resource,create trigger,create job to hr;
exit

2.8 Install, configure, prepare EDB :

2.8.1 login to EDB portal, get token to enable dnf/yum

curl -1sLf 'https://downloads.enterprisedb.com/XYZXYZTOKEN/enterprise/setup.rpm.sh' | sudo -E bash
sudo dnf -y install edb-jdbc.x86_64 edb-migrationtoolkit edb-as14-server edb-xdb edb-livecompare

2.8.2 Initialize the database cluster

PGSETUP_INITDB_OPTIONS="-E UTF-8" /usr/edb/as14/bin/edb-as-14-setup initdb

2.8.3 Start the database cluster

systemctl start edb-as-14
systemctl enable edb-as-14

2.8.4 prepare database

su - enterprisedb
psql edb
create user output ENCRYPTED PASSWORD  'outputpg';
create database output owner output;
create user hr ENCRYPTED PASSWORD  'hrpasspg';
create database hr owner hr;
\q

2.8.5 Edit pg_hba.conf file

vi /var/lib/edb/as14/data/pg_hba.conf

host    all             all             127.0.0.1/32            scram-sha-256
host    all             all             0.0.0.0/0            scram-sha-256
#host    all             all             127.0.0.1/32            ident

2.8.6 Apply new pg_hba

psql edb
select pg_reload_conf();
select * from pg_hba_file_rules ;
\q

2.8.7 Create hr schema, ensure schema hr in search path on user hr

psql "host=127.0.0.1 port=5444 user=hr dbname=hr password=hrpasspg"
create schema hr;
ALTER ROLE hr SET search_path TO hr, public;
\q

2.9 prepare migration toolkit config

su -
cp /opt/oracle/product/21c/dbhomeXE/jdbc/lib/ojdbc8.jar /usr/edb/migrationtoolkit/lib/
chmod 644 /usr/edb/migrationtoolkit/lib/ojdbc8.jar


vi /usr/edb/migrationtoolkit/etc/toolkit.properties

SRC_DB_URL=jdbc:oracle:thin:@localhost:1521/XEPDB1.demo
SRC_DB_USER=hr
SRC_DB_PASSWORD=hrpass

TARGET_DB_URL=jdbc:edb://localhost:5444/hr
TARGET_DB_USER=hr
TARGET_DB_PASSWORD=hrpasspg

2.10 prepare xdb replication server

cp /opt/oracle/product/21c/dbhomeXE/jdbc/lib/ojdbc8.jar /usr/edb/xdb/lib/jdbc/
cp /opt/oracle/product/21c/dbhomeXE/jdbc/lib/ojdbc8.jar /usr/lib/jvm/jre/lib/ext
chmod 644 /usr/edb/xdb/lib/jdbc/ojdbc8.jar
chmod 644 /usr/lib/jvm/jre/lib/ext/ojdbc8.jar

cd /home
java -jar /usr/edb/xdb/bin/edb-repcli.jar -version

2.10.1 Create new password

echo "oracle" > passfile
java -jar /usr/edb/xdb/bin/edb-repcli.jar -encrypt -input passfile -output passfile-encrypted
cat passfile-encrypted
deIuKoLKPi4=

2.10.2 Modify config file, using new password

vi /etc/edb-repl.conf

admin_user=admin
admin_password=deIuKoLKPi4=

2.11 Prepare livecompare:

su -
pip3 install --user cx_Oracle --upgrade
cp /etc/livecompare/template_basic.ini /home/my_project.ini

vi /home/my_project.ini

[General Settings]
logical_replication_mode = off
max_parallel_workers = 4
oracle_user_tables_only = on
oracle_ignore_unsortable = on
column_intersection = on
force_collate = C
difference_tie_breakers = oracle
schema_qualified_table_names = off


[Oracle Connection]
technology = oracle
host = localhost
port = 1521
service = XEPDB1.demo
user = hr
password = hrpass


[Postgres Connection]
technology = postgresql
dsn = host=127.0.0.1 port=5444 user=hr dbname=hr password=hrpasspg
start_query = SET search_path = hr, public


[Output Connection]
dsn = host=127.0.0.1 port=5444 user=output dbname=output password=outputpg


[Table Filter]
schemas = schema_name = 'hr'

2.12 Create required .sql scripts

2.12.1 Create .sql script to check trigger

vi check_trigger.sql

SELECT pg_namespace.nspname, pg_class.relname, pg_trigger.tgname, pg_trigger.tgenabled, pg_trigger.tgctype, pg_trigger.tgdeferrable 
FROM pg_trigger
JOIN pg_class ON pg_trigger.tgrelid = pg_class.oid
JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
where pg_trigger.tgisinternal='f';

2.12.2 Create .sql script to generate disable trigger

vi gen_disable_trigger.sql

SELECT 'alter table '||pg_namespace.nspname||'.'||pg_class.relname||' disable trigger '||pg_trigger.tgname|| ';' 
FROM pg_trigger
JOIN pg_class ON pg_trigger.tgrelid = pg_class.oid
JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE pg_trigger.tgisinternal='f' and pg_trigger.tgenabled <> 'D'
;

2.12.3 Create .sql script to generate enable trigger

vi gen_enable_trigger.sql

SELECT 'alter table '||pg_namespace.nspname||'.'||pg_class.relname||' enable trigger '||pg_trigger.tgname|| ';' 
FROM pg_trigger
JOIN pg_class ON pg_trigger.tgrelid = pg_class.oid
JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE pg_trigger.tgisinternal='f' and pg_trigger.tgenabled <> 'D'
;

3. Migration steps:

3.1 start publication and subscription daemon

/usr/edb/xdb/bin/runPubServer.sh &
/usr/edb/xdb/bin/runSubServer.sh &

3.2 start xdb replication console GUI

/usr/edb/xdb/bin/runRepConsole.sh 

follow GUI wizards: create pub, sub, snapshot, sync

https://github.com/ujangja/demo_mig_oracle_to_edb/blob/main/xdb-gui.pdf

3.3 Execute MTK to import all other schema objects

export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk
export PATH=$JAVA_HOME/bin:$PATH

/usr/edb/migrationtoolkit/bin/runMTK.sh -help

/usr/edb/migrationtoolkit/bin/runMTK.sh -verbose on -schemaOnly -dropSchema false \
-tables COUNTRIES,DEPARTMENTS,EMPLOYEES,JOBS,JOB_HISTORY,LOCATIONS,REGIONS \
-triggers -allViews -allProcs -allFuncs -allPackages -allSequences -allDBLinks \
-allSynonyms -allPublicSynonyms -allPrivateSynonyms -allQueues HR

3.4 Check and generate disable/enable trigger scripts on target postgresql

 
psql "host=127.0.0.1 port=5444 user=hr dbname=hr password=hrpasspg"
\i check_trigger.sql

\! rm -f disable_trigger.sql
\t
\o disable_trigger.sql
\i gen_disable_trigger.sql
\! cat disable_trigger.sql

\! rm -f enable_trigger.sql
\o enable_trigger.sql
\i gen_enable_trigger.sql
\! cat enable_trigger.sql\
\q

3.4.1 Disable trigger on target postgresql

psql "host=127.0.0.1 port=5444 user=hr dbname=hr password=hrpasspg"
\i disable_trigger.sql
\q

3.4.2 Verify trigger has been disabled

psql "host=127.0.0.1 port=5444 user=hr dbname=hr password=hrpasspg"
\i check_trigger.sql

3.5 Simulate add new data

su - oracle
. .xe
sqlplus hr/hrpass@//localhost:1521/XEPDB1.demo

delete from departments where DEPARTMENT_ID in (280,290);
commit;

insert into departments values(280,'zzz',null,1700);
insert into departments values(290,'yyyy',null,1700);
commit;

3.5.1 Check at oracle (source):

SELECT * FROM hr.departments e order by 1 desc;

3.5.2 Validate, check exported data on target postgres

psql "host=127.0.0.1 port=5444 user=hr dbname=hr password=hrpasspg"
select * from departments order by 1 desc;
\q

3.6 Validate data with livecompare:

cd /home
export ORACLE_HOME=/opt/oracle/product/21c/dbhomeXE
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
livecompare my_project.ini --compare

3.6.1 Check livecompare result

cat ./lc_session_1/summary_20221024.out

psql "host=127.0.0.1 port=5444 user=output dbname=output password=outputpg"
select * from livecompare.vw_table_summary where session_id = 1;
\q
Clone this wiki locally