Tâche
Archivez tout sauf une période continue de 13 mois à partir d'un groupe de grandes tables. Les données archivées doivent être stockées dans une autre base de données.
- La base de données est en mode de récupération simple
- Les tableaux sont des rangées de 50 mil à plusieurs milliards et, dans certains cas, occupent des centaines de Go chacun.
- Les tables ne sont actuellement pas partitionnées
- Chaque table possède un index cluster sur une colonne de date toujours croissante
- Chaque table possède en outre un index non clusterisé
- Toutes les modifications de données apportées aux tableaux sont des insertions
- L'objectif est de minimiser les temps d'arrêt de la base de données primaire.
- Le serveur est 2008 R2 Enterprise
La table "archive" aura environ 1,1 milliard de lignes, la table "live" environ 400 millions. Évidemment, la table d'archives augmentera avec le temps, mais je m'attends à ce que la table en direct augmente également assez rapidement. Disons 50% au moins au cours des deux prochaines années.
J'avais pensé aux bases de données extensibles Azure, mais malheureusement, nous sommes à 2008 R2 et nous y resterons probablement un certain temps.
Plan actuel
- Créer une nouvelle base de données
- Créez de nouvelles tables partitionnées par mois (en utilisant la date modifiée) dans la nouvelle base de données.
- Déplacez les 12-13 derniers mois de données dans les tables partitionnées.
- Effectuer un changement de nom des deux bases de données
- Supprimez les données déplacées de la base de données désormais "archive".
- Partitionnez chacune des tables de la base de données "archive".
- Utilisez les échanges de partitions pour archiver les données à l'avenir.
- Je me rends compte que je vais devoir échanger les données à archiver, copier cette table dans la base de données d'archive, puis l'échanger dans la table d'archive. C'est acceptable.
Problème: j'essaie de déplacer les données dans les tables partitionnées initiales (en fait, je fais encore une preuve de concept dessus). J'essaie d'utiliser TF 610 (conformément au Guide de performance de chargement des données ) et une INSERT...SELECT
instruction pour déplacer les données en pensant initialement qu'elles seraient enregistrées de manière minimale. Malheureusement, chaque fois que j'essaie, il est entièrement connecté.
À ce stade, je pense que mon meilleur pari pourrait être de déplacer les données à l'aide d'un package SSIS. J'essaie d'éviter cela car je travaille avec 200 tables et tout ce que je peux faire par script, je peux facilement le générer et l'exécuter.
Y a-t-il quelque chose qui me manque dans mon plan général, et SSIS est-il mon meilleur pari pour déplacer les données rapidement et avec une utilisation minimale du journal (problèmes d'espace)?
Code de démonstration sans données
-- Existing structure
USE [Audit]
GO
CREATE TABLE [dbo].[AuditTable](
[Col1] [bigint] NULL,
[Col2] [int] NULL,
[Col3] [int] NULL,
[Col4] [int] NULL,
[Col5] [int] NULL,
[Col6] [money] NULL,
[Modified] [datetime] NULL,
[ModifiedBy] [varchar](50) NULL,
[ModifiedType] [char](1) NULL
);
-- ~1.4 bill rows, ~20% in the last year
CREATE CLUSTERED INDEX [AuditTable_Modified] ON [dbo].[AuditTable]
( [Modified] ASC )
GO
-- New DB & Code
USE Audit_New
GO
CREATE PARTITION FUNCTION ThirteenMonthPartFunction (datetime)
AS RANGE RIGHT FOR VALUES ('20150701', '20150801', '20150901', '20151001', '20151101', '20151201',
'20160101', '20160201', '20160301', '20160401', '20160501', '20160601',
'20160701')
CREATE PARTITION SCHEME ThirteenMonthPartScheme AS PARTITION ThirteenMonthPartFunction
ALL TO ( [PRIMARY] );
CREATE TABLE [dbo].[AuditTable](
[Col1] [bigint] NULL,
[Col2] [int] NULL,
[Col3] [int] NULL,
[Col4] [int] NULL,
[Col5] [int] NULL,
[Col6] [money] NULL,
[Modified] [datetime] NULL,
[ModifiedBy] [varchar](50) NULL,
[ModifiedType] [char](1) NULL
) ON ThirteenMonthPartScheme (Modified)
GO
CREATE CLUSTERED INDEX [AuditTable_Modified] ON [dbo].[AuditTable]
(
[Modified] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON ThirteenMonthPartScheme (Modified)
GO
CREATE NONCLUSTERED INDEX [AuditTable_Col1_Col2_Col3_Col4_Modified] ON [dbo].[AuditTable]
(
[Col1] ASC,
[Col2] ASC,
[Col3] ASC,
[Col4] ASC,
[Modified] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON ThirteenMonthPartScheme (Modified)
GO
Déplacer le code
USE Audit_New
GO
DBCC TRACEON(610);
INSERT INTO AuditTable
SELECT * FROM Audit.dbo.AuditTable
WHERE Modified >= '6/1/2015'
ORDER BY Modified