Pentaho DI: миграция базы MySQL в PostgreSQL

Автор: | 26/10/2017

Задача – конвертировать базы MySQL в PostgreSQL.

PostgreSQL будет в AWS RDS, пока используем локальный сервер.

Установка PostgreSQLтут>>>, Pentahoтут>>>.

MySQL

Добавляем пользователя с доступом из нашей сети, сread only правами ко всем базам:

[simterm]

MariaDB [(none)]> create user 'userkiev'@'194.***.***.45' identified by 'password';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> grant select on *.* to 'userkiev'@'194.***.***.45';
Query OK, 0 rows affected (0.00 sec)

[/simterm]

Проверяем:

[simterm]

MariaDB [(none)]> select host, user, password from mysql.user where user like '%kiev';
+----------------+----------+-------------------------------------------+
| host           | user     | password                                  |
+----------------+----------+-------------------------------------------+
| 194.***.***.45 | userkiev | *37FFCD0F3335D8ACB394E3AD769189D597D8786D |
+----------------+----------+-------------------------------------------+
1 row in set (0.00 sec)

[/simterm]

Подключаемся с локальной машины – проверяем удалённый доступ:

[simterm]

16:04:07 [setevoy@setevoy-arch-work ~]  $ mysql -h 52.***.***.154 -u userkiev -p                                                                                                                                                               
Enter password:                                                                                                                                                                                                                               
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 9536
Server version: 10.1.17-MariaDB-1~xenial mariadb.org binary distribution

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+----------------------------+
| Database                   |
+----------------------------+
| backup_logs                |
| frank_test                 |
| helpspot_db                |
| information_schema         |
| marin_pb_v2_autodesk       |
| marin_pb_v2_autodesk_31309 |
| marin_pb_v2_autodesk_33244 |
| marin_pb_v2_autodesk_33245 |
...

[/simterm]

Проверяем размер базы данных, для теста возьмём marin_pb_v2_yahoo_49987:

[simterm]

MariaDB [(none)]> select sum(round(((data_length + index_length) / 1024 /1024 ), 2)) as "Size in MB" from information_schema.tables where table_schema = "marin_pb_v2_yahoo_49987";
+------------+
| Size in MB |
+------------+
|      11.35 |
+------------+
1 row in set (0.20 sec)

[/simterm]

ОК – база маленькая, можно использовать.

PostgreSQL

Переключаемся под пользователя postgres:

[simterm]

$ su -l postgres
Password:

[/simterm]

Запускаем сервер:

[simterm]

[postgres@setevoy-arch-work ~]$ pg_ctl start -D /var/lib/postgres/data/
server starting

[/simterm]

Создаём аналогичную базу в PostgresSQL:

[simterm]

[postgres@setevoy-arch-work ~]$ createdb marin_pb_v2_yahoo_49987

[/simterm]

Проверяем:

[simterm]

[postgres@setevoy-arch-work ~]$ psql -c '\l marin*'
                                       List of databases
          Name           |  Owner   | Encoding |   Collate   |    Ctype    | Access privileges 
-------------------------+----------+----------+-------------+-------------+-------------------
 marin_pb_v2_yahoo_49987 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
(1 row)

[/simterm]

Pentaho

Загружаем MariaDB JDBC драйвер:

[simterm]

$ sudo wget https://downloads.mariadb.com/Connectors/java/connector-java-2.1.2/mariadb-java-client-2.1.2.jar -O /opt/pdi/lib/mariadb-java-client-2.1.2.jar

[/simterm]

Запускаем Spoon:

[simterm]

16:21:13 [setevoy@setevoy-arch-work ~]  $ spoon &

[/simterm]

Добавляем два соединения к базам данных – удалённая MySQL:

Жмём Test, если всё ОК – сохраняем.

Аналогично – добавляем базу для локального Postgres, в которую будем копировать данные:

Т.к. подключение локальное – то пароль не обязателен:

[simterm]

[postgres@setevoy-arch-work ~]$ cat /var/lib/postgres/data/pg_hba.conf | grep trust
# METHOD can be "trust", "reject", "md5", "password", "gss", "sspi",
# CAUTION: Configuring the system for local "trust" authentication
# the database superuser.  If you do not trust all your local users,
local   all             all                                     trust
host    all             all             127.0.0.1/32            trust
host    all             all             ::1/128                 trust
#local   replication     postgres                                trust
#host    replication     postgres        127.0.0.1/32            trust
#host    replication     postgres        ::1/128                 trust

[/simterm]

Детали тут>>>.

Сохраняем вторую базу.

Копирование данных

Из Tools > Wizard выбираем Copy Tables:

Выбираем Source (слева) и Target (справа):

Выбираем таблицы, которые надо скопировать:

Указываем имя задачи и путь к krt-файлам (krtKettle Transformation) и имя новой задачи:

Жмём Finish – проверяем файлы задачи:

[simterm]

16:49:32 [setevoy@setevoy-arch-work ~]  $ ls -l Work/PDI\ Jobs/
total 720
-rw-r--r-- 1 setevoy setevoy 17800 Oct 25 16:49 copy_oskar_marin_pb_v2_yahoo_49987account_history_to_postgre_local_test_marin_pb_v2_yahoo_49987.ktr
-rw-r--r-- 1 setevoy setevoy 17712 Oct 25 16:49 copy_oskar_marin_pb_v2_yahoo_49987account_to_postgre_local_test_marin_pb_v2_yahoo_49987.ktr
-rw-r--r-- 1 setevoy setevoy 17767 Oct 25 16:49 copy_oskar_marin_pb_v2_yahoo_49987calendar_day_to_postgre_local_test_marin_pb_v2_yahoo_49987.ktr
-rw-r--r-- 1 setevoy setevoy 17789 Oct 25 16:49 copy_oskar_marin_pb_v2_yahoo_49987calendar_month_to_postgre_local_test_marin_pb_v2_yahoo_49987.ktr
-rw-r--r-- 1 setevoy setevoy 17811 Oct 25 16:49 copy_oskar_marin_pb_v2_yahoo_49987calendar_quarter_to_postgre_local_test_marin_pb_v2_yahoo_49987.ktr
...

[/simterm]

Теперь в Spoon появилось представление того, что будет выполнено:

Можно кликнуть правой кнопкой по любому элементу задачи – Edit, или просто дабл-клик и посмотреть получившийся запрос, который будет выполнен:

Готово – жмём Run, запускаем задачу:

Проверяем:

[simterm]

[postgres@setevoy-arch-work ~]$ psql
psql (9.6.5)
Type "help" for help.
postgres=# \c marin_pb_v2_yahoo_49987;
You are now connected to database "marin_pb_v2_yahoo_49987" as user "postgres".
marin_pb_v2_yahoo_49987=# \dt
                  List of relations
 Schema |           Name           | Type  |  Owner   
--------+--------------------------+-------+----------
 public | account                  | table | postgres
 public | account_history          | table | postgres
 public | calendar_day             | table | postgres
 ...
 public | publisher_history        | table | postgres
(30 rows)

[/simterm]

Ссылки по теме

Converting from other Databases to PostgreSQL

http://sqlfiddle.com – “валидатор” SQL запросов