Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 как обработать результат выполнения dbcc checkdb  [new]
DBCCCHECKD
Guest
Надо в скрипте запустить выполнение dbcc checkdb по всем БД инстанса. Если будут обнаружены ошибки, запустить определённый код.
Как это сделать?
В цикле по всем БД поочередно запускать WITH NO_INFOMSGS чтобы не было кучи текста?
Как записать результат выполнения DBCC CHECKDB WITH NO_INFOMSGS в переменную или таблицы?
И как можно испортить для проверки тестовую БД, что DBCC CHECKDB выдавал ошибку?
9 мар 16, 12:05    [18910529]     Ответить | Цитировать Сообщить модератору
 Re: как обработать результат выполнения dbcc checkdb  [new]
Glory
Member

Откуда:
Сообщений: 104764
DBCCCHECKD
Как записать результат выполнения DBCC CHECKDB WITH NO_INFOMSGS в переменную или таблицы?

insert mytable exec(' DBCC CHECKDB WITH NO_INFOMSGS ')

insert mytable(...)
DBCC CHECKDB WITH TABLERESULTS
9 мар 16, 12:08    [18910553]     Ответить | Цитировать Сообщить модератору
 Re: как обработать результат выполнения dbcc checkdb  [new]
o-o
Guest
[quot DBCCCHECKD
как можно испортить для проверки тестовую БД, что DBCC CHECKDB выдавал ошибку?[/quot]
можно взять HexEditorи им открыть мдф.
понаписать туда нулей.
можно скачать готовые попорченные базы Рэндала.
---
про запуск в цикле.
если кто-то переведет базу в сингл юзер как раз тогда,
когда там орудует dbcc checkdb, выполнение всего цикла прервется
9 мар 16, 12:15    [18910596]     Ответить | Цитировать Сообщить модератору
 Re: как обработать результат выполнения dbcc checkdb  [new]
invm
Member

Откуда: Москва
Сообщений: 7447
DBCCCHECKD
И как можно испортить для проверки тестовую БД, что DBCC CHECKDB выдавал ошибку?
DBCC WRITEPAGE
9 мар 16, 12:21    [18910627]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: как обработать результат выполнения dbcc checkdb  [new]
odisssey
Member

Откуда:
Сообщений: 41
Glory
DBCCCHECKD
Как записать результат выполнения DBCC CHECKDB WITH NO_INFOMSGS в переменную или таблицы?

insert mytable exec(' DBCC CHECKDB WITH NO_INFOMSGS ')

insert mytable(...)
DBCC CHECKDB WITH TABLERESULTS


извиняюсь вероятно за глупый вопрос.
где должна быть создана таблица mytable, и какой структуры?

Создал бд в которую собираюсь записывать результат, кстати бд создал потому как не уверен что можно добавлять пользовательские таблицы в msdb например. Или это приветствуется?
Далее создал таблицу
USE [admin]
GO

/****** Object:  Table [dbo].[check_info]    Script Date: 10/4/2017 5:56:25 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[check_info](
	[checkInfo] [varchar](150) NULL,
	[Details] [sql_variant] NULL
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO


далее запускаю
insert admin..check_info exec(' DBCC CHECKDB (''myBD'') WITH NO_INFOMSGS ')

все отрабатывает, таблица пустая, что не так? для эксперимента запускал без NO_INFOMSGS, чтоб хоть что то записало, все равно таблица пустая (
4 окт 17, 18:02    [20843174]     Ответить | Цитировать Сообщить модератору
 Re: как обработать результат выполнения dbcc checkdb  [new]
o-o
Guest
автор
далее запускаю
insert admin..check_info exec(' DBCC CHECKDB (''myBD'') WITH NO_INFOMSGS ')

А где же tableresults?
4 окт 17, 19:26    [20843367]     Ответить | Цитировать Сообщить модератору
 Re: как обработать результат выполнения dbcc checkdb  [new]
odisssey
Member

Откуда:
Сообщений: 41
o-o
автор
далее запускаю
insert admin..check_info exec(' DBCC CHECKDB (''myBD'') WITH NO_INFOMSGS ')

А где же tableresults?


да конечно, добавил.
insert admin..check_info   exec('DBCC CHECKDB (''myDB'') WITH TABLERESULTS ')

выдаёт ошибку, вероятно все же структура не такая как надо, оно и не удивительно, взято первое попавшееся с просторов интернета.
вот ошибка
Msg 213, Level 16, State 7, Line 76
Column name or number of supplied values does not match table definition.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.


возвращаемся тому что нужно понимать какая структура ((
4 окт 17, 20:21    [20843478]     Ответить | Цитировать Сообщить модератору
 Re: как обработать результат выполнения dbcc checkdb  [new]
o-o
Guest
[Error] [int],
[Level] [int],
[State] [int],
[MessageText] [varchar](7000),
[RepairLevel] [int],
[Status] [int],
[DbId] [int],
[Id] [int],
[IndId] [int],
[PartitionID] [int],
[AllocUnitID] [int],
[File] [int],
[Page] [int],
[Slot] [int],
[RefFile] [int],
[RefPage] [int],
[RefSlot] [int],
[Allocation] [int]

но если вы тестите на здоровой базе, то нормально, что таблица пуста.
скачайте Рэндаловскую порченую базу или тестовую изгадьте тем же DBCC WRITEPAGE
4 окт 17, 20:34    [20843509]     Ответить | Цитировать Сообщить модератору
 Re: как обработать результат выполнения dbcc checkdb  [new]
odisssey
Member

Откуда:
Сообщений: 41
o-o
[Error] [int],
...
[Allocation] [int]

но если вы тестите на здоровой базе, то нормально, что таблица пуста.
скачайте Рэндаловскую порченую базу или тестовую изгадьте тем же DBCC WRITEPAGE


Спасибо. Попробовал. не помогло. та же ошибка.
Msg 213, Level 16, State 7, Line 76
Column name or number of supplied values does not match table definition.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

но есть чувство что это правильное направление :)

отсюда вопрос, откуда вы взяли эти поля таблицы, искал пол дня структуру предполагаемой таблицы, так и не нашел. Где хранят подобные знания? ))

Зато введя предложенные Вами поля в гугл, нашел много интересных тем, в одной из них создаётся процедура проверки баз, с записью в талицу, сейчас тестирую на сервере с больными базами, это до утра.

пользуясь случаем хочу еще спросить.

Создал на сервере план обслуживания с чекдб, он выполнился, через View History вижу что с ошибками, показаны поврежденные страницы
partition ID 72057602430730240, alloc unit ID 72057602423062528 (type In-row data). The high key value on page (1:20324650) (level 0) is not less than the low key value in the parent (0:1), slot 0 of the next page (1:9473725). Table error: Object ID 691637657, index ID 1, partition ID 72057602430730240, alloc unit ID 72057602423062528 (type In-row data).
но какая база - не понятно? Куда пишется результат - не понятно?
для чего нужен такой план?

Собственно это и натолкнуло отказаться от плана обслуживания и сделать джоб руками с записью результата в таблицу.
4 окт 17, 22:06    [20843785]     Ответить | Цитировать Сообщить модератору
 Re: как обработать результат выполнения dbcc checkdb  [new]
o-o
Guest
odisssey

Спасибо. Попробовал. не помогло. та же ошибка.
Msg 213, Level 16, State 7, Line 76
Column name or number of supplied values does not match table definition.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.



представляете, у меня нет никакой ошибки,
таблица прекрасно заполняется,
и если глазами посмотреть на результат чекдб,
то колонки как раз эти самые:

К сообщению приложен файл. Размер - 35Kb
4 окт 17, 22:26    [20843834]     Ответить | Цитировать Сообщить модератору
 Re: как обработать результат выполнения dbcc checkdb  [new]
o-o
Guest
odisssey
но какая база - не понятно? Куда пишется результат - не понятно?
для чего нужен такой план?

в первую очередь в еррорлог пишется.
и посмотреть очень даже просто:
xp_readerrorlog 0,1, N'dbcc checkdb'

разумеется, если сервер рестартовали/лог cycle-ите регулярно,
то надо поправить номер файла
----
философские вопросы типа зачем такое нужно прошу адресовать по адресу Microsoft.
кому не нравится, пишет свое, а не в гуи мышью щелкает
4 окт 17, 22:33    [20843852]     Ответить | Цитировать Сообщить модератору
 Re: как обработать результат выполнения dbcc checkdb  [new]
o-o
Guest
автор
сейчас тестирую на сервере с больными базами, это до утра.

вот почему не скачать битые базы Рэндала и не проверить все за минуту на собственном ноуте?
у меня на все (с учетом скачивания) ушло 5 минут
4 окт 17, 22:36    [20843859]     Ответить | Цитировать Сообщить модератору
 Re: как обработать результат выполнения dbcc checkdb  [new]
odisssey
Member

Откуда:
Сообщений: 41
o-o
автор
сейчас тестирую на сервере с больными базами, это до утра.

вот почему не скачать битые базы Рэндала и не проверить все за минуту на собственном ноуте?
у меня на все (с учетом скачивания) ушло 5 минут

скачал, завтра буду тестить, спасибо за науку.
4 окт 17, 23:02    [20843948]     Ответить | Цитировать Сообщить модератору
 Re: как обработать результат выполнения dbcc checkdb  [new]
odisssey
Member

Откуда:
Сообщений: 41
Итак , все получилось.
подитожу, может кому будет полезно в итоге.
Спасибо консультанту выше, это самое главное ))

подготавливаем DBCC CHECKDB для записи результата в таблицу.

1. как было сказано выше, для понимание необходимо скачать DemoCorruptMetadata, гугла выдает сайт где можно скачать.
после этого пазлы становятся на свои места. Дело в том что я запускал DBCC CHECKDB на не поврежденной базе и соответственно не видел преемущества которое дает параметр tableresults, полагая что он просто отвечает за то что результат может писаться в таблицу. И не могпонять откуда взять мне поля и типы этой таблицы. Но запуск на поврежденной базе все ставит на свои места.

2. создаём таблицу. Выше дан не правильный код таблицы, пару полей [RepairLevel] [varchar](150) NULL, [PartitionID] [varchar](150) NULL, [AllocUnitID] [varchar](150) NULL, должны быть не в int а в varchar
ниже правильный код, покр мере для версии
Microsoft SQL Server 2014 (SP2-CU6) (KB4019094) - 12.0.5553.0 (X64)
Jun 28 2017 16:26:18
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)

также добавлены поля для записи имя базы, сервера и даты проверки

+

USE [admin]
GO

/****** Object:  Table [dbo].[CheckDBResult]    Script Date: 10/6/2017 8:39:09 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[CheckDBResult](
	[ServerName] [varchar](100) NOT NULL,
	[Database]  AS (db_name([DBID])),
	[Error] [int] NULL,
	[Level] [int] NULL,
	[State] [int] NULL,
	[MessageText] [varchar](7000) NULL,
	[RepairLevel] [varchar](150) NULL,
	[Status] [int] NULL,
	[DbId] [int] NULL,
	[DbFragld] [int] NULL,
	[Objectid] [int] NULL,
	[indexId] [int] NULL,
	[PartitionID] [varchar](150) NULL,
	[AllocUnitID] [varchar](150) NULL,
	[RidDbID] [int] NULL,
	[RidPruID] [int] NULL,
	[File] [int] NULL,
	[Page] [int] NULL,
	[Slot] [int] NULL,
	[RefDbId] [int] NULL,
	[RefPruId] [int] NULL,
	[RefFile] [int] NULL,
	[RefPage] [int] NULL,
	[RefSlot] [int] NULL,
	[Allocation] [int] NULL,
	[insert_date] [datetime] NOT NULL
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[CheckDBResult] ADD  CONSTRAINT [DF_CheckDBResult_ServerName]  DEFAULT (@@servername) FOR [ServerName]
GO

ALTER TABLE [dbo].[CheckDBResult] ADD  CONSTRAINT [DF_CheckDBResult_insert_date]  DEFAULT (getdate()) FOR [insert_date]
GO




3. запускаем
insert admin..[CheckDBResult]  (
[Error],[Level],[State],[MessageText],[RepairLevel],[Status],[DbId],[DbFragld],[Objectid],[indexId],[PartitionID],[AllocUnitID],[RidDbID],[RidPruID],[File]
,[Page],[Slot],[RefDbId],[RefPruId],[RefFile],[RefPage],[RefSlot],[Allocation]) 
exec('DBCC CHECKDB (''mybd'') WITH NO_INFOMSGS, tableresults')


4. при необходимости можно запустить по всем базам.
insert admin..[CheckDBResult]  (
[Error],[Level],[State],[MessageText],[RepairLevel],[Status],[DbId],[DbFragld],[Objectid],[indexId],[PartitionID],[AllocUnitID],[RidDbID],[RidPruID],[File]
,[Page],[Slot],[RefDbId],[RefPruId],[RefFile],[RefPage],[RefSlot],[Allocation]) 
exec (' sp_MSForEachDb ''DBCC CHECKDB (?) WITH NO_INFOMSGS, tableresults''')


5.
загнать в джоб, выполнять по воскресеньям, и в понедельник будете иметь удобную в работе таблицу с таблицами битых баз.
6 окт 17, 21:11    [20849600]     Ответить | Цитировать Сообщить модератору
 Re: как обработать результат выполнения dbcc checkdb  [new]
odisssey
Member

Откуда:
Сообщений: 41
Господа, родился новый вопрос.
Отработал мой скрипт, и встал вопрос - как добавить в таблицу выше, строку о том что все зашибись, если все действительно зашибись.
7 окт 17, 19:37    [20851196]     Ответить | Цитировать Сообщить модератору
 Re: как обработать результат выполнения dbcc checkdb  [new]
Eleanor
Member

Откуда:
Сообщений: 1026
odisssey,

Например, так:
Добавляете в CheckDBResult поле с датой CreateDate datetime not null default getdate()
Перед выполнением CHECKDB запоминаете последнюю дату, имеющуюся в таблице.
Выполняете CHECKDB.
Проверяете, появились ли в CheckDBResult записи с более новой датой CreateDate.
Если записей нет, т.е. ошибки не возникли, пишете в неё "всё зашибись"
7 окт 17, 23:21    [20851502]     Ответить | Цитировать Сообщить модератору
 Re: как обработать результат выполнения dbcc checkdb  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 3602
odisssey,

IF @@ROWCOUNT = 0 INSRERT
8 окт 17, 00:23    [20851609]     Ответить | Цитировать Сообщить модератору
 Re: как обработать результат выполнения dbcc checkdb  [new]
odisssey
Member

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

IF @@ROWCOUNT = 0 INSRERT


insert admin..[CheckDBResult]  (
[Error],[Level],[State],[MessageText],[RepairLevel],[Status],[DbId],[DbFragld],[Objectid],[indexId],[PartitionID],[AllocUnitID],[RidDbID],[RidPruID],[File]
,[Page],[Slot],[RefDbId],[RefPruId],[RefFile],[RefPage],[RefSlot],[Allocation]) 
exec (' sp_MSForEachDb ''DBCC CHECKDB (?) WITH NO_INFOMSGS, tableresults''')
IF @@ROWCOUNT = 0 insert admin..[CheckDBResult]  ([MessageText]) values ('все ок')


инсертит - "все ок", если по всем базам ошибок не было, а как бы так сделать чтоб инсертило по каждой проверенной целой базе?
вчера, 00:17    [20871330]     Ответить | Цитировать Сообщить модератору
 Re: как обработать результат выполнения dbcc checkdb  [new]
aleks222
Guest
odisssey
TaPaK
odisssey,

IF @@ROWCOUNT = 0 INSRERT


insert admin..[CheckDBResult]  (
[Error],[Level],[State],[MessageText],[RepairLevel],[Status],[DbId],[DbFragld],[Objectid],[indexId],[PartitionID],[AllocUnitID],[RidDbID],[RidPruID],[File]
,[Page],[Slot],[RefDbId],[RefPruId],[RefFile],[RefPage],[RefSlot],[Allocation]) 
exec (' sp_MSForEachDb ''DBCC CHECKDB (?) WITH NO_INFOMSGS, tableresults''')
IF @@ROWCOUNT = 0 insert admin..[CheckDBResult]  ([MessageText]) values ('все ок')


инсертит - "все ок", если по всем базам ошибок не было, а как бы так сделать чтоб инсертило по каждой проверенной целой базе?


exec (' sp_MSForEachDb '' exec admin.dbo.MyCoolProcToCheckDB ''''?'''' '' ' )

Как-то так.
Процедуру ужо сам наваяй...
вчера, 06:34    [20871442]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить