Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2009, 13:10   #1
DENIS_
 
Регистрация: 07.12.2006
Сообщений: 4
По умолчанию Невосстанавливаемый backup

Доброго времени суток господа!
Есть действующая рабочая база данных Firebird (DB.FDB). Её backup проходит успешно, а вот при restore базы данных DB.gbk возникает ошибка:

gbak: activating and creating deferred index PK_AI_RAIDERS
gbak:cannot commit index PK_AI_RAIDERS
gbak: ERROR:attempt to store duplicate value (visible to active transactions) in unique index "PK_AI_RAIDERS"
gbak: ERROR:action cancelled by trigger (3) to preserve data integrity
gbak: ERROR: Cannot deactivate index used by a PRIMARY/UNIQUE constraint
gbak:Exiting before completion due to errors

Как видно БД не восстанавливается. Подскажите пожалуйсто, в чём дело и как можно исправить эту ошибку?

P.S. А иначе мне конец...
DENIS_ вне форума Ответить с цитированием
Старый 10.09.2009, 13:22   #2
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

а в рабочей базе этот констрейнт/уник.индекс активирован?
судя по всему нарушена уникальность значений
можно проверить наличие неуникальных значений, сделав запрос по табличке
Код:
select 
  [список полей, входящих в праймари],
  count(*)
from [таблица]
group by [список полей, входящих в праймари]
having count(*)>1
в любом случае, неплохо бы и на структуру таблички взглянуть (со всеми констрейнтами)

Последний раз редактировалось soleil@mmc; 10.09.2009 в 13:26.
soleil@mmc вне форума Ответить с цитированием
Старый 10.09.2009, 13:37   #3
DENIS_
 
Регистрация: 07.12.2006
Сообщений: 4
По умолчанию

Сделал указанный запрос и получил:
POLNUM | CBRIDNUM | Count(*)
1 X1 Y1 2
2 X2 Y2 2
3 X3 Y3 2
.
N Xn Yn 2

- что это значит?

А по поводу структурки, так она такова (Выдержки из DDL):


/*********************************** *********************************** ********/
/*** Primary Keys ***/
/*********************************** *********************************** ********/

ALTER TABLE AI_RAIDERS ADD CONSTRAINT PK_AI_RAIDERS PRIMARY KEY (POLNUM, CBRIDNUM);


/*********************************** *********************************** ********/
/*** Indices ***/
/*********************************** *********************************** ********/

CREATE INDEX AI_RAIDERS_IDX1 ON AI_RAIDERS (CBPLAN, BMODE, SUBDTE);
CREATE INDEX AI_RAIDERS_IDX2 ON AI_RAIDERS (CBPLAN);
CREATE INDEX AI_RAIDERS_IDX3 ON AI_RAIDERS (BMODE);
CREATE INDEX AI_RAIDERS_IDX4 ON AI_RAIDERS (SUBDTE);
CREATE INDEX AI_RAIDERS_IDX5 ON AI_RAIDERS (CBSTATUS);
CREATE INDEX AI_RAIDERS_IDX6 ON AI_RAIDERS (POLNUM);

Какие могут быть выводы?
DENIS_ вне форума Ответить с цитированием
Старый 10.09.2009, 13:45   #4
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
По умолчанию

Судя по:
Цитата:
Сообщение от DENIS_ Посмотреть сообщение
gbak: ERROR: Cannot deactivate index used by a PRIMARY/UNIQUE constraint
могу предположить, что индекс не отключается, т.к. является PK таблицы. Выход - убить индекс вообще, после чего восстановить, либо восстанавливать базу перезаписью.
Познавая других, мы познаем себя.
С'est la vie...
SuperVisor вне форума Ответить с цитированием
Старый 10.09.2009, 13:51   #5
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от DENIS_ Посмотреть сообщение
Какие могут быть выводы?
селект вернул непустой набор данных
значит есть дубли при имеющемся ограничении по праймари не иметь этих дублей

если на рабочей БД этот pk не удален, то встает вопрос "а как собсна такое возможно?"
полистать данные и понять - нужны кому-то эти дубли?
скорее всего нет - и тогда удалить лишние
либо дропнуть констрейнт PK_AI_RAIDERS и сделать бекап/рестор, а потом уже на восстановленной БД убить дубли и пересоздать PK_AI_RAIDERS

Цитата:
Сообщение от SuperVisor Посмотреть сообщение
либо восстанавливать базу перезаписью.
прямой путь остаться без БД вообще
soleil@mmc вне форума Ответить с цитированием
Старый 10.09.2009, 14:25   #6
DENIS_
 
Регистрация: 07.12.2006
Сообщений: 4
По умолчанию

Большое спасибо soleil@mmc !!! У меня есть 2 копии БД(разные периоды) одна бэкапится и потом ресторится (более ранняя), а другая бекапиться и потом не ресториться (более поздняя). Так вот В первом случае указанный SELECT был пустой, а во втором случае уже не пустой! Залез руками в таблицу - данные действительно задвоены!!! , - придётся убирать руками. Но влюбом случае, корень проблемы теперь ясен, спасибо soleil@mmc-у и форуму, в интернете описания проблемы почти нет!...
DENIS_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск