не могу записать в базу данных 4 Гб информации
Модератор: kdv
не могу записать в базу данных 4 Гб информации
Всем добрый день.
Прошу помочь справить с такой проблемой. С IB раньше серьезно не работал. Мне необходимо из текстового ascii файла размером 4 Гб записать в таблицу БД IB 7.1 текстовую и числовую (целые и вещественные 12-ти разрядные числа) информацию, а так же даты. Всего в файле порядка 40 млн строк. Писал программу на Delphi и на Borland c++ Builder. Проблема одна и тажа: обрабатывается (и записывается в БД) порядка 2,5 млн строк и выводится ошибка. В Delphi: Invalid pointer operation, в c++: internal gds software consistency chec (can't continue after bugcheck).
Вот кусок программы на с++, на всякий случай:
MainForm->IBDatabase1->LoginPrompt=False;
MainForm->IBDatabase1->DatabaseName = DbEdit->Text;
MainForm->IBDatabase1->Open();
if (MainForm->IBDatabase1->Connected==False)
{
ShowMessage("Error connection to IB database!");
return;
};
...
//здесь происходит открытие текстового файла с данными через fopen
s = "insert into vrslracc (INSNMB, DPTCOD, DCINMB, DCIDCK, DCICPY, PFTTYP, CTMCOD, ENTNMB, CCRCOD, PFTSUM, PFTSUM_EME, PFTSUM_EMR, PFTAGR, PFSNMB, CSTCOD, PFSSUM, PFSTOT) values (";
// в переменной S текст запроса
....
count_rec = 0;
IBTransaction1->StartTransaction();
while (fgets(str,1000,stream))
{
...
query = s + str; // в query типа ansistring собирается текст запроса плюс данные. Типы данных точно соотвествуют требуемым в базе.
query = query + ")";
MainForm->IBQuery1->SQL->Clear();
MainForm->IBQuery1->SQL->Text = query;
try
{
MainForm->IBQuery1->Prepare();
if (MainForm->IBQuery1->Prepared==False)
{
ShowMessage("Query not prepared!");
} else
{
MainForm->IBQuery1->ExecSQL();
};
}
catch(Exception &Err)
{
fputs(query.c_str(),out);
fputc('\n',out);
fflush(out);
};
if ((count_rec % 10000) == 0)
{
IBTransaction1->Commit();
IBTransaction1->StartTransaction();
};
count_rec +=1;
}
IBTransaction1->Commit();
Интересна деталь. Я разрезал исходный текстовый файл на куски по 2 млн строк. Обработал первый из них. Через IBConsolе проверил количество записанных строк в таблицу. Все прошло нормально. Обработал еще два куска. Зашел в IBConsolе и на select count(*) from ... получил сообщение:
Error at line 1 - database file appears corrupt() wrohg page type
page 83684 is of wrong type (expected 5, found 0)Я попробовал Volidation БД, получил сообщение:
Summary of validation errors
Number of data page errors : 3
Number of index page errors : 558
Number of database page errors : 4
Check the InterBase.Log file for additional information
В InterBase.Log примерно вот что:
DMITRII (Server) Tue May 17 12:13:49 2005
Database: D:\PERS\PERSON1.GDB
Index 1 is corrupt on page 38345 in table VRSLRACC (138)
DMITRII (Server) Tue May 17 12:13:49 2005
Database: D:\PERS\PERSON1.GDB
Page 53574 wrong type (expected 7 encountered 0)
DMITRII (Server) Tue May 17 12:13:49 2005
Database: D:\PERS\PERSON1.GDB
Index 1 is corrupt on page 53574 in table VRSLRACC (138)
Не знаю с какой стороны подойти к решению проблемы. Думаю, может надо как-то IB настроить?
IB сервер и клиент находятся на одном компьютере. Пробовал разные файлы gds32.dll в winnt\system32 записывать.
Раньше делал нечто подобное, но с удаленной БД. Такой ошибки не было. Но после этого и на сервере систему сносили и исходный файл поменялся.
И еще: БД состоит из 8 файлов по 480,000 страниц. Размер страницы 4096, пробовали 8192 - не помогло.
Прошу помочь справить с такой проблемой. С IB раньше серьезно не работал. Мне необходимо из текстового ascii файла размером 4 Гб записать в таблицу БД IB 7.1 текстовую и числовую (целые и вещественные 12-ти разрядные числа) информацию, а так же даты. Всего в файле порядка 40 млн строк. Писал программу на Delphi и на Borland c++ Builder. Проблема одна и тажа: обрабатывается (и записывается в БД) порядка 2,5 млн строк и выводится ошибка. В Delphi: Invalid pointer operation, в c++: internal gds software consistency chec (can't continue after bugcheck).
Вот кусок программы на с++, на всякий случай:
MainForm->IBDatabase1->LoginPrompt=False;
MainForm->IBDatabase1->DatabaseName = DbEdit->Text;
MainForm->IBDatabase1->Open();
if (MainForm->IBDatabase1->Connected==False)
{
ShowMessage("Error connection to IB database!");
return;
};
...
//здесь происходит открытие текстового файла с данными через fopen
s = "insert into vrslracc (INSNMB, DPTCOD, DCINMB, DCIDCK, DCICPY, PFTTYP, CTMCOD, ENTNMB, CCRCOD, PFTSUM, PFTSUM_EME, PFTSUM_EMR, PFTAGR, PFSNMB, CSTCOD, PFSSUM, PFSTOT) values (";
// в переменной S текст запроса
....
count_rec = 0;
IBTransaction1->StartTransaction();
while (fgets(str,1000,stream))
{
...
query = s + str; // в query типа ansistring собирается текст запроса плюс данные. Типы данных точно соотвествуют требуемым в базе.
query = query + ")";
MainForm->IBQuery1->SQL->Clear();
MainForm->IBQuery1->SQL->Text = query;
try
{
MainForm->IBQuery1->Prepare();
if (MainForm->IBQuery1->Prepared==False)
{
ShowMessage("Query not prepared!");
} else
{
MainForm->IBQuery1->ExecSQL();
};
}
catch(Exception &Err)
{
fputs(query.c_str(),out);
fputc('\n',out);
fflush(out);
};
if ((count_rec % 10000) == 0)
{
IBTransaction1->Commit();
IBTransaction1->StartTransaction();
};
count_rec +=1;
}
IBTransaction1->Commit();
Интересна деталь. Я разрезал исходный текстовый файл на куски по 2 млн строк. Обработал первый из них. Через IBConsolе проверил количество записанных строк в таблицу. Все прошло нормально. Обработал еще два куска. Зашел в IBConsolе и на select count(*) from ... получил сообщение:
Error at line 1 - database file appears corrupt() wrohg page type
page 83684 is of wrong type (expected 5, found 0)Я попробовал Volidation БД, получил сообщение:
Summary of validation errors
Number of data page errors : 3
Number of index page errors : 558
Number of database page errors : 4
Check the InterBase.Log file for additional information
В InterBase.Log примерно вот что:
DMITRII (Server) Tue May 17 12:13:49 2005
Database: D:\PERS\PERSON1.GDB
Index 1 is corrupt on page 38345 in table VRSLRACC (138)
DMITRII (Server) Tue May 17 12:13:49 2005
Database: D:\PERS\PERSON1.GDB
Page 53574 wrong type (expected 7 encountered 0)
DMITRII (Server) Tue May 17 12:13:49 2005
Database: D:\PERS\PERSON1.GDB
Index 1 is corrupt on page 53574 in table VRSLRACC (138)
Не знаю с какой стороны подойти к решению проблемы. Думаю, может надо как-то IB настроить?
IB сервер и клиент находятся на одном компьютере. Пробовал разные файлы gds32.dll в winnt\system32 записывать.
Раньше делал нечто подобное, но с удаленной БД. Такой ошибки не было. Но после этого и на сервере систему сносили и исходный файл поменялся.
И еще: БД состоит из 8 файлов по 480,000 страниц. Размер страницы 4096, пробовали 8192 - не помогло.
1. У меня IB вроде бы без SP. В свойствах IB Server про версию написано только: WI-V7.1.0.189. Это значит, что без SP? Или уже с ним? Можно ли SP где-нибудь скачать download?kdv писал(а):1. IB 7.1 должен быть SP2. версия 7.1.0.189
2. уже давно, тем более для IB 7.1, нет необходимости делать многофайловую БД
3. какая файловая система используется там, где лежит БД?
4. каков суммарный размер файлов БД при возникновении ошибки?
2. Я БД делаю для программы, которая будет работать на ОС Windows 98 c FAT32 (у некоторых пользователей локально , у некоторых - удаленно).
3.Сейчас я работаю в Windows XP Professional v.2002 SP2, БД находится на диске с NTFS. У меня 512Mb ОЗУ.
4. Сумарный размер файлов БД 685,891,584 byte (по показаниям FarManager-a).
PS: сейчас использую только вариант программы на c++.
ух-ох, я же написал версию IB 7.1 SP2. Это ОНО. Нигде ничего качать не надо. Триал на сайте и последние поставки - только IB 7.1 SP2.1. У меня IB вроде бы без SP. В свойствах IB Server про версию написано только: WI-V7.1.0.189. Это значит, что без SP? Или уже с ним? Можно ли SP где-нибудь скачать download?
это техзадание такое? 4-гиговые базы на Win98 на FAT32? Однозначно в сад... Даже в случае многофайловой БД. Win98 - только клиент. В остальных случаях использования 95-98 как сервера - welcome в наш платный ремонт БД.2. Я БД делаю для программы, которая будет работать на ОС Windows 98 c FAT32 (у некоторых пользователей локально , у некоторых - удаленно).
685 мегабайт - не так уж и много. мне кажется, у вас там какая-то кривизна с многофайловостью, хотя повреждения лог показывает задолго до окончания первого файла. уберите многофайловость....
p.s. с++, delphi - никакого значения не имеет.
prepare для статического запроса смысла не имеет. можно убрать.
А что, сделав многофайловую БД, я не избегаю этого ограничения FAT32 ?1. 4-гиговые базы на Win98 на FAT32? Однозначно в сад... Даже в случае многофайловой БД. Win98 - только клиент.
Может ли быть это вызвано не правильными настройками IB ? Размеры страниц, кеша или еще чего-нибудь...2. у вас там какая-то кривизна с многофайловостью
Михалыч, ну какой нафиг СЕРВЕР на WIN98. Окстись. Это же сугубо клиентская операционка. глючная. Да и на ней даже в 300 мег база может тормозить. А если она брякнется, то и потащит за собой базу. При чем тут fat32???А что, сделав многофайловую БД, я не избегаю этого ограничения FAT32 ?
вообще то, "еще чего нибудь" больше и нет, а потом, настройки, какие бы они ни были хреновые, никак не могут (или не должны) приводить к ПОВРЕЖДЕНИЮ БД.Может ли быть это вызвано не правильными настройками IB ? Размеры страниц, кеша или еще чего-нибудь...
Кстати о птичках. Мысля навеяна вопросом про ibrelink в другой нитке и тем, что Михалыч с IB раньше серьёзно не работал. Начинающие частенько наступают на следующие грабли с многофайловыми базами: если её скопировать (именно скопировать, а не b/r) в другой путь на компьютер, где такой базы нет, то соединиться не получится, не будут найдены вторичные файлы. А вот если в другой путь на том же компе и соединиться - то звездец обоим базам, и копии и исходной. Сервер будет работать с первичным файлом копии и вторичными исходной, что из этого выйдет объяснять наверное не надо. И повреждения да, как раз такого типа и получаются - страницы не ожидаемой системы, неправильная длина записи и т.п. А ещё были одно время какие-то глюки с наращиванием количества файлов через Alter Database. Потом вроде поправили, но если там обсчитаться с количеством страниц и начать вторичный файл с уже существующей страницы, то всё равно база билась. Самый надёжный путь - рестором. Ну и конечно же
для многофайловых баз правило НИКОГДА НЕ РЕСТОРИТЬ ОВЕРВРАЙТОМ просто вопрос жизни и смерти.
для многофайловых баз правило НИКОГДА НЕ РЕСТОРИТЬ ОВЕРВРАЙТОМ просто вопрос жизни и смерти.
а воз и ныне там ...(с) И.А.Крылов1. ну и как там дела?
дело в том, что БД и исходные данные мне предоставлены другим человеком...
Прочитал пост от Мерлина. Сам создал БД (размер страницы 4094) и таблицу в ней. Опять запустил эту программу - загрузил 1 файл (из 2 млн. строк), начал загружать второй файл и ... на 1,790,000 строке опять это "internal gds software consistency chec (can't continue after bugcheck)".
Таблицу в БД создал в Interactiv SQL так:
CREATE TABLE VRSLRACC (INSNMB INTEGER NOT NULL,
DPTCOD INTEGER,
DCINMB FLOAT,
DCIDCK SMALLINT,
DCICPY SMALLINT,
PFTTYP CHAR(4) CHARACTER SET WIN1251,
CTMCOD CHAR(4) CHARACTER SET WIN1251,
CTMSHT CHAR(20) CHARACTER SET WIN1251,
ENTNMB DECIMAL(12, 0),
CPREXT CHAR(4) CHARACTER SET WIN1251,
CCRCOD CHAR(4) CHARACTER SET WIN1251,
PFTSUM FLOAT,
PFTSUM_EME FLOAT,
PFTSUM_EMR FLOAT,
PFTAGR CHAR(4) CHARACTER SET WIN1251,
PFSNMB SMALLINT NOT NULL,
CTMBEG TIMESTAMP,
CTMEND TIMESTAMP,
CSTCOD CHAR(4) CHARACTER SET WIN1251 NOT NULL,
PFSSUM FLOAT,
PFSTOT CHAR(4) CHARACTER SET WIN1251);
CREATE DESCENDING INDEX INSNMB_VRSLR ON VRSLRACC(INSNMB);
Может тут где ошибка?
И эта БД уже однофайловая? Или как?
т.о. в этот раз в БД загрузилось 3,790,000 строк ( в прошлый раз было 2,970,000)...

структура, конечно, интересная, особенно куча float-ов. это научные данные?
гм.... ну если ты к этой БД файлы не добавлял, то однофайловая... Что за вопрос? Многофайловую БД делают явно, указывая сколько и каких файлов надо. Это просто сегментированный файл БД.И эта БД уже однофайловая? Или как?
интересная ошибка. так что там с передачей данных очно? кажется мне, что иначе этот вопрос решить будет невозможно.т.о. в этот раз в БД загрузилось 3,790,000 строк ( в прошлый раз было 2,970,000)...
к сожалению я из далекого Саратова, так что...так что там с передачей данных очно?
Но дело не в самих данных - это точно, т.к. в прошлый раз я обрабатывал файлы в порядку: f1, f2, f3, а на этот раз я обработал f2, а затем стал грузить f1 (извеняюсь, что пропустил эту немаловажную деталь). Каждый файл грузиться. Поодиночке. Но не вместе

Логика мне подсказывает, что это не в программе и не в данных дело. Все же я грешу на IB. Он у меня, ясное дело, с рынка, может "что-то" там не "то"? Или это руки у меня излишне кривые...

И еще: может подскажет кто, где можно скачать русскоязычную доку по IB?
если мне надо хранить информацию о денежной сумме в пределах 99,999 руб 99 коп - всего два знака точность нужна. Float подойдет? Эти числа будут просто отображаться на экране и не будут принимать участия в расчетах.kdv писал(а):float-ы дают высокую погрешность при хранении чисел
Но все же меня больше интересует ответ на пост про файлы и IB...
ну, не такой уж он и далекий. можно было бы через знакомых диск передать.к сожалению я из далекого Саратова, так что...
да, есть такие подозрения. Если бы не одно но. Например, у одной фирмы есть таблица, в которой 10 миллионов записей, и средний размер записи 211 байт. 330970 страниц, 2.5 гига. Все ОК. Ну и, таких примеров я еще могу наколупать. Поэтому здесь скорее всего есть какая-то специфика, возможно уникальная.Логика мне подсказывает, что это не в программе и не в данных дело. Все же я грешу на IB.
насчет "с рынка" - вопрос этот уже навяз в зубах. Нет денег - используй бесплатное. Кто на платный сервер тебя тащит? Или все-таки предполагается платить за лицензии?
а нет такой. Все бы вам халявы. Все что есть - указано на сайте www.ibase.ru.И еще: может подскажет кто, где можно скачать русскоязычную доку по IB?
Доку пытались переводить www.interbase-world.com, но это благое начинание заглохло уже давно.
Добрый день.
вот строчки из interbase.log за тот день
DMITRII (Server) Fri May 20 08:57:00 2005
Server: setting SWEEP_QUANTUM to 250, USER_QUANTUM to 1000, SWEEP_YIELD_TIME to 1 ms
and MAX_THREADS to 1000000
DMITRII (Client) Fri May 20 08:57:00 2005
Guardian starting: C:\Program Files\Borland\InterBase\bin\ibserver.exe
DMITRII (Server) Fri May 20 11:51:48 2005
Server: setting SWEEP_QUANTUM to 250, USER_QUANTUM to 1000, SWEEP_YIELD_TIME to 1 ms
and MAX_THREADS to 1000000
DMITRII (Client) Fri May 20 11:51:48 2005
Guardian starting: C:\Program Files\Borland\InterBase\bin\ibserver.exe
DMITRII (Server) Fri May 20 12:50:50 2005
Database: D:\PERS\PERSON.GDB
database file appears corrupt ()
wrong page type
page 94853 is of wrong type (expected 7, found -1)
internal gds software consistency check (error during savepoint backout (290), file: exe.c line: 1792)
Что бы это значило?
я это на локале (у себя на компе) делаю.hvlad писал(а):"internal gds software consistency chec (can't continue after bugcheck)" всегда возникает после багчека. Т.е. перед этой ошибкой была ещё одна.
Если до программы она не доходит, то в логе сервера она должна быть.
вот строчки из interbase.log за тот день
DMITRII (Server) Fri May 20 08:57:00 2005
Server: setting SWEEP_QUANTUM to 250, USER_QUANTUM to 1000, SWEEP_YIELD_TIME to 1 ms
and MAX_THREADS to 1000000
DMITRII (Client) Fri May 20 08:57:00 2005
Guardian starting: C:\Program Files\Borland\InterBase\bin\ibserver.exe
DMITRII (Server) Fri May 20 11:51:48 2005
Server: setting SWEEP_QUANTUM to 250, USER_QUANTUM to 1000, SWEEP_YIELD_TIME to 1 ms
and MAX_THREADS to 1000000
DMITRII (Client) Fri May 20 11:51:48 2005
Guardian starting: C:\Program Files\Borland\InterBase\bin\ibserver.exe
DMITRII (Server) Fri May 20 12:50:50 2005
Database: D:\PERS\PERSON.GDB
database file appears corrupt ()
wrong page type
page 94853 is of wrong type (expected 7, found -1)
internal gds software consistency check (error during savepoint backout (290), file: exe.c line: 1792)
Что бы это значило?
сначала не то написал. вот это и есть ошибкаDMITRII (Server) Fri May 20 12:50:50 2005
Database: D:\PERS\PERSON.GDB
database file appears corrupt ()
wrong page type
page 94853 is of wrong type (expected 7, found -1)
internal gds software consistency check (error during savepoint backout (290), file: exe.c line: 1792)
page 94853 is of wrong type (expected 7, found -1)
повредился индекс. почему - неясно. В общем, для воспроизведения надо
1. пустую базу или скрипт с этой таблицей
2. приложение, которое наливает в эту таблицу случайные данные.
скрипт таблицы я уже приводил (см. ниже)1. пустую базу или скрипт с этой таблицей
т.е. - тебе передать? каким образом можно это сделать? ехе-шник всего 97 Kb весит (для запуска необходимы будут некоторые *.bpl и *.dll из Borland c++ 6.0)2. приложение, которое наливает в эту таблицу случайные данные.
вышескрипт таблицы я уже приводил (см. ниже)

нет уж. сделай чистый пример, по минимуму, пожалуйста. без всяких bpl и проч.т.е. - тебе передать? каким образом можно это сделать? ехе-шник всего 97 Kb весит (для запуска необходимы будут некоторые *.bpl и *.dll из Borland c++ 6.0)