[Linux][Bazy danych] Jak przekonwertować bazę Access-a (plik MDB) do MySQL-a ?

Bazy danych, Narzędzia
[Linux][Bazy danych] Jak przekonwertować bazę Access-a (plik MDB) do MySQL-a ?

W związku z tym że obsługa plików MDB na Linuks-ach jest dość problematyczna, a przynajmniej dla mnie 😉 Postanowiłem wam zaprezentować sposób na konwersję bazy danych zapisanej w pliku MDB do MySQL-a.

Instalacja mdbtools

Konieczne będzie zainstalowanie narzędzia o nazwie mdbtools, dzięki temu zyskamy dostęp do mdb-schema oraz mdb-export, które wykorzystamy do eksportu danych z pliku MDB.

Instalację wykonujemy poniższym poleceniem w systemie Ubuntu oraz wszystkich pochodnych Debiana:

sudo apt-get install mdbtools

Po instalacji należy sprawdzić jaką wersję pliku bazodanowego posiadamy, wykonujemy to poleceniem mdb-ver

mdb-ver mazwa-pliku.mdb

Jeśli otrzymamy informację że pracujemy z plikiem w wersji JET3 to dokonujemy zmiany ustawień kodowania znaków na WINDOWS-1250.

MDB_JET3_CHARSET=WINDOWS-1250 ; export MDB_JET3_CHARSET

Eksport schematu

Zaczynamy od eksportu schematu z pliku MDB do SQL-a. Do tego celu posłużę się narzędziem mdb-schema, któremu określam że interesuje mnie schemat bazy MySQL:

mdb-schema mazwa-pliku.mdb mysql > schemat.sql

Mając gotową strukturę bazy danych przeprowadzę import do MySQL-a. W tym celu założyłem bazę danych o nazwie access-db oraz dla uproszczenia zakładam, że mam użytkownika root, który ma hasło root.

A teraz samo polecenie importujące:

mysql -uroot -proot access-db < schemat.sql

Eksport danych

Eksport danych z całej bazy jest niemożliwy, gdyż mdbtools nie dostarcza narzędzia które potrafiło by wykonać taką operację, jednak dostarcza narzędzie mdb-export potrafiące eksportować dane z pojedynczej tabeli.

Uwaga! Należy utworzyć katalog sql przed wywołanie polecenia eksportującego dane z tabel, gdyż polecenie zapisuje pliki z danymi właśnie do katalogu o takiej nazwie.

Polecenie eksportu wygląda następująco:

mdb-export -D "%Y-%m-%d %H:%M:%S" -H -I mysql mazwa-pliku.mdb $i > sql/tabela.sql

Flaga -D ustawia format daty. W przypadku bazy MySQL format powinien wyglądać "%Y-%m-%d %H:%M:%S".
Flaga -H pomija wiersz nagłówkowy, który w tym przypadku jest zbędny i mógłby powodować nieoczekiwane rezultaty przy imporcie danych.
Ostatnia flaga -I mysql ustawia eksport danych jako zapytania SQL dla MySQL-a, które w tym przypadku będą INSERT-ami.

Mając gotowe polecenie eksportujące dane z pojedynczej tabeli, konieczne jest pobranie listy tabel i eksport z nich danych. Jako że nie wyobrażam sobie, że będę robił to ręcznie, może przy małej bazie z 3 tabelami bym się pokusił jednak pokaże jak rozwiązać to kompleksowo.

Pobieramy listę dostępnych tabel z zaimportowanego schematu:

mysql -uroot -proot -e "show tables;" access-db

Czyścimy je ze zbędnych znaków wykorzystując narzędzie sed:

mysql -uroot -proot -e "show tables;" access-db | sed -e 's/)$/)\;/'

Teraz wystarczy „przejść” po liście tabel i wyeksportować dane poleceniem które zostało pokazane wcześniej. Jednak trzeba uważać na nazwy tabel, gdyż jeśli w ich nazwie trafi się spacja lub to skrypt uzna to za nową nazwę tabeli. Chcąc się przed tym uchronić konieczne jest ustawienie przed wywołaniem polecenia eksportującego dane aby tylko nowa linia była uznawana za nazwę tabeli.

IFS=$'\n'

Końcowe polecenie będzie wyglądało następująco:

for i in $(mysql -uroot -proot -e "show tables;" access-db | sed -e 's/)$/)\;/'); do echo $i; mdb-export -D "%Y-%m-%d %H:%M:%S" -H -I mysql mazwa-pliku.mdb $i | sed -e 's/\\/\\\\/g' > sql/$i.sql; done

Import danych

Mając komplet wyeksportowanych danych, możemy teraz przeprowadzić ich import, przechodzimy do katalogu sql i wpisujemy polecenie:

for SQL in *.sql; do DB=${SQL/\.sql/}; echo importing $DB; mysql -uroot -proot access-db < $SQL; done

I to by było wszystko tyle jeśli chodzi o import danych z pliku MDB do MySQL-a 🙂