Quantcast
Channel: SQL.ru: Firebird, InterBase
Viewing all 1677 articles
Browse latest View live

Разрыв пользовательского соединения через 2 часа

$
0
0
Доброго времени суток!

Есть приложение, написанное на C#, СУБД Firebird 2.5.7, SuperServer.
По истечении двухчасового молчания клиента, подключенного к серверу Firebird, происходит разрыв соединения. Под молчанием имею в виду - пользователь ничего не делает в программе в течение двух часов. После при попытке выполнить какое-либо действие (например, записать информацию или сохранить), выходит ошибка о разрыве соединения: Error reading data from the connection.
Из того, что накопала: разобралась в KEEPALIVE, он работает, если смотреть по перехваченным пакетам в Wareshark, KeepAlive происходит каждые две минуты с сервера, параметры меняла, он не влияет на наличие ошибки.
Интересно, что разрыв стабилен ровно через два часа. По перехвату пакетов... Через два часа приходит пакет от сервера о подтверждении соединения, как думаю, тег ACK,на что клиент ему кидает ответный пакет. Затем КЛИЕНТ первый отправляет пакет с тегами ACK и FIN по порту 3050(192.168.132.79-клиент, 192.168.100.97-сервер. ):
192.168.132.79 192.168.100.97 64388 → 3050 [ACK] Seq=405 Ack=469 Win=65024 Len=0
192.168.132.79 192.168.100.97 64388 → 3050 [FIN, ACK] Seq=405 Ack=469 Win=65024 Len=0

И если используется порт 3050 от клиента, как понимаю, это Firebird сам разрывает соединение, не ОС.
ОС сервера: Windows Server 2008 R2 Standart. ОС клиента: любая, на win 7, 8, XP выходит данная ошибка.

Подскажите, что у меня не так, если есть вопросы-охотно отвечу. Тяготит, что после двухчасового простоя клиенту приходится переподключаться. Сервер в сети, каждые 30 сек на сервер отправляются пустые пакеты Ping-ом для проверки доступности сервера, все пакеты успешно доходят и возвращаются.
Может я саму работу системы недопонимаю, помогите, уже неделю убила на решение этого вопроса...

nullif и повторное вычиление expr1 - баг?

$
0
0
create sequence gen$test;
alter sequence gen$test restart with 0;

select nullif(gen_id(gen$test, 1),0) from rdb$database

Если выполнять этот запрос - то приращение всегда будет 2. Тоесть происходит повторное вычисление expr1, чего из описания не следует. Баг?

что использовать вместо list() в 2.0

$
0
0
Есть ли возможность в fb 2.0 агрегировать несколько строк в одну в запросе?
думаю что придётся делать на клиенте, но вдруг туплю.

FB3 / Dialect 1 / TIMESTAMP / UDF

$
0
0
Тут один добрый человек вероятно пытается в FB3 перенести какую-то древнюю интербейзовую базу, или создать по разным древним книжкам.

https://stackoverflow.com/q/46075403/976391

В общем, он пытается сотворить весьма экозтическое сочетание FB3 + Dialect 1 + TIMESTAMP + UDF

Ну и получает ошибку, соверщенно невразумительную. Казалось бы, даже такую экзотику FB3 должен ли отрабатывать, или давать четкий человеко-читаемый отказ

3.0.3?

$
0
0
Добрый день!

Сегодня ненароком увидел
на
https://www.firebirdsql.org/en/firebird-3-0-2/

Mac OS X 10.7+ 64-bit
July 20, 2017 Firebird-3.0.3-32738-5-x86_64.pkg 20 MB 64-bit package (Beta)
July 26, 2017 Firebird-3.0.3-32738-i386.pkg 20 MB 32-bit package (Beta)
July 27,2017 Firebird-3.0.3-32738-lipo-x86_64.pkg 37 MB 64-bit lipo package

Причем windows
32-bit Kits
March 22, 2017 Firebird-3.0.2.32703_0_Win32.exe 7 MB Windows executable installer, recommended for first-time users
March 22, 2017 Firebird-3.0.2.32703-0_Win32.zip 12 MB Zip kit for manual/custom installs

Чтобы это значило?

Тестирование логики

$
0
0
Вопрос форумчанам - есть ли у вас тестирование логики ХП и триггеров? И если да, то как/на чем?
Пример: есть ХП, которая с указанными входными параметрами делает обновление в пяти таблицах, удаление в трех и вставку в одну. После изменения ХП, надо проверить, что затронутые таблицы остались теми же.

Как отключить все ключи (FK, PK)?

$
0
0
Добрый день.

Как отключить все ключи на таблицах (FK, PK), а после экспорта-импорта включить их?


Нужно это вот для чего:
Пользователь работает с программой которая использует базу Firebird. У меня есть эта-же программа с базой (только данные в ней старые). Структура моей базы поменяется (я её доработаю, добавлю таблички, индексы, ...). А теперь пользователь должен из своей базы перегрузить свои данные в мою базу (перегрузку должна делать программа). Структура таблиц на 99% остаётся старой, т.е. добавится две-три новых таблички, или какая-то табличка разобъётся на две (часть полей останется в одной, часть в другой).
Таблиц в базе будет около 100-150, данных в табличках - не много, приблизительно до 10000-20000 записей.

Я хотел сделать так:
1. подключиться к своей базе, отключить все ключи (FK, PK)
2. удалить "почти" все (это и есть те одинаковые на 99% таблички для обоих баз) данные (удалить строки из таблиц).
3. в цикле пробежаться по "почти" всем табличкам и скопировать строки из базы пользователя в свою базу.
4. Оставшиеся данные (таблицы у которых поменялась структура) программа перенесёт по заложенному в неё алгоритму.
5. сделать на генераторах в своей базе - те-же значения, которые у пользователя, что-бы первичные ключи дальше генерировались правильно.
6. включить все ключи (FK, PK)

Пока при выключении FK индекса (ключ - это ссылка из таблички с данными, на табличку- справочник) столкнулся с ошибкой:
This operation is not defined for system tables.
unsuccessful metadata update.
ALTER INDEX @1 failed.
action cancelled by trigger (@1) to preserve data integrity.
Cannot deactivate index used by an integrity constraint.

Почему разная скорость запроса из IBExpert и из программы?

$
0
0
Доброго времени суток, помогите разобраться?

+ Вот такой незамысловатый запрос
select tc.ID,

(with N as (
  select NAME
    from
    TFIOS t inner join SPFIOS s on s.ID=t.IDFIO
  where t.IDCAT = tc.ID and t.idkind = 1
  order by NAME)
select list(NAME, ', ')
from N) as FIOS
from TCATALOG tc order by tc.ID


Из IBExpert выполняется отлично, все данные за несколько секунд.

+ Сбацал все это в поток в Делфи, вот так
procedure TFillUpFIOsThread.Execute;
var D: TpFIBDataset;
  RecC: Integer;
begin
  inherited;
  try
    LaDB := TFIBDatabase.Create(nil);
    LaTRN := TFIBTransaction.Create(nil);

    LaDB.DefaultTransaction := LaTRN;

    D := TpFIBDataSet.Create(LaDB);
    D.Database := LaDB;
    D.Transaction := LaTRN;

    LaDB.LibraryName := DM.FIBDB.LibraryName;
    LaDB.UseLoginPrompt := False;
    LaDB.DatabaseName := DM.FIBDB.DatabaseName;
    LaDB.DBParams := DM.FIBDB.DBParams;
    LaDB.SQLDialect := DM.FIBDB.SQLDialect;
    LaDB.DefaultTransaction := LaTRN;
    LaTRN.DefaultDatabase := LaDB;
    LaTRN.TRParams := DM.TRNRead.TRParams;

    LaDB.Connected := True;

    with D do
    begin
      SelectSQL.Text := 'select count(ID) from TCATALOG';
      Open;
      RecC := Fields[0].AsInteger;
      Close; SelectSQL.Clear;
//      SelectSQL.Text := 'select c.ID, (SELECT FIOS FROM CONSTRUCTFIOSLIST(c.ID)) as AUTHLIST from TCATALOG c order by c.ID';
      SelectSQL.Add('select c.ID,');
      SelectSQL.Add('(with N as (');
      SelectSQL.Add('  select NAME');
      SelectSQL.Add('    from');
      SelectSQL.Add('    TFIOS t inner join SPFIOS s on s.ID=t.IDFIO');
      SelectSQL.Add('  where t.IDCAT = c.ID and t.idkind = 1');
      SelectSQL.Add('  order by NAME)');
      SelectSQL.Add('select list(NAME, '', '')');
      SelectSQL.Add('from N) as AUTHLIST');
      SelectSQL.Add('from TCATALOG c '); //order by c.ID
      Open;
      while not EOF do
      begin
        if Terminated then Exit;
        //mutex? ahz
        MainForm.FIOsList.Add(Fields[0].AsInteger, Fields[1].AsString);
        if RecNo mod 1000 = 0 then
        begin
          PBPos := Round(RecNo / RecC * 100);
          Synchronize(MainForm.DrawPBPos);
        end;
        Next;
      end;
      Close;
    end;

  finally
    FreeAndNil(D);
    FreeAndNil(LaTRN);
    FreeAndNil(LaDB);
    Synchronize(MainForm.HidePB);

    if not Terminated then
      FreeAndNil(MainForm.FillUpFIOsThread);
  end;
end;


скорость на пару порядков медленнее, чем из IBE, почему?
Есть процедура, делающая почти то же самое (заремаренная строчка). Если выгружать через нее, то скорость нормальная и из Делфи. Но хочется понять, почему запрос-то из программы так медленно работает?

Спасибо!

fb-devel

$
0
0
Раньше я здесь читал fb-devel, но с 4 августа там ничего не обновляется. Подскажите, что случилось с этим адресом и где теперь можно читать fb-devel?

еще раз о поврежденной базе

$
0
0
Здравствуйте.

ни разу не сталкивался ) наверно везло.

а вот вчера столкнулся.

поставил FirstAID. он выдал в логе, что в конце базы есть страницы неизвестного типа. мегабайт на 58. база в общем 3 гига.
запустил DirectDiagnose. в логе ни одной ошибки.
Сделал бэкап. тоже ошибок не выдал. бэпак по размеру вроде правдоподобен.
Пронесло?)


Спасибо

RDB$GET_CONTEXT(). дополнительные возможности

$
0
0
Добрый день.

Просьба добавить получение информации из MON$DATABASE,MON$ATTACHMENTS, MON$TRANSACTIONS с помощью RDB$GET_CONTEXT(... , ....), без обращения с помощью запроса к системным таблицам.
Нужны данные только по текущему подключению/транзакции.
(При обращении к системным таблицам sysdba/rdb$admin получаем информацию о чужих подключениях.)

пример:
получить кодировку подключения RDB$GET_CONTEXT('SYSTEM' , 'MON$CHARACTER_SET_ID') или RDB$GET_CONTEXT('MON$ATTACHMENTS' , 'MON$CHARACTER_SET_ID')
получить признак read only транзакции RDB$GET_CONTEXT('USER_TRANSACTION' , 'MON$READ_ONLY') или RDB$GET_CONTEXT('MON$TRANSACTIONS' , 'MON$READ_ONLY')

Изменение поля BLOB

$
0
0
Добрый день!
Понадобилось хранить в БД битовое поле большой длины.
Написал UDF - прочитать значение бита и установить.
Чтение бита проходить на ура.
Запись бита валиттся с ошибкой

Invalid data type, length, or value.
function SET_BIT could not be matched.

Решил проверить UDF поставляемую с FIREBIRD.

update kl_value set bitset = string2blob('sdsdsdsdsds', bitset) where did = 106

получил тоже самое

Invalid data type, length, or value.
function STRING2BLOB could not be matched.

Подскажите - куда смотреть?

Firebird 2.5.7 Windows 10

Проблема с производительностью базы

$
0
0
Здравствуйте.

Помогите, пожалуйста, найти причину "затыка" базы.
Каждые 5 минут, база "замирает" - запросы подвисают, но не отваливаются, новые коннекты не подключаются и не отпадают с ошибкой. При этом активности на сервере нет - все ядра используют 0,1%, сетевая\дисковая активность - под 0. Через 1-1,5 минуты все ядра\диски начинают активно работать как и сама база - зависшие запросы, новые коннекты - развисают.
fb_lock_print -h показал большое кол-во Deadlock scans, тут на форуме прочитал что это может вызывать частое обращения к таблицам мониторинга. Был триггер на коннекте, который лазил в таблицу mon$attachments, его отключили. Ситуация с deadlock scans не изменилась. Похоже симптомы поведения базы описаны CORE-3787, откатились на версию 2.5.6 - проблема осталась. :(

Linux, Firebird Classic 2.5.6 x86 (откатились с 2.5.7 проблема осталась) Размер базы: 310GB. CPU: 16 ядер, Mem: 32GB. около 200-300 одновременных коннектов к базе.

firebird.conf
+

DefaultDbCachePages = 1024
TempBlockSize = 2097152
TempCacheLimit = 536870912
LockMemSize = 67108864
LockHashSlots = 30011


fb_lock_print -h
+

LOCK_HEADER BLOCK
Version: 17, Active owner: 0, Length: 67108864, Used: 19963784
Flags: 0x0001
Enqs: 21316962, Converts: 106998, Rejects: 29956, Blocks: 41118
Deadlock scans: 16950, Deadlocks: 0, Scan interval: 10
Acquires: 26067878, Acquire blocks: 2020423, Spin count: 0
Mutex wait: 7.8%
Hash slots: 30011, Hash lengths (min/avg/max): 0/ 1/ 9
Remove node: 0, Insert queue: 0, Insert prior: 0
Owners (174): forward: 487352, backward: 11780228
Free owners (157): forward: 11769300, backward: 955512
Free locks (5634): forward: 11623412, backward: 10126092
Free requests (89469): forward: 3174308, backward: 19506404
Lock Ordering: Enabled

Как использовать поле "CORR"

$
0
0
Добрый день!

Есть куча таблиц с полем CORR. До версии FB 2.5.7 все работало.
Начали пробовать FB 3.0.2 и узнали, что это слово теперь зарезервировано.
Как можно с ним работать не переименовывая этого поля?
Как написать простой селект с таким полем?
select corr from od_table не работает.

fb3. for execute statement и as cursor

$
0
0
Дока утверждает что "Оператор FOR EXECUTE STATEMENT используется (по аналогии с конструкцией FOR
SELECT) для операторов SELECT или EXECUTE BLOCK, возвращающих более одной строки."
Для for select при этом допустимы необьявленные курсоры, а для for execute statement почему-то нет.
Пример: это работает
for select T.F1, T.F2, .. T.Fn from TABLE T
as cursor c do
begin
...
end

, а это
for execute statement('T.F1, T.F2, .. T.Fn from TABLE T')
as cursor c do
begin
...
end

уже нет
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line x, column 6.
cursor


Собстна вопрос - дока не договаривает или бага?

Всех с праздничком, кстати!

Forced Write = Off

$
0
0
Всем привет. Народ подскажите, у меня высокая интенсивность запросов на вставку и обновление данных в БД Firebird 2.5 64-bit Classic и думаю установить режим Forced Writes у базы данных в OFF, прочитал, что это увеличит скорость операций записи до 3х раз. Кто нибудь пробовал отключать Forced Write?

IF и FOR SELECT на удаляемое поле

$
0
0
execute block as
declare vN  VARCHAR(250);
begin
  IF (EXISTS(SELECT 1 FROM RDB$RELATION_FIELDS WHERE RDB$RELATION_NAME = 'T1' AND RDB$FIELD_NAME = 'TXT')) THEN BEGIN
  for select TXT from T1 into :vN do
  ----
  EXECUTE STATEMENT 'ALTER TABLE T1 DROP TXT';
  end
end


Ошибка обращения к T1.TXT при повторном запуске скрипта.

получается for select парсится или выполняется игнорируя результат условия IF ?
IF проверил работает как и ожидается.

FB 2.1.7

онлайн проверка с помощью fbsvcmgr

$
0
0
доброе утро.

было подозрение на поломку таблицы/индексов
запустли fbsvcmgr .... action_validate dbname .... val_tab_incl <table_name>

03:09:10.72 Validation started

03:09:10.74 Relation 162 (<table_name>)
03:09:10.74 process pointer page 0 of 598
....
05:15:30.26 process pointer page 596 of 598
05:16:00.91 process pointer page 597 of 598
05:16:17.38 Index 1 (PK_<table_name>)
05:21:35.92 Index 2 (<table_name>_EXP)
05:31:47.19 Index 3 (<table_name>_IDX1)
05:39:44.89 Index 4 (<table_name>_IDX2)
05:59:40.13 Index 4 misses node on page 12569401 level 1
06:10:34.03 Index 5 (<table_name>_OLD_ID)
06:19:43.60 Index 5 misses node on page 12685832 level 1
06:25:32.63 Index 6 (<table_name>_TABLE_NAME)
06:34:15.92 Index 7 (<table_name>_NEW_ID)
06:54:08.12 Index 7 misses node on page 16143028 level 1
07:03:08.63 Relation 162 (<table_name>) : 3 ERRORS found

07:03:09.30 Validation finished

в firebird.log появились соотвествующие сообщения

<host> Thu Sep 14 05:59:40 2017 Database: <BASE>.gdb Index 4 misses node on page 12569401 level 1 in table <table_name> (162)
<host> Thu Sep 14 05:59:40 2017 Database: <BASE>.gdb Index 5 misses node on page 12685832 level 1 in table <table_name> (162)
<host> Thu Sep 14 05:59:40 2017 Database: <BASE>.gdb Index 7 misses node on page 16143028 level 1 in table <table_name> (162)

FB 2.5.6_27020x32 в БД всего страниц 19704960 (16k)

в описании указано:
"Database validation allows to run low-level checks of consistency of on-disk
structures and even to fix some minor corruptions."


вопрос: пофиксились ли эти ошибки или там должно быть дополнительное сообщение?

FB4: "теплый" NBackup

$
0
0
Прочитал в RN FB4-Alpha:

The nBackup utility in Firebird 4 can perform a physical backup that uses the GUID (UUID) of the most recent
backup of a read-only standby database to establish the backup target file. Increments from the <source database>
can be applied continuously to the standby database, eliminating the need to keep and apply all increments since
the last full backup.
The new style of “warm” backup and merge to a standby database can be run without affecting an existing
multilevel backup scheme on the live database.

Мне это понравилось: запускаешь скрипт в шедуляторе каждый час и имеешь "теплую" запасную БД.
+

gstat -h d:\baza4\backup\standby.fdb 

    Variable header data:
        Database backup GUID:   {0192F9DD-6CF7-4204-A5A1-AECCD7809D86}
        Sweep interval:         20000
        *END*

nbackup -u SYSDBA -p ****** -B {0192F9DD-6CF7-4204-A5A1-AECCD7809D86}  d:\baza4\db_fb4.FDB  d:\baza4\backup\backup.nbk 

nbackup -u SYSDBA -p ****** -I -R d:\baza4\backup\db_fb4_standby.fdb d:\baza4\backup\backup.nbk


Попробовал - работает. Но не понравилось, что для извлечения UUID из stanby нужно запускать gstat и извлекать UUID из его выхлопа. А нельзя указать standby базу в командной строке, чтобы nbackup сам читал UUID?
Viewing all 1677 articles
Browse latest View live