2010-05-18 9 views
0

Je dois gérer les fichiers de trace d'une base de données sur Sql Server 2005 Express Edition. La journalisation d'audit C2 est activée pour la base de données et les fichiers qu'elle crée sont très gourmands en espace. Est-ce que cela peut être fait à partir de Sql Server, ou dois-je écrire un service pour surveiller ces fichiers et prendre les mesures appropriées? J'ai trouvé la table [master]. [Sys]. [Trace] avec les propriétés du fichier de trace. Est-ce que quelqu'un connaît la signification des champs dans ce tableau?Gestion des fichiers de trace sur Sql Server 2005

Répondre

1

Voici ce que je suis venu avec qui travaille très bien à partir d'une application console:

static void Main(string[] args) 
    { 
     try 
     { 
      Console.WriteLine("CcmLogManager v1.0"); 
      Console.WriteLine(); 

      // How long should we keep the files around (in months) 12 is the PCI requirement? 
      var months = Convert.ToInt32(ConfigurationManager.AppSettings.Get("RemoveMonths") ?? "12"); 

      var currentFilePath = GetCurrentAuditFilePath(); 

      Console.WriteLine("Path: {0}", new FileInfo(currentFilePath).DirectoryName); 
      Console.WriteLine(); 

      Console.WriteLine("------- Removing Files --------------------"); 

      var fileInfo = new FileInfo(currentFilePath); 
      if (fileInfo.DirectoryName != null) 
      { 
       var purgeBefore = DateTime.Now.AddMonths(-months); 
       var files = Directory.GetFiles(fileInfo.DirectoryName, "audittrace*.trc.zip"); 

       foreach (var file in files) 
       { 
        try 
        { 
         var fi = new FileInfo(file); 

         if (PurgeLogFile(fi, purgeBefore)) 
         { 
          Console.WriteLine("Deleting: {0}", fi.Name); 

          try 
          { 
           fi.Delete(); 
          } 
          catch (Exception ex) 
          { 
           Console.WriteLine(ex); 
          } 
         } 
        } 
        catch (Exception ex) 
        { 
         Console.WriteLine(ex); 
        } 
       } 
      } 

      Console.WriteLine("------- Files Removed ---------------------"); 
      Console.WriteLine(); 


      Console.WriteLine("------- Compressing Files -----------------"); 

      if (fileInfo.DirectoryName != null) 
      { 
       var files = Directory.GetFiles(fileInfo.DirectoryName, "audittrace*.trc"); 

       foreach (var file in files) 
       { 
        // Don't attempt to compress the current log file. 
        if (file.ToLower() == fileInfo.FullName.ToLower()) 
         continue; 

        var zipFileName = file + ".zip"; 

        var fi = new FileInfo(file); 
        var zipEntryName = fi.Name; 

        Console.WriteLine("Zipping: \"{0}\"", fi.Name); 

        try 
        { 
         using (var fileStream = File.Create(zipFileName)) 
         { 
          var zipFile = new ZipOutputStream(fileStream); 
          zipFile.SetLevel(9); 

          var zipEntry = new ZipEntry(zipEntryName); 
          zipFile.PutNextEntry(zipEntry); 

          using (var ostream = File.OpenRead(file)) 
          { 
           int bytesRead; 
           var obuffer = new byte[2048]; 
           while ((bytesRead = ostream.Read(obuffer, 0, 2048)) > 0) 
            zipFile.Write(obuffer, 0, bytesRead); 
          } 

          zipFile.Finish(); 
          zipFile.Close(); 
         } 

         fi.Delete(); 
        } 
        catch (Exception ex) 
        { 
         Console.WriteLine(ex); 
        } 
       } 
      } 

      Console.WriteLine("------- Files Compressed ------------------"); 
      Console.WriteLine(); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex); 
     } 

     Console.WriteLine("Press any key..."); 
     Console.ReadKey(); 
    } 

    public static bool PurgeLogFile(FileInfo fi, DateTime purgeBefore) 
    { 
     try 
     { 
      var filename = fi.Name; 
      if (filename.StartsWith("audittrace")) 
      { 
       filename = filename.Substring(10, 8); 

       var year = Convert.ToInt32(filename.Substring(0, 4)); 
       var month = Convert.ToInt32(filename.Substring(4, 2)); 
       var day = Convert.ToInt32(filename.Substring(6, 2)); 

       var logDate = new DateTime(year, month, day); 

       return logDate.Date <= purgeBefore.Date; 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex); 
     } 

     return false; 
    } 

    public static string GetCurrentAuditFilePath() 
    { 
     const string connStr = "Data Source=.\\SERVER;Persist Security Info=True;User ID=;Password="; 

     var dt = new DataTable(); 

     var adapter = 
      new SqlDataAdapter(
       "SELECT path FROM [master].[sys].[traces] WHERE path like '%audittrace%'", connStr); 
     try 
     { 
      adapter.Fill(dt); 

      if (dt.Rows.Count >= 1) 
      { 
       if (dt.Rows.Count > 1) 
        Console.WriteLine("More than one audit trace file defined! Count: {0}", dt.Rows.Count); 

       var path = dt.Rows[0]["path"].ToString(); 
       return path.StartsWith("\\\\?\\") ? path.Substring(4) : path; 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex); 
     } 

     throw new Exception("No Audit Trace File in sys.traces!"); 
    } 
0

Vous pouvez également configurer SQL Trace pour se connecter à une table SQL. Vous pouvez ensuite configurer une tâche d'agent SQL pour tronquer automatiquement les enregistrements.

+0

Comment puis-je dire serveur Sql d'utiliser une table pour l'enregistrement lors de l'activation de la journalisation d'audit C2? Cela semble être le plus facile à mettre en œuvre, mais je me demande si cela fonctionnerait avec l'édition Express. – Sophtware

+0

Seul le profileur peut être configuré pour se connecter à une table de base de données. Si vous configurez une trace côté serveur, il écrira toujours dans un fichier .trc, qui peut être relu via la fonction 'sys.fn_trace_gettable()'. –

0

sys.traces a un enregistrement pour chaque trace démarrée sur le serveur. Étant donné que SQL Express n'a pas d'agent et ne peut pas configurer de travaux, vous devez disposer d'un processus ou service externe pour les surveiller. Vous devrez tout faire vous-même (surveillance, archivage, politique de conservation des traces, etc.). Si vous avez une vérification C2 en place, je présume que vous avez des politiques en place qui déterminent la durée de la vérification doit être conservée.

+0

Essayer d'éviter cette route, mais c'est pour la conformité PCI. Je dois garder 6 mois de traces sur l'ordinateur du client, et pour économiser de l'espace, j'ai besoin de compresser les journaux qui ne sont plus utilisés. – Sophtware