Zadanie
Archiwizuj wszystkie oprócz 13-miesięcznego okresu z grupy dużych tabel. Zarchiwizowane dane muszą być przechowywane w innej bazie danych.
- Baza danych znajduje się w prostym trybie odzyskiwania
- Tabele mają od 50 milionów wierszy do kilku miliardów, a w niektórych przypadkach zajmują setki GB.
- Tabele nie są obecnie podzielone na partycje
- Każda tabela ma jeden indeks klastrowy w stale rosnącej kolumnie daty
- Każda tabela ma dodatkowo jeden indeks nieklastrowany
- Wszystkie zmiany danych w tabelach są wstawkami
- Celem jest zminimalizowanie przestojów podstawowej bazy danych.
- Serwer to 2008 R2 Enterprise
Tabela „archiwum” będzie miała około 1,1 miliarda wierszy, a tabela „na żywo” około 400 milionów. Oczywiście tabela archiwów wzrośnie z czasem, ale spodziewam się, że tabela na żywo wzrośnie również dość szybko. Powiedz 50% w ciągu najbliższych kilku lat.
Myślałem o bazach danych Azure stretch, ale niestety jesteśmy w 2008 R2 i prawdopodobnie pozostaniemy tam przez jakiś czas.
Obecny plan
- Utwórz nową bazę danych
- Utwórz nowe tabele podzielone na partycje według miesięcy (używając zmodyfikowanej daty) w nowej bazie danych.
- Przenieś ostatnie 12-13 miesięcy danych do tabel podzielonych na partycje.
- Wykonaj zamianę nazw dwóch baz danych
- Usuń przeniesione dane z obecnie „archiwizowanej” bazy danych.
- Podziel każdą tabelę na partycje w bazie danych „archiwum”.
- Użyj swapów partycji do archiwizacji danych w przyszłości.
- Zdaję sobie sprawę, że będę musiał zamienić dane do zarchiwizowania, skopiować tę tabelę do bazy danych archiwum, a następnie zamienić ją do tabeli archiwum. To jest do przyjęcia.
Problem: Próbuję przenieść dane do początkowych partycjonowanych tabel (w rzeczywistości wciąż robię na tym dowód koncepcji). Próbuję użyć TF 610 (zgodnie z Przewodnikiem wydajności ładowania danych ) i INSERT...SELECT
instrukcji do przeniesienia danych, początkowo sądząc, że zostaną one minimalnie zarejestrowane. Niestety za każdym razem, gdy próbuję, jest w pełni zalogowany.
W tym momencie myślę, że moim najlepszym rozwiązaniem może być przeniesienie danych za pomocą pakietu SSIS. Staram się tego unikać, ponieważ pracuję z 200 tabelami i wszystko, co mogę zrobić za pomocą skryptu, mogę łatwo wygenerować i uruchomić.
Czy brakuje mi czegoś w moim ogólnym planie i czy SSIS jest moim najlepszym rozwiązaniem do szybkiego przenoszenia danych przy minimalnym wykorzystaniu dziennika (dotyczy miejsca)?
Kod demonstracyjny bez danych
-- 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
Przenieś kod
USE Audit_New
GO
DBCC TRACEON(610);
INSERT INTO AuditTable
SELECT * FROM Audit.dbo.AuditTable
WHERE Modified >= '6/1/2015'
ORDER BY Modified