Как синхронизировать базу данных postgresql с данными из базы данных mysql? - PullRequest
2 голосов
/ 12 января 2011

У меня есть приложение в местоположении A (LA-MySQL), которое использует базу данных MySQL;И еще одно приложение в местоположении B (LB-PSQL), которое использует базу данных PostgreSQL.(под локацией я подразумеваю физически удаленные места и разные сети, если это имеет значение)

Мне нужно обновить одну таблицу на LB-PSQL для синхронизации с LA-MySQL, но я не знаю точно, какие из них являются лучшимив этой области.

Кроме того, таблица, которую мне нужно обновить на LB-PSQL, не обязательно имеет такую ​​же структуру LA-MySQL.(но я думаю, что это не проблема, поскольку поля, которые мне нужно обновить на LB-PSQL, способны вместить данные из полей LA-MySQL)

Учитывая эти данные, которые являются лучшими практиками, обычнометоды или ссылки для такого рода вещей?

Заранее спасибо за любые отзывы!

Ответы [ 3 ]

2 голосов
/ 12 января 2011

Если оба сервера находятся в разных сетях, я вижу только один шанс - экспортировать данные в плоский файл из MySQL.

Затем передайте файл (например, FTP или что-то подобное) на сервер PostgreSQL и импортируйте его туда, используя COPY

Я бы рекомендовал импортировать плоский файл в промежуточную таблицу. Оттуда вы можете использовать SQL для перемещения данных в таблицу целей назначения. Это даст вам возможность конвертировать данные или обновлять существующие строки.

Если это преобразование более сложное, вы можете подумать об использовании инструмента ETL (например, Kettle) для выполнения миграции на целевом сервере.

1 голос
/ 18 июня 2015

Не готовое решение, но это некоторый код, который поможет с этой задачей использовать триггеры.Ниже предполагается, что для краткости не удаляются и не обновляются.Требуется PG> = 9,1

1) Подготовить 2 новые таблицы.mytable_a и mytable_b.с теми же столбцами, что и для исходной таблицы, подлежащей репликации:

CREATE TABLE  mytable_a AS TABLE mytable WITH NO DATA;
CREATE TABLE  mytable_b AS TABLE mytable WITH NO DATA;

-- trigger function which copies data from mytable to mytable_a on each insert
CREATE OR REPLACE FUNCTION data_copy_a() RETURNS trigger AS $data_copy_a$
    BEGIN
    INSERT INTO mytable_a SELECT NEW.*;
        RETURN NEW;
    END;
$data_copy_a$ LANGUAGE plpgsql;

-- start trigger
CREATE TRIGGER data_copy_a AFTER INSERT ON mytable FOR EACH ROW EXECUTE PROCEDURE data_copy_a();

Затем при необходимости экспорта:

-- move data from mytable_a -> mytable_b without stopping trigger
WITH d_rows AS (DELETE FROM mytable_a RETURNING * )  INSERT INTO mytable_b SELECT * FROM d_rows; 

-- export data from mytable_b -> file
\copy mytable_b to '/tmp/data.csv' WITH DELIMITER ',' csv; 

-- empty table
TRUNCATE mytable_b;

Затем вы можете импортировать data.csv в mysql.

1 голос
/ 12 января 2011

Просто создайте сценарий в LA, который будет выполнять что-то вроде этого (пример bash):

TMPFILE=`mktemp` || (echo "mktemp failed" 1>&2; exit 1)
pg_dump --column-inserts --data-only --no-password \
  --host="LB_hostname" --username="username" \
  --table="tablename" "databasename" \
  awk '/^INSERT/ {i=1} {if(i) print} # ignore everything to first INSERT' \
  > "$TMPFILE" \
  || (echo "pg_dump failed" 1>&2; exit 1)
(echo "begin; truncate tablename;"; cat "$TMPFILE"; echo 'commit;' ) \
  | mysql "databasename" < "$TMPFILE" \
  || (echo "mysql failed" 1>&2; exit 1) \
rm "$TMPFILE"

и настроить его запуск, например, один раз в день в cron.Вам потребуется «.pgpass» для пароля postgresql и файл опций mysql для пароля mysql.

Это должно быть достаточно быстро для менее чем миллиона строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...