Невосстанавливаемый backup

SQL во всех проявлениях - от ANSI-92 до TSQL.

Модераторы: Yurich, Absurd

Ответить
DENISDV
Сообщения: 2
Зарегистрирован: 10 сен 2009, 12:51

10 сен 2009, 12:55

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

базы данных 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. А иначе мне конец... :eek:
Laba
Сообщения: 33
Зарегистрирован: 24 мар 2009, 17:47

10 сен 2009, 14:16

В "действующей" исправить индекс (удалить pk, исправить дубликаты, создать pk) и сделать backup.
DENISDV
Сообщения: 2
Зарегистрирован: 10 сен 2009, 12:51

10 сен 2009, 14:30

Данные действительно оказались задвоены! Каким чудом не понятно.
Вот выдержка из DDL таблицы:

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

Сделал запрос:

select
POLNUM, CBRIDNUM, count(*)
from AI_RAIDERS
group by POLNUM, CBRIDNUM
having count(*)>1

- его результат оказался не пустым, а везде значение count(*)=2!!! То есть, в более чем 200000 записей, оказалось 146 дубликатов.
Теперь надо устранять дубликаты! - На сколько это может быть опасная процедура и как правильно её делать??
Laba
Сообщения: 33
Зарегистрирован: 24 мар 2009, 17:47

10 сен 2009, 14:39

Попробуй самый тупой способ (может повезёт):

1. create table x as select distinct все_колонки from AI_RAIDERS;

2.

select
POLNUM, CBRIDNUM, count(*)
from x
group by POLNUM, CBRIDNUM
having count(*)>1

Eсли будет пустой, значит повезло. Делай _обязательно_ backup. Дело за малым:

delete from AI_RAIDERS;

commit;

insert into AI_RAIDERS select * from x;

commit;

Далее восстанавливай pk.

Кстати, после удаления pk backup хорошо восстановиться.
Аватара пользователя
Игорь Акопян
Сообщения: 1419
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

14 сен 2009, 15:46

Laba, я правильно понимаю, что ваш способ предлагает без разбору просто убить одну из дубль-записей?
Изображение
Laba
Сообщения: 33
Зарегистрирован: 24 мар 2009, 17:47

14 сен 2009, 16:51

Нееее... не одну, а все без разбору. :D

И не сразу убить, а предварительно скопировать в другую таблицу и перед окончательным удалением сделать восстанавливаемый buсkup.

Часто из-за глюков появляются записи-дубликаты. У них значения во всех колонках совпадают со значениями в оригинале. В п.1. стоит DISTINCT без ограничений в WHERE, т.е. дубликаты "объединяться" с оригиналами.
Аватара пользователя
Игорь Акопян
Сообщения: 1419
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

15 сен 2009, 13:26

а если там дубли только по ключу?
Изображение
Laba
Сообщения: 33
Зарегистрирован: 24 мар 2009, 17:47

15 сен 2009, 13:46

Тогда запрос в п.2 будет не пустой - не повезло. В этом случае нужно думать.

При дубликатах только по ключу - возникает много вопросов. На них трудно ответить без описания конкретной ситуации.
Ответить