Вы когда-нибудь задумывались о том, как сгенерировать ошибки RING_BUFFER_OOM в SQL Server? Ну, не ищите дальше! В этой статье мы рассмотрим несколько скриптов, которые можно использовать для генерации этих ошибок в таблице sys.dm_os_ring_buffers.
Настройка ошибок RING_BUFFER_OOM
Хорошим способом вызвать ошибки RING_BUFFER_OOM является использование ресурсного губернатора и ограничение памяти в экземпляре SQL Server. Следующий скрипт может быть использован для настройки этого сценария:
USE AdventureWorks
GO
DROP USER [MemoryError]
GO
USE [master]
GO
IF EXISTS (SELECT * FROM sys.sql_logins WHERE name = 'MemoryError')
DROP LOGIN [MemoryError]
GO
CREATE LOGIN [MemoryError] WITH PASSWORD=N'p@$$w0rd', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=ON, CHECK_POLICY=ON
GO
EXEC sys.sp_configure N'show advanced options', N'1' RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N'max server memory (MB)', N'50'
GO
RECONFIGURE WITH OVERRIDE
GO
CREATE FUNCTION [dbo].[rgMemoryErrorClassifier]()
RETURNS sysname
WITH SCHEMABINDING
AS
BEGIN
DECLARE @resource_pool sysname
IF SUSER_SNAME() = 'MemoryError'
SET @resource_pool = N'MemoryError'
ELSE
SET @resource_pool = 'default'
RETURN @resource_pool
END
GO
CREATE RESOURCE POOL [MemoryError] WITH(min_cpu_percent=0,
max_cpu_percent=100,
min_memory_percent=0,
max_memory_percent=1)
GO
CREATE WORKLOAD GROUP [MemoryError] WITH(group_max_requests=0,
importance=Medium,
request_max_cpu_time_sec=0,
request_max_memory_grant_percent=25,
request_memory_grant_timeout_sec=0,
max_dop=0) USING [MemoryError]
GO
ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = [dbo].[rgMemoryErrorClassifier]);
GO
ALTER RESOURCE GOVERNOR RECONFIGURE;
GO
USE AdventureWorks
GO
CREATE USER [MemoryError] FOR LOGIN [MemoryError]
GO
EXEC sp_addrolemember N'db_ddladmin', N'MemoryError'Генерация ошибок RING_BUFFER_OOM
Затем откройте новое окно запроса в SQL Server Management Studio и войдите под учетной записью [MemoryError], созданной в предыдущем скрипте. Выполните следующий скрипт для генерации ошибок RING_BUFFER_OOM:
USE AdventureWorks
GO
IF OBJECT_ID('dbo.BigTable') IS NOT NULL
DROP TABLE dbo.BigTable;
GO
WITH
l0 AS (select 0 AS c union all select 0),
l1 AS (select 0 AS c from l0 as a cross join l0 as b),
l2 AS (select 0 AS c from l1 as a cross join l1 as b),
l3 AS (select 0 AS c from l2 as a cross join l2 as b),
l4 AS (select 0 AS c from l3 as a cross join l3 as b),
l5 AS (select 0 AS c from l4 as a cross join l4 as b),
nums as (select row_number() over(order by (select null)) as n from l5)
SELECT TOP (100000000) *, NEWID() AS ID, GETDATE() AS Today, n % 100000 AS SampleColumn
INTO BigTable
FROM nums
ORDER BY nПочти сразу вы должны увидеть ошибку RING_BUFFER_OOM.
Очистка ошибок RING_BUFFER_OOM
После генерации ошибок важно очистить среду. Используйте следующий скрипт, чтобы вернуть все обратно:
IF EXISTS(SELECT * FROM sys.resource_governor_workload_groups WHERE name = 'MemoryError')
DROP WORKLOAD GROUP [MemoryError]
GO
IF EXISTS(SELECT * FROM sys.resource_governor_resource_pools WHERE name = 'MemoryError')
DROP RESOURCE POOL [MemoryError]
GO
ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = NULL);
GO
ALTER RESOURCE GOVERNOR RECONFIGURE;
GO
ALTER RESOURCE GOVERNOR DISABLE;
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[rgMemoryErrorClassifier]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[rgMemoryErrorClassifier]
GO
EXEC sys.sp_configure N'show advanced options', N'1' RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N'max server memory (MB)', N'2048'
GO
RECONFIGURE WITH OVERRIDE
GOВыполнив вышеуказанный скрипт, вы очистите ошибки RING_BUFFER_OOM и восстановите экземпляр SQL Server в его исходное состояние.
Заключение
В этой статье мы рассмотрели, как сгенерировать ошибки RING_BUFFER_OOM в SQL Server. Используя ресурсный губернатор и ограничение памяти, мы смогли симулировать эту ошибку и понять, как она может повлиять на систему. Важно отметить, что генерацию этих ошибок следует выполнять только в контролируемой среде и только в целях тестирования.