Изменение структуры таблицы на лету с помощью SymmetricDS - PullRequest
0 голосов
/ 03 апреля 2020

Моя установка состоит из главного и подчиненного узла, подключенных к MySQL и Oracle БД соответственно. Подчиненный узел уже успешно передает строки, добавленные в таблицу, в главный узел. Однако когда я добавляю столбец в исходную таблицу, в целевой таблице ничего не меняется. До сих пор я выяснил, что

INSERT INTO `symmetricds`.`sym_table_reload_request` (`target_node_id`, `source_node_id`, `trigger_id`, `router_id`, `create_time`, `create_table`, `delete_first`, `processed`, `last_update_time`) 
VALUES ('master', 'client', 'ALL', 'ALL', CURRENT_TIMESTAMP(), '1', '0', '0', CURRENT_TIMESTAMP());

должно вызвать обновление целевой схемы. Однако это работает только тогда, когда я перезагружаю подчиненный узел симметричногоDS (который отправляет данные). То есть добавление столбца, перезапуск, а затем выполнение операций вставки и журналы сервера подтверждают, что XML, содержащий структуру таблицы, содержит новый столбец. Тем не менее, когда я пропускаю перезапуск, XML, показанный в журналах сервера, все еще пропускает новый столбец. Есть ли способ сделать эту работу без перезагрузки?

1 Ответ

1 голос
/ 06 апреля 2020

С помощью chenson42 я смог сделать эту работу. Допустим, у вас есть следующий триггер для таблицы "my_table"

insert into sym_trigger
(trigger_id,source_catalog_name, source_table_name,channel_id,last_update_time,create_time)
values('my_trigger','my_catalog','my_table','default',current_timestamp,current_timestamp);

Теперь вы добавляете столбец:

ALTER TABLE my_catalog.my_table ДОБАВИТЬ hacky_works varchar (40);

Затем, чтобы синхронизировать структуру разбитой таблицы с основной заметкой, запустите следующие строки:

UPDATE sym_trigger SET last_update_time=CURRENT_TIMESTAMP() where trigger_id="my_trigger";

INSERT INTO sym_table_reload_request (`target_node_id`, `source_node_id`, `trigger_id`, `router_id`, `create_time`, `create_table`, `delete_first`, `processed`, `last_update_time`) 
VALUES ('master', 'client', 'ALL', 'ALL', CURRENT_TIMESTAMP(), '1', '0', '0', CURRENT_TIMESTAMP());

Обратите внимание, что в этом примере «master» и «client» - это настроенные имена источника и цели узел.

...