Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 sys.dm_os_buffer_descriptors возвращает несуществующий db_id  [new]
Fedor_new_S
Guest
Обнаружил вот такую ерунду. sys.dm_os_buffer_descriptors возвращает строки для db_id который реально не сущесвует в sys.databases. При этом db_name возвращает имя БД, которая в sys.databases проходит под другим db_id.

Смотрите запросы и результаты ниже. Что это за ерунда такая?
Что жрет мои ресурсы?

Microsoft SQL Server 2008 R2 (SP3) - 10.50.6000.34 (X64)
Aug 19 2014 12:21:34
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

1.
select top 100 * from sys.dm_os_buffer_descriptors where database_id = 13
---

database_id file_id page_id page_level allocation_unit_id page_type row_count free_space_in_bytes is_modified numa_node
----------- ----------- ----------- ----------- -------------------- ------------------------------------------------------------ ----------- ------------------- ----------- -----------
13 3 5586913 0 72057614643757056 DATA_PAGE 29 1948 0 1
13 3 1564344 0 72057621137915904 DATA_PAGE 22 153 0 0
13 4 2205276 0 72057610963058688 DATA_PAGE 66 110 0 1

----
2.
----
select * from sys.databases where database_id = 13
---
(0 row(s) affected)
---

3.
SELECT DB_name (13)
---
AN_MAIN

(1 row(s) affected)
---
4. (Имя реальной базы, которая существует)
SELECT DB_name (9)
---
AN_MAIN

(1 row(s) affected)
27 окт 16, 13:42    [19828206]     Ответить | Цитировать Сообщить модератору
 Re: sys.dm_os_buffer_descriptors возвращает несуществующий db_id  [new]
o-o
Guest
в одном окне выведите содержимое страницы 5586913 базы с id = 9:
DBCC TRACEON (3604);
DBCC PAGE (9, 3, 5586913, 3);

в другом окне содержимое той же страницы, но из базы 13:
DBCC PAGE (13, 3, 5586913, 3);

интересно, одно и то же или нет?
27 окт 16, 17:40    [19829987]     Ответить | Цитировать Сообщить модератору
 Re: sys.dm_os_buffer_descriptors возвращает несуществующий db_id  [new]
Владислав Колосов
Member

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

сейчас окажется, что это были разные серверы.
27 окт 16, 18:02    [19830078]     Ответить | Цитировать Сообщить модератору
 Re: sys.dm_os_buffer_descriptors возвращает несуществующий db_id  [new]
ппп-пп
Guest
Владислав Колосов
o-o,

сейчас окажется, что это были разные серверы.


Не окажется. Вам же привели запросы, которые выполнялись даже в одной сессии. И смотрели на них много людей.
Через 2 часа ситуация магическим образом пофиксилась. При этом даже ребута сервера не было.
Вот такая вот потерянная БД.
27 окт 16, 18:13    [19830112]     Ответить | Цитировать Сообщить модератору
 Re: sys.dm_os_buffer_descriptors возвращает несуществующий db_id  [new]
o-o
Guest
ппп-пп,
А это вас двое разных пишет, или один?
У меня была идея типа детачили/аттачили базу,
потому что 9 <13,
если базу с ид 13 детачить, и при этом нет базы с ид 9 (дропнули давно)
база приаттачится с новым ид,
с первым незанятым,
например 9, если именно 9ой базы нет.
Только при аттаче буферы памяти со страницами отдетаченной базы сразу считаются свободными.
Но вот мало ли, вдруг переглючило чего...
27 окт 16, 18:38    [19830182]     Ответить | Цитировать Сообщить модератору
 Re: sys.dm_os_buffer_descriptors возвращает несуществующий db_id  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31822
Fedor_new_S
Смотрите запросы и результаты ниже.
А смотрите под кем, под sa?
AUTO_CLOSE у базы не установлен?
И SELECT DB_name делайте с конкатенацией каких нибудь символов. Может, там имя с пробелом, табуляцией или переводом строки?
27 окт 16, 18:57    [19830244]     Ответить | Цитировать Сообщить модератору
 Re: sys.dm_os_buffer_descriptors возвращает несуществующий db_id  [new]
ппп-пп
Guest
alexeyvg,

1. Все смотрелось под account, который является sysadmin.
2. Все запросы указанные в первом посте используют вообще db_id, так что не совсем понятна логика с пробелами и скрытыми символами.
3. Про autoclose пока ничего не скажу, но ведь он влиять на db_id не должен.
27 окт 16, 19:04    [19830283]     Ответить | Цитировать Сообщить модератору
 Re: sys.dm_os_buffer_descriptors возвращает несуществующий db_id  [new]
o-o
Guest
Фигня, простите, про autoclose.
Надо искать детач.
Пока не могу придумать других вариантов,
чтобы ид базы поменялось.
Чтобы у кучи страниц вдруг внезапно байтик поменялсч и вместо 9 стал 13 показывать, не поверю.
Да и db_name же находил базу по ид, значит 13 существовало как ид
27 окт 16, 19:19    [19830346]     Ответить | Цитировать Сообщить модератору
 Re: sys.dm_os_buffer_descriptors возвращает несуществующий db_id  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31822
ппп-пп
3. Про autoclose пока ничего не скажу, но ведь он влиять на db_id не должен.

o-o
Пока не могу придумать других вариантов,
Я рассматриваю так же случай, когда не "меняется id", а есть ещё одна база с другим id.
И её не видно в sys.databases , но видно в DB_name
И вот в этом контексте autoclose упоминается в справке по sys.databases.
o-o
чтобы ид базы поменялось.
Чтобы у кучи страниц вдруг внезапно байтик поменялсч и вместо 9 стал 13 показывать, не поверю.
А что бы это проверить, действительно нужно было бы выполнить DBCC PAGE с обоими ИД. Вот тогда было бы понятно, это меняется ИД, или есть 2 базы.
27 окт 16, 20:28    [19830560]     Ответить | Цитировать Сообщить модератору
 Re: sys.dm_os_buffer_descriptors возвращает несуществующий db_id  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31822
ппп-пп
2. Все запросы указанные в первом посте используют вообще db_id, так что не совсем понятна логика с пробелами и скрытыми символами.
Так "запросы указанные в первом посте" не противоречат гипотизе существования двух баз.
И логика с пробелами тут простая: в запросах:
SELECT DB_name (13)
SELECT DB_name (9)
вы же не можете сказать, возвращают они одинаковое имя или разное? Вот я это и предлагал проверить.
27 окт 16, 20:31    [19830573]     Ответить | Цитировать Сообщить модератору
 Re: sys.dm_os_buffer_descriptors возвращает несуществующий db_id  [new]
o-o
Guest
alexeyvg
И SELECT DB_name делайте с конкатенацией каких нибудь символов. Может, там имя с пробелом, табуляцией или переводом строки?

не надо было вообще глазками сравнивать,
кодом надо:
select case when DB_NAME(9) = DB_NAME(13) then 'the same' else 'different' end

но я думаю, они там в курсе, есть ли у них базы с похожими именами,
где все латиницей, а "А", например, кириллицей.
поэтому я ищу объяснение смене id базы.

что можно сделать сейчас, когда уже страницы не посмотреть?
можно на другом сервере мастер за вчера восстановить
и посмотреть, как там дела с базами с id 9 и 13
27 окт 16, 21:21    [19830691]     Ответить | Цитировать Сообщить модератору
 Re: sys.dm_os_buffer_descriptors возвращает несуществующий db_id  [new]
Fedor_new_S
Guest
Добрый день!
Вчера, фантомная база просто взяла и исчезла так же неожиданно как и появилась.
Сегодня утром она вернулась.
Было опять запущено sys.dm_os_buffer_descriptors, взята страница, загруженая и 13й и 9й(реальной).
Результаты DBCC PAGE
-----
BUF @0x0000000CB7FD2040

bpage = 0x0000000CB7856000 bhash = 0x0000000000000000 bpageno = (3:213844)
bdbid = 9 breferences = 3 bcputicks = 0
bsampleCount = 0 bUse1 = 46755 bstat = 0xc20009
blog = 0x21212159 bnext = 0x0000000000000000
-----
BUF @0x00000016AEFDAE00

bpage = 0x00000016AE9D0000 bhash = 0x0000000000000000 bpageno = (3:213844)
bdbid = 13 breferences = 0 bcputicks = 0
bsampleCount = 0 bUse1 = 46743 bstat = 0xc20009
blog = 0x59ca2159 bnext = 0x0000000000000000
--------------------

Сами данные одинаковые.

На дисках файлов для 13й нет. База весит около 130 гб, и я бы заметил лишние 130 гб =)
sys.sysfiles про 13ю тоже ничего не знает.

Копаем дальше.
Джойним на sys.dm_os_buffer_descriptors следующее (sys.partitions, sys.allocation_units, sys.objects, sys.indexes)
И находим, что в память грузятся реальные объекты из 9ки (индексы и таблицы). Причем грузится ВСЕ подряд. Даже холодные индексы которые используются раз в месяц и 9ка их не грузит! а 13я - все подряд. Причем прямо сейчас на оригинальной 9ке активность нулевая. Но 13ка продолжает грузить в память все подряд...

---
Данный запрос
select case when DB_NAME(9) = DB_NAME(13) then 'the same' else 'different' end
отвечает the same.
28 окт 16, 11:27    [19832485]     Ответить | Цитировать Сообщить модератору
 Re: sys.dm_os_buffer_descriptors возвращает несуществующий db_id  [new]
o-o
Guest
еррорлог что пишет про эту базу?
(база одна и та же, теперь это ясно, а вот почему он ее "задваивает", это интересно)
какие вообще о ней упоминания?
xp_readerrorlog 0,1,'AN_MAIN'
28 окт 16, 11:43    [19832614]     Ответить | Цитировать Сообщить модератору
 Re: sys.dm_os_buffer_descriptors возвращает несуществующий db_id  [new]
Fedor_new_S
Guest
Шизофрения прогрессирует.
Сервер забил все 100% оперативки доступной ему, фантомной базой... и она исчезла как вчера.
НО
под 13 номером появился клон 5й базы =)
Так как 5я база весит пару гигов, клон загрузился в память полностью и исчез так же как и клон 9ки!
5я база - это база ReportServer$...., репозиторий репорт сервера. На ней нет ни бэкапов, ни репликации, ничего вообще.

Логи чистые. Как Виндовые, так и серверные
28 окт 16, 11:57    [19832695]     Ответить | Цитировать Сообщить модератору
 Re: sys.dm_os_buffer_descriptors возвращает несуществующий db_id  [new]
o-o
Guest
набазу навесить временный аудит (database audit), на селект в том числе.
кто-то же запрашивает эти страницы,
хотя вы и считаете, что никто
28 окт 16, 12:05    [19832747]     Ответить | Цитировать Сообщить модератору
 Re: sys.dm_os_buffer_descriptors возвращает несуществующий db_id  [new]
Fedor_new_S
Guest
Активность по индексам из 13й равна нулю (DM_DB_INDEX_USAGE_STATS не видит никакой активности в том числе).
Но в следующий раз попробую успеть включить трэйс по 13 базе.
По хорошему надо сервак ребутнуть... но такой возможности пока что нет.
Спасибо!
28 окт 16, 12:28    [19832904]     Ответить | Цитировать Сообщить модератору
 Re: sys.dm_os_buffer_descriptors возвращает несуществующий db_id  [new]
invm
Member

Откуда: Москва
Сообщений: 9687
Fedor_new_S, похоже у вас запускается dbcc checkdb последовательно для всех БД. А dbcc checkdb для своей работы создает снепшот проверяемой БД. Вот вам и фантом.
28 окт 16, 12:37    [19832957]     Ответить | Цитировать Сообщить модератору
 Re: sys.dm_os_buffer_descriptors возвращает несуществующий db_id  [new]
o-o
Guest
так надо базу опросить на предмет последнего удачного dbcc checkdb:
dbcc dbinfo with tableresults

dbi_dbccLastKnownGood
28 окт 16, 13:22    [19833327]     Ответить | Цитировать Сообщить модератору
 Re: sys.dm_os_buffer_descriptors возвращает несуществующий db_id  [new]
o-o
Guest
но вообще неужто в активных сессиях не видно было dbcc checkdb?
куда они смотрели-то, когда заявили, что базу никто не использует?
28 окт 16, 13:25    [19833338]     Ответить | Цитировать Сообщить модератору
 Re: sys.dm_os_buffer_descriptors возвращает несуществующий db_id  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
invm
Fedor_new_S, похоже у вас запускается dbcc checkdb последовательно для всех БД. А dbcc checkdb для своей работы создает снепшот проверяемой БД. Вот вам и фантом.

детектив разрешился :)
28 окт 16, 13:33    [19833404]     Ответить | Цитировать Сообщить модератору
 Re: sys.dm_os_buffer_descriptors возвращает несуществующий db_id  [new]
ппп-пп
Guest
invm
Fedor_new_S, похоже у вас запускается dbcc checkdb последовательно для всех БД. А dbcc checkdb для своей работы создает снепшот проверяемой БД. Вот вам и фантом.


СПАСИБО. Первый логичный комментарий. Эффект воспроизвелся. Вот и верь документации Microsoft.

https://msdn.microsoft.com/en-us/library/ms173442.aspx

From To On Relationship
sys.dm_os_buffer_descriptors sys.databases database_id many-to-one
28 окт 16, 13:39    [19833463]     Ответить | Цитировать Сообщить модератору
 Re: sys.dm_os_buffer_descriptors возвращает несуществующий db_id  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
ппп-пп
invm
Fedor_new_S, похоже у вас запускается dbcc checkdb последовательно для всех БД. А dbcc checkdb для своей работы создает снепшот проверяемой БД. Вот вам и фантом.


СПАСИБО. Первый логичный комментарий. Эффект воспроизвелся. Вот и верь документации Microsoft.

https://msdn.microsoft.com/en-us/library/ms173442.aspx

From To On Relationship
sys.dm_os_buffer_descriptors sys.databases database_id many-to-one

и в чём там мелкомягкий обманул вас??? db_id новый
28 окт 16, 13:43    [19833496]     Ответить | Цитировать Сообщить модератору
 Re: sys.dm_os_buffer_descriptors возвращает несуществующий db_id  [new]
o-o
Guest
а какие претензии к документации, кто понял?
и как можно чекдб не заметить-то?
он же берет страницы базы, база та самая,
но т.к. ему нужен консистентный вид базы, то да, делает снэпшот.
а ид у снэпшота разумеется другой,
и в sys.databases его нет, т.к. это *скрытый* снэпшот.
не нравится чекдб со снэпшотом, делайте с таблоком
28 окт 16, 13:49    [19833541]     Ответить | Цитировать Сообщить модератору
 Re: sys.dm_os_buffer_descriptors возвращает несуществующий db_id  [new]
ппп-пп
Guest
o-o
а какие претензии к документации, кто понял?
и как можно чекдб не заметить-то?
он же берет страницы базы, база та самая,
но т.к. ему нужен консистентный вид базы, то да, делает снэпшот.
а ид у снэпшота разумеется другой,
и в sys.databases его нет, т.к. это *скрытый* снэпшот.
не нравится чекдб со снэпшотом, делайте с таблоком


Я же привел табличку и ссылку. Там написано, что database_id берется из sys.databases (many to one - relation).
Как видите, оттуда она не берется.
28 окт 16, 13:53    [19833579]     Ответить | Цитировать Сообщить модератору
 Re: sys.dm_os_buffer_descriptors возвращает несуществующий db_id  [new]
o-o
Guest
ппп-пп
o-o
а какие претензии к документации, кто понял?
и как можно чекдб не заметить-то?
он же берет страницы базы, база та самая,
но т.к. ему нужен консистентный вид базы, то да, делает снэпшот.
а ид у снэпшота разумеется другой,
и в sys.databases его нет, т.к. это *скрытый* снэпшот.
не нравится чекдб со снэпшотом, делайте с таблоком


Я же привел табличку и ссылку. Там написано, что database_id берется из sys.databases (many to one - relation).
Как видите, оттуда она не берется.

у меня даже поиском на sys.databases по той странице не находится.
процитируюте не устраивающий вас кусок.
в таблице я вижу такое:
database_id int ID of database associated with the page in the buffer pool. Is nullable.
ну и?
со снэпшотом ассоциирован ид 13 (ID of database associated with the page in the buffer pool), что, не так?
где написано, что он есть в sys.databases?
28 окт 16, 14:06    [19833658]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить