Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Перебрать все таблицы из битой базы, и выбрать "живые" (SQL 2005)  [new]
dolly_ev
Member

Откуда: Чита
Сообщений: 29
Помогите нубу.
Имеем битую БД, часть таблиц не читается вовсе, часть - кусками.
Хочу как-то разом поиметь представление об ущербе, т.е. выбрать список всех таблиц, пройтись по нему и на каждую таблицу получить кол-во записей и какую-то метку, что или все Ок, или таблица далее не читается..
Поиском набрел вот на эту конструкцию:
use MNFK
declare @cmd1 nvarchar(1000)
SET @cmd1 = 'select ?, count(*) from ?'
exec sp_MSforeachtable @command1 = @cmd1


Но конструкция естественно обламывается на первом же сбое:
Msg 824, Level 24, State 2, Procedure sp_MSforeach_worker, Line 31
SQL Server detected a logical consistency-based I/O error: incorrect pageid (expected 1:1875476; actual 0:0). It occurred during a read of page (1:1875476) in database ID 5 at offset 0x00000393c28000 in file 'C:\BASES\SQL_Data\MNFK.mdf'. Additional messages in the SQL Server error log or system event log may provide more detail. This is a severe error condition that threatens database integrity and must be corrected immediately. Complete a full database consistency check (DBCC CHECKDB). This error can be caused by many factors; for more information, see SQL Server Books Online.

Есть в Т-SQL на этот случай что-либо?
(типа конструкции Попытка Исключение КонецПопытки в 1С, одинеснег я)
3 июл 14, 08:32    [16252682]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать все таблицы из битой базы, и выбрать "живые" (SQL 2005)  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
dolly_ev
Есть в Т-SQL на этот случай что-либо?


DBCC CHECKDB
3 июл 14, 08:38    [16252687]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать все таблицы из битой базы, и выбрать "живые" (SQL 2005)  [new]
dolly_ev
Member

Откуда: Чита
Сообщений: 29
Knyazev Alexey
dolly_ev
Есть в Т-SQL на этот случай что-либо?


DBCC CHECKDB


Это уже не помогло))
Восстановление БД (SQL 2005, ldf потерян)
Попытаться удаленно восстановить БД (SQL 2005)
3 июл 14, 09:19    [16252799]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать все таблицы из битой базы, и выбрать "живые" (SQL 2005)  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
т.е. вы полагаете что еще создатите еще одну тему в мсскл появяться новые интрукции как бороться с проблемами БД после падения железа ?
Можно попробовать вручную савсем
declare @t table (name sysname, i int identity(1,1), st bit)
declare @name sysname, @i int  =1, @x int =0 ,@sql nvarchar(2048)
insert into @t(name) select name form sys.all_objects where type =N'U'
set @x = (select MAX(i) from @t)
if @x <>0
begin
  while @i>=@x
   begin
       set @name = (select name  from @t where i=@i)
       begin try
          set @sql = 'select count(*) from ' + @name
          exec (@sql) 
          update @t set st =1 where i=@i 
       end try 
       begin cacth
            select ERROR_MESSAGE()
            update @t set st =0 where i=@i 
       end cacth
       set @ = @i+1
       set @sql = ''
   end
end
3 июл 14, 09:37    [16252885]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать все таблицы из битой базы, и выбрать "живые" (SQL 2005)  [new]
dolly_ev
Member

Откуда: Чита
Сообщений: 29
Maxx
т.е. вы полагаете что еще создатите еще одну тему в мсскл появяться новые интрукции как бороться с проблемами БД после падения железа ?

Нет конечно)), я уже последствия разгребаю

Maxx
Можно попробовать вручную савсем
declare @t table (name sysname, i int identity(1,1), st bit)
declare @name sysname, @i int  =1, @x int =0 ,@sql nvarchar(2048)
insert into @t(name) select name form sys.all_objects where type =N'U'
set @x = (select MAX(i) from @t)
if @x <>0
begin
  while @i>=@x
   begin
       set @name = (select name  from @t where i=@i)
       begin try
          set @sql = 'select count(*) from ' + @name
          exec (@sql) 
          update @t set st =1 where i=@i 
       end try 
       begin cacth
            select ERROR_MESSAGE()
            update @t set st =0 where i=@i 
       end cacth
       set @ = @i+1
       set @sql = ''
   end
end

Вот вот самое оно, что мне было нужно! только уж помогите теперь с синтаксисом, иначе я очень долго провожусь :-(
use MNFK
declare @t table (name sysname, i int identity(1,1), st bit)
declare @name sysname, @i int, @x int,@sql nvarchar(2048)
set @i =1
set @x =0
insert into @t(name) select name form sys.all_objects where type =N'U'
set @x = (select MAX(i) from @t)
if @x <>0
begin
  while @i>=@x
   begin
       set @name = (select name  from @t where i=@i)
       begin try
          set @sql = 'select count(*) from ' + @name
          exec (@sql) 
          update @t set st =1 where i=@i 
       end try 
       begin cacth
            select ERROR_MESSAGE()
            update @t set st =0 where i=@i 
       end cacth
       set @ = @i+1
       set @sql = ''
   end
end

ругается:
Msg 102, Level 15, State 1, Line 6
Incorrect syntax near 'sys'.
Msg 156, Level 15, State 1, Line 18
Incorrect syntax near the keyword 'begin'.
Msg 102, Level 15, State 1, Line 18
Incorrect syntax near 'cacth'.
Msg 156, Level 15, State 1, Line 22
Incorrect syntax near the keyword 'set'.
Msg 137, Level 15, State 1, Line 22
Must declare the scalar variable "@".
Msg 156, Level 15, State 1, Line 25
Incorrect syntax near the keyword 'end'.
3 июл 14, 10:23    [16253145]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать все таблицы из битой базы, и выбрать "живые" (SQL 2005)  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
dolly_ev
use MNFK
declare @t table (name sysname, i int identity(1,1), st bit)
declare @name sysname, @i int, @x int,@sql nvarchar(2048)
set @i =1
set @x =0
insert into @t(name) select name form sys.all_objects where type =N'U'
set @x = (select MAX(i) from @t)
if @x <>0
begin
  while @i>=@x
   begin
       set @name = (select name  from @t where i=@i)
       begin try
          set @sql = 'select count(*) from ' + @name
          exec (@sql) 
          update @t set st =1 where i=@i 
       end try 
       begin cacth
            select ERROR_MESSAGE()
            update @t set st =0 where i=@i 
       end cacth
       set @ = @i+1
       set @sql = ''
   end
end
на from замените.
3 июл 14, 10:39    [16253321]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать все таблицы из битой базы, и выбрать "живые" (SQL 2005)  [new]
dolly_ev
Member

Откуда: Чита
Сообщений: 29
dolly_ev
use MNFK
declare @t table (name sysname, i int identity(1,1), st bit)
declare @name sysname, @i int, @x int,@sql nvarchar(2048)
set @i =1
set @x =0
insert into @t(name) select name form sys.all_objects where type =N'U'
set @x = (select MAX(i) from @t)
if @x <>0
begin
  while @i>=@x
   begin
       set @name = (select name  from @t where i=@i)
       begin try
          set @sql = 'select count(*) from ' + @name
          exec (@sql) 
          update @t set st =1 where i=@i 
       end try 
       begin catch
            select ERROR_MESSAGE()
            update @t set st =0 where i=@i 
       end catch
       set @i=@i+1
       set @sql = ''
   end
end

Совсем немножко ругается:
Msg 102, Level 15, State 1, Line 6
Incorrect syntax near 'sys'.
3 июл 14, 10:42    [16253351]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать все таблицы из битой базы, и выбрать "живые" (SQL 2005)  [new]
dolly_ev
Member

Откуда: Чита
Сообщений: 29
Minamoto, спасибо! пропустил
Взлетело, только почему-то st=NULL везде? (хотя я точно знаю, что есть таблички, которые полностью селектятся)
и сортировку бы - как в Базе таблички идут?

RG17080 1 NULL
DH4290 2 NULL
DH22864 3 NULL
DH1974 4 NULL
SC32925 5 NULL
...
3 июл 14, 10:50    [16253411]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать все таблицы из битой базы, и выбрать "живые" (SQL 2005)  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
dolly_ev
while @i>=@x

замените на
while @i<=@x 
3 июл 14, 11:08    [16253513]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать все таблицы из битой базы, и выбрать "живые" (SQL 2005)  [new]
dolly_ev
Member

Откуда: Чита
Сообщений: 29
Maxx
dolly_ev
while @i>=@x

замените на
while @i<=@x 

Во, взлетело. Теперь еще вот это:
select * from @t

(373 row(s) affected)
The query has exceeded the maximum number of result sets that can be displayed in the results grid. Only the first 100 result sets are displayed in the grid.


Как не выводить в грид результаты селектов в конструкции try / catch ?
3 июл 14, 11:14    [16253551]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать все таблицы из битой базы, и выбрать "живые" (SQL 2005)  [new]
Maxx
Member [скрыт]

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

складывать вот ето в отдельную таблицу или добавить поле в @t
declare @t table (name sysname, i int identity(1,1), st bit, err nvarchar(2048))
и далее

       begin catch
            select ERROR_MESSAGE()
            update @t set st =0 where i=@i 
       end catch

заменить на
       begin catch
            
            update @t set st =0 б укк =ERROR_MESSAGE() where i=@i 
       end catch
3 июл 14, 11:20    [16253595]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать все таблицы из битой базы, и выбрать "живые" (SQL 2005)  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
dolly_ev,

Можно селект динамический сделать так:

select count(*) into #temp
3 июл 14, 11:26    [16253638]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать все таблицы из битой базы, и выбрать "живые" (SQL 2005)  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
dolly_ev
Как не выводить в грид результаты селектов в конструкции try / catch ?
set @sql = 'set nocount on; declare @c int; select @c = count(*) from ' + quotename(@name)
3 июл 14, 11:29    [16253670]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать все таблицы из битой базы, и выбрать "живые" (SQL 2005)  [new]
dolly_ev
Member

Откуда: Чита
Сообщений: 29
Maxx
заменить на
       begin catch
            
            update @t set st =0 б укк =ERROR_MESSAGE() where i=@i 
       end catch

Вот, вот, тоже самое почти сам сделал))
declare @t table (name sysname, i int identity(1,1), st bit, qty int, err nvarchar(1000))
declare @name sysname, @i int, @x int, @sql nvarchar(2048), @qty int
set @i =1
set @x =0
insert into @t(name) select name from sys.all_objects where type =N'U'
set @x = (select MAX(i) from @t)
if @x <>0
begin
  while @i<=@x
   begin
       set @name = (select name  from @t where i=@i)
		--set @name = quotename(@name, '[]')
       begin try
          set @sql = 'select count(*) from ' + @name
          --set @qty = exec (@sql)
          update @t set st =1, qty = exec(@sql) where i=@i
       end try 
       begin catch
            --set @err = select ERROR_MESSAGE()
            update @t set st =0, err =ERROR_MESSAGE() where i=@i 
       end catch
       set @i=@i+1
       set @sql = ''
   end
end
select * from @t order by name

Нужен последний пинок:
Msg 156, Level 15, State 1, Line 17
Incorrect syntax near the keyword 'exec'.
Msg 156, Level 15, State 1, Line 17
Incorrect syntax near the keyword 'where'.
3 июл 14, 11:33    [16253696]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать все таблицы из битой базы, и выбрать "живые" (SQL 2005)  [new]
Maxx
Member [скрыт]

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

у вас сегодня неподражаемый искроментный юмор...честное слово
3 июл 14, 11:36    [16253718]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать все таблицы из битой базы, и выбрать "живые" (SQL 2005)  [new]
dolly_ev
Member

Откуда: Чита
Сообщений: 29
Maxx, это да))... Но все-таки пинок?))
чем ему не нравится
qty = exec(@sql)
?
3 июл 14, 11:38    [16253735]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать все таблицы из битой базы, и выбрать "живые" (SQL 2005)  [new]
Maxx
Member [скрыт]

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

хотя бы тем что нет такой контрукции в языке.
3 июл 14, 11:39    [16253756]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать все таблицы из битой базы, и выбрать "живые" (SQL 2005)  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
sp_executesql
3 июл 14, 11:43    [16253786]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать все таблицы из битой базы, и выбрать "живые" (SQL 2005)  [new]
dolly_ev
Member

Откуда: Чита
Сообщений: 29
Maxx
sp_executesql

Msg 195, Level 15, State 10, Line 17
'sp_executesql' is not a recognized built-in function name.

Maxx, я же написал в начале - одинеснег))... Пинок не помог, но из контекста понятно, чего я хочу
3 июл 14, 11:49    [16253833]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать все таблицы из битой базы, и выбрать "живые" (SQL 2005)  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
1. Успешное выполнение select count(*) from не гарантирует отсутствие ошибок в таблице.

2.
declare @t table
(
 Error int,
 Level int,
 State int,
 MessageText varchar(8000),
 RepairLevel varchar(100),
 Status int,
 Dbid int,
 DbFragId int,
 ObjectId int,
 IndexId int,
 PartitionId bigint,
 AllocUnitId bigint,
 RidDbId int,
 RidPruId int,
 [File] int,
 Page int,
 Slot int,
 RefDbId int,
 RefPruId int,
 RefFile int,
 RefPage int,
 RefSlot int,
 Allocation int
);

declare @s varchar(max);
select @s = 'dbcc checkdb(' + quotename(db_name()) + ') with tableresults;';

insert into @t
 exec(@s);

select distinct object_name(ObjectId) from @t where Error <> 2593 and ObjectId > 0;
Адаптацию для SQL Server 2005 сделаете сами.
3 июл 14, 11:51    [16253844]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать все таблицы из битой базы, и выбрать "живые" (SQL 2005)  [new]
dolly_ev
Member

Откуда: Чита
Сообщений: 29
invm
1. Успешное выполнение select count(*) from не гарантирует отсутствие ошибок в таблице.

Это понимаю, но полный селект - уже результат (для задачи "оценить ущерб")
invm
2.
declare @t table
(
...

Msg 213, Level 16, State 7, Line 1
Insert Error: Column name or number of supplied values does not match table definition.
Msg 824, Level 24, State 2, Line 1
SQL Server detected a logical consistency-based I/O error: incorrect pageid (expected 1:1875476; actual 0:0). It occurred during a read of page (1:1875476) in database ID 7 at offset 0x00000393c28000 in file 'C:\BASES\SQL_Data\MNFK.mdf:MSSQL_DBCC7'. Additional messages in the SQL Server error log or system event log may provide more detail. This is a severe error condition that threatens database integrity and must be corrected immediately. Complete a full database consistency check (DBCC CHECKDB). This error can be caused by many factors; for more information, see SQL Server Books Online.

Т.е., я так понимаю вставляемое не соответствует определенному в таблице и это как раз адаптация к СКЛь 2005?
Да и мне бы исходный скрипт добить, и хватит с меня))
3 июл 14, 11:58    [16253889]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать все таблицы из битой базы, и выбрать "живые" (SQL 2005)  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
dolly_ev
Это понимаю, но полный селект - уже результат (для задачи "оценить ущерб")
Это не полный селект, а подсчет количества строк в таблице. А для этого совершенно не обязательно обращаться к самой таблице. Замените хотя бы на select checksum_agg(checksum(*)) from .... Правда этот вариант тоже не дает гарантии.
dolly_ev
Т.е., я так понимаю вставляемое не соответствует определенному в таблице и это как раз адаптация к СКЛь 2005?
Да. Вам всего-то надо запустить dbcc checkdb(...) with tableresults и привести схему таблицы в соответствие с полученным набором.
3 июл 14, 12:10    [16253979]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать все таблицы из битой базы, и выбрать "живые" (SQL 2005)  [new]
dolly_ev
Member

Откуда: Чита
Сообщений: 29
Maxx,
set @qty = sp_executesql(@sql)

Не взлетает :-(
3 июл 14, 12:11    [16253981]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать все таблицы из битой базы, и выбрать "живые" (SQL 2005)  [new]
dolly_ev
Member

Откуда: Чита
Сообщений: 29
invm
dolly_ev
Это понимаю, но полный селект - уже результат (для задачи "оценить ущерб")
Это не полный селект, а подсчет количества строк в таблице. А для этого совершенно не обязательно обращаться к самой таблице. Замените хотя бы на select checksum_agg(checksum(*)) from .... Правда этот вариант тоже не дает гарантии.
dolly_ev
Т.е., я так понимаю вставляемое не соответствует определенному в таблице и это как раз адаптация к СКЛь 2005?
Да. Вам всего-то надо запустить dbcc checkdb(...) with tableresults и привести схему таблицы в соответствие с полученным набором.

Понятно. Спасибо!
3 июл 14, 12:12    [16253996]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать все таблицы из битой базы, и выбрать "живые" (SQL 2005)  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
dolly_ev
Maxx,
set @qty = sp_executesql(@sql)


Не взлетает :-(

и не должно.. там специально примеры есть по ссылке (можно даже читать а не ждать что вот так все само заработает)
Кстате правильно заметили что коунт не даст полной картины.. замените в цикле на вызов
DBCC CHECKTABLE
3 июл 14, 12:23    [16254064]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить