Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
DBCCCHECKD
Guest |
Надо в скрипте запустить выполнение dbcc checkdb по всем БД инстанса. Если будут обнаружены ошибки, запустить определённый код. Как это сделать? В цикле по всем БД поочередно запускать WITH NO_INFOMSGS чтобы не было кучи текста? Как записать результат выполнения DBCC CHECKDB WITH NO_INFOMSGS в переменную или таблицы? И как можно испортить для проверки тестовую БД, что DBCC CHECKDB выдавал ошибку? |
9 мар 16, 12:05 [18910529] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
insert mytable exec(' DBCC CHECKDB WITH NO_INFOMSGS ') insert mytable(...) DBCC CHECKDB WITH TABLERESULTS |
||
9 мар 16, 12:08 [18910553] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
[quot DBCCCHECKD как можно испортить для проверки тестовую БД, что DBCC CHECKDB выдавал ошибку?[/quot] можно взять HexEditorи им открыть мдф. понаписать туда нулей. можно скачать готовые попорченные базы Рэндала. --- про запуск в цикле. если кто-то переведет базу в сингл юзер как раз тогда, когда там орудует dbcc checkdb, выполнение всего цикла прервется |
9 мар 16, 12:15 [18910596] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9646 |
|
||
9 мар 16, 12:21 [18910627] Ответить | Цитировать Сообщить модератору |
Между сообщениями интервал более 1 года. |
odisssey Member Откуда: Сообщений: 64 |
извиняюсь вероятно за глупый вопрос. где должна быть создана таблица 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] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
А где же tableresults? |
||
4 окт 17, 19:26 [20843367] Ответить | Цитировать Сообщить модератору |
odisssey Member Откуда: Сообщений: 64 |
да конечно, добавил. 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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
odisssey Member Откуда: Сообщений: 64 |
Спасибо. Попробовал. не помогло. та же ошибка. 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] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
представляете, у меня нет никакой ошибки, таблица прекрасно заполняется, и если глазами посмотреть на результат чекдб, то колонки как раз эти самые: К сообщению приложен файл. Размер - 35Kb |
||
4 окт 17, 22:26 [20843834] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
в первую очередь в еррорлог пишется. и посмотреть очень даже просто: xp_readerrorlog 0,1, N'dbcc checkdb' разумеется, если сервер рестартовали/лог cycle-ите регулярно, то надо поправить номер файла ---- философские вопросы типа зачем такое нужно прошу адресовать по адресу Microsoft. кому не нравится, пишет свое, а не в гуи мышью щелкает |
||
4 окт 17, 22:33 [20843852] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
вот почему не скачать битые базы Рэндала и не проверить все за минуту на собственном ноуте? у меня на все (с учетом скачивания) ушло 5 минут |
||
4 окт 17, 22:36 [20843859] Ответить | Цитировать Сообщить модератору |
odisssey Member Откуда: Сообщений: 64 |
скачал, завтра буду тестить, спасибо за науку. |
||||
4 окт 17, 23:02 [20843948] Ответить | Цитировать Сообщить модератору |
odisssey Member Откуда: Сообщений: 64 |
Итак , все получилось. подитожу, может кому будет полезно в итоге. Спасибо консультанту выше, это самое главное )) подготавливаем 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) также добавлены поля для записи имя базы, сервера и даты проверки
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] Ответить | Цитировать Сообщить модератору |
odisssey Member Откуда: Сообщений: 64 |
Господа, родился новый вопрос. Отработал мой скрипт, и встал вопрос - как добавить в таблицу выше, строку о том что все зашибись, если все действительно зашибись. |
7 окт 17, 19:37 [20851196] Ответить | Цитировать Сообщить модератору |
Eleanor Member Откуда: Сообщений: 3214 |
odisssey, Например, так: Добавляете в CheckDBResult поле с датой CreateDate datetime not null default getdate() Перед выполнением CHECKDB запоминаете последнюю дату, имеющуюся в таблице. Выполняете CHECKDB. Проверяете, появились ли в CheckDBResult записи с более новой датой CreateDate. Если записей нет, т.е. ошибки не возникли, пишете в неё "всё зашибись" |
7 окт 17, 23:21 [20851502] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
odisssey, IF @@ROWCOUNT = 0 INSRERT |
8 окт 17, 00:23 [20851609] Ответить | Цитировать Сообщить модератору |
odisssey Member Откуда: Сообщений: 64 |
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 ('все ок') инсертит - "все ок", если по всем базам ошибок не было, а как бы так сделать чтоб инсертило по каждой проверенной целой базе? |
||
16 окт 17, 00:17 [20871330] Ответить | Цитировать Сообщить модератору |
aleks222
Guest |
exec (' sp_MSForEachDb '' exec admin.dbo.MyCoolProcToCheckDB ''''?'''' '' ' ) Как-то так. Процедуру ужо сам наваяй... |
||||
16 окт 17, 06:34 [20871442] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |