Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
 После добавления новой таблицы из скрипта ошибка при попытке работать с этой таблицей  [new]
Вадим Мещеряков
Member

Откуда:
Сообщений: 50
Несколько баз работают с 2017 года без backup-restore. Firebird 3.0 Windows 64.
Клиент работает через DevArt UNIDAC.
Периодически выполняются SQL скрипты для обновления структуры базы данных.
При выполнении очередного скрипта

CREATE TABLE DOC_PACKS (
    ID           INTEGER NOT NULL,
    IDDOC        N_INTEGER,
    IDROW        N_INTEGER,
    IDLABEL      N_INTEGER,
    QUANTITY     NMONEY,
    BARCODE      CHAR200,
    IDOWNER      INTEGER,
    IDINOWNER    INTEGER,
    RECORDCOLOR  VARCHAR(20),
    RECORDFONT   VARCHAR(20),
    STATUS       N_INTEGER
);

ALTER TABLE DOC_PACKS ADD PRIMARY KEY (ID);

CREATE INDEX DOC_PACKS_BARCODE ON DOC_PACKS (BARCODE);
CREATE INDEX DOC_PACKS_IDDOC ON DOC_PACKS (IDDOC);
CREATE INDEX DOC_PACKS_IDROW ON DOC_PACKS (IDROW);



На нескольких базах была ошибка:
<unsuccessful metadata update
cannot create index RDB$PRIMARY444>


Теперь часть баз из множества находится в таком состоянии:
Все что работало ранее работает
Select по этой таблице выдает ошибку. Если удалить и создать заново её или создать любую другую таблицу то ошибки

1.
table  is not defined.
table id 599 is not defined.


2.
IBM	Mon Jun 29 21:12:44 2020
	Database: BASE.FDB
	Error: Page 24225 wrong type (expected pointer encountered data)


IBM	Mon Jun 29 21:12:44 2020
	Database: BASE.FDB
	Error: Pointer page 24225 {sequence 0} inconsistent in table NEW_TABLE (599)


Такое ощущение что базы "устали" от изменения метаданных за эти три года
Дальнейшие попытки добавлять метаданные приводят к ошибкам выявляемым gfix -v -full

IBM	Mon Jun 29 21:12:44 2020
	Database: BASE.FDB
	Error: Pointer page 24225 {sequence 0} inconsistent in table NEW_TABLE (599)


IBM	Mon Jun 29 21:12:44 2020
	Database: BASE.FDB
	Warning: Page 177 is an orphan


IBM	Mon Jun 29 21:12:44 2020
	Database: BASE.FDB
	Warning: Page 179 is an orphan


IBM	Mon Jun 29 21:12:44 2020
	Database: BASE.FDB
	Validation finished: 2 errors, 2 warnings, 0 fixed


В таблице RDB$RELATIONS RDB$FORMAT и RDB$FIELD_ID для этой таблицы и для всех вновь создаваемых содержат null
Gfix не помог а backup-restore лечит эту проблему, но баз много все их перебэкапить хлопотно.
Может кто то уже сталкивался и есть какое то решение по ремонту?

Спасибо.
29 июн 20, 19:27    [22159233]     Ответить | Цитировать Сообщить модератору
 Re: После добавления новой таблицы из скрипта ошибка при попытке работать с этой таблицей  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4214
Вадим Мещеряков
Такое ощущение что базы "устали" от изменения метаданных за эти три года
Коммиты надо делать между операторами ddl.
Между созданием таблицы и сознанием пк на нее, например.
Без коммитов - может сработать, может не сработать - это штатное поведение.
29 июн 20, 20:42    [22159254]     Ответить | Цитировать Сообщить модератору
 Re: После добавления новой таблицы из скрипта ошибка при попытке работать с этой таблицей  [new]
hvlad
Member

Откуда:
Сообщений: 10957
Вадим Мещеряков,

если есть воспроизводимый пример - было бы хорошо разобраться что там происходит.
29 июн 20, 23:11    [22159309]     Ответить | Цитировать Сообщить модератору
 Re: После добавления новой таблицы из скрипта ошибка при попытке работать с этой таблицей  [new]
Вадим Мещеряков
Member

Откуда:
Сообщений: 50
hvlad,

Воспроизвести такую поломку - взять нормальную базу выполнить скрипты и база сломалась не получилось.

Есть уже некондиционная база, в ней добавление любой таблицы дает ошибку. После перебэкапа все будет норм.
Такая база поможет понять причину?
30 июн 20, 10:33    [22159484]     Ответить | Цитировать Сообщить модератору
 Re: После добавления новой таблицы из скрипта ошибка при попытке работать с этой таблицей  [new]
Вадим Мещеряков
Member

Откуда:
Сообщений: 50
YuRock,

Тут проблема не в том что таблица не добавилась, а в том что теперь добавление любой таблицы создает таблицы по которым в RDB$Relations null в двух полях и эти таблицы не работают.
30 июн 20, 10:35    [22159487]     Ответить | Цитировать Сообщить модератору
 Re: После добавления новой таблицы из скрипта ошибка при попытке работать с этой таблицей  [new]
hvlad
Member

Откуда:
Сообщений: 10957
Вадим Мещеряков
Есть уже некондиционная база, в ней добавление любой таблицы дает ошибку. После перебэкапа все будет норм.
Такая база поможет понять причину?
Надеюсь - да
30 июн 20, 11:03    [22159501]     Ответить | Цитировать Сообщить модератору
 Re: После добавления новой таблицы из скрипта ошибка при попытке работать с этой таблицей  [new]
Вадим Мещеряков
Member

Откуда:
Сообщений: 50
hvlad,

Куда можно ссылку на скачивание базы отправить 40 мб в rar (что бы всем не светилась)?
30 июн 20, 13:56    [22159662]     Ответить | Цитировать Сообщить модератору
 Re: После добавления новой таблицы из скрипта ошибка при попытке работать с этой таблицей  [new]
hvlad
Member

Откуда:
Сообщений: 10957
Вадим Мещеряков,

hvlad at users sf net
30 июн 20, 14:12    [22159681]     Ответить | Цитировать Сообщить модератору
 Re: После добавления новой таблицы из скрипта ошибка при попытке работать с этой таблицей  [new]
Вадим Мещеряков
Member

Откуда:
Сообщений: 50
hvlad,

Отправил
30 июн 20, 14:26    [22159695]     Ответить | Цитировать Сообщить модератору
 Re: После добавления новой таблицы из скрипта ошибка при попытке работать с этой таблицей  [new]
Вадим Мещеряков
Member

Откуда:
Сообщений: 50
hvlad,

Посмотрел в истории выполнения скриптов обновлений.

Высланная база не выдала ошибки на двух таких скриптах (с коммитом транзакции между ними)

CREATE TABLE COLLECTPRICE_CACHE (
    ID             INTEGER NOT NULL,
    DATEDOC        DATE,
    IDDIVISION     N_INTEGER /* N_INTEGER = INTEGER DEFAULT 0 */,
    IDPRICEREGION  N_INTEGER /* N_INTEGER = INTEGER DEFAULT 0 */,
    IDUSER         N_INTEGER /* N_INTEGER = INTEGER DEFAULT 0 */,
    IDSOURCE1      N_INTEGER /* N_INTEGER = INTEGER DEFAULT 0 */,
    IDSOURCE2      N_INTEGER /* N_INTEGER = INTEGER DEFAULT 0 */,
    IDSOURCE3      N_INTEGER /* N_INTEGER = INTEGER DEFAULT 0 */,
    IDSOURCE4      N_INTEGER /* N_INTEGER = INTEGER DEFAULT 0 */,
    IDOWNER        INTEGER,
    IDINOWNER      INTEGER,
    RECORDCOLOR    VARCHAR(20),
    RECORDFONT     VARCHAR(20),
    STATUS         N_INTEGER /* N_INTEGER = INTEGER DEFAULT 0 */
);


ALTER TABLE COLLECTPRICE_CACHE ADD PRIMARY KEY (ID);


но эта таблица COLLECTPRICE_CACHE не работает и все следующие попытки создать другие таблицы были неудачны
30 июн 20, 14:32    [22159698]     Ответить | Цитировать Сообщить модератору
 Re: После добавления новой таблицы из скрипта ошибка при попытке работать с этой таблицей  [new]
hvlad
Member

Откуда:
Сообщений: 10957
Вадим Мещеряков
таблица COLLECTPRICE_CACHE не работает
Всегда ставили в ступор такие фразы.

PS ссылку получил, спасибо, разбираться буду чуть позже
30 июн 20, 14:59    [22159712]     Ответить | Цитировать Сообщить модератору
 Re: После добавления новой таблицы из скрипта ошибка при попытке работать с этой таблицей  [new]
Вадим Мещеряков
Member

Откуда:
Сообщений: 50
hvlad
Всегда ставили в ступор такие фразы.


В таблицу нельзя добавить строки, посмотреть строки, удалить строки. Лучше фразы чем "таблица не работает" я не нашел :)
Картинку всего одну можно приложить. Пусть будет эта

К сообщению приложен файл. Размер - 25Kb
30 июн 20, 17:21    [22159856]     Ответить | Цитировать Сообщить модератору
 Re: После добавления новой таблицы из скрипта ошибка при попытке работать с этой таблицей  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11913
Вадим Мещеряков
Лучше фразы чем "таблица не работает" я не нашел :)
Вместо "не работает" всегда лучше приводить ДОСЛОВНЫЙ текст ошибки
30 июн 20, 17:36    [22159870]     Ответить | Цитировать Сообщить модератору
 Re: После добавления новой таблицы из скрипта ошибка при попытке работать с этой таблицей  [new]
Вадим Мещеряков
Member

Откуда:
Сообщений: 50
YuRock
Коммиты надо делать между операторами ddl.
Между созданием таблицы и сознанием пк на нее, например.
Без коммитов - может сработать, может не сработать - это штатное поведение.

Анализ логов работы скриптов показал что было два скрипта, в первом создавалась таблица, второй скрипт создавал Primary Key и индексы. Между скриптами был Commit транзакции, плановое отключение от базы новый коннект к базе.
30 июн 20, 20:52    [22159965]     Ответить | Цитировать Сообщить модератору
 Re: После добавления новой таблицы из скрипта ошибка при попытке работать с этой таблицей  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4214
Вадим Мещеряков
YuRock
Коммиты надо делать между операторами ddl.
Между созданием таблицы и сознанием пк на нее, например.
Без коммитов - может сработать, может не сработать - это штатное поведение.

Анализ логов работы скриптов показал что было два скрипта, в первом создавалась таблица, второй скрипт создавал Primary Key и индексы. Между скриптами был Commit транзакции, плановое отключение от базы новый коннект к базе.
Да я уже понял, что тут проблема по-серьезней, и одна надежда на то, что у Влада получится ее повторить.

А с виду было похоже - у меня подобное проявлялось не раз, когда коммит всё решал.
30 июн 20, 23:31    [22160016]     Ответить | Цитировать Сообщить модератору
Все форумы / Firebird, InterBase Ответить