Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Нашёл в базе повреждённую таблицу. Как её удалить?  [new]
BestiA
Member

Откуда: Саратов
Сообщений: 44
Нашёл в базе повреждённую таблицу. Как её удалить?

Любая попытка к ней обратиться

Даже такое:

SELECT * FROM Table1

приводит к появлению сообщения:

Сообщение 0, уровень 11, состояние 0, строка 0
При выполнении текущей команды возникла серьезная ошибка.. При наличии результатов они должны быть аннулированы.
Сообщение 0, уровень 20, состояние 0, строка 0
При выполнении текущей команды возникла серьезная ошибка.. При наличии результатов они должны быть аннулированы.


Единственное, что я могу с ней сделать - переименовать.. :-)
28 дек 09, 17:04    [8128448]     Ответить | Цитировать Сообщить модератору
 Re: Нашёл в базе повреждённую таблицу. Как её удалить?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
а если базу попробовать починить?
28 дек 09, 17:05    [8128455]     Ответить | Цитировать Сообщить модератору
 Re: Нашёл в базе повреждённую таблицу. Как её удалить?  [new]
pr0ger
Member

Откуда: Москва
Сообщений: 1933
Что говорят DBCC CHECKTABLE /DBCC CHECKDB ???
28 дек 09, 18:00    [8128881]     Ответить | Цитировать Сообщить модератору
 Re: Нашёл в базе повреждённую таблицу. Как её удалить?  [new]
BestiA
Member

Откуда: Саратов
Сообщений: 44
pr0ger,

Команда "
DBCC CHECKTABLE ('Out.dbo.Table1');
возвращает сообщение:


Сообщение 0, уровень 11, состояние 0, строка 0
При выполнении текущей команды возникла серьезная ошибка.. При наличии результатов они должны быть аннулированы.
Сообщение 0, уровень 20, состояние 0, строка 0
При выполнении текущей команды возникла серьезная ошибка.. При наличии результатов они должны быть аннулированы.


Команда "
DBCC CHECKDB('Out');
:

Сообщение 8930, уровень 16, состояние 3, строка 1
Ошибка базы данных: база данных 12 имеет несогласованные метаданные. Эта ошибка не может быть исправлена и препятствует дальнейшей обработке DBCC. Восстановите базу из резервной копии.
Сообщение 8921, уровень 16, состояние 1, строка 1
Проверка отменена. В процессе сбора фактов была обнаружена ошибка. Возможно, база данных tempdb достигла предела памяти, или системная таблица не согласована. Проверьте предыдущие ошибки.
30 дек 09, 16:08    [8138286]     Ответить | Цитировать Сообщить модератору
 Re: Нашёл в базе повреждённую таблицу. Как её удалить?  [new]
BestiA
Member

Откуда: Саратов
Сообщений: 44
Konst_One
а если базу попробовать починить?


И как это сделать ?
30 дек 09, 16:12    [8138304]     Ответить | Цитировать Сообщить модератору
 Re: Нашёл в базе повреждённую таблицу. Как её удалить?  [new]
vino
Member

Откуда:
Сообщений: 1191
BestiA, резервные копии есть?
30 дек 09, 16:16    [8138318]     Ответить | Цитировать Сообщить модератору
 Re: Нашёл в базе повреждённую таблицу. Как её удалить?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Попробуйте DBCC CHECKCATALOG
30 дек 09, 16:17    [8138323]     Ответить | Цитировать Сообщить модератору
 Re: Нашёл в базе повреждённую таблицу. Как её удалить?  [new]
Fire83
Member

Откуда: Гомель-Минск
Сообщений: 474
BestiA,

Совет Восстановите базу из резервной копии конечно неосуществим?
30 дек 09, 16:19    [8138333]     Ответить | Цитировать Сообщить модератору
 Re: Нашёл в базе повреждённую таблицу. Как её удалить?  [new]
pr0ger
Member

Откуда: Москва
Сообщений: 1933
Если нет резервной копии, то переливайте всё что можно в новую базу.
30 дек 09, 16:39    [8138446]     Ответить | Цитировать Сообщить модератору
 Re: Нашёл в базе повреждённую таблицу. Как её удалить?  [new]
BestiA
Member

Откуда: Саратов
Сообщений: 44
vino
BestiA, резервные копии есть?


Нет. Ошибка в базе висит, судя по датам, достаточно давно. Вернуться к бекапу без ошибки - равносильно тому,что угробить данные за пару-тройку месяцев.
31 дек 09, 10:39    [8140364]     Ответить | Цитировать Сообщить модератору
 Re: Нашёл в базе повреждённую таблицу. Как её удалить?  [new]
BestiA
Member

Откуда: Саратов
Сообщений: 44
Fire83
BestiA,

Совет Восстановите базу из резервной копии конечно неосуществим?


Разумеется нет. Иначе я бы не стал заморачиваться.
31 дек 09, 10:41    [8140383]     Ответить | Цитировать Сообщить модератору
 Re: Нашёл в базе повреждённую таблицу. Как её удалить?  [new]
BestiA
Member

Откуда: Саратов
Сообщений: 44
pr0ger
Если нет резервной копии, то переливайте всё что можно в новую базу.


Это не так просто. Там около 700 взаимосвязанных таблиц. %-(
31 дек 09, 10:44    [8140402]     Ответить | Цитировать Сообщить модератору
 Re: Нашёл в базе повреждённую таблицу. Как её удалить?  [new]
vino
Member

Откуда:
Сообщений: 1191
BestiA, сделайте точную копию всех файлов испорченной БД при выключенном сервере, потом экспериментируйте, найдя сначала весь набор испорченных таблиц, чтобы оценить масштаб работ
31 дек 09, 14:21    [8141255]     Ответить | Цитировать Сообщить модератору
 Re: Нашёл в базе повреждённую таблицу. Как её удалить?  [new]
vino
Member

Откуда:
Сообщений: 1191
BestiA, лога тоже нет и модель simple
31 дек 09, 14:22    [8141261]     Ответить | Цитировать Сообщить модератору
 Re: Нашёл в базе повреждённую таблицу. Как её удалить?  [new]
Crimean
Member

Откуда:
Сообщений: 13147
BestiA
pr0ger
Если нет резервной копии, то переливайте всё что можно в новую базу.


Это не так просто. Там около 700 взаимосвязанных таблиц. %-(


ну, от простого пути - регулярный реглламент, настроенный визардом, вы отказались. остается сложный, хотя сложность - дело практики, на самом деле пеерливаются данные, а потом на них накидываются форины
12 янв 10, 14:38    [8171377]     Ответить | Цитировать Сообщить модератору
 Re: Нашёл в базе повреждённую таблицу. Как её удалить?  [new]
xVost
Member

Откуда: Калининград
Сообщений: 4
Такая же проблема.
Ошибка- Possible schema corruption. Run DBCC CHECKCATALOG.
DBCC CHECKCATALOG говорит ошибок нет.
Знаю таблицу которая с ошибкой как ее заменить на имеющуюся исправную таблицу или удалить ее.
22 июн 10, 17:11    [8981949]     Ответить | Цитировать Сообщить модератору
 Re: Нашёл в базе повреждённую таблицу. Как её удалить?  [new]
pr0ger
Member

Откуда: Москва
Сообщений: 1933
xVost
Такая же проблема.
Ошибка- Possible schema corruption. Run DBCC CHECKCATALOG.
DBCC CHECKCATALOG говорит ошибок нет.
Знаю таблицу которая с ошибкой как ее заменить на имеющуюся исправную таблицу или удалить ее.

Если не получается удалить поврежденную таблицу, то попробуйте перекачать все исправные таблицы в новую базу.
22 июн 10, 17:14    [8981983]     Ответить | Цитировать Сообщить модератору
 Re: Нашёл в базе повреждённую таблицу. Как её удалить?  [new]
xVost
Member

Откуда: Калининград
Сообщений: 4
pr0ger, спасибо за совет. Вроде получилось. Я пытался наоборот в сломанную базу впихнуть исправную таблицу.
25 июн 10, 17:57    [9004475]     Ответить | Цитировать Сообщить модератору
 Re: Нашёл в базе повреждённую таблицу. Как её удалить?  [new]
BestiA
Member

Откуда: Саратов
Сообщений: 44
Проблему решил перелив данные из повреждённой базы в заведомо исправную с той же структурой предварительно переименовав повреждённую таблицу и создав её копию. Благо в базе не было связанных таблиц и вычисляемых полей. Поэтому переливка особого труда не составила. Ниже приведён скрипт, которым я написал для этой цели.

/*Переливка данных базы [bad] --> [et]*/
USE [et]

Declare @Tbl_Name Varchar(255), @Tbl_Id Int, @Fld_Name Varchar(255),@Is_Identity Int
Declare @IsId_Flag Int,@FLD_Sp Varchar(3000),@SQL_Com Varchar(8000)

DECLARE db_cur CURSOR FOR
	SELECT DISTINCT so.name AS [TABL],so.object_id AS [TABL_ID]
	FROM bad.sys.objects so INNER JOIN bad.sys.columns cl ON cl.object_id = so.object_id
    /*<<-- исключая те таблицы, которых нет в целевой базе*/
	LEFT JOIN (
		SELECT so.object_id,so.name FROM bad.sys.objects so
		INNER JOIN bad.sys.columns cl ON cl.object_id = so.object_id
		LEFT JOIN (
			SELECT so.name AS [TABL],so.object_id AS [TABL_ID],cl.name as [Fld],cl.system_type_id,cl.Is_identity
				 FROM et.sys.objects so
			INNER JOIN et.sys.columns cl ON cl.object_id = so.object_id
			WHERE so.TYPE='U'  
		) orp ON so.name = orp.TABL AND cl.name = orp.Fld
		WHERE so.TYPE='U' AND orp.TABL IS NULL OR cl.system_type_id <> orp.system_type_id
		OR cl.Is_identity <> orp.Is_identity
	) notinwork ON notinwork.object_id = so.object_id
    /*-->>*/
	WHERE so.TYPE='U' AND (notinwork.object_id IS NULL) 
OPEN db_cur
FETCH NEXT FROM db_cur INTO @Tbl_Name,@Tbl_Id
WHILE @@FETCH_STATUS = 0
BEGIN
	Print @Tbl_Name+' '+'['+LTRIM(STR(@Tbl_Id))+']'
    SET @IsId_Flag = 0
	SET @FLD_Sp = NULL	
	SET @SQL_Com = ''	
    DECLARE db_cur2 CURSOR FOR SELECT DISTINCT cl.name as [Fld],cl.Is_identity FROM bad.sys.columns cl WHERE cl.object_id = @Tbl_Id 
	OPEN db_cur2 
    FETCH NEXT FROM db_cur2 INTO @Fld_Name,@Is_Identity
	WHILE @@FETCH_STATUS = 0
	BEGIN
		IF @IsId_Flag = 0 AND @Is_Identity = 1  SET @IsId_Flag = 1
		IF COL_LENGTH(@Tbl_Name,@Fld_Name)>0 
		BEGIN
			SET @FLD_Sp = ISNULL(@FLD_Sp+',[','[') +RTRIM(@Fld_Name)+']'
		END
		FETCH NEXT FROM db_cur2 INTO @Fld_Name,@Is_Identity
	END
	CLOSE db_cur2
	DEALLOCATE db_cur2
	SET @SQL_Com = @SQL_Com + ' BEGIN TRAN; '
	SET @SQL_Com = @SQL_Com + ' TRUNCATE TABLE ' + @Tbl_Name+'; ' 	
	IF @IsId_Flag = 1 SET @SQL_Com = @SQL_Com + ' SET IDENTITY_INSERT '+@Tbl_Name+' ON; '
	SET @SQL_Com = @SQL_Com + '	INSERT INTO '+@Tbl_Name+' ('+@FLD_Sp+') '
    + 'SELECT '+@FLD_Sp+' FROM bad.dbo.'+@Tbl_Name+' ; '
	IF @IsId_Flag = 1 SET @SQL_Com = @SQL_Com + ' SET IDENTITY_INSERT '+@Tbl_Name+' OFF; '
	SET @SQL_Com = @SQL_Com + ' COMMIT TRAN; '
	PRINT @SQL_Com
	EXECUTE(@SQL_Com)	
	FETCH NEXT FROM db_cur INTO @Tbl_Name,@Tbl_Id
END

CLOSE db_cur
DEALLOCATE db_cur 
6 июн 11, 09:54    [10767390]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить