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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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


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

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

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


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

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

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

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


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

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

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

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

+1

PS всё равно - не приветствую анонимов
...
Рейтинг: 0 / 0
26.07.2015, 12:44
    #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
26.07.2015, 15:23
    #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
26.07.2015, 15:38
    #39016146
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каков механизм порчи базы?
quesудалось добиться 100% воспроизведения следующей ошибки
Вот только эта ошибка никак не соотносится с той, что описана в стартовом посте.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
26.07.2015, 15:40
    #39016148
ques
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каков механизм порчи базы?
Dimitry Sibiryakov,

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

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


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