В тази статия ще говорим за контролните точки на SQL Server.
За да подобри производителността, SQL Server прилага модификации към страниците на базата данни в паметта. Често тази памет се нарича буферен кеш или буферен пул. SQL Server не изтрива тези страници на диск след всяка промяна. Вместо това, механизмът на базата данни извършва операция на контролна точка във всяка база данни от време на време. КОНТРОЛНА ТОЧКА операцията записва мръсните страници (текущи модифицирани страници в паметта) и също така записва подробности за дневника на транзакциите.
SQL Server поддържа четири типа контролни точки:
1. Автоматично — Този тип контролни точки се появяват зад кулисите и зависят от конфигурациите на сървъра за интервал за възстановяване. Стойността се измерва в минути, а стойността по подразбиране е 1 минута (не може да бъде зададена по-ниска). Контролната точка ще завърши във времето, което минимизира въздействието върху производителността.
EXEC sp_configure 'recovery interval', 'seconds'
При модела за възстановяване SIMPLE автоматична контролна точка също се задейства, когато регистърът на транзакциите е пълен на 70%.
2. Непряко — Този тип контролни точки се появяват и зад кулисите според зададените от потребителя настройки за време за възстановяване на базата данни. Започвайки от SQL Server 2016 CTP2, стойността по подразбиране за този тип контролна точка е 1 минута. Това означава, че базата данни ще използва непреки контролни точки. За по-старите версии на SQL Server по подразбиране е 0. Това означава, че база данни ще използва автоматични контролни точки, чиято честота зависи от настройката на интервала за възстановяване на екземпляра на SQL Server. Microsoft препоръчва 1 минута за повечето системи.
ALTER DATABASE … SET TARGET_RECOVERY_TIME = target_recovery_time { SECONDS | MINUTES }
Когато задавате това, вземете предвид възможностите на основната I/O подсистема. Може да има смисъл да зададете това на по-ниско за по-бързи I/O подсистеми (например SSD). Бъдете внимателни, тази настройка се запазва чрез архивиране и възстановяване, така че възстановяването до по-бавен хардуер може да причини проблеми с производителността поради прекомерно натоварване на входно/изходно устройство.
3. Ръчно — Възниква при изпълнение на командата T-SQL CHECKPOINT.
CHECKPOINT [ checkpoint_duration ]
продължителност на контролната точка е цяло число, използвано за дефиниране на времето, през което една контролна точка трябва да завърши. Този параметър също така управлява колко ресурси са присвоени на операцията на контролната точка. Ако параметърът не е посочен, контролната точка ще завърши във времето, което минимизира въздействието върху производителността.
4. Вътрешен — Някои операции на SQL Server издават този тип контролни точки, за да гарантират, че дисковите изображения съответстват на текущото състояние на регистрационния файл на транзакциите. Това са контролни точки, които се изпълняват, когато се извършва определена операция:
- Добавя се или премахва файл с данни
- Възниква изключване на базата данни (по каквато и да е причина)
- Създава се резервно копие или моментна снимка на база данни
- Изпълнява се команда DBCC, която създава моментна снимка на скрита база данни (или напр. DBCC_CHECKDB, DBCC_CHECKTABLE).
Защо контролните точки са полезни?
Контролните точки намаляват времето за възстановяване при срив. Това се случва, защото страниците с файлове с данни не се записват на диска едновременно със записите в дневника. В паметта има страници с файлове с данни, които са по-актуални от страниците с файлове с данни на диска.
Контролните точки намаляват I/O към диска и подобряват производителността. Причината, поради която страниците с файлове с данни не се записват на диска в момента на извършване на транзакцията, е да се намали броят на I/O операции. Представете си няколкото хиляди транзакции UPDATE към една страница с данни. По-ефективно е да запишете страница с данни на диска само веднъж, по време на контролна точка, а не след всяка промяна.
Чисти и мръсни страници
Буферният пул поддържа редица страници с данни в паметта. Има два типа страници с данни:чисти имръсно . Чиста страница е тази, която не е променена, откакто е била последно прочетена от диск или записана на диск. Мръсна страница е страница, която е променена и промените не са записани на диска. Контролните точки се отнасят до „мръсни страници“.
Информацията за страницата може да се види с помощта на sys.dm_os_buffer_descriptors . Нека видим какво връща тази функция:
SELECT * FROM sys.dm_os_buffer_descriptors dobd; GO
Всяка страница има свързана с нея контролна структура, която проследява състоянието на страницата:
- База данни, която има datdabase_id 32767 е ресурсна база данни само за четене, която съдържа всички системни обекти.
- file_id , идентификатор_страница , идентификатор_единица_разпределение на която принадлежи тази страница.
- Какъв вид страница е:или страница с данни, или страница с индекс.
- Броят на редовете на страницата.
- Свободното място на страницата
- Дали страницата е мръсна или не
- Numa_node, към който принадлежи конкретната страница
- Малко информация за последно използвания алгоритъм
Нека обобщим тази информация по база данни, използвайки следния код:
SELECT *, [DirtyPageCount] * 8 / 1024 AS [DirtyPageMB], [CleanPageCount] * 8 / 1024 AS [CleanPageMB] FROM (SELECT (CASE WHEN ([database_id] = 32767) THEN N'Resource Database' ELSE DB_NAME([database_id]) END) AS [DatabaseName], SUM(CASE WHEN ([is_modified] = 1) THEN 1 ELSE 0 END) AS [DirtyPageCount], SUM(CASE WHEN ([is_modified] = 1) THEN 0 ELSE 1 END) AS [CleanPageCount] FROM sys.dm_os_buffer_descriptors GROUP BY [database_id]) AS [buffers] ORDER BY [DatabaseName] GO
Механизъм за контролна точка
Когато се появи контролната точка, тя записва всички мръсни страници на диска. Страниците, маркирани като мръсни, веднага след като имат някои промени. Няма значение дали транзакцията, която е направила промяната, е ангажирана или неангажирана към момента на контролната точка. След като страниците бъдат записани на диск, „мръсният“ бит се изчиства. Когато се появи контролната точка, се извършват следните действия:
- Нов запис в регистъра показва начало на контролна точка
- Допълнителни регистрационни записи се появяват с информация за контролна точка (като състоянието на регистъра на транзакциите в момента, когато контролната точка е стартирана)
- Всички мръсни страници се записват на диск
- Маркирайте LSN на контролната точка в страницата за зареждане на базата данни (в dbi_checkptLSN), това е критично за възстановяване при срив.
- Ако се използва SIMPLE модел за възстановяване, опитайте да изчистите регистрационния файл
- Последният запис в регистъра показва, че контролната точка е завършена
Възможно е контролните точки на множество бази данни да се появяват паралелно. SQL Server 2000 беше ограничен до една контролна точка в даден момент. Когато мениджърът на буфера напише страница, той търси съседни мръсни страници, които могат да бъдат включени в една операция събиране-запис. Също така, буферният пул ще се опита да се увери, че не претоварва I/O подсистемата. Той следи колко време отнема завършването на I/O. Ако латентността на запис надвиши 20 ms по време на контролната точка, тя се дроселира. По време на изключване прагът на дроселиране се увеличава до 100 ms. Тук можете да намерите по-подробно обяснение. Можете да използвате недокументирана опция за стартиране „-kXX“, за да зададете скоростта на входно/изходно управление на контролната точка на XX MB/s.
Когато страницата на файла с данни се записва на диск от контролна точка, записването напред гарантира, че всички регистрационни записи, засягащи тази страница, трябва първо да бъдат записани в регистъра на транзакциите на диска. Всички регистрационни записи до последния, който е засегнал страницата включително, се изписват, независимо от коя транзакция са част. Регистрационните записи се записват по три начина:
- Когато транзакция се извърши или прекъсне
- Когато страницата с файл с данни е записана на диск
- Когато блок на регистрационния файл достигне максималния размер от 60 КБ и приключи принудително
Запис в дневника на контролната точка
Контролните точки записват множество записи в регистъра на транзакциите:
- LOP_BEGIN_CKPT — означава, че контролната точка е започнала
- LOP_XACT_CKPT с NULL контекст (само ако има незаети транзакции по време на стартиране на контролната точка) — съдържа броя на незаети транзакции. Той също така изброява LSN на LOP_BEGIN_XACT регистрационните записи на незаети транзакции.
- LOP_BEGIN_CKPT с контекст LOP_BOOT_PAGE_CKPT (само за SQL Server 2012) — означава, че страницата за зареждане е актуализирана.
- LOP_END_CKPT — означава края на контролния пункт.
Наблюдение на контролни точки
Може да бъде полезно да се съпоставят контролните точки, възникващи с пикове в I/O, така че да могат да се правят промени в конкретната база данни (за I/O подсистемата), за да се облекчи I/O скокът, ако той претовари I/O подсистемата. Например, правене на по-чести, ръчни контролни точки или конфигуриране на по-нисък интервал за възстановяване на SQL Server 2012 с непреки контролни точки. Това ще доведе до по-постоянно I/O натоварване без високи пикове, които претоварват I/O подсистемата. Основната причина обаче може да е повече I/O, извършвани поради промяна някъде, така че не приемайте просто внезапно увеличаване на активността на контролните точки, без да разследвате защо се е случило.
Броячът на Buffer Manager/Checkpoint pages/sec не е специфичен за базата данни, така че идентифицирането на коя база данни е включена изисква флагове за проследяване или разширени събития.
Флаг за проследяване3502 записва съобщения в регистъра на грешките за коя контролна точка на базата данни се появява.
Флаг за проследяване 3504 записва по-подробна информация за това колко страници са били изписани и средната латентност при запис.
Тези следи флагове са безопасни за използване в производството за ограничен вар. Всичко, което правят, е да отпечатват съобщения в регистъра за грешки.
Ако искате да използвате разширени събития, можете да използвате две събития:checkpoint_begin и checkpoint_end.
Резюме
В тази статия говорихме за контролни точки в SQL Server — основният механизъм за записване на страници с файлове с данни на диск, след като са били променени.