Sql server сообщение 5133

Обновлено: 02.07.2024

← →
Фокс Йожин ( 2011-10-01 16:59 ) [0]

Есть некая таблица MyTable. При выборке SELECT * FROM MyTable получаю ошибку:
SQL Server обнаружил логическую ошибку ввода-вывода, связанную с согласованностью: недопустимый параметр защиты. Она произошла при прочитать страницы (1:1412094) в базе данных с идентификатором 10 по смещению 0x000002b17fc000 файла "D:\Base \BC1\BC1.mdf". Дополнительные сведения см. в журнале ошибок SQL Server и журнале системных событий. Это серьезная ошибка, которая угрожает целостности базы данных и должна быть немедленно исправлена. Выполните полную проверку базы данных на согласованность (DBCC CHECKDB). Эта ошибка может быть вызвана многими причинами; дополнительные сведения см. в электронной документации по SQL Server.

Вычленить диапазон записей из данной таблицы, которые попадают под ошибку и их удалить?

← →
sniknik © ( 2011-10-01 17:08 ) [2]

> SELECT * FROM MyTable
SELECT AnyField FROM MyTable
SELECT AnyButNonBiFirstField FROM MyTable
SELECT TOP 1 * FROM MyTable
SELECT * FROM MyTable WHERE KeyField = 11
дают ошибку?

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

← →
Фокс Йожин ( 2011-10-01 17:19 ) [3]


> sniknik © (01.10.11 17:08) [2]

SELECT AnyField FROM MyTable - ошибка
SELECT AnyButNonBiFirstField FROM MyTable - ошибка
SELECT TOP 1 * FROM MyTable - нет ошибки
SELECT * FROM MyTable WHERE KeyField = 11 - нет ошибки


> Ega23 © (01.10.11 17:07) [1]
>
>

DELETE? Попробую, но ведь при выборке этого диапазона возникает ошибка.

← →
Ega23 © ( 2011-10-01 17:37 ) [4]


> Попробую, но ведь при выборке этого диапазона возникает
> ошибка.

Выдели этот диапазон.
Например, таблица, ID c 1 по 1000. Битые записи в диапазоне 439-523.
Найди этот диапазон и удали. Либо перенеси в другую таблицу всё, что лежит вне рамок данного диапазона.

← →
sniknik © ( 2011-10-01 17:54 ) [5]

> этого диапазона возникает ошибка.
> SELECT TOP 1 * FROM MyTable - нет ошибки
> SELECT * FROM MyTable WHERE KeyField = 11 - нет ошибки
есть все чтобы вычислить и удалить. операции >

← →
sniknik © ( 2011-10-01 17:59 ) [6]

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

← →
Фокс Йожин ( 2011-10-01 18:31 ) [7]


> sniknik © (01.10.11 17:54) [5]


>
> есть все чтобы вычислить и удалить. операции > ну, вперед.
>

Дык, ключ не понятно как сгенерён.
Делаю:
select top 9230
* from MyTable
order by ID
выбирает нормально, меняю количество на 9231 - ошибка.

беру ключ последней записи выборки, делаю:
select * from MyTable
where ID
получаю ошибку

← →
sniknik © ( 2011-10-01 19:49 ) [8]

> получаю ошибку
естественно. ID Дык, ключ не понятно как сгенерён.
это ты непонятно как сгенерён. в школе учился?

сколько всего записей? допустим 1000, + допустим ID автоинкремент и соответствует порядку (для примера сойдет), т.е. первая 1 последняя 1000.

берем половину - 500
select * from MyTable where ID 500 работает?

допустим ошибка на втором запросе т.е. теперь первая 501 последняя 1000.

берем половину - 750
select * from MyTable where ID > 500 AND 750 работает?

и т.д. рекурсия блин. метод половинного деления.

← →
Фокс Йожин ( 2011-10-01 21:21 ) [9]


> сколько всего записей? допустим 1000, + допустим ID автоинкремент
> и соответствует порядку (для примера

1. Первичный ключ - символьный
2. LastKey - это последний ключ в выборке первых неглючных 9230 записей, select top 9230 * from . order by ID,
3. Половинное деление подходит, если глючный диапазон - один, а если внутри него есть живые диапазоны, чередующиеся с глючными?

← →
sniknik © ( 2011-10-01 22:16 ) [10]

> 1. Первичный ключ - символьный
и что? больше, меньше не работает? или половину рассчитать не можешь? ну так это не обязательно должна быть половина, дели по не предопределение количеству. всего то проблем больше итераций будет.

> 2. LastKey - это последний ключ в выборке первых неглючных 9230 записей, select top 9230 * from . order by ID
и что?
с order by и без порядок может быть разный.

> 3. Половинное деление подходит, если глючный диапазон - один, а если внутри него есть живые диапазоны, чередующиеся с глючными?

ну так сделай над собой усилие, и ищи в 2х-3-х диапазонах, в скольких понадобится, до записей.
вообще, тебе нужно восстановить или нет? может ну его нафиг, грохни базу и начни все сначала (символьный на искусственный ключ с автоинкрементом не забудь поменять).

← →
sniknik © ( 2011-10-01 22:26 ) [11]

Можно еще попробовать удалить ключи/индексы. на время.

← →
Фокс Йожин ( 2011-10-01 22:44 ) [12]


> sniknik © (01.10.11 22:16) [10]


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

Ничего не понял. Вот ключи из 16 символов: AAABBBCCCDD . 1345FF,
EEBBCCCDD . AA55C, и т.д. Как перебирать диапазоны?


> и что?
> с order by и без порядок может быть разный.

вычленил диапазон с помощью двух запросов select top N . order by ID и select top M . order by ID desc

Сохранил полученные ID во временную таблицу tmp_MyTable
Делаю delete form MyTable where ID not in (select ID from tmp_MyTable)
Т.е. удаляю все записи, кроме тех, что выбрались без ошибки.
Всё равно падает с ошибкой ввода-вывода.


> вообще, тебе нужно восстановить или нет? может ну его нафиг, грохни базу и начни все сначала (символьный
> на искусственный ключ с автоинкрементом не забудь поменять).
>
>

Нужно. База - 1С:УПП. Так что, ни о каких самодельных автоинкрементах не может быть и речи.

← →
sniknik © ( 2011-10-01 22:58 ) [13]

> перебирать диапазоны?
1 Всё равно падает с ошибкой ввода-вывода.
бл. ну что ты делаешь?
> Делаю delete form MyTable where ID not in (select ID from tmp_MyTable)
> Т.е. удаляю все записи, кроме тех, что выбрались без ошибки.
т.е. условие на перебор и сравнение со ВСЕМИ записям, т.е. чтение тех от которых падает (чтобы сравнить).

delete form MyTable where

← →
Фокс Йожин ( 2011-10-01 23:15 ) [14]


> sniknik © (01.10.11 22:58) [13]

Простой тест:
1. делаю
select
* from MyTable where

Выбирает 1 строчку

2. делаю
select
* from MyTable where ID >= 0xAEB0000E0C3BD80911DC4BE92724F491
and ID = "1" and _IDRRef

← →
Фокс Йожин ( 2011-10-01 23:18 ) [15]

select
* from ID where ID between "1" and "1"

Тоже падает с ошибкой ввода-вывода

← →
Фокс Йожин ( 2011-10-01 23:19 ) [16]


> Фокс Йожин (01.10.11 23:18) [15]
>
> select
> * from ID where ID between "1" and "1"
>
> Тоже падает с ошибкой ввода-вывода

Пардон:
select
* from MyTable where ID between "1" and "1"

Тоже падает с ошибкой ввода-вывода

← →
sniknik © ( 2011-10-01 23:34 ) [17]

> Т.е., падает вообще всегда, когда задаётся диапазон.
с 1 операцией больше, или меньше не падает? этого достаточно чтобы выбрать.

> Как же тогда перебирать половинным делением.
тебе предлагали вариант, а не панацею. что делать и зачем делать (искать глючные и удалить), не ищи как не работает ищи как РАБОТАЕТ. у каждого глюка может быть по своему.

p.s. а вообще сдай базу в контору какую нибудь по восстановлению, а то чую делов натворишь, еще хуже станет.

← →
Фокс Йожин ( 2011-10-01 23:45 ) [18]


> sniknik © (01.10.11 23:34) [17]


> с 1 операцией больше, или меньше не падает? этого достаточно
> чтобы выбрать.

падает


> p.s. а вообще сдай базу в контору какую нибудь по восстановлению,
> а то чую делов натворишь, еще хуже станет.

Они там, как правило, месяц держат. Да и не факт, что данные будут восстановлены.
Я, вот, хочу те данные,которые выбираются, сохранить в копию, а глючную таблицу дропнуть. Если после всего этого оборотно-сальдовая ведомость сойдётся, то можно сказать, баг пофиксен.

← →
sniknik © ( 2011-10-01 23:50 ) [19]

> Дополнительные сведения см. в журнале ошибок SQL Server и журнале системных событий.
?

← →
Фокс Йожин ( 2011-10-01 23:59 ) [20]


> sniknik © (01.10.11 23:50) [19]

пусто

← →
картман © ( 2011-10-02 03:03 ) [21]

попробуй курсором - а вдруг? или че-нть вроде:

declare @key varchar(скока-то там)

select top 1 @key = id from mytable order by id

while true
begin
select top 1
into new_table
from mytable
where id > @key
order by id

select top 1 @key = id from mytable where id>@id order by id

end;

← →
Anatoly Podgoretsky © ( 2011-10-02 10:41 ) [22]

> Фокс Йожин (01.10.2011 18:31:07) [7]

reindex сделал?

← →
Фокс Йожин ( 2011-10-02 13:20 ) [23]


> картман © (02.10.11 03:03) [21]

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


> Anatoly Podgoretsky © (02.10.11 10:41) [22]


> reindex сделал?

Сделал. И реструктуризацию тоже. Теперь вот логическую проверку средствами 1С запустил. Жду результата.

I am unable to attach example database mdf file. It gives me error 5133 though I can create new database without any problem. The error says " Directory lookup for the file "c:\program Files\Microsoft SQL Server\MSSQL11.MSSSQLSERVER\MSSQL\DATA\AdventureWorks2012_Log.ldf" failed with the operating system error 3 (the system cannot find the path specified). (Microsoft SQL Server, Error:5133)

Ответы

Balmukund Lakhani
Please mark solved if I've answered your question, vote for it as helpful to help other users find a solution quicker
--------------------------------------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights.
--------------------------------------------------------------------------------
My Blog | Team Blog | @Twitter | Facebook
Author: SQL Server 2012 AlwaysOn - Paperback, Kindle


Ошибки доступа к SQL серверу и базе данных

Для решения проблемы желательно настроить доступ к SQL серверу так, как описано в разделе "Сервер 1С:Предприятия и SQL-сервер".

Microsoft OLE DB Provider for SQL Server: Connection failure.
HRESULT=80004005, SQLSTATE=08501, native=0


Причиной ошибки могла послужить перезагрузка SQL сервера при работающем сервере 1С:Предприятия. При получении такой ошибки сервер 1С:Предприятия также нужно перезагрузить.

Microsoft OLE DB для SQL Server: [DBNMPNTW] ConnectionOpen(CreateFile()).
HRESULT=80004005, SQLSTATE=01000 native=1326


Во-первых, следует обратить внимание на идентификатор библиотеки, записанный в квадратных скобках. Список некоторых из них приведен ниже:

DBNETLIB - библиотека, используемая на клиенте SQL сервера для доступа к SQL-серверу по любому протоколу.


Microsoft OLE DB Provider for SQL Server: The database could not be exclusively locked to perform the operation. HRESULT=80040E14, HRESULT=80040E14, SQLSTATE=42000, native=5030

SELECT DISTINCT pr.hostname, pr.program_name, pr.hostprocess
FROM sysdatabases db
INNER JOIN sysprocesses pr
ON db.dbid = pr.dbid
WHERE db.name = 'TEST'

Особенности исполнения запросов SQL сервером

Причиной возникновения следующих ошибок являются особенности исполнения запросов SQL сервером Microsoft SQL Server 2000. Они могут проявляться либо при достижении недокументированных программных ограничений SQL сервера, либо в случае проявления на конкретном SQL запросе ошибок Microsoft SQL Server 2000. Такие ошибки встречаются достаточно редко. Свести вероятность их возникновения к минимуму можно лишь посредством тестирования разрабатываемых конфигураций в клиент-серверном варианте работы. Если при исполнении некоторого запроса встретилась подобная ошибка, то устранить ее обычно можно, переписав запрос несколько по-другому. Среди известных особенностей Microsoft SQL Server 2000 следующие:

Microsoft OLE DB Provider for SQL Server: Cannot perform an aggregate function on an expression containing an aggregate or a
subquery.
HRESULT=80040E14, SQLSTATE=42000, native=130


Выражение, вложенное в агрегатные функции или использованное в разделе СГРУППИРОВАТЬ ПО, содержит вложенные запросы. Начиная с 1С:Предприятия 8.0.9.32, данную ошибку диагностирует компилятор языка запросов.

Microsoft OLE DB provider for SQL Server: only text pointer are allowed in work tables, never text, ntext or image column. The query processor produced a query plan that reqied text, ntext or image column in work table.
HRESULT=80040E14, SQLSTATE=42000, native=8226


Ошибка возникает при построении планов некоторых запросов, включающих операцию объединения таблиц и вложенные запросы. Для ее предотвращения избегайте объединения полей типа Строка неограниченной длины с полями типа Строка ограниченной длины, если они являются результатами вложенных запросов. Платформа 1С:Предприятия, начиная с версии 8.0.11.3, обходит данную особенность SQL сервера, не накладывая никаких ограничений на пользовательские запросы.

Microsoft OLE DB Provider for SQL Server: SqlDumpExceptionHandler: Process 52 generated fatal exception c0000005
EXCEPTION_ACCESS_VIOLATION. SQL Server is terminating this process.
HRESULT=80040E14, SQLSTATE=42000, native=0


Эта ошибка может проявиться при исполнении некоторых достаточно сложных запросов. При получении такой ошибки необходимо несколько видоизменить запрос. Точно сформулировать условия, при которых возникает данная ошибка не представляется возможным.

Microsoft OLE DB Provider for SQL Server: Too many table names in the query. The maximum allowable is 256.
HRESULT=80040E14, SQLSTATE=42000, Native=106

Microsoft OLE DB Provider for SQL Server: ORDER BY items must appear in the select list if the statement contains a UNION operator.
HRESULT=80040E14, SQLSTATE=42000, native=104


Ошибка связана с неверным поведением SQL сервера при использовании запроса с операцией UNION в случае, если во вложенных запросах используется раздел ORDER BY совместно с ключевым словом TOP. Такой запрос будет построен, например, при выполнении следующего запроса 1С:Предприятия:

ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ Ссылка В ИЕРАРХИИ
(ВЫБРАТЬ ПЕРВЫЕ 1 Ссылка ИЗ Справочник.Номенклатура УПОРЯДОЧИТЬ ПО Код)


Для обхода данной ошибки необходимо избегать использования вложенных запросов с разделами "УПОРЯДОЧИТЬ ПО", если исходный запрос содержит операцию "ОБЪЕДИНИТЬ". Необходимо учитывать, что операция "ОБЪЕДИНИТЬ" используется неявно при вычислении операции сравнения "В ИЕРАРХИИ".

Microsoft OLE DB Provider for SQL Server: Warning: The query processor could not produce a query plan from the optimizer because the total length of all the columns in the GROUP BY or ORDER BY clause exceeds 8000 bytes. Resubmit your query without the ROBUST PLAN hint.
HRESULT=80040E14, SQLSTATE=42000, native=8618


Ошибка возникает при группировке записей и вычислении агрегатных функций, если группировка выполняется над результатом вложенного запроса и максимальная длина записи результата вложенного запроса превышает 4000 байт. Одной из причин возникновения такой ошибки является неправильное вычисление SQL сервером максимальной длины результата операции SUBSTRING над полем неограниченной длины. Например, максимальная длина значения функции ПОДСТРОКА(ДокументКемВыдан, 1, 200) будет равняться 4000 символов, а не 200 символам. Функция ПОДСТРОКА может использоваться таким образом, в частности, для приведения значения поля неограниченной длины к значению ограниченной длины. Рекомендуется в этом случае использовать вместо "ПОДСТРОКА(ДокументКемВыдан, 1, 200)" оператор "ВЫРАЗИТЬ(ДокументКемВыдан КАК СТРОКА(200))". Максимальная длина результата этого оператора "ВЫРАЗИТЬ" будет равна 200 символов, а не 4000, как у функции "ПОДСТРОКА".

Ошибки при выполнении операций над данными

Ошибки из этой группы возникают при выполнении запросов SQL сервером в случае, если значениями выражений оказываются данные, недопустимые для объявленных типов.

Microsoft OLEDB Provider for SQL Server: Adding a value to a 'datetime' column caused overflow. HRESULT=80040E07, SQLSTATE=22077, native=517


Возникает при выполнении функций над датами в том случае, если в качестве их результата получается слишком большая или слишком маленькая дата. Для Microsoft SQL Server 2000 минимально допустимой является дата 1 января 1753 года, а максимально допустимой - 31 декабря 9999 года.

Ошибки размещения базы данных

Microsoft OLE DB Provider for SQL Server: Could not allocate space for object '_AccumReg224NG' in database '. ' because the 'PRIMARY' filegroup is full. HRESULT=80004500, SQLSTATE=42000, native=1105

Ошибки исполнения транзакций

Microsoft OLE DB Provider for SQL Server: Transaction (Process ID 53) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
HRESULT=80004005, SQLSTATE=40001, native=1205

Microsoft OLE DB Provider for SQL Server: Lock request time out period expired.
HRESULT = 80040E31, SQLSTATE = HYT00, native = 1222

Я сделал резервную копию базы данных на диске с сервера, к которому у меня нет онлайн-доступа. Попытка восстановить базу данных на моей локальной машине, используя:

Я получаю следующую ошибку:

Кажется, он смотрит на диск D: сервер, на котором я скопировал резервную копию. Я попробовал ту же команду выше

Он также зависает со статусом Восстановление . Студия управления сервером MS, я также пытался CONTINUE_AFTER_ERROR до сих пор безрезультатно. любая помощь очень ценится

Читайте также: