powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Каков механизм порчи базы?
25 сообщений из 44, страница 1 из 2
Каков механизм порчи базы?
    #39015893
ques
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый.

FireBird 2.5.4, база данных в 1-м диалекте

Ситуация: при наличии активных подключений в таблицу, которую активно модифицируют пользователи, добавляется поле integer nullable. Далее добавленное поле апдейтится в 0. После коммита запрос count(*) этой таблицы вызывает ошибку. gfix показал наличие большого количества wrong page type. Опция -mend базу не вылечила. Пришлось восстанавливаться из ночного бекапа.

Каков механизм порчи базы данных в описанной ситуации?
...
Рейтинг: 0 / 0
Каков механизм порчи базы?
    #39015896
MaratIsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
quesДень добрый.

FireBird 2.5.4, база данных в 1-м диалекте

Ситуация: при наличии активных подключений в таблицу, которую активно модифицируют пользователи, добавляется поле integer nullable. Далее добавленное поле апдейтится в 0. После коммита запрос count(*) этой таблицы вызывает ошибку. gfix показал наличие большого количества wrong page type. Опция -mend базу не вылечила. Пришлось восстанавливаться из ночного бекапа.

Каков механизм порчи базы данных в описанной ситуации?

механизм ты! добавление поля в работающую БД - идиотизм
...
Рейтинг: 0 / 0
Каков механизм порчи базы?
    #39015923
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
quesСитуация: при наличии активных подключений в таблицу, которую активно модифицируют пользователи, добавляется поле integer nullable. Далее добавленное поле апдейтится в 0. После коммита запрос count(*) этой таблицы вызывает ошибку.Какую ошибку ?

quesgfix показал наличие большого количества wrong page type.А когда до этого вызывался gfix ? Т.е. где гарантия, что их не было раньше ?

quesКаков механизм порчи базы данных в описанной ситуации?Воспроизводимый пример в трекере даст ответ на этот и другие вопросы
...
Рейтинг: 0 / 0
Каков механизм порчи базы?
    #39015925
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запретить DDL доменов, таблиц и вьюх в немонопольном режиме, а также ввести для них принудительно SET AUTODDL ON - вот что давно назрело в ФБ. Оставить только возможность перекомпиляции ХП и триггеров.
Ибо ответ на такие сообщения обычно один: "модицифируешь таблицы при работающих юзерах ? ССЗБ".
Если не работает эта штука в ФБ, то зачем её вообще разрешать ?..
...
Рейтинг: 0 / 0
Каков механизм порчи базы?
    #39015927
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

не правильнее ли сделать так, чтобы "эта штука" работала?
...
Рейтинг: 0 / 0
Каков механизм порчи базы?
    #39015929
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrне правильнее ли сделать так, чтобы "эта штука" работала?Если стр-ру созданной ранее таблицы меняют на живой базе, это говорит о недоделанном дизайне. Есть база для девелоперов - на ней и пусть и тренируются. У мну было что-то похожее, когда они индекс дропнули - "вроде бы не юзается нигде...". Поубивать хотел всехнах... :-)
...
Рейтинг: 0 / 0
Каков механизм порчи базы?
    #39015953
КепО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Таблоид,
Большинство баз под FB - 24/7/365(6)
Из них подавляющее большинство - развиваются. То есть и поля добавляются и т.п.
Если на каждое добавление поля - монополить БД - это сильно расстроит владельцев бузинеса, боле того - они захотят СУБД, которая "работает". Так что не плюй в колодец
...
Рейтинг: 0 / 0
Каков механизм порчи базы?
    #39015960
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КепО,

мы уже проходили это волшебство, которое "на лету". Наелись пару раз - спасибо, больше не надо
...
Рейтинг: 0 / 0
Каков механизм порчи базы?
    #39015961
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КепОБольшинство баз под FB - 24/7/365(6)
Не бывает. Всегда есть регламентные окна хотя бы для сброса счётчика транзакций.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каков механизм порчи базы?
    #39015982
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид> Запретить DDL в немонопольном режиме, а также ввести для них
Таблоид> принудительно SET AUTODDL ON - вот что давно назрело в ФБ

Выдыхай, бобёр! (с)

И не распространяй свои фантазии на всех -
лично у меня подобные глупости не "назрели".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каков механизм порчи базы?
    #39016033
Зимаргл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ТаблоидЗапретить DDL доменов, таблиц и вьюх в немонопольном режиме, а также ввести для них принудительно SET AUTODDL ON - вот что давно назрело в ФБ. Оставить только возможность перекомпиляции ХП и триггеров.
Ибо ответ на такие сообщения обычно один: "модицифируешь таблицы при работающих юзерах ? ССЗБ".
Если не работает эта штука в ФБ, то зачем её вообще разрешать ?..
Жизнь в принципе нестатичная штука. Зачем ее вообще разрешать =)

Ради смеха живые примеры:

-первое, что я сделал на прошлой неделе, поставив Линтер, это добавил а потом удалил поле в онлайне

-тоже на прошлой неделе, пришлось поменять структуру БД хранения данных внутри "железки", из-за неожиданных глюков в протоколе обмена. Ожидаются "небольшие проблемы" с восстановлением данных до смены структуры

Так что свои фантазии вы либо изо рта не вытаскивайте, либо обратно в ***у засуньте.

P.S.Да я злой и грубый, уж извините, селяви

PPS DS, проблемы счетчика транзакций, бизнес тоже не волнуют

Рад, что разработчики смотрят на проблему адекватнее.
...
Рейтинг: 0 / 0
Каков механизм порчи базы?
    #39016039
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗимарглРади смеха живые примеры:

-первое, что я сделал на прошлой неделе, поставив Линтер, это добавил а потом удалил поле в онлайне


Ну это ты и FB сделать можешь. Если конечно зависимости от этого поля не наплодил. А если наплодил и удалил поле онлайн, то...

У вас там пользователи сильно смеялись когда вдруг поле пропало?

Представь себе ситуацию пользователь запускает ХП, а она бац и не работает. А почему? Да там какой-то Вася Пупкин грохнул бездумно поле в таблице, а то что процедура окривела проверить забыл. Ай-ай-ай...
...
Рейтинг: 0 / 0
Каков механизм порчи базы?
    #39016047
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис> Ну это ты и FB сделать можешь

Ты тоже выдыхай. Или внимательнее читай
предлагаемые "назревшие" фантазии. :)

> Представь себе ситуацию пользователь запускает ХП, а она бац и не работает

Так уж прям и не работает? Выдаёт сообщение
"бац! не работаю" вместо результата? При чём
делает это строго если добавить поле в БД, а
потом его удалить? Чёрт, у меня проснулся
интерес к Линтеру, чудесная СУБД.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каков механизм порчи базы?
    #39016049
Зимаргл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов ДенисЗимарглРади смеха живые примеры:

-первое, что я сделал на прошлой неделе, поставив Линтер, это добавил а потом удалил поле в онлайне


Ну это ты и FB сделать можешь. Если конечно зависимости от этого поля не наплодил. А если наплодил и удалил поле онлайн, то...

Читай внимательно - "добавил". Еще частая ситуация - поменять тип - расширить его. По хорошему, при таких операциях ничего ломаться в БД не должно, а при норм написании - и в приложениях и в хранимках итп.

При разумных операциях грабли ненужны.
...
Рейтинг: 0 / 0
Каков механизм порчи базы?
    #39016082
MaratIsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗимарглСимонов Дениспропущено...


Ну это ты и FB сделать можешь. Если конечно зависимости от этого поля не наплодил. А если наплодил и удалил поле онлайн, то...

Читай внимательно - "добавил". Еще частая ситуация - поменять тип - расширить его. По хорошему, при таких операциях ничего ломаться в БД не должно, а при норм написании - и в приложениях и в хранимках итп.

При разумных операциях грабли ненужны.

я тоже злой и грубый
...
Рейтинг: 0 / 0
Каков механизм порчи базы?
    #39016083
MaratIsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗимарглСимонов Дениспропущено...


Ну это ты и FB сделать можешь. Если конечно зависимости от этого поля не наплодил. А если наплодил и удалил поле онлайн, то...

Читай внимательно - "добавил". Еще частая ситуация - поменять тип - расширить его. По хорошему, при таких операциях ничего ломаться в БД не должно, а при норм написании - и в приложениях и в хранимках итп.

При разумных операциях грабли ненужны.

я тоже злой и грубый на вот таких как ты разработчиков
...
Рейтинг: 0 / 0
Каков механизм порчи базы?
    #39016116
КепО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Любая БД - продукт с жизненным циклом. В идеале - все операции, возможные в течении жизненного цикла, должны протекать не прерывая основного процесса - доступности БД. По-этому чем больше можно сделать в немонопольном режиме - тем лучше как для нас, так и для FB.
to all: давайте обойдёмся без грубостей друг к другу. Высказывать отношение можно и к мысли, а не только к автору.
...
Рейтинг: 0 / 0
Каков механизм порчи базы?
    #39016117
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КепО,

+1

PS всё равно - не приветствую анонимов
...
Рейтинг: 0 / 0
Каков механизм порчи базы?
    #39016119
ques
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый.

Попробую ответить.

MaratIsk,механизм ты!
А разве я где-нибудь утверждал, что это сделал я? На самом деле, с этим вопросом ко мне обратился, скажем так, "смежник". А я никак прокомментировать не смог.

MaratIsk,идиотизм
Ну-у-у... Если технически такие действия не запрещены, значит разрешены.

hvlad,Какую ошибку ?
Вчера уточнил - к БД ничем нельзя было подключиться. Сообщение было что-то "wrong page type" - точнее сказать не могу.

hvlad,А когда до этого вызывался gfix ?
Сложно сказать, но ночной бекап восстановился без каких либо ошибок.

hvlad,Воспроизводимый пример...
Попытался смоделировать - ошибка порчи БД не воспроизвелась. Правда, возникла другая ошибка: при наличии активных подключений (некие апдейты в цикле) в таблицу было добавлено поле типа INTEGER:
Код: plsql
1.
ALTER TABLE TBL ADD BLAH_BLAH_BLAH INTEGER;


При апдейте добавленного поля в 0 возникло исключение типа нарушение уникального индекса RDB$ЧЕГО_ТО_ТАМ. Причем, на добавленное поле никаких ограничений не накладывалось. Текст ошибки скопировать не догадался. Повторил сценарий еще 8 раз - ошибка не воспроизвелась. Если надо, могу скрипты и текст клиентского приложения на Delphi скинуть сюда.


Таблоид,Запретить...
И, главное, не пущать :-)
...
Рейтинг: 0 / 0
Каков механизм порчи базы?
    #39016144
ques
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итак, в результате ковыряний удалось добиться 100% воспроизведения следующей ошибки:

Создаем базу:
Код: 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.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
SET SQL DIALECT 1;

SET NAMES WIN1251;

CREATE DATABASE 'LOCALHOST:C:\DATA\DAMAGE.FDB'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 16384
DEFAULT CHARACTER SET WIN1251 COLLATION WIN1251;

CREATE SEQUENCE GEN_TBL_ID;

CREATE DOMAIN PK_INT AS
INTEGER
NOT NULL;

CREATE DOMAIN STR_32 AS
VARCHAR(32);

CREATE TABLE TBL (
    TBL_ID   PK_INT NOT NULL,
    UPD_CNT  PK_INT,
    STR_VAL  STR_32,
    COMP     COMPUTED BY ('UPD #<' || CAST(UPD_CNT AS VARCHAR(10)) || '>')
);

ALTER TABLE TBL ADD CONSTRAINT PK_TBL PRIMARY KEY (TBL_ID);
CREATE INDEX TBL_UPD ON TBL (UPD_CNT);

SET TERM ^ ;

CREATE TRIGGER TBL_BI FOR TBL
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.TBL_ID IS NULL) THEN
    NEW.TBL_ID = GEN_ID(GEN_TBL_ID, 1);
  NEW.UPD_CNT = 0;
  NEW.STR_VAL = 'String Value #<' || CAST(NEW.TBL_ID AS VARCHAR(10)) || '>';
END^

SET TERM ; ^

SET TERM ^ ;

CREATE PROCEDURE UPD_TBL(UPD_ID INTEGER)
RETURNS (RES SMALLINT)
AS
DECLARE VARIABLE UPD_VAL INTEGER;
BEGIN
  SELECT UPD_CNT FROM TBL WHERE TBL_ID = :UPD_ID INTO :UPD_VAL;
  IF (UPD_VAL IS NULL) THEN
    RES = 0;
  ELSE
    BEGIN
      RES = 1;
      UPD_VAL = :UPD_VAL + 1;
      UPDATE TBL SET UPD_CNT = :UPD_VAL WHERE TBL_ID = :UPD_ID;
      WHEN ANY DO RES = -1;
    END
  SUSPEND;
END^

SET TERM ; ^

EXECUTE BLOCK
AS
  DECLARE VARIABLE ID INTEGER;
BEGIN
  ID = 0;
  WHILE (ID < 1000000) DO
    BEGIN
      INSERT INTO TBL(TBL_ID) VALUES (NULL);
      ID = GEN_ID(GEN_TBL_ID, 0);
    END
END;

COMMIT;

SET STATISTICS INDEX PK_TBL;
SET STATISTICS INDEX TBL_UPD;



Далее пишем небольшое клиентское приложение на Delphi + FIBPlus:
Код: pascal
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.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    pFIBDatabase1: TpFIBDatabase;
    pFIBTransaction1: TpFIBTransaction;
    pFIBQuery1: TpFIBQuery;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
    Run : boolean;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Run := False;
  pFIBDatabase1.Connected := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Id : integer;
begin
  if Run then   Exit;
  Run := True;
  while Run do
    begin
      Id := Round(Random * 1000000);
      pFIBTransaction1.StartTransaction;
      pFIBQuery1.Params[0].AsInteger := Id;
      pFIBQuery1.ExecQuery;
      pFIBTransaction1.Commit;
      Label1.Caption := IntToStr(Succ(StrToInt(Label1.Caption)));
      Application.ProcessMessages;
      Sleep(250);
    end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Run := False;
end;


Нажатие кнопки Button1 запускает циклический апдейт таблицы по рандомному TBL_ID.

Параметры транзакции pFIBTransaction1:
Код: pascal
1.
2.
3.
4.
write
nowait
rec_version
read_committed



Запрос pFIBQuery1 выглядит следующим образом:
Код: plsql
1.
SELECT RES FROM UPD_TBL(:ID)



Теперь сценарий воспроизведения ошибки:
1. Запускаем клиентское приложение - Заголовок Label1 содержит количество сделанных апдейтов.
2. Запускаем ISQL и не останавливая клиентское приложение добавляем в таблицу поле.
3. Что бы не нарваться на deadlock, останавливаем клиентское приложение.
4. Из ISQL апдейтим добавленное поле.
5. Запускаем апдейты в клиентском приложении.
6. В ISQL комитим апдейт добавленного поля.
7. Выясняется, что в таблице имеется какое-то количество записей, в которых значение добавленного поля NULL.

Вот последовательность выполнения команд в ISQL с пояснениями:
-- на момент запуска ISQL клиентское приложение производит апдейты
Use CONNECT or CREATE DATABASE to specify a database
SQL> CONNECT C:\DATA\DAMAGE.FDB USER SYSDBA PASSWORD masterkey;
Database: C:\DATA\DAMAGE.FDB, User: SYSDBA
SQL> ALTER TABLE TBL ADD BLAH_BLAH_BLAH INTEGER;
SQL> COMMIT;
-- в этом месте во избежание DEADLOCK-а останавливаем апдейты в клиентском приложении
SQL> UPDATE TBL SET BLAH_BLAH_BLAH = 0;
-- запускаем клиентские апдейты
SQL> COMMIT;
-- никаких ошибок нет, во всех записях значение поля BLAH_BLAH_BLAH должно равняться 0
SQL> SELECT COUNT(*) FROM TBL WHERE BLAH_BLAH_BLAH IS NULL;

COUNT
============
74
-- имеются записи, в которых значение BLAH_BLAH_BLAH есть NULL
SQL> COMMIT;
SQL>

Теперь закрываем клиентское приложение и выходим из ISQL
Опять заходим в ISQL

SQL> SELECT COUNT(*) FROM TBL WHERE BLAH_BLAH_BLAH IS NULL;

COUNT
============
5070
...
Рейтинг: 0 / 0
Каков механизм порчи базы?
    #39016146
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
quesудалось добиться 100% воспроизведения следующей ошибки
Вот только эта ошибка никак не соотносится с той, что описана в стартовом посте.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каков механизм порчи базы?
    #39016148
ques
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

но была обнаружена при попытках ее воспроизвести.
...
Рейтинг: 0 / 0
Каков механизм порчи базы?
    #39016150
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
quesно была обнаружена при попытках ее воспроизвести.
Почитай про версионность метаданных. Твой запрос из приложения и процедура, им
использованная, были скомпилированы ДО изменения метаданных. Почему ты считаешь, что они
должны порождать версии записей в формате, появившемся после их компиляции? Тут не MS SQL
с его интерпретируемыми батчами.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каков механизм порчи базы?
    #39016151
ques
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Хорошо, я перенесу логику хранимой процедуры в клиентское приложение и посмотрю, что получится. Надеюсь, что ошибка не повториться.
...
Рейтинг: 0 / 0
Каков механизм порчи базы?
    #39016152
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
quesНадеюсь, что ошибка не повториться.
Зря надеешься. Чтобы эта "ошибка" не повторилась, тебе надо перестать использовать
запросы, препарированные вне текущей транзакции.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 44, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Каков механизм порчи базы?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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