MS SQL - Taches de maintenance
Verifier et rebuilder les cluster index
-- Insertion de données dans une table dans TempDB via boucle WHILE via T-SQL
-- Vérification et rebuild des cluster Index via T-SQL
--
--
-- Remplacer YourTableName par le nom de la table que vous souhaitez utiliser pour faire vos tests
-- Remplacer les noms de colonnes Date, Montant, Quantité par ceux que vous souhaitez utiliser pour vos tests
--
--
-- Utilisation la base de données tempdb :
USE tempdb;
GO
-- Création d'une table avec une clé primaire spécifiée.
-- Sachez que la déclaration d'une clé primaire crée un index
-- cluster, sauf si vous spécifiez un index non-cluster.
CREATE TABLE dbo.YourTableName
( YourTableNameID int IDENTITY(1,1) PRIMARY KEY,
Date datetime2 NOT NULL,
Montant nvarchar(100) NOT NULL,
Quantité int NOT NULL
);
GO
-- Insérez des données dans la table.
SET NOCOUNT ON;
DECLARE @Counter int = 0;
WHILE @Counter < 10000 BEGIN
INSERT dbo.YourTableName (Date, Montant, Quantité)
VALUES(SYSDATETIME(),'100',CAST(RAND() * 1000 AS int));
SET @Counter += 1;
END;
GO
-- Vérifiez le niveau de fragmentation via sys.dm_db_index_physical_stats.
-- Observez avg_fragmentation_in_percent et avg_page_space_used_in_percent
SELECT *
FROM sys.dm_db_index_physical_stats(DB_ID(),
OBJECT_ID('dbo.YourTableName'),
NULL,
NULL,
'DETAILED');
GO
-- Modifiez les données de la table.
SET NOCOUNT ON;
DECLARE @Counter int = 0;
WHILE @Counter < 10000 BEGIN
UPDATE dbo.YourTableName SET Montant = REPLICATE('100',CAST(RAND() * 100 AS int))
WHERE YourTableNameID = @Counter % 10000;
IF @Counter % 100 = 0 PRINT @Counter;
SET @Counter += 1;
END;
GO
-- Vérifiez le niveau de fragmentation via sys.dm_db_index_physical_stats.
-- Notez à nouveau avg_fragmentation_in_percent et avg_page_space_used_in_percent
SELECT *
FROM sys.dm_db_index_physical_stats(DB_ID(),
OBJECT_ID('dbo.YourTableName'),
NULL,
NULL,
'DETAILED');
GO
-- Reconstruisez la table et ses index.
ALTER INDEX ALL ON dbo.YourTableName REBUILD;
GO
-- Vérifiez le niveau de fragmentation via sys.dm_db_index_physical_stats.
-- Observez à nouveau avg_fragmentation_in_percent et avg_page_space_used_in_percent
SELECT *
FROM sys.dm_db_index_physical_stats(DB_ID(),
OBJECT_ID('dbo.YourTableName'),
NULL,
NULL,
'DETAILED');
GO
-- Supprimez la table à la fin de vos test si nécessaire
DROP TABLE dbo.YourTableName;
GO
Réparer une BDD corrompue avec DBCC
-- Réparer un BDD corrompue avec DBCC - Un exemple simple pour comprendre le principe
-- (ATTENTION : Valable pour BDD non répliquée uniquement !!)
-- Imaginons une BDD MyBDD qui est corrompue
--
-- Remplacer MyBdd par le nom de votre BDD corrompue
-- Remplacer Your-Table-To-Check par le nom de votre table corrompue. Replacer aussi les nom de colonnes utiliser comme exemple (Your-Cl-ID)
--
-- Lancer DBCC CHECKDB sur MyBDD.
-- Noter les erreurs qui sont indiquées
DBCC CHECKDB('MyBDD');
GO
-- Si des erreurs précisent qu'une ou plusieurs tables sont corrompues, essayer de consulter le contenu de ces tables : .
SELECT * FROM MyBDD.dbo.Your-Table-To-Check;
GO
-- Lorsque vous ne disposez pas d'une sauvegarde avant corruption, il
-- reste uniquement la possibilité d'effectuer une récupération de la base de données.
-- ATTENTION : à utiliser uniquement si aucune autre possibilité !!
-- En effet, après récupération, il n'existe aucune garantie sur la cohérence logique
-- dans la base de données (comme les contraintes de clé étrangère).
-- Définir la base de données dans le mode SINGLE_USER et lancer la récupération :
ALTER DATABASE MyBDD SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
DBCC CHECKDB('MyBDD', REPAIR_ALLOW_DATA_LOSS);
GO
ALTER DATABASE MyBDD SET MULTI_USER WITH ROLLBACK IMMEDIATE;
GO
-- Controller s'il est désormais possible d'accéder à la ou les tables qui posaient problèmes :
SELECT * FROM MyBDD.dbo.Your-Table-To-Check;
GO
-- Relancer DBCC CHECKDB pour vérifier la cohérence de la structure de la base de données
DBCC CHECKDB('MyBDD') WITH NO_INFOMSGS;
GO