Ошибки Firebird при использовании Symmetricds

Я использую бесплатную версию symmetrds для репликации моей базы данных firebird. Когда я демонстрировал создание новой (пустой) БД, все работало нормально. Но когда я настраиваю свою существующую БД (имею данные), произошла ошибка.

введите здесь описание изображения

Я использую Firebird-2.5.5.26952_0 32bit и симметричный сервер-3.9.5, ОС Windows Server 2008 Enterprise.

Я искал целый день, но ничего не нашел, чтобы решить эту проблему. Кто-нибудь, пожалуйста, помогите. Спасибо за ваше время.

ОБНОВЛЕНИЕ: при начальной загрузке Symmetric выполняет оператор для объявления UDF в базе данных firebird:

declare external function sym_hex blob   
  returns cstring(32660) free_it 
  entry_point 'sym_hex' module_name 'sym_udf

Это вызвало ошибку, потому что моя существующая кодировка БД - UNICODE_FSS, максимальная длина CSTRING - 10922. Когда я работал, обновляя кодировку до NONE, все работало нормально. Но это не безопасное решение. Все еще работаю, чтобы найти лучше.

Еще одна вещь, кто-нибудь знает другие инструменты с открытым исходным кодом для репликации базы данных Firebird, я пробовал многие в здесь и только симметричная работа.


person Jacky    schedule 29.03.2018    source источник
comment
В системе отслеживания проблем есть открытая ошибка: symbolds.org/issues/view.php ?id=2369 :/   -  person Boris Pavlović    schedule 29.03.2018
comment
Не могли бы вы понизить уровень ведения журнала до DEBUG и получить оператор sql, который вызывает исключение?   -  person Boris Pavlović    schedule 29.03.2018
comment
@BorisPavlović, что вы имеете в виду, понизив уровень ведения журнала до DEBUG? Я видел эту проблему при поиске решения, похоже, никто не может это исправить :)   -  person Jacky    schedule 29.03.2018
comment
Использование бесплатной версии означает, что если возникнет проблема, вам придется найти способ ее обойти. Переименуйте файл SYMMETRIC_DS_HOME\conf\log4j.xml в SYMMETRIC_DS_HOME\conf\log4j.xml_backup, а файл SYMMETRIC_DS_HOME\conf\log4j-debug.xml в SYMMETRIC_DS_HOME\conf\log4j.xml. Перезапустите двигатель, чтобы получить журналы с ошибкой sql. Журнал находится в папке SYMMETRIC_DS_HOME\log.   -  person Boris Pavlović    schedule 29.03.2018
comment
спасибо @BorisPavlović. Я следую вашим шагам и обновляю изображение файла журнала выше, но все еще не вижу, какой оператор sql вызвал ошибку.   -  person Jacky    schedule 29.03.2018
comment
должны быть операторы журнала с классами org.jumpmind.symmetric.io, которые распечатывают операторы sql   -  person Boris Pavlović    schedule 29.03.2018
comment
Не могли бы вы скопировать/вставить точное исключение?   -  person Boris Pavlović    schedule 29.03.2018
comment
Пожалуйста, публикуйте ошибки, журналы и код в виде текста, а не в виде снимков экрана.   -  person Mark Rotteveel    schedule 29.03.2018
comment
Как я могу увеличить предел реализации длины cstring моей БД? - переписав реализацию (которой является сам Firebird). Таким образом, это вряд ли то, что вы практически можете сделать. Интересно, могут ли интерфейсы FB3 и UDR вместо этого обеспечить функцию более длинного буфера.   -  person Arioch 'The    schedule 29.03.2018
comment
Теперь, глядя на freeadhocudf.org/documentation_english/dok_eng_blob.html, я вижу, что библиотека работала с 32760 › 32660 Размер CSTRING. Может быть, на CSTRING влияет либо соединение, либо кодировка базы данных по умолчанию?   -  person Arioch 'The    schedule 29.03.2018
comment
FB SQL LangRef утверждает, что ограничение CSTRNIg в любом случае находится в BYTES, а не в CHAR   -  person Arioch 'The    schedule 29.03.2018
comment
Может случиться так, что язык базы данных по умолчанию влияет на интерпретацию типа данных CSTRING, по крайней мере, судя по объявлению strlen в c:\Program Files\Firebird\Firebird_2_1\UDF\ib_udf2.sql (но не в ib_udf.sql). Итак, @Jacky, введите эту команду как для старой, так и для новой базы данных: SELECT RDB$CHARACTER_SET_NAME FROM RDB$DATABASE   -  person Arioch 'The    schedule 29.03.2018
comment
На данный момент я ожидаю, что старая база данных будет использовать некоторые 1-байтовые MBCS (вероятно, WIN1250 или WIN1252), а новая база данных - некоторый вариант Unicode... Что может привести к тому, что все старые текстовые UDF потенциально будут возвращать неверные данные (несоответствие новой кодировке БД) , если вы не исправите все их объявления UDF, чтобы явно указать каждый текстовый параметр, ввод или вывод, с кодировкой, как в старой базе данных   -  person Arioch 'The    schedule 29.03.2018
comment
Кажется, у вас есть база данных unicode, которая не может иметь такую ​​длинную строку cstring, поскольку возвращаемый unicode varchar cos firebird составляет всего 32 767/4.   -  person Konstantin Streletsky    schedule 29.03.2018
comment
.... если это так, возникает вопрос, почему Symmetrics не ценит этот важный параметр. Это удача, если это так, что его функция так долго выполнялась, что она явно падала на шаге объявления. Было бы намного хуже, если бы он попал в поле зрения радаров без ранних явных ошибок....   -  person Arioch 'The    schedule 29.03.2018
comment
UNICODE_FSS устарел и ненадежен. NONE просто опасен. В настоящее время я предлагаю вам изучить текстовые поля подтипов CHAR/VARCHAR/BLOB в вашей базе данных, чтобы увидеть, имеют ли эти столбцы атрибуты какой-либо кодировки. Если нет - попадаешь в очень опасную воду. По крайней мере, Symmetics, кажется, не может клонировать кодировку базы данных. Может быть, это задумано, может быть, вместо этого явно воссоздаются кодировки столбцов и аргументов udf. Вы должны это проверить. //// Вы пробовали последнюю версию Firebird 2.5.8?   -  person Arioch 'The    schedule 30.03.2018
comment
проверьте UDF в старой базе данных, если ее параметры помечены наборами символов, вероятно, оба они UNICODE_FSS там в старой БД, и, возможно, вы можете исправить определение функции для новой БД, указав кодировки для обоих параметров явно. Тем не менее, вам лучше проконсультироваться с разработчиком UDF, чтобы узнать, какие наборы символов должны быть в этих параметрах.   -  person Arioch 'The    schedule 30.03.2018
comment
что такое кодировка подключения, которую вы указываете в информационном окне регистрации базы данных IBExpert? Или SELECT RDB$CHARACTER_SET_NAME FROM MON$ATTACHMENTS, RDB$CHARACTER_SETS WHERE MON$CHARACTER_SET_ID = RDB$CHARACTER_SET_ID   -  person Arioch 'The    schedule 30.03.2018
comment
1) пожалуйста, вставляйте все запросы и ошибки в свои вопросы КАК ТЕКСТ. Скриншоты трудно использовать повторно, срок их действия истечет, и они будут удалены в течение неопределенно короткого промежутка времени. 2) Пожалуйста, укажите в тексте вопроса дополнительные данные, которые вы упомянули в комментариях. Никто не любит читать длинные стены комментариев в поисках крох данных. 3) связать это обсуждение вместе с важными данными в отчете об ошибке, который вы открыли на Symmetrics, иначе, если команда Symmetrics когда-либо заглянет в него, они никогда не узнают эти дополнительные подробности.   -  person Arioch 'The    schedule 03.04.2018
comment
@Arioch'Спасибо за инструкцию, я обновил свой вопрос и удалил некоторые комментарии;)   -  person Jacky    schedule 06.04.2018


Ответы (1)


Проблема кажется ошибкой в ​​Firebird, где длина CSTRING должна быть в байтах, но на самом деле она использует символы. Ваша база данных, похоже, имеет UTF8 (или UNICODE_FSS) в качестве набора символов по умолчанию, что означает, что каждый символ может занимать до 4 байтов (3 для UNICODE_FSS). Максимальная длина CSTRING составляет 32767 байт, но если вычислить в символах для CSTRING, это резко уменьшит максимум до 8191 символа (или 32764 байта) (или 10922 символа, 32766 байт для UNICODE_FSS).

Обходным путем для этой проблемы может быть создание базы данных с другим набором символов по умолчанию. В качестве альтернативы вы можете (временно) изменить набор символов по умолчанию:

Для Firebird 3:

  1. Установите набор символов по умолчанию на однобайтовый набор символов (например, NONE). Использование NONE предпочтительнее, чтобы избежать непреднамеренных проблем с транслитерацией

    alter database set default character set NONE;
    
  2. Отключитесь (важно, вам может понадобиться отключить все текущие соединения из-за кэширования метаданных!)
  3. Настройте SymmetricDS, чтобы он создавал UDF.
  4. Установите набор символов по умолчанию обратно на UTF8 (или UNICODE_FSS)

    alter database set default character set UTF8;
    
  5. Отключить снова

При использовании Firebird 2.5 или более ранних версий вам потребуется выполнить прямое обновление системной таблицы (что больше невозможно в Firebird 3), используя:

Шаг 2:

update RDB$DATABASE set RDB$CHARACTER_SET_NAME = 'NONE'

Шаг 4:

update RDB$DATABASE set RDB$CHARACTER_SET_NAME = 'UTF8'

В качестве альтернативы SymmetricDS может изменить свою инициализацию на

DECLARE EXTERNAL FUNCTION SYM_HEX
    BLOB
    RETURNS CSTRING(32660) CHARACTER SET NONE FREE_IT
    ENTRY_POINT 'sym_hex' MODULE_NAME 'sym_udf';

Или, может быть, набор символов BINARY вместо NONE, так как это кажется более близким к цели UDF.

person Mark Rotteveel    schedule 31.03.2018
comment
Смотри его комментарии, Марк. Он утверждает, что в его новой базе данных нет ни одной кодировки, а не его старой. Звучит странно... - person Arioch 'The; 01.04.2018
comment
@Arioch'Я пропустил этот комментарий. Но они говорят, что это работает с новой пустой базой данных, а не с существующей базой данных, и это соответствует этому ответу и набору символов, который они упоминают для каждого. - person Mark Rotteveel; 01.04.2018
comment
@Arioch'Когда я создаю новую пустую БД для тестирования, я не устанавливаю кодировку, оставляю ее значением по умолчанию (НЕТ). Старая БД была создана кем-то давным-давно и использует кодировку UNICODE_FSS, в нашей БД слишком много данных в юникоде, теперь мне нужно реплицировать эту старую БД :) - person Jacky; 02.04.2018
comment
@Jacky Набор символов по умолчанию указывает только набор символов, который будет использоваться при добавлении (создании) нового столбца без указания явного набора символов. - person Mark Rotteveel; 02.04.2018
comment
@MarkRotteveel в любом случае, спасибо за утверждение update RDB$DATABASE set RDB$CHARACTER_SET_NAME = 'NONE', остановился на шаге 3, и все сработало нормально. Когда я обновляю кодировку до UNICODE_FSS (шаг 4), симметричный перестает работать. - person Jacky; 03.04.2018
comment
@Jacky Я сам не использую SymmetricDS, поэтому не знаю, чем еще могу вам помочь. Возможно, вы захотите проверить, существует ли какой-либо форум поддержки или список рассылки для SymmetricDS, и посмотреть, сможете ли вы найти там дополнительную помощь. - person Mark Rotteveel; 03.04.2018
comment
что такое библиотека sym_udf? кто его разработал, ты? Потому что у команды в вашем IBExpert отсутствует набор символов, а это опасно, запах кода! Вы только что продемонстрировали, почему так, потому что тогда правильность функции становится неявно зависимой от внешнего контекста (базы данных по умолчанию) - person Arioch 'The; 03.04.2018
comment
@Arioch'The It является частью SymmetricDS, и технически CSTRING не должен иметь набора символов (но для по какой-то причине кажется, что Firebird применяет семантику набора символов). - person Mark Rotteveel; 03.04.2018
comment
CSTRING shouldn't have a character set это довольно сомнительная интерпретация. Как бы вы перекодировали select udf(1) frin rdb$database в кодировку подключения? Однако документация здесь серьезно терпит неудачу, это точно. - person Arioch 'The; 03.04.2018
comment
It is part of SymmetricDS - название намекает на это, но я не уверен, что это так официально, и не хочу слишком копаться в этом. Но если это так, то баг надо прицепить к Symmetrics на неправильном объявлении функции - person Arioch 'The; 03.04.2018
comment
Для протокола, обсуждение документации и реализации UDF (на русском): sql.ru/forum/ и sql .ру/форум/ - person Arioch 'The; 03.04.2018
comment
@Arioch'Я уверен, что это часть SymmetricDS, я проверил их исходный код. И CSTRING должен быть в байтах, это специально указано в документации Firebird и InterBase. - person Mark Rotteveel; 04.04.2018
comment
@MarkRotteveel Я рассказал об этом аспекте документации еще 29 марта. Но это похоже на ошибку в документации. - person Arioch 'The; 04.04.2018