Les raisons pour lesquelles les fichiers journaux restent longtemps sans être supprimés
InterSystems FAQ rubric
Si le système ne s'arrête pas pendant 24 heures, les anciens fichiers journaux seront supprimés à 0h30 selon les « Paramètres de suppression des fichiers journaux ».
Une cause possible pour laquelle des fichiers journaux restants sont plus anciens que les « Paramètres de suppression des fichiers journaux » est que certaines transactions restent ouvertes.
Dans ce cas, vous pourrez supprimer le fichier journal en recherchant les processus exécutant les transactions et en finalisant les transactions.
L'exemple ci-dessous vérifie l'existence de transactions ouvertes et, si elles existent, génère le nom du fichier cible et les informations sur l'enregistrement du journal.
(Des exemples peuvent être téléchargés ici)
*Remarque* Si la taille du fichier journal à vérifier est importante ou s'il existe de nombreux fichiers journaux, l'exécution prendra du temps, veuillez donc contacter notre centre d'assistance.
Class ISJ.JournalUtility
{
ClassMethod GetOpenTransaction() As %Status
{
set status=$$$OK
#dim ex As %Exception.AbstractException
#dim rset As %ResultSet
try {
//current journal file
write !,"Current journal file name:",
##class(%SYS.Journal.System).GetCurrentFileName(),!! // Open transaction file
// Get info about journals recorded in WIJ
$$$ThrowOnError(##class(%SYS.Journal.System).GetImageJournalInfo(.filename,.jrnoffset,.jrnfilecount,.opentranoffset,.opentranfilecount))
if $get(opentranoffset)="" {
write !,"There are no open transactions",!
return status
} //If there is a differeence in file counts(jrnfilecount-opentranfilecount>0 )
// There is an open transaction in the old journal file, so please search for a target file name
if jrnfilecount-opentranfilecount>0 {
set loopcnt=jrnfilecount-opentranfilecount
for i=1:1:loopcnt {
set currentfile=filename
$$$ThrowOnError(##class(%SYS.Journal.File).GetPrev(currentfile,.filename))
}
} write "〇〇 list of open target journal records 〇〇",!
set rset=##class(%ResultSet).%New("%SYS.Journal.Record:List")
do rset.%Execute(filename,,,,$LB("Address","=",opentranoffset))
write !,"=== File Name : ",filename," ===",!
write "Address : TimeStamp : ProcessID : RemoteSystemID : TypeName : Transaction",!
while rset.%Next() {
write rset.%Get("Address")," : ",
rset.%Get("TimeStamp")," : ",
rset.%Get("ProcessID")," : ",
rset.%Get("RemoteSystemID")," : ",
rset.%Get("TypeName")," : ",
rset.%Get("InTransaction"),!
}
}
catch ex {
set status=ex.AsStatus()
}
return status
}
}Un exemple d'exécution :
USER>do##class(ISJ.JournalUtility).GetOpenTransaction()
Current journal file name:/usr/irissys/mgr/journal/20210330.002
〇〇 list of open target journal records 〇〇
=== File Name : /usr/irissys/mgr/journal/20210330.001 ===
Address : TimeStamp : ProcessID : RemoteSystemID : TypeName : Transaction
1834156 : 2021-03-3013:19:00 : 5194 : 1073741824 : BeginTrans : 1