Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Versión original del producto: SQL Server 12 y versiones posteriores
Síntoma
Considere el caso siguiente:
- Instaló una instancia con una intercalación mediante caracteres complementarios para la base de datos del sistema en SQL Server.
- Ha configurado el almacenamiento de datos de administración (MDW) y la recopilación de datos.
En este escenario, cuando los paquetes de SQL Server Integration Services (SSIS) creados por la ejecución de recopilación de datos, encontrará que la base de datos MSDB crece inesperadamente.
Nota:
Ese tipo de nombre de intercalación termina con _SC, por ejemplo, Latin1_General_100_CI_AS_SC.
Cada 10 segundos, los siguientes 11 mensajes de advertencia se insertan en la tabla del msdb.dbo.sysssislog sistema:
Puede producirse un truncamiento debido a la recuperación de datos de la columna de base de datos "task_state" con una longitud de 20 a la columna de flujo de datos "task_state" con una longitud de 10.
Puede producirse un truncamiento debido a la recuperación de datos de la columna de base de datos "request_status" con una longitud de 30 a la columna de flujo de datos "request_status" con una longitud de 15.
Puede producirse un truncamiento debido a la recuperación de datos de la columna de base de datos "session_status" con una longitud de 30 a la columna de flujo de datos "session_status" con una longitud de 15.
Puede producirse un truncamiento debido a la recuperación de datos de la columna de base de datos "host_name" con una longitud de 40 a la columna de flujo de datos "host_name" con una longitud de 20.
Puede producirse un truncamiento debido a la recuperación de datos de la columna de base de datos "program_name" con una longitud de 100 a la columna de flujo de datos "program_name" con una longitud de 50.
Puede producirse un truncamiento debido a la recuperación de datos de la columna de base de datos "login_name" con una longitud de 60 a la columna de flujo de datos "login_name" con una longitud de 30.
Puede producirse un truncamiento debido a la recuperación de datos de la columna de base de datos "wait_type" con una longitud de 60 a la columna de flujo de datos "wait_type" con una longitud de 45.
Puede producirse un truncamiento debido a la recuperación de datos de la columna de base de datos "last_wait_type" con una longitud de 60 a la columna de flujo de datos "last_wait_type" con una longitud de 45.
Puede producirse un truncamiento debido a la recuperación de datos de la columna de base de datos "wait_resource" con una longitud de 100 a la columna de flujo de datos "wait_resource" con una longitud de 50.
Puede producirse un truncamiento debido a la recuperación de datos de la columna de base de datos "resource_description" con una longitud de 280 a la columna de flujo de datos "resource_description" con una longitud de 140.
Las columnas externas para ODS: obtener instantáneas de dm_exec_requests no están sincronizadas con las columnas del origen de datos. Es necesario actualizar la columna externa "task_state". Es necesario actualizar la columna externa "request_status". Es necesario actualizar la columna externa "session_status". Es necesario actualizar la columna externa "host_name". Es necesario actualizar la columna externa "program_name". Es necesario actualizar la columna externa "login_name". Es necesario actualizar la columna externa "wait_type". La columna externa "last_wait_type" debe actualizarse. Es necesario actualizar la columna externa "wait_resource". Es necesario actualizar la columna externa "resource_description".
Como resultado, la msdb.dbo.sysssislog tabla crece una página (8 KB) cada 10 segundos. El impacto en el espacio en disco es:
- 2,8 MB por hora (8 KB x 6 x 60)
- 67,5 MB al día (8 KB x 6 x 60 x 24)
- 1,97 GB al mes (8 KB x 6 x 60 x 24 x 30)
Causa
Las intercalaciones que usan caracteres complementarios cambiarán el tamaño de algunas columnas de vista de administración dinámica (DMV). La herramienta Recopilador de datos captura el contenido de algunas DMV, por ejemplo sys.dm_exec_requests, y agrega los resultados a la base de datos MDW mediante paquetes SSIS. En estos paquetes SSIS, los tamaños de columna se predefinin en función del tamaño de las columnas para intercalaciones sin usar caracteres adicionales. Cuando se ejecutan los paquetes, se devuelve un mensaje de advertencia para cada columna cuyo tamaño es mayor que el tamaño predefinido y se agrega a la msdb.dbo.sysssislog tabla.
Nota:
Estos mensajes de advertencia no afectan a la inserción de datos reales de la DMV en la tabla de recopilación de datos.
Más información
El proceso de recopilación de datos recopila los metadatos del primer conjunto de resultados al llamar a sp_syscollector_snapshot_dm_exec_requests. El siguiente script sql es un ejemplo:
exec [sys].sp_describe_first_result_set N'EXEC [msdb].[dbo].[sp_syscollector_snapshot_dm_exec_requests] 5',NULL,1
Esta llamada devuelve resultados diferentes en función de la intercalación, usando caracteres complementarios o no:
Instancia con una intercalación que no usa caracteres adicionales:
Nota:
Para mayor claridad, solo se muestran las filas y columnas afectadas.
Índice de columna nombre Is nullable Type_id del sistema Type_name del sistema Longitud máxima Nombre de intercalación 11 task_state 1 231 nvarchar(10) 20 SQL_Latin1_General_CP1_CI_AS 12 request_status 1 231 nvarchar(15) 30 SQL_Latin1_General_CP1_CI_AS 13 session_status 1 231 nvarchar(15) 30 SQL_Latin1_General_CP1_CI_AS ... 17 host_name 1 231 nvarchar(20) 40 SQL_Latin1_General_CP1_CI_AS 18 program_name 1 231 nvarchar(50) 100 SQL_Latin1_General_CP1_CI_AS 19 login_name 1 231 nvarchar(30) 60 SQL_Latin1_General_CP1_CI_AS 20 wait_type 1 231 nvarchar(45) 90 SQL_Latin1_General_CP1_CI_AS 21 last_wait_type 1 231 nvarchar(45) 90 SQL_Latin1_General_CP1_CI_AS 22 wait_duration_ms 0 127 bigint 8 NULL 23 wait_resource 1 231 nvarchar(50) 100 SQL_Latin1_General_CP1_CI_AS 24 resource_description 1 231 nvarchar(140) 280 SQL_Latin1_General_CP1_CI_AS Instancia con una intercalación que usa caracteres adicionales:
Nota:
Para mayor claridad, solo se muestran las filas y columnas afectadas.
Índice de columna nombre Is nullable Type_id del sistema Type_name del sistema Longitud máxima Nombre de intercalación 11 task_state 1 231 nvarchar(20) 40 SQL_Latin1_General_CP1_CI_AS 12 request_status 1 231 nvarchar(30) 60 SQL_Latin1_General_CP1_CI_AS 13 session_status 1 231 nvarchar(30) 60 SQL_Latin1_General_CP1_CI_AS ... 17 host_name 1 231 nvarchar(20) 40 SQL_Latin1_General_CP1_CI_AS 18 program_name 1 231 nvarchar(100) 200 SQL_Latin1_General_CP1_CI_AS 19 login_name 1 231 nvarchar(60) 120 SQL_Latin1_General_CP1_CI_AS 20 wait_type 1 231 nvarchar(60) 120 SQL_Latin1_General_CP1_CI_AS 21 last_wait_type 1 231 nvarchar(60) 120 SQL_Latin1_General_CP1_CI_AS 23 wait_resource 1 231 nvarchar(50) 100 SQL_Latin1_General_CP1_CI_AS 24 resource_description 1 231 nvarchar(280) 560 SQL_Latin1_General_CP1_CI_AS
Ambas instancias muestran la diferencia en algunas columnas. Por ejemplo, la wait_type columna tiene un nombre de tipo de sistema de nvarchar(45) con una longitud máxima de 90 en una intercalación estándar. Sin embargo, las intercalaciones que usan caracteres complementarios tienen un nombre de tipo de sistema de nvarchar(60) con una longitud máxima de 120. La diferencia de tamaño provoca los mensajes de advertencia registrados por el paquete SSIS.
Solución alternativa
Puede usar una de las siguientes soluciones alternativas:
Importante
Si usa la solución alternativa 1 y la solución alternativa 2, se perderán todos los inicios de sesión, trabajos o paquetes existentes. Estas soluciones alternativas solo deben usarse en un entorno que no sea de producción.
Solución alternativa 1
Desinstale y vuelva a instalar la instancia de SQL Server con una intercalación sin usar caracteres adicionales.
Solución alternativa 2
Recompile la instancia de bases de datos del sistema con una intercalación sin usar caracteres adicionales.
Solución alternativa 3
Cree un trabajo para quitar las advertencias innecesarias de la msdb.dbo.sysssislog tabla. En el ejemplo siguiente, el trabajo está programado para ejecutarse cada hora. Puede definir una programación diferente según sea necesario cambiando el @freq_subday_interval valor.
Por ejemplo, puede cambiar el @freq_subday_interval valor de 1 a 2 para ejecutar el trabajo cada dos horas.
USE [msdb]
GO
/****** Object: Job [Data Collection Warnings Cleanup] Script Date: <Datetime> ******/
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** Object: JobCategory [[Uncategorized (Local)]] Script Date: <Datetime> ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
END
DECLARE @jobId BINARY(16)
EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Data Collection Warnings Cleanup',
@enabled=1,
@notify_level_eventlog=0,
@notify_level_email=0,
@notify_level_netsend=0,
@notify_level_page=0,
@delete_level=0,
@description=N'This jobs removes uneccessary Data Colletion Warnings from msdb.dbo.sysssislog table. These warnings are logged when system uses a supplementary characters collation.',
@category_name=N'[Uncategorized (Local)]',
@owner_login_name=N'WIN-BINNHII7A8S\Administrator', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object: Step [Delete warrnings] Script Date: <Datetime> ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Delete warrnings',
@step_id=1,
@cmdexec_success_code=0,
@on_success_action=1,
@on_success_step_id=0,
@on_fail_action=2,
@on_fail_step_id=0,
@retry_attempts=0,
@retry_interval=0,
@os_run_priority=0, @subsystem=N'TSQL',
@command=N'set nocount on
declare @system_collation nvarchar(128)
declare @CountWarn1 int, @CountWarn2 int
declare @InfoMsg nvarchar(200)
select @system_collation = cast(SERVERPROPERTY(''collation'') as nvarchar(128))
set @CountWarn1 = 0
set @CountWarn2 = 0
if upper(right(@system_collation,2)) = ''SC''
begin -- we have a supplementary characters collation we need to remove unnecessary warnings from msdb.dbo.sysssislog table
delete
from msdb.dbo.sysssislog
where event = ''OnWarning''
and source like ''Set%Master_Package_Collection''
and message like ''Truncation may occur%''
Set @CountWarn1 = @@ROWCOUNT
delete
from msdb.dbo.sysssislog
where event = ''OnWarning''
and source like ''Set%Master_Package_Collection''
and message like ''The external columns for ODS - Get snapshot of%''
Set @CountWarn2 = @@ROWCOUNT
set @InfoMsg = ''Data Collection warning clean up job deleted ''+ltrim(str(@CountWarn1+@CountWarn2,8))+'' warnings from msdb.dbo.sysssislog table.''
print @InfoMsg
end
',
@database_name=N'master',
@flags=0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'Run every Hour',
@enabled=1,
@freq_type=4,
@freq_interval=1,
@freq_subday_type=8,
@freq_subday_interval=1,
@freq_relative_interval=0,
@freq_recurrence_factor=0,
@active_start_date=20201224,
@active_end_date=99991231,
@active_start_time=0,
@active_end_time=235959,
@schedule_uid=N'684bccd2-7424-4011-85d6-1d81791c53fe'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:
GO