powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Испорченная БД
25 сообщений из 54, страница 2 из 3
Испорченная БД
    #39168433
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrпопробуй создать таблицу и залить в нее данные в той же транзакции. О результатах доложи.
На выходных попробую, доложу.

В данном случае, на сколько удалось выяснить, сценарий был таков:
- массовые апдейты производились из некой клиентской программы (обычная 2-звенка, FIBplus, длинная читающая транзакция и пишущая транзакция на апдейт);
- из IBE в уже существующую таблицу сотрудник добавляет целочисленное поле not null;
- сразу же после добавления в SQLEditor-е выполняется что-то типа
Код: plsql
1.
2.
update SOME_TABLE
   set NOT_NUL_INT = 0;


Создания таблицы и заливки в нее данных в той же транзакции не было.

С уважением, Polesov.
...
Рейтинг: 0 / 0
Испорченная БД
    #39168448
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov- из IBE в уже существующую таблицу сотрудник добавляет целочисленное поле not null;
- сразу же после добавления в SQLEditor-е выполняется что-то типа
прекрасно. т.е. столбец добавляется неизвестно каким способом (я надеюсь, что ИБЕ тут использует alter table),
и кроме того, добавление столбца и update выполняются в разных транзакциях
...
Рейтинг: 0 / 0
Испорченная БД
    #39168449
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

это не должно приводить к разрушению БД. И ещё есть более правильный путь

Код: sql
1.
2.
alter table SOME_TABLE
add NOT_NUL_INT int default 0 not null;



который ещё и работает быстрее.

P.S. В трёшке если таблица содержит данные, то FB не даст тебе добавить NOT NULL столбец без указания кляузы DEFAULT
...
Рейтинг: 0 / 0
Испорченная БД
    #39168463
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrО результатах доложи.

Не стал ждать выходных.
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
SQL> create table TEST ( ID integer not null primary key );
SQL> insert into TEST values( 1 );
Statement failed, SQLSTATE = 42S02
Dynamic SQL Error
-SQL error code = -204
-Table unknown
-TEST
-At line 1, column 13
SQL>


В общем-то, все ожидаемо, но БД не повредилась. Все же, это несколько другой случай. IMHO.

С уважением, Polesov.
...
Рейтинг: 0 / 0
Испорченная БД
    #39168467
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PolesovНе стал ждать выходных.
предложено было не тебе, а Сибирякову

PolesovВсе же, это несколько другой случай. IMHO
именно
...
Рейтинг: 0 / 0
Испорченная БД
    #39168472
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvдобавление столбца и update выполняются в разных транзакциях
В принципе, я об этом же и говорил.


Симонов Денисэто не должно приводить к разрушению БД
По идее да, но все же имеются прецеденты...

Речь идет не о том, как при активных коннектах применять к БД DDL, а можно ли выяснить причину падения БД и исправить ошибку в исходном коде сервера.

Все же на выходных попробую воспроизвести сценарий порчи БД.

С уважением, Polesov.
...
Рейтинг: 0 / 0
Испорченная БД
    #39168498
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrпопробуй создать таблицу и залить в нее данные в той же транзакции. О
результатах доложи.
Я знаю, что с этого направления вы уже давно поставили заборчик из костылей, но у ТСа-то
не CREATE TABLE, а ALTER TABLE ADD COLUMN.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Испорченная БД
    #39168501
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЯ знаю, что с этого направления вы уже давно поставили заборчик из костылей, но у ТСа-то
не CREATE TABLE, а ALTER TABLE ADD COLUMN.
1) его поставили в борланде, насколько я помню
2) ну и нефиг тогда было писать про "создание" таблицы
...
Рейтинг: 0 / 0
Испорченная БД
    #39168505
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrнефиг тогда было писать про "создание" таблицы
Кстати, с alter table все то же самое:
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
SQL> alter table TEST add VC varchar(16) not null;
SQL> update TEST set VC = ID;
Statement failed, SQLSTATE = 42S22
Dynamic SQL Error
-SQL error code = -206
-Column unknown
-VC
-At line 1, column 17
SQL>


С уважением, Polesov.
...
Рейтинг: 0 / 0
Испорченная БД
    #39168516
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

ну так невозможно проапдейтить ещё не существующий столбец, а вот любой другой легко (DML не видит результаты DDL ещё незавершённой транзакции). И вообще все DDL выполняются только по коммиту.
Я же вроде правильный путь показал.
...
Рейтинг: 0 / 0
Испорченная БД
    #39168530
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr1) его поставили в борланде, насколько я помню

1) Я отлично помню, что Firebird 1 и даже, возможно, 1.5, этого заборчика не имели.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Испорченная БД
    #39168550
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисDML не видит результаты DDL ещё незавершённой транзакции
Более того, в другом коннекте не видит даже после commit в DDL-соединении - только после переподключения.
...
Рейтинг: 0 / 0
Испорченная БД
    #39168563
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesovв другом коннекте не видит даже после commit в DDL-соединении - только после переподключения.

Потому что Classic
...
Рейтинг: 0 / 0
Испорченная БД
    #39169153
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Симонов Денис]Polesov,

это не должно приводить к разрушению БД. И ещё есть более правильный путь

Код: sql
1.
2.
alter table SOME_TABLE
add NOT_NUL_INT int default 0 not null;



который ещё и работает быстрее.

Если я правильно помню то default срабатывает при вставке записи.
Если добавить такой командой поле в таблицу где уже есть записи то в имеющихся записях будет NULL несмотря на default.
Надо делать update.
...
Рейтинг: 0 / 0
Испорченная БД
    #39169221
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks,

ты бы проверил что ли. Конечно если добавить DEFAULT к ранее созданному полю NULL значения останутся на своих местах. А вот для нового NOT NULL с DEFAULT поля для всех существующих ранее записей в этом поле будет значение по умолчанию. Причём этот оператор отработает очень быстро, потому что он на самом деле не делает UPDATE, а лишь создаёт новый формат к которому будут приведены существующие записи при выборке. Это как раз я проверял.

Думаешь зря в тройке запретили добавление NOT NULL полей в таблицу с данными без предложения DEFAULT?
Одно это изменение + запрет на модификацию системных таблиц убирают 50% причин возникновения так называемых "невосстановимых" бэкапов.
...
Рейтинг: 0 / 0
Испорченная БД
    #39169226
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис> в тройке запретили добавление NOT NULL полей
Симонов Денис> в таблицу с данными без предложения DEFAULT?

Серьёзно? Какой ужас.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Испорченная БД
    #39169229
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

а зачем оно нужно? Чтобы битые базы создавать?
...
Рейтинг: 0 / 0
Испорченная БД
    #39169243
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,
допустим DEFAULT нам не нужен. Тогда мы можем сделать вот так.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
alter table SOME_TABLE
add NOT_NUL_INT int default 0 not null;

commit;

update SOME_TABLE
set NOT_NUL_INT = NOT_NUL_INT;

commit;

alter table SOME_TABLE
alter NOT_NUL_INT drop default;

commit;



по крайней мере после выполнения каждого оператора БД остаётся в консистентном состоянии. Последний оператор не меняет номер формата.
...
Рейтинг: 0 / 0
Испорченная БД
    #39169257
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисfraks,

ты бы проверил что ли. Конечно если добавить DEFAULT к ранее созданному полю NULL значения останутся на своих местах. А вот для нового NOT NULL с DEFAULT поля для всех существующих ранее записей в этом поле будет значение по умолчанию. Причём этот оператор отработает очень быстро, потому что он на самом деле не делает UPDATE, а лишь создаёт новый формат к которому будут приведены существующие записи при выборке. Это как раз я проверял.

Проверил. Действительно, на FB 2.5 это работает.
Возможно раньше это было не так (работаю с FB начиная с IB 4.2.1) и потом поправлено,
а может был комплект граблей которые я неправильно опознал.

Симонов ДенисДумаешь зря в тройке запретили добавление NOT NULL полей в таблицу с данными без предложения DEFAULT?
Одно это изменение + запрет на модификацию системных таблиц убирают 50% причин возникновения так называемых "невосстановимых" бэкапов.

Буквально на днях прошелся по сходным граблям.
В таблицу добавил поле INTEGER DEFAULT -1 NOT NULL и при помощи UPDATE заполнил существующие записи.
Косяк в том что делал это при наличи работающих коннектов. В итоге к вечеру в таблице таки были записи где это поле было с NULL и бэкап не ресторился.
...
Рейтинг: 0 / 0
Испорченная БД
    #39169276
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис> Тогда мы можем сделать вот так.

Понятно, что сделать можно по-всякому.
Но заставлять писать 2 оператора вместо
одного без необходимости - маразм.
И на это будут справедливо пенять.


P.S. Интересно, при создании таблицы
(а не добавлении поля) тоже такое же
ограничение имеется?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Испорченная БД
    #39169282
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraksБуквально на днях прошелся по сходным граблям.
В таблицу добавил поле INTEGER DEFAULT -1 NOT NULL и при помощи UPDATE заполнил существующие записи.
Косяк в том что делал это при наличи работающих коннектов. В итоге к вечеру в таблице таки были записи где это поле было с NULL и бэкап не ресторился.
Так точно. На днях так же добавили поле not null с дефолтным значением в домене. Вечером бэкап не восстановился из-за трех строк с NULL. Делали ли полный апдейт всех строк этой таблицы на дефолтное значение - не знаю.
...
Рейтинг: 0 / 0
Испорченная БД
    #39169287
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамP.S. Интересно, при создании таблицы
(а не добавлении поля) тоже такое же
ограничение имеется?


нет конечно. Мало того если таблица пустая то добавить NOT NULL поле можно. Такое же поведение и в Оракле хз с какой версии.
...
Рейтинг: 0 / 0
Испорченная БД
    #39169289
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks,

работающие коннекты это совсем из другой оперы, там багов ещё вагон и маленькая тележка и не только с NOT NULL. По крайней мере при использовании такого оператора в моноконнекте нельзя получить битую БД.
...
Рейтинг: 0 / 0
Испорченная БД
    #39169293
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис> нет конечно

Ну хоть так.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Испорченная БД
    #39171273
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PolesovВсе же на выходных попробую воспроизвести сценарий порчи БД.

В пустой БД была создана таблица:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
create generator GEN_TEST_ID;

create table TEST (
    ID     integer not null,
    VAL    varchar(10),
    CALC   computed by ((ID + 100) / 10.0),
    STR    computed by (VAL || '=' || CALC),
    INS    timestamp,
    UPD    timestamp
);

alter table TEST
  add constraint PK_TEST primary key (ID);

set term ^ ;

create trigger TEST_BI for TEST
active before insert position 0
as
begin
  new.ID = gen_id( GEN_TEST_ID, 1 );
  if (new.VAL is null) then
    new.VAL = '<NULL>';
  new.INS = current_timestamp;
end ^

create or alter trigger TEST_BU for TEST
active before update position 0
as
begin
  new.UPD = current_timestamp;
end ^

set term ; ^


Закачано 10 млн записей. Далее 10 копий программы-имитатора производили в случайных диапазонах апдейты.
Из ISQL добавлялось поле интежер нот нулл. Далее после соммита добавленое поле апдейтилось в 0. Апдейт постоянно натыкался на дидлок.

Был опробован другой сценарий: 10 копий программы-имитатора коннектились к БД, но ничего не апдейтили. После добавления из ISQL поля и его апдейта в 0 запускались апдейты в программах-имитаторах.

В-общем, сломать БД не получилось.

С уважением, Polesov.
...
Рейтинг: 0 / 0
25 сообщений из 54, страница 2 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Испорченная БД
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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