Помилка під час перегляду запиту на блокування запиту. Помилка під час спроби бачити Ієрархії БД


17

У мене проблеми з базою даних.

  1. Я можу запускати основні запити, хоча і набагато повільніше, ніж зазвичай.

  2. Коли я намагаюсь переглянути дерева ієрархії таблиць, представлень чи процедур у SSMS Object Explorer, я отримую lock request time out period exceeded.

  3. Мої звіти SSRS, які працюють на об'єктах у цій базі даних, більше не завершуються.

  4. Завдання, пов'язані з процедурами, що зберігаються в цій базі даних, також не виконуються.

Я намагався sp_who2знайти і вбити всі з'єднання в базі даних, однак це не вирішило проблему.

Що тут відбувається? Як я можу це вирішити?


Також дивіться: stackoverflow.com/questions/12167570/… ; не впевнений, чи вважається це дублікатом чи ні.
LittleBobbyTables - Au Revoir

На основі Вашого коментаря до моєї відповіді нижче, я думаю, вам потрібно надати набагато більше інформації. Який розмір сервера чи ви спостерігали за його лічильниками продуктивності, чи заміняється він на диск чи іншим чином голодує ресурс. Будьте впевнені, що насправді перевірте вище, а не просто припускаєте нічого. Далі, чи трапляється це, коли ви підключаєтесь, віддаляючись на робочий стіл? Чи проблема виникає лише під час доступу з одного місця? Яка погода в мережі для цього сервера (і ваше з'єднання з ним)?
NotMe

3
Здається, у вас є відкриті транзакції, які блокують доступ для читання до таблиць.
a_horse_with_no_name

Відповіді:


11

Це було викликано вічним відказом транзакції. Довелося врешті перезапустити мій кластер сервера


2
Перезапуск служби вирішив це для мене.
HerrimanCoder

Перезапуск у такій ситуації може призвести до відновлення бази даних
MaazKhan47

dbcc opentran скаже вам, чи є відкриті транзакції
Нейт Андерсон

Мені здається дивним, що під час запуску транзакції я не можу розширити розділ таблиць, наприклад. Ніяких даних, читання DDL, нічого, лише список таблиць.
gerleim

5

За винятком розгляду програмного забезпечення, можливо, вам потрібно запустити скрипт, щоб перевірити, що таке діяльність, що стримує SQL-сесію. Одним із поширених сценаріїв є не використання Implicit transactions Optionв студії управління SQL Server.


Привіт, турбо, чи можете ви детальніше розглянути те, що ви пропонуєте?

Схоже, що, хоча це не повністю пояснено, це може бути кращою відповіддю, постійним відказом транзакцій, які не відмовляються, і активовані лише через неявні транзакції.
КонстантинК

оглядаючись на запитання, я не можу сказати, що це повинен бути вічний відкат транзакції. Судячи з того, що locking request time out period exceedя б сказав, біг implicit transaction optionдав би краще зрозуміти причини.
Турбот

Інструменти / Параметри / Виконання запитів / SQL Server / ANSI / SET IMPLICIT TRANSACTIONS
Tadej

3

Цю проблему я отримав, коли почав явну транзакцію, в якій створив таблицю в tempdb зі скрипту, який працює в іншій базі даних (не tempdb). Коли я здійснив транзакцію, фіксація, здавалося, не звільнила замок на створеній мною таблиці в tempdb.

Завдяки цій сторінці я USEd tempdb і виконав DBCC OPENTRANі отримав SPID з'єднання з tempdb, що викликало блокування. Тоді я KILL <SPID number>його вбиваю.

Не дуже витончено, і я втратив всю інформацію в таблиці, яку я створив у tempdb, але це було нормально в моєму випадку.


У нашому випадку командою DML (переглядання перегляду) була видана база даних againt, використовуючи SET IMPLICIT TRANSACTIONS ON без COMMIT TRANSACTION , що випадково спричинило тривалу транзакцію. Використання DBCC OPENTRAN допомогло швидко простежити цю проблему.
Хуліо Нобре

1

Є так багато речей, це може бути те, що все, що я можу запропонувати, - це декілька питань, які допоможуть вам надати відповідь.

  1. Чи БД на сервері призначений для просто запуску SQL Server? Якщо ні, то інші процеси можуть заважати, викрадаючи дорогоцінний час процесора.

  2. Чи сервер БД по суті не має пам'яті? SQL Server намагатиметься виділити кожен байт, який він може, але якщо він є потужним і ваші запити потребують завантаження більшої кількості даних, то він повинен відмовитися від використання віртуальної пам’яті, що кардинально збільшує кількість часу, яке можуть зайняти навіть прості запити.

  3. Чи пропускна здатність мережі сервера БД невелика, щоб вчасно обробляти передачу даних?


Зрештою, це здається, що машина, на якій ви розміщуєте сервер SQL Server, недостатня для того, що ви намагаєтеся зробити. Цілком можливо, що ви нарешті досягли тих апаратних меж, коли продуктивність кардинально знижується. Якщо це так (вищезазначені питання допоможуть вам визначити це), тоді ви захочете перемістити БД на сервер, який має належний розмір для кількості даних (та запитів), які ви намагаєтеся обробити.

Це може означати використання більш швидких процесорів, швидших дисків або просто встановлення більшої кількості оперативної пам'яті.


Це не апаратне питання. Кластер серверів розміщує кілька баз даних. Це єдина база даних, яка має проблеми

@LloydBanks: Це не означає, що це не апаратна проблема. Якщо у мене є 2 бази даних, одна розміром 20 ГБ із високою швидкістю транзакцій, а друга - 1 ГБ із меншою швидкістю транзакцій, тоді я очікую, що 1 Гб буде замінено на віртуальну пам'ять; що збільшило б кількість запитів. Якщо 20 Гб дБ вдарився досить сильно, це може призвести до проблем з підключенням до меншого.
NotMe

1

"Коли я намагаюся переглянути дерева ієрархії для таблиць, представлень або процедур у Провіднику об'єктів SSMS, я отримую перевищення періоду часу запиту блокування."

У мене було саме таке питання. Я перейшов до вікна виконання запиту і; набраний та виконаний ROLLBACKоператор.

Схоже, деякі серії заяв, які я виконував до цього, проводили відкриту транзакцію. Зокрема, тому що деякі з них, де є заяви DDL. Як тільки я видав відкат, ієрархії об'єктів почали працювати.


0

Як багато хто вже зазначав, зазвичай трапляється тривала транзакція, здебільшого викликана моєю пропущеною функцією SET IMPLICIT TRANSACTIONS ON, яку взагалі не слід використовувати. Щоб зрозуміти, чому перегляньте глибоку статтю Брента Озара

У будь-якому випадку ви можете отримати список довготривалих відкладених транзакцій, скориставшись наступним запитом.

SELECT
    [s_tst].[session_id],
    [s_es].[login_name] AS [Login Name],
    DB_NAME (s_tdt.database_id) AS [Database],
    [s_tdt].[database_transaction_begin_time] AS [Begin Time],
    [s_tdt].[database_transaction_log_bytes_used] AS [Log Bytes],
    [s_tdt].[database_transaction_log_bytes_reserved] AS [Log Rsvd],
    [s_est].text AS [Last T-SQL Text],
    [s_eqp].[query_plan] AS [Last Plan]
FROM
    sys.dm_tran_database_transactions [s_tdt]
JOIN
    sys.dm_tran_session_transactions [s_tst]
ON
    [s_tst].[transaction_id] = [s_tdt].[transaction_id]
JOIN
    sys.[dm_exec_sessions] [s_es]
ON
    [s_es].[session_id] = [s_tst].[session_id]
JOIN
    sys.dm_exec_connections [s_ec]
ON
    [s_ec].[session_id] = [s_tst].[session_id]
LEFT OUTER JOIN
    sys.dm_exec_requests [s_er]
ON
    [s_er].[session_id] = [s_tst].[session_id]
CROSS APPLY
    sys.dm_exec_sql_text ([s_ec].[most_recent_sql_handle]) AS [s_est]
OUTER APPLY
    sys.dm_exec_query_plan ([s_er].[plan_handle]) AS [s_eqp]
where [s_tdt].[database_transaction_begin_time] is not null
ORDER BY
    [Begin Time] ASC;

https://www.brentozar.com/archive/2018/02/set-implicit_transaction-one-hell-bad-idea/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.