web-dev-qa-db-fra.com

Comment puis-je obtenir la taille du journal des transactions dans SQL 2005 par programme?

Nous travaillons avec une taille de journal des transactions fixe sur nos bases de données, et j'aimerais mettre en place une application pour surveiller les tailles de journaux afin que nous puissions voir quand les choses deviennent trop serrées et nous devons augmenter le journal trn fixe.

Existe-t-il une commande TSQL que je peux exécuter qui me dira la taille actuelle du journal des transactions et la limite fixe du journal des transactions?

21
Adam Ness

J'ai utilisé votre code, mais une erreur s'est produite lors de la conversion en int. "Msg 8115, niveau 16, état 2, ligne 1 Erreur de dépassement arithmétique lors de la conversion de l'expression en type de données int." Donc, partout où il y avait un "* 8", je l'ai changé en * 8.0 et le code fonctionne parfaitement.

SELECT (size * 8.0)/1024.0 AS size_in_mb
     , CASE
  WHEN max_size                                 = -1 
  THEN 9999999                  -- Unlimited growth, so handle this how you want
  ELSE (max_size * 8.0)/1024.0                  END AS max_size_in_mb
  FROM YOURDBNAMEHERE.sys.database_files
 WHERE data_space_id                            = 0           
31
Myles Yamada

Une recherche rapide sur Google a révélé ceci:

DBCC SQLPERF ( LOGSPACE )

Pourquoi n'utilisez-vous pas la croissance automatique dans le journal des transactions? Il semble que ce serait une solution plus fiable.

20
Eric Z Beard

L'utilisation de sys.database_files vous donne uniquement la taille du fichier journal et non la taille du journal qu'il contient. Ce n'est pas très utile si votre fichier est de toute façon de taille fixe. DBCC SQLPERF (LOGSPACE) est un peu vieille école, mais fonctionne bien si vous devez prendre en charge les anciennes versions de SQL Server.

Au lieu de cela, vous pouvez utiliser la table dm_os_performance_counters comme ceci:

SELECT
    RTRIM(instance_name) [database], 
    cntr_value log_size_kb
FROM 
    sys.dm_os_performance_counters 
WHERE 
    object_name = 'SQLServer:Databases'
    AND counter_name = 'Log File(s) Used Size (KB)'
    AND instance_name <> '_Total'
13
Martin Brown

C'est sur le dessus de ma tête, donc vous voudrez peut-être revérifier les mathématiques ...

SELECT
     (size * 8)/1024.0 AS size_in_mb,
     CASE
        WHEN max_size = -1 THEN 9999999   -- Unlimited growth, so handle this how you want
        ELSE (max_size * 8)/1024.0
     END AS max_size_in_mb
FROM
     MyDB.sys.database_files
WHERE
     data_space_id = 0   -- Log file

Il y a plus que vous pouvez obtenir de cette vue système, comme l'incrément de croissance, si le journal est défini sur la croissance automatique et s'il est configuré pour augmenter d'un montant spécifique ou d'un pourcentage.

HTH!

7
Tom H

Si vous avez vraiment besoin de vous en tenir à un journal des transactions de taille fixe, je suggère de le définir à une taille raisonnable, en laissant une marge, puis effectuez l'une des deux opérations suivantes:

  • Réglez le mode de récupération de la base de données sur SIMPLE, si vous n'avez pas besoin d'une récupération ponctuelle. En termes simples, il permettra au journal des transactions de "recycler" automatiquement l'espace.

OR

  • Si vous devez conserver le mode de récupération sur PLEIN, planifiez un travail qui effectue une sauvegarde du journal des transactions. Cela libérera de l'espace dans le journal des transactions et vous permettra également d'effectuer une récupération ponctuelle, si nécessaire.

En outre, vous pouvez peut-être trouver l'article suivant utile: Comment empêcher le journal des transactions d'une base de données SQL Server de croître de façon inattendue .

1
Diego

Pour SQL 2008 et versions ultérieures, FILEPROPERTY expose également la quantité d'espace utilisée dans un fichier et est beaucoup moins compliqué que toutes les autres réponses:

select [Name], physical_name [Path], CAST(size AS BIGINT)*8192 [TotalBytes], CAST(FILEPROPERTY(name,'SpaceUsed') AS BIGINT)*8192 [UsedBytes], (case when max_size<0 then -1 else CAST(max_size AS BIGINT)*8192 end) [MaxBytes]
from sys.database_files
1
James