|
message length error: как найти имена проблемных столбцов?
|
|||
---|---|---|---|
#18+
Добрый день. Есть legacy приложение. Восстанавливаем систему после падения. БД - Firebird. Начали с настройки backup-ов и решили сделать пробный backup с помощью gbak . Процесс обрывается на таблице T с сообщением: gbak loggbak: writing index PK_T gbak: writing data for table T gbak: ERROR: message length error (encountered 326, expected 322) Я понимаю, было сделано изменение в схеме БД, прочитал, что IBExpert позволяет менять типы столбцов без предупреждения о несоответствиях между схемой и данными. Мы как раз пользуемся стареньким IBExpert. История изменений схемы БД не задокументирована. В документации Firebird по поводу rdb$formats написано: firebird docsRDB$DESCRIPTOR | BLOB FORMAT | Stores column names and data attributes as BLOB, as they were at the time the format record was created Выполнил следующий запрос: Код: sql 1. 2. 3. 4.
Получил результат вида (искренне ожидал увидеть имена столбцов=)): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Далеко неочевидным оказалось, что: - числа 4, 8, 12, 16, 20, 24 - адреса указателей - имена типов данных здесь - внутренние для Firebird Собственно вопросы: - Как по этим адресам указателей найти какому имени в таблице они соответствуют? Среди советов - использовать IBExpert Database Inside , наш IBExpert слишком стар для такого. Как обойтись без этого инструмента? - Допустим мы поставим новый IBExpert с Database Inside, как им пользоваться, как и где искать? - Видим, что для столбца с адресом 8 в 16 -м событии произошло изменение и столбец (как я понимаю) изменил тип данных с LONG на VARCHAR. В таблице Т поля для VARCHAR-столбцов имеют длины равные 10, 20, 20, 20, 22, 22, 80 символов? - Возможно ли экспортировать схему в SQL-скрипт, создать пустую БД, залить в нее данные из предыдущей? Или опять же мы напоремся на проблему переполнения/конфликта? - Есть ли другие способы решения данной проблемы? Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2017, 13:20 |
|
message length error: как найти имена проблемных столбцов?
|
|||
---|---|---|---|
#18+
hamishhamishСобственно вопросы: вопросы эти имеют мало смысла. Вы будете в записях физически корежить форматы? Да ну... Надо сделать select * from T, полный фетч, найти на какой записи ошибка происходит, понять, в результате чего ошибка, и если это размер столбца - скорректировать размер столбца альтером. Или присвоить столбцу пустую строку (или null), или вообще удалить запись. Или исправить системные таблицы - взять ДДЛ таблицы Т, создать ее в пустой базе, посмотреть чем отличается Т созданная из ДДЛ, и Т в старой базе. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2017, 14:16 |
|
message length error: как найти имена проблемных столбцов?
|
|||
---|---|---|---|
#18+
hamishhamishВ документации Firebird по поводу rdb$formats написано: firebird docsRDB$DESCRIPTOR | BLOB FORMAT | Stores column names and data attributes as BLOB, as they were at the time the format record was createdНет там имён, конечно же. Это кто-то не подумав написал. В документации тоже бывают ошибки, увы. И их можно регистрировать в трекере, кстати. Но. В любом случае - содержимое RDB$DESCRIPTOR есть внутренняя кухня движка и документировать её можно разве что для познавательных целей, она может измениться (и реально меняется) без предупреждения. hamishhamish Код: plaintext
hamishhamishДалеко неочевидным оказалось, что: - числа 4, 8, 12, 16, 20, 24 - адреса указателей - имена типов данных здесь - внутренние для FirebirdНе адреса, а смещения. Неочевидным это может показаться разве что тому, кому вообще не стоит в это смотреть :) hamishhamish- Как по этим адресам указателей найти какому имени в таблице они соответствуют?Это не адреса указателей. Пронумеруй строки, начиная с нуля. Полученные значения - это RDB$RELATION_FIELDS.RDB$FIELD_ID hamishhamish- Видим, что для столбца с адресом 8 в 16 -м событии произошло изменение и столбец (как я понимаю) изменил тип данных с LONG на VARCHAR. В таблице Т поля для VARCHAR-столбцов имеют длины равные 10, 20, 20, 20, 22, 22, 80 символов?Где вопрос-то ? В таблице выше длина указана в байтах, у VARCHAR есть 2-х байтовый префикс с реальной длиной строки, отсюда следует, что поле объявлено как VARCHAR(10) (если чарсет однобайтный) hamishhamish- Есть ли другие способы решения данной проблемы?Я уже про 2.х не помню, но если поле в принципе читается, то можно сделать холостой апдейт дабы привести все записи в таблице к последнему формату. Есс-но, лучше сначала потренироваться на копии. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2017, 14:24 |
|
message length error: как найти имена проблемных столбцов?
|
|||
---|---|---|---|
#18+
hvladПронумеруй строки, начиная с нуля. Полученные значения - это RDB$RELATION_FIELDS.RDB$FIELD_ID А скажи такой момент.... Допустим, я переопределил порядок столбцов. Просто было поле пятым, а стало вторым. Это меняет версию формата? Если нет, то допустим, я ещё и тип другого поля поменял, чтобы наверняка. И вот интересно, это изменение порядка столбцов, оно как-то отразится в RDB$DESCRIPTOR ? Потому что в текстовом формате RDB$DESCRIPTOR (ни в варианте Firebird, ни в варианте IBExpert) я такого не нашел. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2017, 20:45 |
|
message length error: как найти имена проблемных столбцов?
|
|||
---|---|---|---|
#18+
Arioch, логический порядок полей определяется RDB$RELATION_FIELDS.RDB$FIELD_POSITION ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2017, 21:28 |
|
message length error: как найти имена проблемных столбцов?
|
|||
---|---|---|---|
#18+
Ariochв текстовом формате RDB$DESCRIPTOR (ни в варианте Firebird, ни в варианте IBExpert)Ты серьёзно думаешь, что IBE понимает структуры системных блобов ? Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2017, 21:30 |
|
message length error: как найти имена проблемных столбцов?
|
|||
---|---|---|---|
#18+
hvladТы серьёзно думаешь, что IBE понимает структуры системных блобов ? Ну, RDB$DESCRIPTOR он понимает, иначе Database Inside не было бы. Но в данном случае просто блоб-фильтр соответствующий использует, конечно. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2017, 03:49 |
|
message length error: как найти имена проблемных столбцов?
|
|||
---|---|---|---|
#18+
IBExpertпросто блоб-фильтр соответствующий использует Свой BLOB-фильтр, не совпадающий по результату выдачи с блоб-фильтровв встроенным в firebird ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2017, 15:16 |
|
message length error: как найти имена проблемных столбцов?
|
|||
---|---|---|---|
#18+
hvladлогический порядок полей определяется RDB$RELATION_FIELDS.RDB$FIELD_POSITION Для текущей версии формата, а для предыдущих? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2017, 15:17 |
|
message length error: как найти имена проблемных столбцов?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2017, 15:29 |
|
message length error: как найти имена проблемных столбцов?
|
|||
---|---|---|---|
#18+
AriochДля текущей версии формата, а для предыдущих? логический порядок есть только у текущих метаданных ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2017, 15:48 |
|
message length error: как найти имена проблемных столбцов?
|
|||
---|---|---|---|
#18+
AriochIBExpertпросто блоб-фильтр соответствующий использует Свой BLOB-фильтр, не совпадающий по результату выдачи с блоб-фильтровв встроенным в firebirdОПять ерундой болтаешь... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2017, 16:04 |
|
|
start [/forum/topic.php?fid=40&msg=39552507&tid=1561339]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
68ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
others: | 10ms |
total: | 161ms |
0 / 0 |