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
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!");
}
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.
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.
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
- 1. Trace flags sql 2005
- 2. Gestion d'état via Sql Server 2005
- 3. Stockage des fichiers .dll dans SQL Server 2005
- 4. SQL Server sauvegarde et de restauration 2005
- 5. SQL Server 2005
- 6. Fichiers et groupes de fichiers SQL Server 2005
- 7. Gestion des connexions SQL Server
- 8. Configuration dbmail avec SQL Server (2005) Gestion de Studio Express
- 9. SQL Server 2005 Developer Edition
- 10. SQL Server 2005 sp_send_dbmail
- 11. Gestion des performances de TDE sur SQL Server 2008
- 12. SQL Server 2005 Replication
- 13. Modèle de gestion des erreurs SQL Server
- 14. Chargement de nombreux fichiers plats dans SQL Server 2005
- 15. Installation de SQL Server 2005 sur Windows 2000 Server
- 16. TransactionInDoubtException à l'aide de System.Transactions sur SQL Server 2005
- 17. SSL sur TDS, SQL Server 2005 Express
- 18. Blocage SQL Server 2005 sur la clé
- 19. Requête SQL Server 2005
- 20. SQL Server: indicateur de trace 4135
- 21. Index varchar sur MS SQL Server 2005
- 22. SSIS 2008 sur SQL Server 2005?
- 23. erreur sp_OACreate sur SQL Server 2005
- 24. Comment créer des modèles de procédure stockée SQL Server 2005 dans SQL Server 2005 Management Studio?
- 25. Vues SQL Server 2005
- 26. Sql Server 2005 AutoCompletion
- 27. GetOleDbSchemaTable Clés étrangères sur Sql Server 2005
- 28. Opérations sur les fichiers SQL Server?
- 29. Aide sur les requêtes SQL Server 2005
- 30. Gestion hexadécimale SQL Server
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
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()'. –