Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Каким инструментом перелить данные.  [new]
o-o
Guest
Нарим
Вроде как все печально:

автор
Сообщение 8948, уровень 16, состояние 3, строка 1
Ошибка базы данных: страница (1:5208495) отмечена неверным типом на PFS-странице (1:5200584). Для состояния PFS 0x70 ожидается 0x60.
Для исправления данной ошибки необходимо сначала исправить другие ошибки.
Сообщение 2576, уровень 16, состояние 1, строка 1
На страницу карты распределения индекса (IAM) (0:0) указывает предыдущий указатель IAM-страницы (1:1958) в объекте с идентификатором 0, идентификатор индекса -1, идентификатор секции 0, идентификатор единицы размещения 72057594102808576 (тип Unknown), но это не было обнаружено в ходе просмотра.
Уровень исправлений для данной инструкции DBCC вызвал обход данного исправления.
Сообщение 2575, уровень 16, состояние 1, строка 1
На страницу карты распределения индекса (IAM) (1:5208495) указывает следующий указатель IAM-страницы (1:5208489) в объекте с идентификатором 0, идентификатор индекса -1, идентификатор секции 0, идентификатор единицы размещения 72057594102808576 (тип Unknown), но это не было обнаружено в ходе просмотра.
Для исправления данной ошибки необходимо сначала исправить другие ошибки.
CHECKDB обнаружил 3 ошибок размещения и 0 ошибок согласованности, не связанных ни с одним объектом.
Сообщение 8906, уровень 16, состояние 1, строка 1
Страница (1:5208495) в базе данных с идентификатором 7 размещена в SGAM (1:5112321) и PFS (1:5200584), но не была размещена ни в одной IAM. PFS помечает "IAM_PG MIXED_EXT ALLOCATED 0_PCT_FULL".
Уровень исправлений для данной инструкции DBCC вызвал обход данного исправления.


ваша ошибка означает, что для таблицы с alloc unit ID 72057594102808576 отсутствуют метаданные.
по ссылке IAM page corruption examples найдете разъяснения + в комментариях товарищ, получивший такую же ошибку, спрашивает, можно ли из той таблицы перелить данные через SELECT INTO.
ответ Рэндала:
Yes, it’s not quite that simple, but basically yes. Note that the data you recover will be transactionally inconsistent. I’d only do this if there’s no way to recover using a backup.
хотя до этого сам же приговорил эту таблицу:
You can only resolve this through repair. There is no metadata for the table and so it’s no longer a valid table.
в смысле, запустите dbcc checkdb (your_db, repair_allow_data_loss), починит, но данные потеряете
25 янв 15, 02:03    [17165466]     Ответить | Цитировать Сообщить модератору
 Re: Каким инструментом перелить данные.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
Нарим
Что-то на 83 % застыла и все, третий час уже. Так должно быть или я делаю что-то не так ?
[img]http://s020.radikal.ru/i701/1501/7f/8a9868038e35.png[/img]
СТранно. Застыла не на копировании, а на других, быстрых операциях.

Непонятно, в чём дело. Нужно смотреть - например, начать с состояния процессов в сиквле, блокировок.
25 янв 15, 02:04    [17165467]     Ответить | Цитировать Сообщить модератору
 Re: Каким инструментом перелить данные.  [new]
o-o
Guest
Нарим,

попробуйте перелить из всех таблиц, кроме поврежденной.
или повреждена именно системная таблица?
вы на первой странице про это пишете, как проверяли?
нашли, чей это allocation_unit_id?
25 янв 15, 02:18    [17165490]     Ответить | Цитировать Сообщить модератору
 Re: Каким инструментом перелить данные.  [new]
Нарим
Member

Откуда:
Сообщений: 41
o-o, repair_allow_data_loss отрабатывает очень долго, часов 10. До меня уже пробовали, еще сказали, что вроде не все ошибки исправляет, поэтому и было решение переливать.

автор
Непонятно, в чём дело.

После этого вот такая ошибка, может поэтому и застыла. Прикрепил.

Что на счет таблицы, мне сказали что повреждены системные тот, кто пытался восстановить до меня. А я как то даже не проверял, сейчас попробую выяснить.

К сообщению приложен файл. Размер - 18Kb
25 янв 15, 10:12    [17165708]     Ответить | Цитировать Сообщить модератору
 Re: Каким инструментом перелить данные.  [new]
o-o
Guest
Нарим,

не надо прерывать DBCC CHECKDB, он должен долго отрабатывать.
это когда все хорошо, то быстро, а если что-то находит, другой алгоритм срабатывает.
если он даже не все исправляет, разберитесь, что именно не исправилось.

ваша ошибка с картинки может вылезти в том случае, если вы не сам визард заставили генерировать таблицы-приемники, а запустили сами скрипт их создания.
и создались таблицы с вычисляемыми столбцами или identity.
теперь визард сопоставил по именам источник-приемник и пытается заполнить эти identity/вычисляемые.
25 янв 15, 10:53    [17165736]     Ответить | Цитировать Сообщить модератору
 Re: Каким инструментом перелить данные.  [new]
Нарим
Member

Откуда:
Сообщений: 41
o-o, нда, спасибо. Я кажется понял, что сделал не так.

Пока не получается выяснить к какой таблице принадлежит страница. Нашел на форуме тут, делаю так:

PAGE HEADER: Page @0x000000012CF28000 Metadata: ObjectId 1725249201

select object_name(1725249201) - в ответ NULL. А как найти по aloc unit я пока не могу найти.
25 янв 15, 11:29    [17165798]     Ответить | Цитировать Сообщить модератору
 Re: Каким инструментом перелить данные.  [new]
Нарим
Member

Откуда:
Сообщений: 41
Поковырялся, все ведет к "отсутствующему" Object Id который 1725249201.
25 янв 15, 12:16    [17165889]     Ответить | Цитировать Сообщить модератору
 Re: Каким инструментом перелить данные.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
Нарим
select object_name(1725249201) - в ответ NULL. А как найти по aloc unit я пока не могу найти.
Может, на другой базе выполняете select object_name?
25 янв 15, 12:20    [17165905]     Ответить | Цитировать Сообщить модератору
 Re: Каким инструментом перелить данные.  [new]
Нарим
Member

Откуда:
Сообщений: 41
alexeyvg, да нет, на этой же. Может он "самоуничтожился" из-за повреждения ?
25 янв 15, 13:05    [17166040]     Ответить | Цитировать Сообщить модератору
 Re: Каким инструментом перелить данные.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
Нарим
alexeyvg, да нет, на этой же. Может он "самоуничтожился" из-за повреждения ?
Ну, если повреждены системные таблицы, то да, может быть - в страницах ИД объекта есть, а в метаданных нет.
25 янв 15, 19:52    [17167351]     Ответить | Цитировать Сообщить модератору
 Re: Каким инструментом перелить данные.  [new]
Нарим
Member

Откуда:
Сообщений: 41
alexeyvg, застыло опять, только уже на Pre-execute 60 %. Хотя я посмотрел количество строк в таблицах в приемнике такое же как в родителе. Что делает этот процесс ?
25 янв 15, 20:58    [17167718]     Ответить | Цитировать Сообщить модератору
 Re: Каким инструментом перелить данные.  [new]
o-o
Guest
Нарим
А как найти по aloc unit я пока не могу найти.

см. sys.allocation_units (Transact-SQL)
select object_name(p.object_id), *
from sys.allocation_units au join sys.partitions p 
       on au.container_id = p.hobt_id
where allocation_unit_id = 72057594102808576       
25 янв 15, 22:02    [17167932]     Ответить | Цитировать Сообщить модератору
 Re: Каким инструментом перелить данные.  [new]
Нарим
Member

Откуда:
Сообщений: 41
o-o,

Да, я догадался уже, спасибо. Но:

автор
Поковырялся, все ведет к "отсутствующему" Object Id который 1725249201.


И в первом столбце Вашего скрипта мне NULL пишет.
25 янв 15, 22:11    [17167973]     Ответить | Цитировать Сообщить модератору
 Re: Каким инструментом перелить данные.  [new]
Нарим
Member

Откуда:
Сообщений: 41
Задолбал меня этот визард. С ночи стоит на Copy Rows. Только я понять не могу зачем, когда количество строк во обоих базах и так уже одинаковое.
26 янв 15, 16:03    [17171793]     Ответить | Цитировать Сообщить модератору
 Re: Каким инструментом перелить данные.  [new]
Нарим
Member

Откуда:
Сообщений: 41
o-o,

автор
не сам визард заставили генерировать таблицы-приемники, а запустили сами скрипт их создания.


А если он таблицы сам создаст, они будут без PK и FK все. В ручную пересоздавать их что-ли ?
26 янв 15, 23:30    [17174095]     Ответить | Цитировать Сообщить модератору
 Re: Каким инструментом перелить данные.  [new]
Hooly-Gun
Member

Откуда:
Сообщений: 16
Нарим, была аналогичная задача. после аварийного завершения работы сервера, часть таблиц наиболее активной БД слетела
Попробуй
.создать проект БД на основе поврежденной БД(почисть мусор. создай чистую БД для заполнения из битой в Studio или скриптами)
.Проверь все таблицы на выборку данных. сохрани таблицы из которых данные не выбираются
создай скрипты
для генерации скриптов переноса данных из битой БД в новою переноса исключить битые таблицы
+
PRINT 'PRINT ''>> Копирование данных'''
-- Генерируем скрипт для заполнения таблиц
DECLARE DataCursor2 CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY 
FOR
    SELECT '[' + SCHEMA_NAME(t.[schema_id]) + '].[' + t.name + ']' AS full_name
    FROM   sys.tables t
    ORDER BY
           1

OPEN DataCursor2
WHILE 1 > 0
BEGIN
    FETCH NEXT FROM DataCursor2 INTO @Name
    IF @@FETCH_STATUS != 0
        BREAK
    
    IF NOT EXISTS(
           SELECT TOP 1 1
           FROM   @ExcludeTables
           WHERE  TableName = @Name
       )
        CONTINUE
    SELECT @Colums = ''
    SELECT @Colums = @Colums + '[' + NAME + ']'  + ', '
    FROM   sys.columns
    WHERE  OBJECT_ID = OBJECT_ID(@Name)
    AND is_computed = 0
    AND system_type_id != 189
    
    SELECT @Colums = LEFT(@Colums, LEN(@Colums) - 1)
    
    
    IF OBJECTPROPERTY(OBJECT_ID(@Name), 'TableHasIdentity') = 1
    BEGIN
        PRINT 'PRINT ''Таблица  с Identity ' + @Name + 'IDENTITY_INSERT ON'''
        PRINT 'SET IDENTITY_INSERT ' + @Name + ' ON '
        PRINT 'GO'
    END
    
    
    PRINT 'PRINT ''Копирование ' + @Name + '...'''
    --PRINT 'SELECT * INTO ' + @TargetDB + '.' + @Name + ' FROM ' + @SourceDB + '.' + @Name + ';'
    PRINT 'INSERT INTO ' + @TargetDB + '.' + @Name + '(' + @Colums + ') ' + ' SELECT ' + @Colums +' FROM ' + @SourceDB 
    + '.' + @Name + ';'
    PRINT 'PRINT ''Скопировано: '' + LTRIM(@@ROWCOUNT)'
    
    IF OBJECTPROPERTY(OBJECT_ID(@Name), 'TableHasIdentity') = 1
    BEGIN
        PRINT 'SET IDENTITY_INSERT ' + @Name + ' OFF '
        PRINT 'PRINT ''IDENTITY_INSERT OFF'''
    END
    
    PRINT 'GO'
END
CLOSE DataCursor2
DEALLOCATE DataCursor2

PRINT 'PRINT ''>> Копирование данных завершено'''

скрипт отключения CONSTRAINT и триггеров

+
PRINT 'PRINT ''>> Отключаем проверку по внешним ключам'''
-- Генерируем скрипт для заполнения таблиц
DECLARE DataCursor2 CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY 
FOR
    SELECT '[' + SCHEMA_NAME(t.[schema_id]) + '].[' + t.name + ']' AS full_name,
           '[' + fk.name + ']'  AS nameKey
    FROM   sys.foreign_keys fk
           JOIN sys.tables t
                ON  t.object_id = fk.parent_object_id
    ORDER BY
           1

OPEN DataCursor2
WHILE 1 > 0
BEGIN
    FETCH NEXT FROM DataCursor2 INTO @NameTable, @NameKey
    IF @@FETCH_STATUS != 0
        BREAK
    
    
    PRINT 'PRINT ''Отключение проверки ' + @NameTable + '...'''
    PRINT 'ALTER TABLE ' + @NameTable + ' NOCHECK CONSTRAINT ' + @NameKey
    PRINT 'PRINT ''проверка отключена ' + @NameTable + ''''
    PRINT 'GO'
END
CLOSE DataCursor2
DEALLOCATE DataCursor2

PRINT 'PRINT ''>> Отключение проверки завершено'''
PRINT 'PRINT ''>> Создание ХП для отключения триггеров...'''

PRINT '
IF OBJECT_ID(''[dbo].[DisableTriggers]'') != 0
    DROP PROCEDURE [dbo].[DisableTriggers] 
 GO
 
CREATE PROCEDURE [dbo].[DisableTriggers]
	@disable BIT = 1
AS
	DECLARE @sql             VARCHAR(500),
	        @tableName       VARCHAR(128),
	        @triggerName     VARCHAR(128),
	        @tableSchema     VARCHAR(128)
	
	DECLARE triggerCursor CURSOR  
	FOR
	    SELECT so_tr.name  AS TriggerName,
	           tbl.name    AS TableName,
	           sch.name    AS TableSchema
	    FROM   sysobjects so_tr
	           INNER JOIN sys.tables tbl
	                ON  so_tr.parent_obj = tbl.object_id
	           INNER JOIN sys.schemas sch
	                ON  sch.schema_id = tbl.schema_id
	    WHERE  so_tr.type = ''TR''
	    ORDER BY
	           tbl.name    ASC,
	           so_tr.name  ASC
	
	OPEN triggerCursor FETCH NEXT FROM triggerCursor INTO @triggerName, @tableName, 
	@tableSchema 
	WHILE (@@FETCH_STATUS = 0)
	BEGIN
	    IF @disable = 1
	        SET @sql = ''DISABLE TRIGGER ['' + @triggerName + ''] ON '' + @tableSchema 
	            + ''.['' + @tableName + '']''
	    ELSE
	        SET @sql = ''ENABLE TRIGGER ['' + @triggerName + ''] ON '' + @tableSchema 
	            + ''.['' + @tableName + '']''
	    
	    PRINT ''Executing Statement - '' + @sql 
	    EXECUTE (@sql) FETCH NEXT FROM triggerCursor INTO @triggerName, @tableName, 
	    @tableSchema
	END CLOSE triggerCursor DEALLOCATE triggerCursor
GO


'
PRINT 'PRINT ''>> Создана ХП для отключения триггеров'''


PRINT 'PRINT ''>> Отключаем триггера...'''

PRINT 'USE [' + @TargetDB + ']'
PRINT 'GO'
PRINT '
EXEC [dbo].[DisableTriggers] 
     @disable = 1
GO'
PRINT 'GO'
PRINT 'PRINT ''>> Триггеры отключены'''


скрипт включения CONSTRAINT и триггеров
+
PRINT 'PRINT ''>> Включаем проверку по внешним ключам'''
-- Генерируем скрипт для заполнения таблиц
DECLARE DataCursor2 CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY 
FOR
    SELECT '[' + SCHEMA_NAME(t.[schema_id]) + '].[' + t.name + ']' AS full_name,
           '[' + fk.name + ']'  AS nameKey
    FROM   sys.foreign_keys fk
           JOIN sys.tables t
                ON  t.object_id = fk.parent_object_id
    ORDER BY
           1

OPEN DataCursor2
WHILE 1 > 0
BEGIN
    FETCH NEXT FROM DataCursor2 INTO @NameTable, @NameKey
    IF @@FETCH_STATUS != 0
        BREAK
    
    
    PRINT 'PRINT ''Включение проверки ' + @NameTable + '...'''
    PRINT 'ALTER TABLE ' + @NameTable + ' CHECK CONSTRAINT ' + @NameKey
    PRINT 'PRINT ''проверка включена ' + @NameTable + ''''
    PRINT 'GO'
END
CLOSE DataCursor2
DEALLOCATE DataCursor2

PRINT 'PRINT ''>> Включение проверки завершено'''
PRINT 'PRINT ''>> Создание ХП для включения триггеров...'''

PRINT '
IF OBJECT_ID(''[dbo].[DisableTriggers]'') != 0
    DROP PROCEDURE [dbo].[DisableTriggers] 
 GO
 
CREATE PROCEDURE [dbo].[DisableTriggers]
	@disable BIT = 1
AS
	DECLARE @sql             VARCHAR(500),
	        @tableName       VARCHAR(128),
	        @triggerName     VARCHAR(128),
	        @tableSchema     VARCHAR(128)
	
	DECLARE triggerCursor CURSOR  
	FOR
	    SELECT so_tr.name  AS TriggerName,
	           tbl.name    AS TableName,
	           sch.name    AS TableSchema
	    FROM   sysobjects so_tr
	           INNER JOIN sys.tables tbl
	                ON  so_tr.parent_obj = tbl.object_id
	           INNER JOIN sys.schemas sch
	                ON  sch.schema_id = tbl.schema_id
	    WHERE  so_tr.type = ''TR''
	    ORDER BY
	           tbl.name    ASC,
	           so_tr.name  ASC
	
	OPEN triggerCursor FETCH NEXT FROM triggerCursor INTO @triggerName, @tableName, 
	@tableSchema 
	WHILE (@@FETCH_STATUS = 0)
	BEGIN
	    IF @disable = 1
	        SET @sql = ''DISABLE TRIGGER ['' + @triggerName + ''] ON '' + @tableSchema 
	            + ''.['' + @tableName + '']''
	    ELSE
	        SET @sql = ''ENABLE TRIGGER ['' + @triggerName + ''] ON '' + @tableSchema 
	            + ''.['' + @tableName + '']''
	    
	    PRINT ''Executing Statement - '' + @sql 
	    EXECUTE (@sql) FETCH NEXT FROM triggerCursor INTO @triggerName, @tableName, 
	    @tableSchema
	END CLOSE triggerCursor DEALLOCATE triggerCursor
GO


'
PRINT 'PRINT ''>> Включаем триггера...'''

PRINT 'USE [' + @TargetDB + ']'
PRINT 'GO'
PRINT '
EXEC [dbo].[DisableTriggers]
     @disable = 0
GO'
PRINT 'GO'
PRINT 'PRINT ''>> Триггеры включены'''


Выполнить
скрипт отключения CONSTRAINT и триггеров
скрипт копирования данных
скрипт включения CONSTRAINT и триггеров

PS.
данные из некоторых битых таблиц восстановить не удалось - пришлось искать в древних БД.
27 янв 15, 09:14    [17174696]     Ответить | Цитировать Сообщить модератору
 Re: Каким инструментом перелить данные.  [new]
Нарим
Member

Откуда:
Сообщений: 41
Hooly-Gun, спасибо огромное! Попробую ваши скрипты. А вы сверяли чем-то две базы ? Чтобы убедиться, что создать какой-то объект, триггер или индекс не забыли. А то человеческий фактор сыграет свое.
27 янв 15, 21:08    [17179302]     Ответить | Цитировать Сообщить модератору
 Re: Каким инструментом перелить данные.  [new]
Нарим
Member

Откуда:
Сообщений: 41
Hooly-Gun, скрипт на отключение надо для каждой таблицы ? В tablename подставлять ? У меня 170 таблиц.
27 янв 15, 21:59    [17179496]     Ответить | Цитировать Сообщить модератору
 Re: Каким инструментом перелить данные.  [new]
человек_ниоткуда
Guest
Нарим
Вроде как все печально:

автор
Сообщение 8948, уровень 16, состояние 3, строка 1
Ошибка базы данных: страница (1:5208495) отмечена неверным типом на PFS-странице (1:5200584). Для состояния PFS 0x70 ожидается 0x60....

А теперь возьми, восстанови последний бекап в новое место и:
USE [master];
GO
ALTER DATABASE [твоя_датабаза_из_бекапа] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
USE [твоя_датабаза_из_бекапа];
GO

DBCC CHECKDB('твоя_датабаза_из_бекапа', REPAIR_ALLOW_DATA_LOSS);
USE [master];
GO
ALTER DATABASE [твоя_датабаза_из_бекапа] SET MULTI_USER;

... и всё что написал запрос в студию.
28 янв 15, 10:16    [17180908]     Ответить | Цитировать Сообщить модератору
 Re: Каким инструментом перелить данные.  [new]
человек_ниоткуда
Guest
ой... ребят сорри... вторую страницу треда не увидел...
28 янв 15, 10:18    [17180919]     Ответить | Цитировать Сообщить модератору
 Re: Каким инструментом перелить данные.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Нарим
А вы сверяли чем-то две базы ? Чтобы убедиться, что создать какой-то объект, триггер или индекс не забыли. А то человеческий фактор сыграет свое.

А скриптование объектов в ManagamentStudio что хуже самописного скрипта ?
28 янв 15, 10:21    [17180945]     Ответить | Цитировать Сообщить модератору
 Re: Каким инструментом перелить данные.  [new]
Нарим
Member

Откуда:
Сообщений: 41
Glory, без DML-триггеров скриптует, а у меня таких большинство.
29 янв 15, 00:21    [17186672]     Ответить | Цитировать Сообщить модератору
 Re: Каким инструментом перелить данные.  [new]
o-o
Guest
Нарим,

К сообщению приложен файл. Размер - 112Kb
29 янв 15, 00:39    [17186750]     Ответить | Цитировать Сообщить модератору
 Re: Каким инструментом перелить данные.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
Нарим
Glory, без DML-триггеров скриптует, а у меня таких большинство.
Там ещё и индексы не скриптует по умолчанию. Проверьте внимательно все опции.
29 янв 15, 01:02    [17186838]     Ответить | Цитировать Сообщить модератору
 Re: Каким инструментом перелить данные.  [new]
Iona Gracia
Member

Откуда:
Сообщений: 2
Нарим,

Bulk copy program and import /Export option can help you out..
29 янв 15, 08:54    [17187239]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить