powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / message length error: как найти имена проблемных столбцов?
12 сообщений из 12, страница 1 из 1
message length error: как найти имена проблемных столбцов?
    #39552171
hamishhamish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Есть 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.
select CAST(SUBSTRING(f.rdb$descriptor FROM 1 FOR 32000) AS VARCHAR(32000)) log 
from rdb$formats f
join rdb$relations r on r.rdb$relation_id = f.rdb$relation_id
where r.rdb$relation_name = 'T'


Получил результат вида (искренне ожидал увидеть имена столбцов=)):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
TABLE FORMAT ID = 15
----------------------------------------------------------
4:  type=9  (LONG)  length=4  sub_type=0  flags=0x0
8:  type=9  (LONG)  length=4  sub_type=0  flags=0x0   
12: type=14 (DATE)  length=4  sub_type=0  flags=0x0 
16: type=9  (LONG)  length=4  sub_type=0  flags=0x0  
20: type=9  (LONG)  length=4  sub_type=0  flags=0x0  
24 <-- truncated?

TABLE FORMAT ID = 16
----------------------------------------------------------
4:  type=9  (LONG)     length=4    sub_type=0   flags=0x0
8:  type=3  (VARCHAR)  length=12   sub_type=52  flags=0x0
20: type=14 (DATE)     length=4    sub_type=0   flags=0x0
24: type=9  (LONG)     length=4    sub_type=0   flags=0x0
28: type=9  (LONG)     length=4    sub_type=0   flags=0x0

Далеко неочевидным оказалось, что:
- числа 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-скрипт, создать пустую БД, залить в нее данные из предыдущей? Или опять же мы напоремся на проблему переполнения/конфликта?
- Есть ли другие способы решения данной проблемы?

Спасибо.
...
Рейтинг: 0 / 0
message length error: как найти имена проблемных столбцов?
    #39552227
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hamishhamishСобственно вопросы:
вопросы эти имеют мало смысла. Вы будете в записях физически корежить форматы? Да ну...
Надо сделать select * from T, полный фетч, найти на какой записи ошибка происходит,
понять, в результате чего ошибка, и если это размер столбца - скорректировать размер столбца альтером. Или присвоить столбцу пустую строку (или null), или вообще удалить запись.
Или исправить системные таблицы - взять ДДЛ таблицы Т, создать ее в пустой базе, посмотреть чем отличается Т созданная из ДДЛ, и Т в старой базе.
...
Рейтинг: 0 / 0
message length error: как найти имена проблемных столбцов?
    #39552235
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
24 <-- truncated?
Что - так и написано ? Или отсебятина какая-то ?

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.х не помню, но если поле в принципе читается, то можно сделать холостой апдейт дабы привести все записи в таблице к последнему формату.
Есс-но, лучше сначала потренироваться на копии.
...
Рейтинг: 0 / 0
message length error: как найти имена проблемных столбцов?
    #39552507
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladПронумеруй строки, начиная с нуля. Полученные значения - это RDB$RELATION_FIELDS.RDB$FIELD_ID

А скажи такой момент....

Допустим, я переопределил порядок столбцов. Просто было поле пятым, а стало вторым.
Это меняет версию формата?
Если нет, то допустим, я ещё и тип другого поля поменял, чтобы наверняка.

И вот интересно, это изменение порядка столбцов, оно как-то отразится в RDB$DESCRIPTOR ?
Потому что в текстовом формате RDB$DESCRIPTOR (ни в варианте Firebird, ни в варианте IBExpert) я такого не нашел.
...
Рейтинг: 0 / 0
message length error: как найти имена проблемных столбцов?
    #39552519
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

логический порядок полей определяется RDB$RELATION_FIELDS.RDB$FIELD_POSITION
...
Рейтинг: 0 / 0
message length error: как найти имена проблемных столбцов?
    #39552521
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochв текстовом формате RDB$DESCRIPTOR (ни в варианте Firebird, ни в варианте IBExpert)Ты серьёзно думаешь, что IBE понимает структуры системных блобов ?

Код: plaintext
1.
2.
isql
set blob all;
select RDB$DESCRIPTOR from RDB$FORMATS WHERE ...
...
Рейтинг: 0 / 0
message length error: как найти имена проблемных столбцов?
    #39552587
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladТы серьёзно думаешь, что IBE понимает структуры системных блобов ?


Ну, RDB$DESCRIPTOR он понимает, иначе Database Inside не было бы. Но в данном случае просто блоб-фильтр соответствующий использует, конечно.
...
Рейтинг: 0 / 0
message length error: как найти имена проблемных столбцов?
    #39552908
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpertпросто блоб-фильтр соответствующий использует

Свой BLOB-фильтр, не совпадающий по результату выдачи с блоб-фильтровв встроенным в firebird
...
Рейтинг: 0 / 0
message length error: как найти имена проблемных столбцов?
    #39552909
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladлогический порядок полей определяется RDB$RELATION_FIELDS.RDB$FIELD_POSITION

Для текущей версии формата, а для предыдущих?
...
Рейтинг: 0 / 0
message length error: как найти имена проблемных столбцов?
    #39552921
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochс блоб-фильтров встроенным в firebird

пример этой выдачи 20937841
...
Рейтинг: 0 / 0
message length error: как найти имена проблемных столбцов?
    #39552929
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochДля текущей версии формата, а для предыдущих?
логический порядок есть только у текущих метаданных
...
Рейтинг: 0 / 0
message length error: как найти имена проблемных столбцов?
    #39552940
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochIBExpertпросто блоб-фильтр соответствующий использует

Свой BLOB-фильтр, не совпадающий по результату выдачи с блоб-фильтровв встроенным в firebirdОПять ерундой болтаешь...
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / message length error: как найти имена проблемных столбцов?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]