Dec 9 2013

Migrarea bazelor de date IBM DB2

Categorie: Export | IBM DB2 | Import | MigrareCatalin Dumitru @ 11:52

IBM DB2 este un sistem de gestiune de baze de date distribuit pe sisteme de operare diferite pornind de la Windows, Linux si Unix pana la z/OS. Pentru un deployment este nevoie de 2 instante de DB2. In cele ce urmeaza ma voi referi la instanta initiala in care se afla baza de date pe care dorim sa o migram (aceasta poate fi un mediu de dezvoltare sau chiar de productie) si instanta secundara, adica instanta unde dorim sa migram baza de date initiala (aceasta poate fi un mediu de productie, sandbox, mediu de pre-release, testare s.a.).

Metodele de deployment pe care ne putem baza sunt:
1. Backup pe mediul initial si restore pe mediul secundar;
2. IBM Data Movement Tool - aplicatie realizata de IBM pentru migrari;
3. db2look si db2move;
4. Change plans;
5. Aplicatii third party.

1. backup si restore

Este cea mai utilizata metoda pentru copierea/migrarea/deployment-ul unei baze de date, totusi are cateva constrangeri importante: sistemele de operare ale celor 2 medii trebuie sa fie similare (windows to windows, linux to linux etc.); tipul sistemelor de operare trebuie sa fie similar, fie pe 32 biti fie pe 64 de biti. Pe site-ul IBM sunt publicate si restul de constrangeri.

2. IBM Data Movement Tool

Este o aplicatie scrisa in java care se conecteaza la 2 servere si extrage codul ddl si datele dintr-o baza de date si o ruleaza pe cel dea-al 2-lea mediu. Este o aplicatie gratuita si poate fi folosita si in mod deconectat, adica ne permite extragerea ddl-ului si a datelor fara a rula codul pe mediul nou. Aceasta este metoda promovata de IBM pentru migrarea bazelor de date intr-e sisteme de operare diferite.

3. Extragerea codului DDL si a datelor utilizand db2look si db2move

Db2look este o comanda care extrage codul ddl de creare a obiectelor unei baze de date iar db2move este folosita pentru export/import a datelor. 

4. Change plans

IBM Data Studiu este aplicatia IBM de management pentru IBM DB2. Una dintre functionalitati este Change plans iar scopul ei este de a urmari modificarile obiectelor din baza de date si de a salva aceste modificari in scripturi. Din pacate, aceasta solutie nu este tocmai buna atunci cand se lucreaza in echipa, deoarece aceste scripturi de modificari sunt salvate local iar deploymentul pe un nou mediu ar trebui sa tina cont de modificarile tuturor membrilor echipei de dezvoltatori (sigur ca se pot extrage aceste modificari de la fiecare dezvoltator in parte si combinarea lor intr-un script mare insa este o munca suplimentara). Change plans urmareste doar modificarile de structura.

5. Aplicatii third party

Exista aplicatii dezvoltate de diferite companii care faciliteaza deploymentul, nu voi intra in detalii.

 

Exista cazurile cand baza de date initiala se gaseste pe o masina cu un sistem de operare iar mediul secundar sa aibe alt sistem de operare. In acest caz deploytment-ul nu se mai poate face prin metoda backup + restore. Solutia este aceea de a genera codul de creare a obiectelor si de a realiza un import al datelor. 

In cele ce urmeaza voi exemplifica migrarea unei baze de date prin metoda db2look + db2move. Db2look extrage ddl-ul de creare a obiectelor in baza de date dar si setarile bazei de date. Db2move ne faciliteaza exportul si importul de date.

Propun urmatorul caz: se considera un server de dezvoltare cu sistem de operare Linux si un server de productie de tip Unix. Ambele servere sunt alte masini decat masina de pe care voi exemplifica pasii de mai jos si care este o masina Windows.

Aplicatii necesare:
1. Este nevoie de o aplicatie consola din care vom rula comenzile db2look si db2move. Spre exemplificare se poate folosi putty http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html ;
2. Este nevoie sa mutam fisierele generate pe masina initiala pe masina secundara. Spre exemplificare se poate folosi winscp http://winscp.net/eng/download.php ;
3. IBM Data Studiu. Aplicatia IBM de management a bazelor de date din pachetul IBM DB2.

Pasi necesari:

1. Extragerea scriptului pentru crearea obiectelor in baza de date (putty):

db2look -d NUME_DB -l -e -o NUME_DB.sql

Se va crea fisierul NUME_DB.sql care contine scriptul de creare a obiectelor sql. Pentru o lista completa a parametrilor puteti tasta db2look -h.

 

2. Extragerea scriptului de export a datelor (putty)

db2move NUME_DB export

Se vor crea mai multe fisiere care contin datele din baza de date (pentru o lista completa a parametrilor puteti tasta db2move -h.):
a. db2move.lst - lista tabelelor exportate impreuna cu numele celor 2 fisiere corespondente(msg si ixf);
b. cate un fisier msg si unul ixf pt fiecare tabela (msg va contine mesaje si ixf va contine datele).

3. Se vor copia toate fisiere rezultate la primii 2 pasi pe noul mediu sau pe mediul local. Eu prefer pe mediul local in cazurile cand trebuie modificat acest fisier.

Se poate folosi WinSCP.

5. Daca bazele de date initiala si secundara au un nume diferit, trebuie specificat acest lucru prin inlocuirea liniei "CONNECT TO NUME_DB;" cu linia "CONNECT TO NEW_NUME_DB;". Daca fisierul NUME_DB.sql a fost urcat pe noul mediu, se va rula fisierul care creaza obiectele sql.

db2 -f NUME_DB.sql

Eu prefer sa deschid fisierul cu IBM Data Studio si sa rulez crearea schemelor si a tabelelor, voi pastra restul pana dupa import.

6. In cazul in care in baza de date initiala avem tabele generate IDENTITY, se va genera codul care face drop la proprietatea identity (le vom recrea la pasul 9), se va folosi aplicatia IBM Data Studio:

SELECT 'ALTER TABLE 'concat trim(TABSCHEMA) concat '.' concat TABNAME concat ' ALTER COLUMN ' concat COLNAME concat ' DROP IDENTITY;' AS CodSQL
FROM SYSCAT.COLUMNS
WHERE IDENTITY='Y' AND TABSCHEMA NOT IN ('SYSIBM', 'SYSCAT', 'SYSSTAT', 'SYSIBMADM', 'SYSPUBLIC', 'SYSTOOLS')
ORDER BY TABSCHEMA, TABNAME;

Ruland codul de mai sus se obtine o lista de instruciuni de DROP IDENTITY care trebuie rulata in baza de date secundara.

8. Se va importa datele generate la pasul 2 si copiate pe mediul secundar la pasul 3:

db2 NUME_DB import 

Se poate folosi si load in loc de import insa tabelele vor ramane in starea de pending si va trebui rulata o instructiune set integrity pentru fiecare.

9. Se regenereaza proprietatea identity ruland codul de mai jos:

In baza de date initiala se va executa scriptul de mai jos, output-ul se va rula in baza de date sursa:
SELECT 'ALTER TABLE 'concat trim(TABSCHEMA) concat '.' concat TABNAME concat ' ALTER COLUMN ' concat COLNAME concat ' SET GENERATED ALWAYS AS IDENTITY;' AS CodSQL
FROM SYSCAT.COLUMNS
WHERE IDENTITY='Y' AND TABSCHEMA NOT IN ('SYSIBM', 'SYSCAT', 'SYSSTAT', 'SYSIBMADM', 'SYSPUBLIC', 'SYSTOOLS')
ORDER BY TABSCHEMA, TABNAME;

Acum am refacut setarea pentru coloanele identity insa fiecare va genera valori pornind de la 1, prin urmare trebuie sa setam pt fiecare tabela in parte de la ce valoarea sa continue sirul de valori generat:

In baza de date initiala se va executa scriptul de mai jos, output-ul se va executa si el. Noul output se va executa pe baza de date secundara.

SELECT 'select ''ALTER TABLE ' concat trim(TABSCHEMA) concat '.' concat TABNAME concat ' ALTER COLUMN ' concat COLNAME concat ' RESTART WITH '' concat (max(' concat COLNAME concat ')+1) concat '';'' from ' concat TRIM(TABSCHEMA) concat '.' concat TABNAME concat ' union ' AS Max
FROM SYSCAT.COLUMNS
WHERE IDENTITY='Y' AND TABSCHEMA NOT IN ('SYSIBM', 'SYSCAT', 'SYSSTAT', 'SYSIBMADM', 'SYSPUBLIC', 'SYSTOOLS')
ORDER BY TABSCHEMA, TABNAME;

Atentie: trebuie sters unltinul cuvant UNION din scriptul generat si inlocuit cu ";".

Scriptul de mai sus, genereaza un cod pentru fiecare tabela pentru care a fost setata proprietatea IDENTITY si cu noua valoare de la care va continua generarea sirului.

10. este bine sa se verifice daca trebuie rulata verificarea de integritate a vreunei tabele:

SELECT 'SET INTEGRITY FOR ' concat trim(tabschema) concat '.' concat tabname concat ' ALLOW NO ACCESS IMMEDIATE CHECKED;' FROM syscat.tables WHERE access_mode = 'N'

11. Daca scriptul ddl de creare a obiectelor bezei de date a fost rulat partial din IBM Data Studio, acum este momentul sa rulam restul codului, cel care creaza chei primare, relatii, triggere, functii etc.

Atentie insa la versiunile de sistem de operare, este posibil ca obiectele care contin cod sql (proceduri stocate, functii etc.) sa necesite anumite ajustari in functie de versiunea instantei de db2 (care este speciala pt acel sistem de operare).

Concluzii

Migrarea bazelor de date IBM DB2 este un proces ceva mai dificil daca vorbim de instante cu sisteme de operare diferite. In acest caz este bine sa facem o analiza a obiectelor pentru ca este posibil sa trebuiasca putin adaptat codul generat de db2look. Aplicatia IBM Data Movement creata de IBM reuseste sa mute bazele de date insa sunt anumite aspecte pe care este posibil sa vrem sa le controlam precum tablespaces-urile, bufferpool-urile s.a.

Aceste metode enumerate mai sus au plusuri si minusuri care in functie de nevoie puteti alege una sau alta insa inainte de a aplica in productie, este bine sa va mai documentati pentru ca acest articol prezinta doar foarte pe scurt care sunt pasii de urmat. Spre exemplu la metoda backup / restore trebuie sa tineti cont de structura si drepturile de securitate pe directoare. IBM Data Movement genereaza niste setari peste care este bine sa le adaptati, db2look + db2move este posibil sa va lase tabelele in pending si sa necesite rularea unei intructiuni de verificare a integritatii.  

Etichete: , , ,