IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration SQL Server Discussion :

FAQ taux d'occupation des disques


Sujet :

Administration SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 137
    Points : 56
    Points
    56
    Par défaut FAQ taux d'occupation des disques
    Bonjour à tous!

    J'ai suivi l'article "Auditer le taux d'occupation de vos disques de manière automatique" de la FAQ SQL Server téléchargée sur developpez.com.

    Mais j'ai une erreur lors de la mise en place de la routine journalière.

    Je vous joins un copier-coller de la FAQ:

    Auditer le taux d'occupation de vos disques de manière automatique
    Auteurs : Frédéric Brouard ,
    Voici un ensemble de codes SQL utilisant des procédures systèmes et l'agent SQL pour scruter le taux d'occupation des
    disques et remonter une alerte en cas de dépassement.

    Création des objets dans la basez de données MSDB
    Création des tables de suivi de l'évolution de l'espace disque et de leur taux d'occupation. Notez l'utilisation du schéma
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    S_SYS dans msdb :
    USE msdb;
    GO
    CREATE SCHEMA S_SYS
    CREATE TABLE T_A_DISK_DSK
    ( DSK_ID INT NOT NULL PRIMARY KEY,
    DSK_UNIT CHAR(1) NOT NULL UNIQUE CHECK (DSK_UNIT COLLATE French_CI_AS BETWEEN 'C' AND 'Z'),
    DSK_ALERT_PC FLOAT NOT NULL DEFAULT 30.0 CHECK (DSK_ALERT_PC BETWEEN 0.0 AND 100.0))
    CREATE TABLE T_A_TRACE_SPACE_DISK_TSP
    ( TSP_ID INT NOT NULL PRIMARY KEY,
    DSK_UNIT CHAR(1) NOT NULL FOREIGN KEY REFERENCES T_A_DISK_DSK (DSK_UNIT),
    TSP_DATETIME DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    TSP_SIZE_MO INT NOT NULL,
    TSP_USED_MO INT NOT NULL);
     
    GO
    CREATE INDEX X_TSP_DTM ON S_SYS.T_A_TRACE_SPACE_DISK_TSP (TSP_DATETIME, DSK_UNIT);
    GO
    Création de la procédure de capture des données d'espace disque
    CREATE PROCEDURE S_SYS.P_AUDIT_SPACE_DISK
    AS
    SET NOCOUNT ON;
    DECLARE @HDL int,
    @FSO int,
    @HD char(1),
    @DRV int,
    @SZ varchar(20),
    @MB bigint ;
    SET @MB = 1048576;
    CREATE TABLE #HD (HD_UNIT char(1) PRIMARY KEY,
    HD_FREESPACE int NULL,
    HD_SIZE int NULL);
    INSERT INTO #HD (HD_UNIT, HD_FREESPACE)
    EXEC master.dbo.xp_fixeddrives;
    DELETE FROM #HD
    WHERE HD_UNIT NOT IN (SELECT DSK_UNIT
    FROM S_SYS.T_A_DISK_DSK);
    EXEC @HDL = sp_OACreate 'Scripting.FileSystemObject',@FSO OUT;
    IF @HDL <> 0 EXEC sp_OAGetErrorInfo @FSO;
    DECLARE C CURSOR LOCAL FAST_FORWARD
    FOR SELECT HD_UNIT
    FROM #HD;
    OPEN C;
    FETCH NEXT FROM C INTO @HD;
    WHILE @@FETCH_STATUS=0
    BEGIN
    EXEC @HDL = sp_OAMethod @FSO, 'GetDrive', @DRV OUT, @HD
    IF @HDL <> 0 EXEC sp_OAGetErrorInfo @FSO;
    EXEC @HDL = sp_OAGetProperty @DRV, 'TotalSize', @SZ OUT
    IF @HDL <> 0 EXEC sp_OAGetErrorInfo @DRV;
    UPDATE #HD
    SET HD_SIZE = CAST(@SZ AS FLOAT) / @MB
    WHERE HD_UNIT = @HD;
    FETCH NEXT FROM C INTO @HD;
    END
    CLOSE C;
    DEALLOCATE C;
    EXEC @HDL=sp_OADestroy @FSO;
    IF @HDL <> 0 EXEC sp_OAGetErrorInfo @FSO;
     
    INSERT INTO S_SYS.T_A_TRACE_SPACE_DISK_TSP (TSP_UNIT, TSP_SIZE_MO, TSP_USED_MO)
    SELECT HD_UNIT, HD_SIZE, HD_SIZE - HD_FREESPACE
    FROM #HD
    DROP TABLE #HD;
    RETURN;
    GO
    Mise en place dans l'agent SQL Server serveur d'une routine journalière de scrutation à 5h du matin
    USE [msdb]
    GO
    EXEC msdb.dbo.sp_add_job
    @job_name=N'Scrutation espace disque',
    @enabled=1,
    @notify_level_eventlog=0,
    @notify_level_email=2,
    @notify_level_netsend=2,
    @notify_level_page=2,
    @delete_level=0,
    @category_name=N'Data Collector',
    @owner_login_name=N'SA';
    EXEC msdb.dbo.sp_add_jobserver
    @job_name=N'Scrutation espace disque',
    @server_name = N'ServerSQL[\instance]';
    EXEC msdb.dbo.sp_add_jobstep
    @job_name=N'Scrutation espace disque',
    @step_name=N'Rapporte l''état du volume du disque',
    @step_id=1,
    @cmdexec_success_code=0,
    @on_success_action=1,
    @on_fail_action=2,
    @retry_attempts=0,
    @retry_interval=0,
    @os_run_priority=0,
    @subsystem=N'TSQL',
    @command=N'EXEC S_SYS.P_AUDIT_SPACE_DISK;',
    @database_name=N'msdb',
    @flags=0;
    EXEC msdb.dbo.sp_update_job
    @job_name=N'Scrutation espace disque',
    @enabled=1,
    @start_step_id=1,
    @notify_level_eventlog=0,
    @notify_level_email=2,
    @notify_level_netsend=2,
    @notify_level_page=2,
    @delete_level=0,
    @description=N'',
    @category_name=N'Data Collector',
    @owner_login_name=N'ServerSQL[\instance]',
    @notify_email_operator_name=N'',
    @notify_netsend_operator_name=N'',
    @notify_page_operator_name=N'';
    EXEC msdb.dbo.sp_add_jobschedule
    @job_name=N'Scrutation espace disque',
    @name=N'Planification espace disque',
    @enabled=1,
    @freq_type=4,
    @freq_interval=1,
    @freq_subday_type=1,
    @freq_subday_interval=0,
    @freq_relative_interval=0,
    @freq_recurrence_factor=1,
    @active_start_date=20090312,
    @active_end_date=99991231,
    @active_start_time=50000,
    @active_end_time=235959;
    GO
    L'erreur se produit lors de la mise en place de la routine journalière.


    Voici l'erreur:
    Msg*14262, Niveau*16, État*1, Procédure*sp_verify_category_identifiers, Ligne*50
    Le @category_name ('Data Collector') spécifié n'existe pas.
    Msg*14262, Niveau*16, État*1, Procédure*sp_verify_job_identifiers, Ligne*67
    Le @job_name ('Scrutation espace disque') spécifié n'existe pas.
    Msg*14262, Niveau*16, État*1, Procédure*sp_verify_job_identifiers, Ligne*67
    Le @job_name ('Scrutation espace disque') spécifié n'existe pas.
    Msg*14262, Niveau*16, État*1, Procédure*sp_verify_job_identifiers, Ligne*67
    Le @job_name ('Scrutation espace disque') spécifié n'existe pas.
    Msg*14262, Niveau*16, État*1, Procédure*sp_verify_job_identifiers, Ligne*67
    Le @job_name ('Scrutation espace disque') spécifié n'existe pas.
    Merci beaucoup pour votre aide!

  2. #2
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonjour,

    Apparemment la catégorie (Data Collector) définie dans le job ne doit pas exister pour vous. Vous pouvez le vérifier avec la procédure suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    USE msdb ;
    GO
     
    EXEC dbo.sp_help_category
        @type = N'LOCAL' ;
    GO
    Créez la si besoin avec la procédure stockée sp_addcategory

    ++

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 137
    Points : 56
    Points
    56
    Par défaut
    Merci mikedavem!

    J'ai utilisé sp_add_category pour créer les deux catégories qui posaient problème mais maintenant j'ai un nouveau message d'erreur:

    Msg*515, Niveau*16, État*2, Procédure*sp_update_job, Ligne*275
    Impossible d'insérer la valeur NULL dans la colonne 'owner_sid', table 'msdb.dbo.sysjobs'. Cette colonne n'accepte pas les valeurs NULL. Échec de UPDATE.
    L'instruction a été arrêtée.
    Quand je fais select * from sysjobs, il me rend 0*01 dans la colonne owner_sid

    Où puis-je trouver la valeur d'owner_sid à insérer dans la table sysjobs?
    Merci!

  4. #4
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Dans la procédure sp_update_job, comment avez vous renseigner ce le paramètre @owner_login_name ?

    Dans votre cas je vois :

    @owner_login_name=N'ServerSQL[\instance]'

    Personnellement j'enleverais ce paramètre de cette procédure.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    EXEC msdb.dbo.sp_update_job
    @job_name=N'Scrutation espace disque',
    @enabled=1,
    @start_step_id=1,
    @notify_level_eventlog=0,
    @notify_level_email=2,
    @notify_level_netsend=2,
    @notify_level_page=2,
    @delete_level=0,
    @description=N'',
    @category_name=N'Data Collector',
    @notify_email_operator_name=N'',
    @notify_netsend_operator_name=N'',
    @notify_page_operator_name=N'';
    ++

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 137
    Points : 56
    Points
    56
    Par défaut
    Merci! C'est passé!

    Par contre, j'ai encore des problèmes avec la dernière étape...
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    Création d'un déclencheur pour envoi par mail d'une alerte immédiate
    -- trigger pour envoi d'un mail
    CREATE TRIGGER E_I_TSP
    ON S_SYS.T_A_TRACE_SPACE_DISK_TSP
    FOR INSERT
    AS
    BEGIN
    IF EXISTS(SELECT *
    FROM inserted AS i
    INNER JOIN S_SYS.T_A_DISK_DSK AS D
    ON i.DSK_UNIT = D.DSK_UNIT
    WHERE (CAST(TSP_USED_MO AS FLOAT) / CAST(TSP_SIZE_MO AS FLOAT) ) * 100 > DSK_ALERT_PC
    master..sp_send_dbmail @profile_name = 'profile_name',
    @recipients = 'mail_destinataire1;mail_destinataire2;mail_destinataire3;...',
    @subject = 'Alerte automatique : quota d''espace libre de disque en dessous de la valeur fixée',
    @body = 'Au moins un des disques que vous suivez via la procédure cyclique
    S_SYS.P_AUDIT_SPACE_DISK a atteint un quota d''espace disque inférieur au seuil d''alerte fixé.',
    @body_format = 'TEXT',
    @importance = 'High',
    @query = 'SELECT D.DSK_UNIT AS UNITE, TSP_SIZE_MO AS TAILLE_MO, TSP_USED_MO AS ESPACE_UTILISE_MO,
    (CAST(TSP_USED_MO AS FLOAT) / CAST(TSP_SIZE_MO AS FLOAT) ) * 100 AS OCCUPATION_POURCENT,
    DSK_ALERT_PC AS TAUX_ALERTE_POURCENT,
    CASE
    WHEN (CAST(TSP_USED_MO AS FLOAT) / CAST(TSP_SIZE_MO AS FLOAT) ) * 100 > DSK_ALERT_PC
    THEN ''CRITIQUE !''
    ELSE ''normal''
    END AS ETAT
    FROM S_SYS.T_A_TRACE_SPACE_DISK_TSP AS T
    INNER JOIN S_SYS.T_A_DISK_DSK AS D
    ON T.DSK_UNIT = D.DSK_UNIT
    WHERE TSP_DATETIME = (SELECT MAX(TSP_DATETIME)
    FROM S_SYS.T_A_TRACE_SPACE_DISK_TSP)
    ORDER BY 1 ',
    @execute_query_database = 'msdb',
    @attach_query_result_as_file = 0,
    @query_result_header = 1;
    END
    GO

    J'ai remplacé "profile_name" par un opérateur auquel j'ai renseigné une adresse mail (maildestinataire1 etc.)
    J'ai une erreur à propos de "master..sp_send_dbmail" que j'ai remplacée par "msdb.dbo.sp_send_dbmail" (que j'ai trouvée dans ma base msdb) mais l'erreur persiste:

    Msg*102, Niveau*15, État*1, Procédure*E_I_TSP, Ligne*11
    Syntaxe incorrecte vers 'msdb'.
    Merci pour votre aide.

  6. #6
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 137
    Points : 56
    Points
    56
    Par défaut
    J'ai édité avec les balises de code, désolé...
    Si quelqu'un a une idée? Parce que je suis bien bloqué là

    merci d'avance

  7. #7
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Il y a quelques erreurs de syntaxe.

    Voici une version corrigée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    CREATE TRIGGER E_I_TSP
    ON S_SYS.T_A_TRACE_SPACE_DISK_TSP
    FOR INSERT
    AS
    BEGIN
    IF EXISTS(SELECT *
    		  FROM inserted AS i
    		  INNER JOIN S_SYS.T_A_DISK_DSK AS D
    		  ON i.DSK_UNIT = D.DSK_UNIT
    		  WHERE (CAST(TSP_USED_MO AS FLOAT) / CAST(TSP_SIZE_MO AS FLOAT)) * 100 > DSK_ALERT_PC)
    	EXEC msdb..sp_send_dbmail 
    		@profile_name = 'profile_name',
    		@recipients = 'mail_destinataire1;mail_destinataire2;mail_destinataire3;...',
    		@subject = 'Alerte automatique : quota d''espace libre de disque en dessous de la valeur fixée',
    		@body = 'Au moins un des disques que vous suivez via la procédure cyclique
    				S_SYS.P_AUDIT_SPACE_DISK a atteint un quota d''espace disque inférieur au seuil d''alerte fixé.',
    		@body_format = 'TEXT',
    		@importance = 'High',
    		@query = 'SELECT D.DSK_UNIT AS UNITE, TSP_SIZE_MO AS TAILLE_MO, TSP_USED_MO AS ESPACE_UTILISE_MO,
    					(CAST(TSP_USED_MO AS FLOAT) / CAST(TSP_SIZE_MO AS FLOAT) ) * 100 AS OCCUPATION_POURCENT,
    					DSK_ALERT_PC AS TAUX_ALERTE_POURCENT,
    					CASE
    						WHEN (CAST(TSP_USED_MO AS FLOAT) / CAST(TSP_SIZE_MO AS FLOAT) ) * 100 > DSK_ALERT_PC
    						THEN ''CRITIQUE !''
    						ELSE ''normal''
    					END AS ETAT
    				FROM S_SYS.T_A_TRACE_SPACE_DISK_TSP AS T
    				INNER JOIN S_SYS.T_A_DISK_DSK AS D
    				ON T.DSK_UNIT = D.DSK_UNIT
    				WHERE TSP_DATETIME = (SELECT MAX(TSP_DATETIME)
    										FROM S_SYS.T_A_TRACE_SPACE_DISK_TSP)
    										ORDER BY 1 ',
    		@execute_query_database = 'msdb',
    		@attach_query_result_as_file = 0,
    		@query_result_header = 1;
    END
    GO
    ++

  8. #8
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 137
    Points : 56
    Points
    56
    Par défaut
    merci beaucoup pour votre aide Mikedaven!

    malheureusement, il y a toujours des soucis

    A l'exécution de votre requête corrigée, j'ai ce message:

    Impossible d'ajouter des lignes à sys.sql_dependencies pour la procédure stockée, parce que celle-ci dépend de la table manquante 'master..sp_send_dbmail'. La procédure stockée va cependant être créée*; toutefois, elle ne pourra pas être exécutée correctement si la table n'existe pas.

    J'ai remplacé "master..sp_send_dbmail" par "msdb..sp_send_dbmail".

    Là, SQLServer me dit que le trigger existe déjà... je l'ai supprimé avec un drop.

    J'ai relancé, et maintenant j'ai ce message:

    Msg*8197, Niveau*16, État*4, Procédure*E_I_TSP, Ligne*1
    L'objet 'S_SYS.T_A_TRACE_SPACE_DISK_TSP' n'existe pas ou n'est pas valide pour cette opération.

    Merci d'avance!

  9. #9
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Hmm oui effectivement, je n'avais pas réagi sur la procédure sp_send_dbmail. C'est une erreur dans la FAQ.

    Pour votre problème de création, regardez si vous exécutez bien votre ordre SQL dans le contexte de la base de données msdb. Vérifiez au préalable par un simple SELECT FROM que votre table existe et créez votre trigger.

    ++

  10. #10
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 137
    Points : 56
    Points
    56
    Par défaut
    à la création du trigger j'ai ce message:

    Impossible d'ajouter des lignes à sys.sql_dependencies pour la procédure stockée, parce que celle-ci dépend de la table manquante 'msdb.sp_send_dbmail'. La procédure stockée va cependant être créée*; toutefois, elle ne pourra pas être exécutée correctement si la table n'existe pas.
    C'est normal? Alarmant? :p

    Merci!

Discussions similaires

  1. Affiche la taille et le taux d'occupation des bases
    Par Fabien Celaia dans le forum Contribuez
    Réponses: 1
    Dernier message: 12/09/2019, 11h49
  2. [filezilla] Taux d'occupation du disque distant ?
    Par byloute dans le forum Administration
    Réponses: 1
    Dernier message: 13/11/2007, 16h10
  3. Réponses: 3
    Dernier message: 09/01/2004, 14h37
  4. Connaître le taux d'occupation CPU
    Par Thom@s dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 12/11/2003, 23h44
  5. Récupèrer la liste des disques durs
    Par Tililian dans le forum C++Builder
    Réponses: 4
    Dernier message: 19/06/2003, 12h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo