Pozadí
Jednou jsem potřeboval zálohu produkční databáze k reprodukci chyby.
K mému překvapení jsem narazil na následující omezení:
- Záloha databáze byla vytvořena ve verzi SQL Server 2016 a nebyla kompatibilní s mým SQL Server 2014.
- Na mém pracovním počítači byla jako OS použita Windows 7, takže jsem nemohl přejít SQL Server na verzi 2016
- Podporovaný produkt byl součástí většího systému s silně propojenou legacy architekturou a také se odkazoval na další produkty a databáze, proto by jeho nasazení na jinou stanici mohlo trvat velmi dlouho.
Vzhledem k výše uvedenému jsem dospěl k závěru, že nastal čas na improvizovaná řešení.
Obnovení dat ze zálohy
Rozhodl jsem se použít virtuální stroj s Windows 10 (můžete vzít zkušební obraz pro prohlížeč Edge ). Na virtuální stroj byl nainstalován SQL Server 2016 a na něm byla ze zálohy obnovena databáze aplikace ().
Nastavení přístupu k SQL Serveru na virtuálním stroji
Dále bylo nutné učinit několik kroků, aby byl možný přístup k SQL Serveru zvenčí:
- Pro firewall přidat pravidlo pro povolení požadavků na port 1433.
- Je lepší, aby přístup na server fungoval ne přes Windows autentizaci, ale přes SQL pomocí uživatelského jména a hesla (snadnější nastavení přístupu). V tomto případě je však třeba nezapomenout povolit v nastavení SQL Serveru možnost SQL autentizace.
- V nastavení uživatele na SQL Serveru na kartě User Mapping určit pro obnovenu databázi roli uživatele db_securityadmin.
Přenos dat
Přenos dat se vlastně skládá ze dvou fází:
- Přenos schéma dat (tabulky, pohledy, uložené procedury atd.)
- Přenos samotných dat
Přenos schéma dat
Provádíme následující operace:
- Vyberte Tasks -> Generate Scripts pro přenášenou databázi.
- Vybereme požadované objekty k přenosu nebo ponecháme výchozí hodnotu (v tomto případě budou vytvořeny skripty pro všechny objekty databáze).
- Uvedeme nastavení pro uložení skriptu. Nejpohodlnější je uložit skript do jednoho souboru v kódování Unicode. Pak při selhání není potřeba znovu opakovat všechny kroky.
Po uložení skriptu ho lze vykonat na původním SQL Serveru (staré verzi), abychom vytvořili požadovanou databázi.
Pozor: Po provedení skriptu je nutné zkontrolovat shodu nastavení databáze z zálohy a databáze vytvořené skriptem. V mém případě ve skriptu chybělo nastavení pro COLLATE, což vedlo k chybě při přenosu dat a komplikovanému přestavění databáze za pomoci upraveného skriptu.
Přenos dat
Před přenosem dat je nutné vypnout kontrolu všech omezení na databázi:
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'Přenos dat provádíme pomocí průvodce importem dat Úkoly -> Importovat data na SQL Serveru, kde se nachází databáze vytvořená skriptem:
- Uvedeme nastavení připojení ke zdroji (SQL Server 2016 na virtuálním stroji). Použil jsem Data Source SQL Server Native Client a výše zmíněnou SQL autentizaci.
- Uvedeme nastavení připojení k cíli (SQL Server 2014 na hostitelském stroji).
- Dále nastavíme mapování. Je nutné vybrat všechny ne read-only objekty (např. pohledy není nutné vybírat). Jako další možnosti by mělo být vybráno „Povolit vkládání do identity sloupců“, pokud takové existují.
Pozor: pokud se při pokusu o vybrání několika tabulek a nastavení jejich vlastnosti „Povolit vkládání do identity sloupců“ vlastnost již byla dříve nastavena alespoň pro jednu z vybraných tabulek, v dialogu bude uvedeno, že vlastnost již byla nastavena pro všechny vybrané tabulky. Tento fakt může zmást a vést k chybám při přenosu. - Spustíme přenos.
- Obnovujeme kontrolu omezení:
EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'
Pokud se objeví nějaké chyby, zkontrolujeme nastavení, odstraníme vytvořenou databázi s chybami, znovu ji vytvoříme ze skriptu, provedeme opravy a zopakujeme přenos dat.
Závěr
Tento úkol se vyskytuje poměrně zřídka a vzniká pouze z výše uvedených omezení. Nejčastěji spočívá řešení v aktualizaci SQL Serveru nebo připojení k vzdálenému serveru, pokud to umožňuje architektura aplikace. Nicméně od lélegacy kódu a špatně provedeného vývoje nikdo není chráněn. Doufám, že budete tuto instrukci potřebovat co nejméně, a pokud se přece jen objeví, pomůže vám ušetřit spoustu času a nervů. Děkuji za pozornost!
Seznam použitých zdrojů
Zdroj: habr.com
