Mam bardzo dużą produkcyjną bazę danych i bardzo dużą bazę danych środowiska testowego w SQL Server 2008R2. Obie bazy danych mają podobną strukturę tabel, ale różnych użytkowników / loginy / uprawnienia / role.
Muszę od czasu do czasu odświeżać tylko kilka tabel w testowej bazie danych, mniej więcej raz w miesiącu.
Obecnie planuję to zrobić
- Użyj narzędzia BCP, aby wyeksportować tabele, których potrzebuję z produkcji.
- Skopiuj plik eksportu bcp na serwer testowy
- Wyłącz indeksy i ograniczenia dla wszystkich tabel, które odświeżam w teście
- Obetnij tabele testowej bazy danych
- Załaduj dane z powrotem do testowania tabel bazy danych za pomocą BCP.
- odbuduj indeksy i ponownie włącz ograniczenia w teście
To wszystko wydaje się trochę zbyt skomplikowane jak na tak małe zadanie. Wydaje się również, że spowodowałoby to wiele przeróbek (w dzienniku T) Czy istnieje lepszy sposób na zrobienie tego?
Innym sposobem, w jaki o tym pomyślałem, jest przywrócenie kopii zapasowej z Produkcji do środowiska testowego - ale mam problem z tym, że pełna kopia zapasowa byłaby dość duża i nie potrzebuję odświeżania wszystkich tabel, tylko kilka - - a także użytkownicy i bezpieczeństwo w produkcyjnej bazie danych różnią się od testu. Zostaną zastąpione przez ustawienia bezpieczeństwa w produkcyjnej bazie danych, jeśli przywrócę całą bazę danych.
źródło
Odpowiedzi:
Istnieją 2 metody, które odpowiadają Twoim potrzebom:
(Uwaga: jeśli do tabel odwołuje się klucz obcy, nie będziesz mógł ich używać
TRUNCATE
. Musisz usunąć fragmenty . Alternatywnie możesz usunąć wszystkie indeksy + Klucze obce i załadować dane, a następnie ponownie je utworzyć).Docelowa baza danych BCP OUT i BULK INSERT INTO .
Włącz flagę śledzenia 610 - minimalnie zalogowane wstawki do indeksowanych tabel.
-
Metoda 2: SSIS - w tym przypadku moja preferowana metoda.
Odniesienie: Przewodnik po wydajności ładowania danych i moja odpowiedź na - Wstaw do tabeli wybierz * z tabeli vs wstawianie zbiorcze
źródło
Nie ma potrzeby robienia kopii zapasowych i przywracania, ani wywoływania / koordynowania procesów zewnętrznych (np. BCP), ani nawet bałagania w SSIS (bardzo potężny, bardzo fajny, ale jeśli mogę tego uniknąć, na pewno będę :). Możesz sobie z tym wszystkim poradzić, korzystając z T-SQL, w procedurze przechowywanej, którą możesz zaplanować za pomocą agenta SQL lub skryptu uruchamianego raz w miesiącu (chociaż posiadanie go w proc i planowanie jest mniej pracochłonne biegać). W jaki sposób? Korzystając z SQLCLR, aby uzyskać dostęp do
SqlBulkCopy
klasy w .NET, ponieważ jest to zasadniczo BCP, bez kłopotów z wywoływaniem BCP. Możesz to sam kodować: nie ma super skomplikowanej konfiguracji ani niczego takiego jakSqlBulkCopy
klasa zajmuje się prawie wszystkim za Ciebie (możesz ustawić wielkość partii, niezależnie od tego, czy chcesz uruchamiać wyzwalacze itp.). Lub, jeśli nie chcesz zadzierać ze skompilowaniem i wdrożeniem zestawu , możesz użyć wstępnie zbudowanej procedury składowanej SQLCLR, takiej jak DB_BulkCopy, która jest częścią biblioteki SQL # SQLCLR (której jestem autorem, ale jest ona przechowywana procedura jest w wersji darmowej). Opisuję to bardziej szczegółowo, w tym przykład użycia DB_BulkCopy , w następującej odpowiedzi:Importuj dane z jednej bazy danych do innego skryptu
Jeśli nie jest jasne, gdzie umieścić to w bieżącym planie, wykonaj następujące czynności:
EXEC
o DB_BulkCopy czy cokolwiek to nazwać, jeśli to sam kod, który po prostu przenosi dane z punktu A do punktu B.Należy również zauważyć, że
SqlBulkCopy
i DB_BulkCopy :AKTUALIZACJA dotycząca minimalnie zarejestrowanych operacji za pośrednictwem SqlBulkCopy
Możliwe jest uzyskanie minimalnie zarejestrowanych operacji, ale powinieneś wiedzieć:
[tempdb]
a następnie wykonaj uporządkowane wstawianie do miejsca docelowego. W związku z tym wiąże się to z dodatkowym obciążeniem, zarówno fizycznym we / wy do tempdb (pliki danych i dziennika), jak i operacją sortowania (ze względu na to,ORDER BY
która jest wymagana do uzyskania minimalnie rejestrowanych operacji)źródło