Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Version du produit d’origine : SQL Server 12 et versions ultérieures
Symptôme
Examinez le cas suivant :
- Vous avez installé une instance avec un classement à l’aide de caractères supplémentaires pour la base de données système dans SQL Server.
- Vous avez configuré Management Data Warehouse (MDW) et la collecte de données.
Dans ce scénario, lorsque les packages SQL Server Integration Services (SSIS) créés par l’exécution de la collecte de données, vous trouverez que la base de données MSDB augmente de façon inattendue.
Note
Ce type de nom de classement se termine par _SC, par exemple Latin1_General_100_CI_AS_SC
.
Toutes les 10 secondes, les 11 messages d’avertissement suivants sont insérés dans la msdb.dbo.sysssislog
table système :
La troncation peut se produire en raison de la récupération des données de la colonne de base de données « task_state » avec une longueur de 20 à la colonne de flux de données « task_state » avec une longueur de 10.
La troncation peut se produire en raison de la récupération des données de la colonne de base de données « request_status » avec une longueur de 30 à la colonne de flux de données « request_status » avec une longueur de 15.
La troncation peut se produire en raison de la récupération des données de la colonne de base de données « session_status » avec une longueur de 30 à la colonne de flux de données « session_status » avec une longueur de 15.
La troncation peut se produire en raison de la récupération des données de la colonne de base de données « host_name » avec une longueur de 40 à la colonne de flux de données « host_name » avec une longueur de 20.
La troncation peut se produire en raison de la récupération des données de la colonne de base de données « program_name » avec une longueur de 100 à la colonne de flux de données « program_name » avec une longueur de 50.
La troncation peut se produire en raison de la récupération des données de la colonne de base de données « login_name » avec une longueur de 60 à la colonne de flux de données « login_name » avec une longueur de 30.
La troncation peut se produire en raison de la récupération des données de la colonne de base de données « wait_type » avec une longueur de 60 à la colonne de flux de données « wait_type » avec une longueur de 45.
La troncation peut se produire en raison de la récupération des données de la colonne de base de données « last_wait_type » avec une longueur de 60 à la colonne de flux de données « last_wait_type » avec une longueur de 45.
La troncation peut se produire en raison de la récupération des données de la colonne de base de données « wait_resource » avec une longueur de 100 à la colonne de flux de données « wait_resource » avec une longueur de 50.
La troncation peut se produire en raison de la récupération des données de la colonne de base de données « resource_description » avec une longueur de 280 à la colonne de flux de données « resource_description » avec une longueur de 140.
Les colonnes externes pour ODS - Obtenir un instantané de dm_exec_requests ne sont pas synchronisées avec les colonnes de source de données. La colonne externe « task_state » doit être mise à jour. La colonne externe « request_status » doit être mise à jour. La colonne externe « session_status » doit être mise à jour. La colonne externe « host_name » doit être mise à jour. La colonne externe « program_name » doit être mise à jour. La colonne externe « login_name » doit être mise à jour. La colonne externe « wait_type » doit être mise à jour. La colonne externe « last_wait_type » doit être mise à jour. La colonne externe « wait_resource » doit être mise à jour. La colonne externe « resource_description » doit être mise à jour.
Par conséquent, la msdb.dbo.sysssislog
table augmente d’une page (8 Ko) toutes les 10 secondes. L’impact sur l’espace disque est :
- 2,8 Mo par heure (8 Ko x 6 x 60)
- 67,5 Mo par jour (8 Ko x 6 x 60 x 24)
- 1,97 Go par mois (8 Ko x 60 x 60 x 24 x 30)
Cause
Les classements utilisant des caractères supplémentaires modifient la taille de certaines colonnes DMV (Dynamic Management View). L’outil Collecteur de données capture le contenu de certaines DMV, par exemple sys.dm_exec_requests
, et ajoute les résultats dans la base de données MDW à l’aide de packages SSIS. Dans ces packages SSIS, les tailles de colonne sont prédéfinies en fonction de la taille des colonnes pour les classements sans utiliser de caractères supplémentaires. Lorsque les packages s’exécutent, un message d’avertissement est retourné pour chaque colonne dont la taille est supérieure à la taille prédéfinie et ajoutée à la msdb.dbo.sysssislog
table.
Note
Ces messages d’avertissement n’affectent pas l’insertion de données réelles de la vue dynamique dans la table de collecte de données.
Plus d’informations
Le processus de collecte de données collecte les métadonnées du premier jeu de résultats lors de l’appel sp_syscollector_snapshot_dm_exec_requests
. Le script sql suivant est un exemple :
exec [sys].sp_describe_first_result_set N'EXEC [msdb].[dbo].[sp_syscollector_snapshot_dm_exec_requests] 5',NULL,1
Cet appel retourne des résultats différents en fonction du classement, à l’aide de caractères supplémentaires ou non :
Instance avec un classement qui n’utilise pas de caractères supplémentaires :
Note
Pour plus de clarté, seules les lignes et colonnes affectées sont affichées.
Numéro de colonne nom Est de type Null Type_id système Type_name système Longueur maximale Nom du classement 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 Instance avec un classement qui utilise des caractères supplémentaires :
Note
Pour plus de clarté, seules les lignes et colonnes affectées sont affichées.
Numéro de colonne nom Est de type Null Type_id système Type_name système Longueur maximale Nom du classement 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
Les deux instances montrent la différence sur certaines colonnes. Par exemple, la wait_type
colonne a un nom de type système de nvarchar(45) avec une longueur maximale de 90 sur un classement standard. Toutefois, les classements utilisant des caractères supplémentaires ont un nom de type système nvarchar (60) avec une longueur maximale de 120. La différence de taille provoque les messages d’avertissement enregistrés par le package SSIS.
Solution de contournement
Vous pouvez utiliser l’une des solutions de contournement suivantes :
Important
Si vous utilisez la solution de contournement 1 et la solution 2, les connexions, travaux ou packages existants sont perdus. Ces solutions de contournement ne doivent être utilisées que dans un environnement hors production.
Solution de contournement 1
Désinstallez et réinstallez l’instance SQL Server avec un classement sans utiliser de caractères supplémentaires.
Solution de contournement 2
Régénérez l’instance de bases de données système avec un classement sans utiliser de caractères supplémentaires.
Solution de contournement 3
Créez un travail pour supprimer les avertissements inutiles de la msdb.dbo.sysssislog
table. Dans l’exemple suivant, le travail est planifié pour s’exécuter toutes les heures. Vous pouvez définir une planification différente en fonction des besoins en modifiant la @freq_subday_interval
valeur.
Par exemple, vous pouvez modifier la @freq_subday_interval
valeur de 1 à 2 pour exécuter le travail toutes les deux heures.
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