Implément SQL Server Agent Jobs dans AlwaysOn Availability Groups

L’Agent SQL Server ne fait pas partie de l’AG en Faite Les groupes de disponibilité AlwaysOn synchronisent les bases de données qui font partie d’un groupe de disponibilité, mais tout autre objet qui ne fait pas partie de ces bases de données n’est pas synchronisé (c’est-à-dire les connexions, les serveurs liés, les opérateurs, etc.) et cela inclut les travaux de l’Agent SQL Server.

Pour accomplir ce mode de création de travail d’agent SQL, j’utilise cette fonction pour tester si une base de données participe à un AG est accessible en écriture. Si c’est le cas, passez au reste des étapes du travail de l’agent SQL. Si ce n’est pas le cas, stopper le job

-- fn_hadr_group_is_primary
USE master;
GO
IF OBJECT_ID('dbo.fn_hadr_group_is_primary', 'FN') IS NOT NULL
  DROP FUNCTION dbo.fn_hadr_group_is_primary;
GO
CREATE FUNCTION dbo.fn_hadr_group_is_primary (@AGName sysname)
RETURNS bit
AS
BEGIN;
  DECLARE @PrimaryReplica sysname; 

  SELECT
    @PrimaryReplica = hags.primary_replica
  FROM sys.dm_hadr_availability_group_states hags
  INNER JOIN sys.availability_groups ag ON ag.group_id = hags.group_id
  WHERE ag.name = @AGName;

  IF UPPER(@PrimaryReplica) =  UPPER(@@SERVERNAME)
    RETURN 1; -- primary

    RETURN 0; -- not primary
END; 

Utilisez la fonction fn_hadr_group_is_primary dans une nouvelle étape de travail pour déterminer si cette instance sql est un réplica principal. S’il ne s’agit pas d’un réplica principal, nous émettons une demande d’arrêt de la tâche tout en identifiant le nom de la tâche actuelle à l’aide des jetons de l’agent SQL Server.

-- Detect if this instance's role is a Primary Replica.
-- If this instance's role is NOT a Primary Replica stop the job so that it does not go on to the next job step
DECLARE @rc int; 
EXEC @rc = master.dbo.fn_hadr_group_is_primary N'my-ag';

IF @rc = 0
BEGIN;
    DECLARE @name sysname;
    SELECT  @name = (SELECT name FROM msdb.dbo.sysjobs WHERE job_id = CONVERT(uniqueidentifier, '$(ESCAPE_NONE(JOBID))'));
    
    EXEC msdb.dbo.sp_stop_job @job_name = @name;
    PRINT 'Stopped the job since this is not a Primary Replica';
END;

batch mode sql server in RowStore

Qu’est-ce qu’un batch mode ?

En termes simples, un batch est une structure de stockage interne de 64 Ko de large qui contient un groupe de lignes allant de 64 à 900 selon le nombre de colonnes qui les composent. Chaque colonne utilisée par la requête est stockée dans un vecteur de colonne continu d’éléments de taille fixe, où le vecteur de ligne qualificatif indique quelles lignes font encore logiquement partie du lot 

Pour commencer je vais exécuter exécutez mon code TSQL où nous gardons le niveau de compatibilité de la base de données à 140 qui représente SQL Server 2017 Vérifiez le plan d’exécution de la requête Remarquez bien que comment le mode d’exécution est ROW

CPU time = 142656 ms, elapsed time = 43660ms.

Maintenant, nous prenons la même base de données avec la même requête et on active le mode mode batch en définissant le niveau de compatibilité de la base de données sur « 150 »

Ici, nous voyons que, comme prévu, le stockage est « RowStore », mais le mode d’exécution réel est désormais « Batch ». Et les résultats reviennent en un peu moins de 1/3 du temps de la même requête sur la même table en mode ligne

CPU time = 142547 ms, elapsed time = 24702ms.
 
Pour obtenir le mode batch, il vous suffit d'exécuter vos requêtes avec le dernier niveau de compatibilité sur SQL Server 2019 en Edition entreprise sur des larges tables  

Surveiller vos Instances SQL a travers Powershell

Problème

ce script de surveillance PowerShell collectera des données au niveau de l’instance pour tous les serveurs SQL qui ont été enregistrés pour cette solution de surveillance.

Solution

Ce module rassemblera des informations sur l’instance SQL Server, telles RAM ,PLE,cache Hit ration ,CPU l. Il se connectera à chaque serveur de LA TABLE Serveurs  et capturera les données pour chacune de ces instances. La connexion à chaque instance SQL Server sera basée sur les paramètres de la table

Ce module rassemblera des informations sur l’instance SQL Server, telles RAM ,PLE,cache Hit ration ,CPU l. Il se connectera à chaque serveur de LA TABLE Serveurs  et capturera les données pour chacune de ces instances. La connexion à chaque instance SQL Server sera basée sur les paramètres de la table Serveurs.

Le script PowerShell qui crée les objets ci-dessus et insère des données dans la table nomé CPU_Memory_Usage

Import-Module SqlServer
 $server = "COSxxxxxxx"
 $inventoryDB = "DBA_TOOLS"
 This is the definition of the table that will contain the values for each instance you wish to collect information from
 $resourcesUsageTable = "
 IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'CPU_Memory_Usage' AND xtype = 'U')
 CREATE TABLE CPU_Memory_Usage(
    [server]varchar(10) NOT NULL,
    [max_server_memory] [int] NOT NULL,
    [sql_memory_usage] [int] NOT NULL,
    [physical_memory] [int] NOT NULL,
    [available_memory] [int] NOT NULL,
    [system_memory_state]varchar(30) NOT NULL,
    [page_life_expectancy] [int] NOT NULL,
    [cache hit ratio] NUMERIC(10,6) NOT NULL,
    [cpu_usage_30] [int] NOT NULL,
    [cpu_usage_15] [int] NOT NULL,
    [cpu_usage_10] [int] NOT NULL,
    [cpu_usage_5] [int] NOT NULL,
    [data_sample_timestamp] [datetime] NULL
 ) ON [PRIMARY]
 "
 Make sure you create this table in your central environment, where you wish to gather the information from all the desired instances
 $instances = Invoke-Sqlcmd -ServerInstance $server -Database $inventoryDB -Query $resourcesUsageTable
 /* Récupérer List Serveur Pour leur parcours */
 $instanceLookupQuery = "SELECT name  FROM servers" 
 $instances = Invoke-Sqlcmd -ServerInstance $server -Database $inventoryDB -Query $instanceLookupQuery
 $resourcesQuery = "
 WITH SQLProcessCPU
 AS(
    SELECT TOP(30) SQLProcessUtilization AS 'CPU_Usage', ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS 'row_number'
    FROM ( 
          SELECT 
            record.value('(./Record/@id)[1]', 'int') AS record_id,
            record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') AS [SystemIdle],
            record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') AS [SQLProcessUtilization], 
            [timestamp] 
          FROM ( 
               SELECT [timestamp], CONVERT(xml, record) AS [record] 
               FROM sys.dm_os_ring_buffers 
               WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' 
               AND record LIKE '%%'
               ) AS x 
         ) AS y
 ) 
 SELECT 
    SERVERPROPERTY('SERVERNAME') AS 'Instance',
    (SELECT value_in_use FROM sys.configurations WHERE name like '%max server memory%') AS 'Max Server Memory',
    (SELECT physical_memory_in_use_kb/1024 FROM sys.dm_os_process_memory) AS 'SQL Server Memory Usage (MB)',
    (SELECT total_physical_memory_kb/1024 FROM sys.dm_os_sys_memory) AS 'Physical Memory (MB)',
    (SELECT available_physical_memory_kb/1024 FROM sys.dm_os_sys_memory) AS 'Available Memory (MB)',
    (SELECT system_memory_state_desc FROM sys.dm_os_sys_memory) AS 'System Memory State',
    (SELECT [cntr_value] FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Manager%' AND [counter_name] = 'Page life expectancy') AS 'Page Life Expectancy',
       (SELECT CAST(
         (
           SELECT CAST (cntr_value AS BIGINT)
           FROM sys.dm_os_performance_counters  
           WHERE counter_name = 'Buffer cache hit ratio'
         )* 100.00
         /
         (
           SELECT CAST (cntr_value AS BIGINT)
           FROM sys.dm_os_performance_counters  
           WHERE counter_name = 'Buffer cache hit ratio base'
         ) AS NUMERIC(6,3)
       ))as [cache hit ratio] ,
    (SELECT AVG(CPU_Usage) FROM SQLProcessCPU WHERE row_number BETWEEN 1 AND 30) AS 'SQLProcessUtilization30',
    (SELECT AVG(CPU_Usage) FROM SQLProcessCPU WHERE row_number BETWEEN 1 AND 15) AS 'SQLProcessUtilization15',
    (SELECT AVG(CPU_Usage) FROM SQLProcessCPU WHERE row_number BETWEEN 1 AND 10) AS 'SQLProcessUtilization10',
    (SELECT AVG(CPU_Usage) FROM SQLProcessCPU WHERE row_number BETWEEN 1 AND 5)  AS 'SQLProcessUtilization5',
 GETDATE() AS 'Data Sample Timestamp'
 "
 Try
 {
 Parcours Lists serveur par Foreach
 foreach ($instance in $instances){
    Write-Host "Fetching CPU/RAM information for instance" $instance.name
    $results = Invoke-Sqlcmd -Query $resourcesQuery -ServerInstance $instance.name -ErrorAction Stop -querytimeout 30
 #Insert statement 
    if($results.Length -ne 0){    
       $insert = "INSERT INTO CPU_Memory_Usage VALUES"
       foreach($result in $results){        
          $insert += "
          (
          '"+$result['Instance']+"',
          "+$result['Max Server Memory']+",
          "+$result['SQL Server Memory Usage (MB)']+",
          "+$result['Physical Memory (MB)']+",
          "+$result['Available Memory (MB)']+",
             '"+$result['System Memory State']+"',
             "+$result['Page Life Expectancy']+",
             "+$result['cache hit ratio']+",
             "+$result['SQLProcessUtilization30']+",
             "+$result['SQLProcessUtilization15']+",
             "+$result['SQLProcessUtilization10']+",
             "+$result['SQLProcessUtilization5']+",
             GETDATE()
             ),
        "
        }
 #Perform the INSERT in the central table
    Invoke-Sqlcmd -Query $insert.Substring(0,$insert.LastIndexOf(',')) -ServerInstance $server -Database $inventoryDB
    }
 }
 Write-Host "Done!" 
 }
 catch
 {
 write-host  "Error de connectivité" $instance.name
 }

Si nous interrogeons la table CPU_Memory_Usage , nous pouvons voir les données qui ont été collectées

Bonne surveillance de Vos instances

Comment Activer le mode ARCHIVELOG :

Comment savoir si une base est en mode archivelog ?

sql>select name ,log_mode from v$database;
LOG_MODE 
------------ 
NOARCHIVELOG
sql>ARCHIVE LOG LIST 
mode Database log                               mode No Archive 
Archivage automatique                           Désactivé 
Destination de l'archive                        USE_DB_RECOVERY_FILE_DEST 
Séquence de journal en ligne la plus ancienne   82 
Séquence de journal courante                    84

En mode NOARCHIVELOG, la base de données s’exécute normalement, mais il est impossible d’effectuer des opérations de récupération ou des sauvegardes en ligne à un moment donné. Ainsi, vous devez arrêter la base de données pour la sauvegarder, et lorsque vous récupérez la base de données, vous ne pouvez la récupérer qu’au moment de la dernière sauvegarde. 

Comment Activer le mode ARCHIVELOG :

Il faut tout d’abord se connecter à la DB en administrateur :

sqlplus /nolog

connect /as sysdba

1. Arrêter la base.

 shutdown immediate 

2. Sauvegarder la base.

Ce n’est pas obligatoire mais vaut toujours mieux avoir un backup avant modification.

4. Démarrer la base en mode mount sans l’ouvrir.

  STARTUP MOUNT 

5. Modifier le mode d’archivage et ouvrir la base.

  ALTER DATABASE ARCHIVELOG   

   ALTER DATABASE OPEN;  

Erreur de groupe de disponibilité AlwaysOn SQL Server: 1408 La jointure de base de données sur le réplica secondaire entraînait une erreur

J’ai été en train de configurer un environnement SQL Server AlwaysOn à deux nœuds. Lors de la configuration, nous avons reçu  »
Error: 1408 Joining database on secondary replica resulted in an error.  » Comment cette erreur s’est-elle produite et comment la résolvons-nous?

Vous pouvez voir ici que SQL Server AlwaysOn a été configuré avec succès sur le réplica secondaire xxxx, alors qu’une erreur s’est produite pour le réplica secondaire xxxx. Nous allons maintenant vérifier les détails de l’erreur pour résoudre ce problème. Vous pouvez cliquer sur le lien « Erreur » pour obtenir les détails de l’erreur, comme indiqué dans la capture d’écran ci-dessous.

vous verrez que la base de données posant problème comporte un point d’exclamation. Faites un clic droit sur cette base de données et cliquez sur «Rejoindre un groupe de disponibilité»

Maintenant, si vous lancez le rapport de tableau de bord SQL Server AlwaysOn, vous pouvez voir l’état actuel de la configuration AlwaysOn, comme indiqué dans la capture d’écran ci-dessous.

Les détails de l’erreur indiquent que « la copie distante de la base de données » DRTest « n’est pas récupérée suffisamment pour permettre la mise en miroir de la base de données ou pour la joindre au groupe de disponibilité. Vous devez appliquer les enregistrements de journal manquants à la base de données distante en restaurant le fichier en cours. enregistrer les sauvegardes de la base de données principale / principale. (Microsoft SQL Server, Erreur: 1408) « . Cela signifie que les bases de données source et cible ne sont pas synchronisées. Nous allons résoudre ce problème dans cette astuce. Cliquez sur le bouton OK pour fermer cette fenêtre.

Alter database production SET HADR AVAILABILITY GROUP = AVGProduction;

Msg 1478, Level 16, State 101, Line 1
The mirror database, « XXXXX », has insufficient transaction log data to preserve the log backup chain of the principal database. This may happen if a log backup from the principal database has not been taken or has not been restored on the mirror database.

Vous devez restaurer la sauvegarde du journal qui a été prise à partir de la base de données primaire vers la base de données secondaire et réessayer. Si vous ne trouvez pas la sauvegarde du journal ou si vous avez effectué la sauvegarde avec une autre application de sauvegarde, effectuez une sauvegarde différentielle, puis effectuez une sauvegarde du journal à partir de la base de données principale et restaurez ces sauvegardes dans la base de données secondaire en mode Norecovery

 cliquez avec le bouton droit de la souris sur la base de données secondaire dans l’onglet Bases de données de disponibilité, puis cliquez sur « Join To Avaibility Groupe »

. Au bout d’un moment, vous constaterez que l’état de la base de données secondaire est à nouveau synchronisé et que le problème est corrigé.

on passe maintenant à la réplique principale xxxxxx et lancez le rapport de tableau de bord SQL Server AlwaysOn pour cette configuration. Le rapport de tableau de bord du groupe de disponibilité « xxxxx » apparaît dans le volet de droite. L’état du groupe de disponibilité est maintenant sain et toutes les valeurs d’état sont vertes. Vous pouvez valider la configuration de la réplique secondaire xxxxx ainsi que celle illustrée ci-dessous.

lancer un vacuum full pour récupérer d’espace disque

Un détail à noter sur  l’autovacuum   c’est qu’il ne restitue pas l’espace qu’il libère dans le système d’exploitation. Au lieu de cela, il ne marque que l’espace comme libre, de sorte qu’il peut être utilisé plus tard de nouvelles lignes. Cela signifie que si vous avez un volume de 100 Go et que vous en supprimez la moitié, il occupera tout de même 100 Go, même si vous exécutez  VACUUM dessus. Pour contourner ce problème, Postgres a une commande  VACUUM FULL .

VACUUM FULL  prend une table existante et crée une nouvelle copie de la table. Cela permettra au système d’exploitation de récupérer tout l’espace libre utilisé auparavant par les lignes, mais il présente quelques inconvénients. L’implémentation actuelle de  VACUUM FULL  verrouille complètement la table en cours d’aspiration. Cela signifie que vous ne pourrez pas exécuter de requêtes ni insérer de données dans la table tant que VACUUM FULL n’est pas  terminé. En général, si vous voulez récupérer tout l’espace vide d’une table, au lieu d’utiliser  VACUUM FULL , vous devriez regarder pg_repack . L’extension pg_repack est une extension Postgres qui fournit une commande équivalente à  VACUUM FULL cela vous permet toujours d’exécuter des requêtes sur la table en cours de compactage

create table Test_vacumm (a int , b varchar(50), c varchar(80));
 
 insert into test_vacumm (a,b,c) select 1, md5('abdallah'::varchar), md5('abdallah'::varchar) from generate_series ( 1, 60000000 ) ;
INSERT 0 10000000

en lançant une requête de delete massive

delete from  test_vacumm;

DELETE 60000000

j’utilise cette petit requête

delete from  test_vacumm;


Pour récupérer les taille des différent table dans ma base de donnée

SELECT N.nspname || '.' || C.relname AS "relation",
    CASE WHEN reltype = 0
        THEN pg_size_pretty(pg_total_relation_size(C.oid)) || ' (index)'
        ELSE pg_size_pretty(pg_total_relation_size(C.oid)) || ' (' ||  pg_size_pretty(pg_relation_size(C.oid)) || ' data)'
    END AS "size (data)",
    COALESCE(T.tablespace, I.tablespace, '') AS "tablespace"
FROM pg_class C
LEFT JOIN pg_namespace N ON  (N.oid = C.relnamespace)
LEFT JOIN pg_tables T ON (T.tablename = C.relname)
LEFT JOIN pg_indexes I ON (I.indexname = C.relname)
LEFT JOIN pg_tablespace TS ON TS.spcname = T.tablespace
LEFT JOIN pg_tablespace XS ON XS.spcname = I.tablespace
WHERE nspname NOT IN ('pg_catalog','pg_toast','information_schema')
ORDER BY pg_total_relation_size(C.oid) DESC;


alors j’obtiens cette résultat

En lançant un vacuum FULL

VACUUM FULL verbose test_vacumm;

INFO: exécution du VACUUM sur « public.test_vacumm »
INFO: « test_vacumm » : 46347450 versions de ligne supprimables, 0 non supprimables
parmi 740741 pages
DÉTAIL : 0 versions de lignes ne peuvent pas encore être supprimées.
CPU 15.82s/13.03u sec elapsed 53.02 sec.

N’oubliez pas que VACUUM FULL nécessite un verrou exclusif sur la table afin que, pendant cette opération, votre table ne soit pas accessible.

aussi vous avez évidemment besoin d’un espace de stockage supplémentaire. il doit être au moins deux fois plus grand que la taille du table en question,. Si vous avez de la chance pouvez ajouter dynamiquement un disque à la machine

AlwaysOn Le réplica secondaire est à l’état  » resolving state » après le basculement

bonjour

J’ai récemment installé un simple cluster de basculement à 2 nœuds qui sera utilisé pour le groupe de disponibilité AlwaysOn. Après l’installation, j’ai proposé au client d’effectuer des tests de basculement, non seulement pour connaître le comportement du cluster de basculement Windows, mais également pour voir comment les applications réagiraient en cas de basculement. 
Lorsque j’ai désactivé la carte réseau sur le nœud hébergeant le groupe de clusters, le basculement a bien fonctionné comme prévu

J’ai réactivé la carte réseau et effectué le même test sur l’autre nœud (qui hébergeait maintenant le groupe de clusters). À ma grande surprise, il n’y a pas eu de basculement, mais le nom du cluster et l’adresse IP ont simplement été déconnectés

Cependant J’ai essayer 3  fois de basculé le secondaire il reste Toujours dans un état de « Résolution ».

J’ai vérifié les événements du cluster et constaté l’erreur suivante: « Le rôle de cluster ‘Groupe de cluster’ a dépassé son seuil de basculement»

Message D’erreur :
Based on the failure policies for the resource and role, the cluster service may try to bring the resource online on this node or move the group to another node of the cluster and then restart it. Check the resource and group state using Failover Cluster Manager or the Get-ClusterResource Windows PowerShell cmdlet.

selon la configuration du cluster par défaut La limite maximale de basculement est définie sur 1 fois sur 6 heures.

Par défaut, l’unité de temps est de 6h et le nombre de fois est de n-1 (n étant le nombre de nœuds). Par exemple avec une architecture à 2 nœuds, vous pouvez basculer au plus 4 fois dans la même journée (24 heures) , à condition que ces quatre basculement aient lieu à plus de 6h d’intervalle

vous devez cliquer avec le bouton droit sur le nom du cluster et sélectionner les propriétés. Maintenant, si vous regardez de plus près, il existe un «lien» dans les premières fenêtres appelé «Gérer le groupe de ressources du cluster principal». 
Je n’ai pas remarqué ce lien car la plupart des liens ne servent qu’à ouvrir les fichiers d’aide…

Accédez à l’onglet Basculement, où vous trouverez le nombre maximal d’échecs dans la période spécifiée. Par défaut, il est défini sur 1 dans une période de 6 heures. Cela ne suffit pas lors des tests de cluster de basculement et vous indiquera le problème que j’ai rencontré qui a échoué / hors connexion. 
Remplacez-le par une valeur plus élevée, telle que 10 par exemple

Veuillez noter que j’ai utilisé ces configurations uniquement à des opération de test

N’oubliez pas de rétablir la valeur par défaut une fois vos tests terminés.

Comment Activé la clé de licence SQL Server?

bonjour a tous

Ce tutoriel explique comment réaliser un upgrade SQL Server Evaluation Edition valable sur une période de 180j  vers une édition payante Entreprise

La procédure de mise à jour de la clé de produit SQL server est simple. En réalité, ces étapes sont identiques à celles requises pour mettre à niveau l’édition de SQL Server

Si SQL est déjà installé, vous pouvez également lancer le «Centre d’installation» en cliquant sur Démarrer-> Programmes -> Microsoft SQL Server 2017> Outils de configuration-> Centre d’installation SQL Server [(64 bits)]

donc Vous obtiendrez l’écran ci-dessous  Allez à « Maintenance » et cliquez sur « Edition Upgrade » comme indiqué ci-dessous

Sans titre

Renseigner après la clé de produit (product key) pour sélectionner l’édition achetée.

Sans titre3

Vérifier le récapitulatif des opération à effectuer, ici l’action est une « Edition Update » vers l’édition « Entreprise » avec la liste des fonctionnalités et le nom de l’instance conservée

Sans titre4

un écran récapitule les étapes de migration avec leur état

Sans titre5

Maintenant si on vérifie on voit  qu’on arrive bien a activé la version Entreprise Edition

Sans titre

Le serveur SQL est maintenant sous licence Entreprise et il est bien Activé

Si vous voulez le faire en ligne de commande, vous pouvez lancer setup.exe avec les paramètres requis.


Setup.exe /q /ACTION=EditionUpgrade /INSTANCENAME=MSSQLSERVER /PID=” /IACCEPTSQLSERVERLICENSETERMS

bonne Activation

TRUNCATE TABLE WITH PARTITIONS (SQL Server 2016)

Bonjour

TRUNCATE TABLE WITH PARTITIONS est une nouvelle Amélioration de T-SQL dans SQL Server 2016
Il est bien connu que TRUNCATE TABLE est plus rapide que l’instruction DELETE. TRUNCATE TABLE utilise des ressources système et un fichier journal transactionnel inférieurs à ceux d’une instruction DELETE.

À partir de SQL Server 2016, Microsoft a introduit une nouvelle clause TRUNCATE TABLE WITH PARTITIONS qui peut être utilisée pour tronquer toutes les lignes disponibles dans une partition

Passons en revue une simple démonstration pour nous montrer comment cela fonctionne. Nous allons commencer par ajouter un  nouveaux groupes de fichiers nommé FG1 et UN  fichiers de données à notre base de données AdventureworksDW2016CTP3 existante avec le script ci-dessous:

use [AdventureworksDW2016CTP3]

GO
use [master]

GO
USE [master]
GO
ALTER DATABASE [AdventureworksDW2016CTP3] ADD FILEGROUP [FG1]
GO

Une fois que le groupe de fichiers et les fichier ndf de base de données sont prêts, nous allons créer la fonction de partitionnement ainsi que le schéma de partitionnement

use [AdventureworksDW2016CTP3]

GO
use [model]

GO
USE [master]
GO
ALTER DATABASE [AdventureworksDW2016CTP3] ADD FILE ( NAME = N'AdventureWorksDW2014_Data2', FILENAME = N'C:\Data\AdventureWorksDW2016CTP3_Log.ndf' , SIZE = 8192KB , FILEGROWTH = 65536KB ) TO FILEGROUP [FG1]
GO

USE [AdventureworksDW2016CTP3]
GO
BEGIN TRANSACTION
CREATE PARTITION FUNCTION [Parttion1](datetime) AS RANGE LEFT FOR VALUES (N'2005-01-01T00:00:00', N'2005-05-01T00:00:00', N'2005-11-01T00:00:00', N'2007-01-01T00:00:00', N'2010-05-05T00:00:00', N'2015-05-05T00:00:00')

CREATE PARTITION SCHEME [Partition1] AS PARTITION [Parttion1] TO ([FG1], [FG1], [FG1], [FG1], [FG1], [FG1], [FG1])

ALTER TABLE [dbo].[FactResellerSalesXL_PageCompressed] DROP CONSTRAINT [PK_FactResellerSalesXL_PageCompressed_SalesOrderNumber_SalesOrderLineNumber] WITH ( ONLINE = OFF )

SET ANSI_PADDING ON

ALTER TABLE [dbo].[FactResellerSalesXL_PageCompressed] ADD  CONSTRAINT [PK_FactResellerSalesXL_PageCompressed_SalesOrderNumber_SalesOrderLineNumber] PRIMARY KEY NONCLUSTERED
(
	[SalesOrderNumber] ASC,
	[SalesOrderLineNumber] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, DATA_COMPRESSION = PAGE) ON [FG1]

CREATE CLUSTERED INDEX [ClusteredIndex_on_Partition1_636714223260918622] ON [dbo].[FactResellerSalesXL_PageCompressed]
(
	[ShipDate]
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, DATA_COMPRESSION = PAGE ON PARTITIONS (1 TO 7)) ON [Partition1]([ShipDate])

DROP INDEX [ClusteredIndex_on_Partition1_636714223260918622] ON [dbo].[FactResellerSalesXL_PageCompressed]

COMMIT TRANSACTION

Nous allons maintenant l’exécution de l’instruction truncate TABLE. L’instruction TRUNCATE ci-dessous est utilisée pour tronquer le deuxième et troisième partitions et la quatrième partition de la table FactResellerSalesXL_PageCompressed ce qui supprimera les données de ces partition

TRUNCATE TABLE FactResellerSalesXL_PageCompressed
WITH (PARTITIONS (2 TO 4));
GO

Maintenant interrogeons la table sys.partitions pour vérifier le nombre d’enregistrements dans chaque partition avant et après l’application de l’instruction TRUNCATE TABLE:

Sans_titre-lanczos3 (1)

Activer le chiffrement transparent des données TDE

bonjour

Vous pouvez configurer le chiffrement de données transparent (TDE) lorsque vous créez une base de données pour la première fois ou que vous pouvez l’appliquer à une base de données existante. Dans ce dernier cas, une fois que TDE a été activé, il sera configuré pour chiffrer vos données existantes en arrière-plan.

Dans les deux cas, les étapes sont les mêmes. Nous allons les parcourir rapidement avant d’entrer dans les détails.

Vous devez d’abord avoir une clé principale de base de données (DMK) dans la base de données principale et un certificat qui sera utilisé par TDE

USE MASTER;

CREATE MASTER KEY
ENCRYPTION BY PASSWORD = 'MasterkeyTunisie20180819';

Puis vous devrez procéder a crée votre propre certificat

CREATE CERTIFICATE TDE_Cert
WITH SUBJECT = 'Chiffrement base de données ';

Cet certificat est essentiel pour pouvoir accéder aux données chiffrées par TDE, vous devez donc vous assurer de les sauvegarder

Pour sauvegarder votre certificat il faut procéder a faire :

BACKUP CERTIFICATE TDE_Cert
TO FILE = 'C:\TDE_Cert'
WITH PRIVATE KEY
(
    FILE = 'C:\Privatekey_cert',
    ENCRYPTION BY PASSWORD = 'Password_TDE@20180819'
);

Ensuite, dans la base de données chiffrée avec TDE, vous devez créer une clé de chiffrement de la base de données (DEK) et spécifier le certificat

USE Production ;

CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_256
ENCRYPTION BY SERVER CERTIFICATE TDE_Cert  ;

Enfin, vous Pouvez activez le cryptage sur votre base de donné :

ALTER DATABASE TestTDE SET ENCRYPTION ON;

En mode Graphique
Sans titre.png

Sans titre

vous pouvez voir Si votre bases de données est activées par TDE en consultant la colonne is_encrypted:

SELECT name
FROM sys.databases
WHERE is_encrypted = 1;

ou a travers

SELECT
   d.name,
   k.encryption_state,
   k.encryptor_type,
   k.key_algorithm,
   k.key_length,
   k.percent_complete
FROM sys.dm_database_encryption_keys k
INNER JOIN sys.databases d
   ON k.database_id = d.database_id;

Sans titre

bonne chiffrement