HOW TO: migratie van Oracle Database naar AWS RDS
Dit blog beschrijft de stappen om een Oracle database te migreren naar Amazon RDS. Het is bedoeld als een hands-on verslag van de stappen die ondergetekende auteur onlangs zelf heeft uitgevoerd bij een grootschalig migratie project bij een klant.
Pre-Requisites
Oracle kennis:
- AWS kennis; (EC2, RDS, VPC)
- Eigen AWS EC2 instance met Oracle geïnstalleerd
- AWS RDS database
Inleiding
Voor een klant hebben we onlangs een migratie uitgevoerd naar verschillende onderdelen van Amazon AWS. Een van deze onderdelen betrof het overzetten van een 3-tal databases naar AWS RDS. Omdat onze klant de database niet zelf in eigen beheer had, hebben we enkele extra stappen moeten uitvoeren.
Zo kregen we een Oracle export bestand aangemaakt via het bekende exp commando.
exp user/password owner=schema_owner file=name_of_dump_file.dmp log=name_of_log_file.log consistent=y direct=y
In ons project hebben we gekozen om de import in AWS RDS uit te voeren via Oracle datapump. Daarom importeren we eerst het ontvangen export bestand tijdelijk naar een AWS ec2 instance met een lokale Oracle database. Als je zelf de eigenaar bent van de bron Oracle database hoef je natuurlijk niet de database eerst te exporteren en heb je ook de AWS oracle instance niet nodig.
Stap 1: Bron DB en Doel DB (AWS RDS) – Aanmaken tablespace en user
Als de objecten van de user in een niet standaard tablespace aanwezig zijn zal je ook de user specifieke tablespace moeten aanmaken.
TIP: Het is handig om de grootte van deze tablespace te weten in de bron DB, op deze manier kan je de tablespace direct met de juiste omvang aanmaken.
Maak de juiste user aan in de Oracle database met de juiste rechten. Om dit goed te doen heb je het exacte exp commando nodig, hierin staat de schema owner en dat is de user die aangemaakt moet worden in de Oracle database, in ons geval is dit user waveset met tablespace waveset_ts.
CREATE USER waveset IDENTIFIED BY waveset DEFAULT TABLESPACE waveset_ts QUOTA UNLIMITED ON waveset_ts;
GRANT CREATE SESSION to waveset;
ALTER USER waveset QUOTA UNLIMITED ON USERS;
Stap 2: Bron DB – import dmp file
Na het aanmaken van de juiste user is het tijd om de export file te importeren in de AWS EC2 Oracle instance.
Zorg ervoor dat de export file op het lokale filesysteem van de AWS EC2 instance staat, dit kan je doen door gebruik te maken van het programma winscp of putty. Het import commando leest de export file en zorgt ervoor dat alle data weer correct in de database terechtkomt.
imp system/password fromuser=waveset touser=waveset file=/tmp/HIT_waveset.08012013.dmp log=/tmp/HIT_waveset.08012013.dmp.log statistics=safe
TIP: Statistics = recalculate berekent de statistieken tijdens de import. Uiteraard duurt dit langer tijdens de import.
Als de import klaar is zitten alle objecten van user waveset in de lokale database.
TIP: Het is verstandig om het export log te vergelijken met dit import log.
Stap 3: Bron DB – Nabewerkingen
Hieronder nog een aantal controles die voor ons noodzakelijk waren aangezien de oude database niet helemaal netjes ingedeeld was en hier slechts ter volledigheid vermeld staan:
- Controleer of alle tabellen in de juiste tablespace zitten. We verwachten alle objecten in tablespace WAVESET_TS
select tablespace_name, owner, table_name from all_tables where owner = ‘WAVESET’; - Controleer of alle indexen in de juiste tablespace zitten, ook hier verwachten we alle indexen in tablespace WAVESET_TS
select tablespace_name, owner, index_name from all_indexes where owner = ‘WAVESET’
Als dat niet het geval is, zet het object dan in de juiste tablespace:
- Voor tabel
alter table <table_name> move tablespace waveset_ts; - Voor index
alter index <index_name> rebuild tablespace waveset_ts;
Als alle objecten weer in de juiste tablespace zitten (in jullie geval zijn deze stappen waarschijnlijk overbodig) dan is het verstandig om de statistieken weer te rebuilden voor deze user.
EXEC DBMS_STATS.gather_schema_stats(‘WAVESET’)
Stap 4: Bron DB – Aanleggen Database links
Om de data van de AWS EC2 Oracle instance naar AWS RDS te “transporteren” maken we gebruik van het Oracle datapump mechanisme. Dit mechanisme heeft een database link nodig van de bron DB naar doel DB en de doel DB moet weer kunnen communiceren met de bron DB.
Maak een DB link van de bron DB naar doel DB
Voer dit uit in bijvoorbeeld sqlplus:
create database link test
connect to username identified by password
using
‘(DESCRIPTION=
(ADDRESS=
(PROTOCOL=TCP)
(HOST=enter_IP_address_from_AWS_RDS)
(PORT=1521))
(CONNECT_DATA=
(SID=enter_SID)))’
Deze connectie is om onderling te kunnen communiceren met de doel DB (AWS RDS). Dit kan je testen door het volgende select commando uit te voeren:
select * from v$version@test
TIP: Zorg dat de firewall van je AWS RDS verkeer van jouw bron DB op poort 1521 toelaat. Heb je een AWS RDS in een VPC, koppel dan een elastic IP aan je DB.
Het datapump commando leest bij start de tnsnames.ora voor de juiste connectie gegevens met je AWS RDS. Daarom moeten we ook de volgende gegevens toevoegen aan de tnsnames.ora:
test =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)
(HOST = enter_IP_address_from_AWS_RDS)
(PORT = 1521))
(CONNECT_DATA =
(SID = enter_SID)))
Om deze stap uit te voeren kan je de tnsnames.ora van de doel DB gebruiken om aan te loggen. Op deze manier heb je dit direct getest. We hebben de connectie in de tnsnames.ora test genoemd. Voer daarom dit commando uit:
sqlplus username/password_RDS@test
Stap 5: Doel DB (AWS RDS) – Aanleggen Database links
Maak een DB link van de doel DB naar bron DB.
TIP: Gebruik hier de username / password combinatie die je hebt opgegeven bij het aanmaken van de AWS RDS DB.
Nu heb je toegang tot de AWS RDS database, hier moeten we ook de link terug weer aanbrengen, deze link noemen we ec2db.
create database link ec2db
connect to username identified by password
using
‘(DESCRIPTION=
(ADDRESS=
(PROTOCOL=TCP)
(HOST= enter_IP_address_from_AWS_EC2_instance)
(PORT=1521))
(CONNECT_DATA=
(SID=enter_SID)))’/
TIP: Ook deze connectie kan je weer testen door select * from v$version@ec2db uit te voeren.
Stap 6: Bron DB – import via Oracle datapump naar AWS RDS
Als alle voorbereidingen goed zijn verlopen kan je nu via Oracle datapump van de bron DB naar de doel DB gegevens over zetten. Gebruik hiervoor dit commando:
impdp DB_owner_user/password@test directory=data_pump_dir network_link=ec2db schemas=username
TIP: Gebruik eventueel de parallel parameter om de import te versnellen: impdp DB_owner_user/password@test directory=data_pump_dir parallel=4 network_link=ec2db schemas=username Controleer na afronding van de datapump of alle gegevens zich ook in de AWS RDS bevinden.
Disclamer:
Bovenstaande stappen zijn de daadwerkelijke stappen genomen om de klant database te migreren naar AWS RDS. Voor een andere omgeving zijn wellicht andere stappen nodig.
Uiteraard is een van de gebruikte bronnen: http://aws.amazon.com/articles/4173109646282306 en verder http://aws.amazon.com.
Dit blog verscheen eerder op http://www.awsblog.nl en op http://www.xapper.nl