Вставка строк во время начальной загрузки приводит к сбою синхронизации. Как это предотвратить?

Я использую SymmetricDS версии 3.4.8 для синхронизации двух баз данных PostgreSQL.

Я столкнулся со следующей проблемой: у меня есть несколько зависимых таблиц, например. таблицы «node» и «device», где таблица «device» имеет FK для таблицы «node»; если новые строки были добавлены в эти таблицы во время начальной синхронизации, когда таблица 'node' уже была синхронизирована, а 'device' нет (то есть, между 'node em>' и 'device'), обработка таблицы 'device' на подчиненном узле завершается со сбоем при попытке вставить новую строку, поскольку она нарушает ограничения внешнего ключа, поскольку ключ отсутствует в таблице 'node'. Как я могу справиться с этой проблемой?

Спасибо


person Yulia    schedule 03.03.2014    source источник


Ответы (1)


SymmetricDS по умолчанию использует отдельный канал для первоначальных пакетов загрузки. При первоначальной загрузке в активной среде эти нарушения FK могут возникать временно по замыслу.

Когда канал начальной загрузки сталкивается с нарушением FK, канал приостанавливается. Ваш канал данных, содержащий отсутствующий ПК, начнет синхронизироваться. После завершения канала данных первоначальный канал загрузки снова попытается синхронизироваться. На этот раз ошибки не будет, потому что требуемый ПК теперь доступен на цели.

person Austin Brougher    schedule 03.03.2014
comment
Спасибо за ответ. - person Yulia; 04.03.2014
comment
Два параллельных канала (начальная загрузка и мой канал обновления данных) достигли состояния гонки: - person Yulia; 04.03.2014
comment
Два параллельных канала (первоначальная загрузка и канал обновления моих данных) достигли состояния гонки: - текущий пакет загрузки содержит строки таблицы "device", которые были добавлены после синхронизации таблицы "node" (новые строки должны быть синхронизированы каналом обновления); - текущий параллельный пакет обновления содержит строки, которые зависят от таблицы, которая еще не загружена изначально bean-компонентом; в результате каналы находятся в тупиковой ситуации. - person Yulia; 04.03.2014
comment
Канал начальной загрузки завершится ошибкой, если родительская запись недоступна. Вы говорите, что ваш канал обновления работает, и перед обновлением отсутствующей родительской записи канал инициализации нуждается в том, чтобы он столкнулся с собственной отсутствующей записью pk, которую канал инициализации еще не вставил? Изменения вашего узла и устройства вносятся в канал обновления данных? - person Austin Brougher; 04.03.2014
comment
Да, вы абсолютно правы. Это ситуация. Не удалось обновить канал в какой-то дополнительной паре таблиц, я вижу строки, которые необходимы для начального канала в том же пакете канала обновления, но после «плохих» данных. Изменения узла и устройства, сделанные на канале обновления данных, в дополнительном, начальном канале выбирают те же строки из таблицы устройств, которые включены в пакеты канала обновления. - person Yulia; 04.03.2014
comment
Теперь я понимаю. Есть два способа справиться с этим. Дождитесь спокойного времени, чтобы выполнить первоначальную загрузку, или удалите и перестройте все ваши отношения fk с помощью специального расширения SDS IReloadListener. - person Austin Brougher; 04.03.2014
comment
Большое спасибо за Вашу помощь. Есть ли способ получить исходные данные в виде снимка? Я имею в виду, что даже если в БД есть изменения, все исходные данные будут собраны, так как они не меняются с самого начала при начальной загрузке; все обновления будут собираться, но не отправляться, и канал обновлений начнет работать, когда завершится первоначальная загрузка. - person Yulia; 04.03.2014
comment
Данные начальной загрузки не копируются в другую таблицу, например sym_data. Это приведет к повреждению большой базы данных из-за ограничений по размеру и процессору. Также было бы медленно создавать список, ссылающийся на каждую запись таблицы. Мы не видели, чтобы эта проблема возникала очень часто, но это действительно происходит. Мы всегда открыты для предложений. - person Austin Brougher; 04.03.2014
comment
Для меня большая честь предложить дополнительное/альтернативное поведение. Думаю о следующем - окружить первоначальную загрузку транзакцией БД, иначе говоря, изолировать сбор данных от текущих изменений БД. Канал обновлений должен быть создан в режиме приостановки (обновления собираются без отправки); когда первоначальная загрузка будет завершена, канал обновления должен быть переведен в активный режим с помощью IReloadListener для завершения синхронизации БД. - person Yulia; 05.03.2014
comment
Сложность заключается в том, чтобы изолировать первоначальную загрузку от новых записей. Как узнать, какие записи являются новыми, если у вас есть таблица с миллионами записей. - person Austin Brougher; 05.03.2014
comment
Одна транзакция БД должна быть изолирована от изменений данных, происходящих одновременно в других транзакциях БД, не так ли? Извините, если я упустил что-то очевидное. - person Yulia; 05.03.2014
comment
Проблема, с которой вы сталкиваетесь, заключается в том, что ваше приложение выполняет вставку во время начальной загрузки. Использование транзакции для выбора целых таблиц заблокирует все ваши таблицы и не позволит вашему приложению выполнять вставки. - person Austin Brougher; 20.03.2014