vrijdag 8 maart 2013

Migratie naar Windows Azure SQL Database (Deel 3)

In de vorige twee delen hebben we gezien hoe we de database in twee stappen de cloud in kunnen schieten. In het eerste deel hebben we het schema gemigreerd en in het tweede deel de data.
In dit artikel kijken we hoe we de database in de cloud kunnen krijgen via Data-tier Applications Export and Import. Deze benadering heeft als voordeel dat zowel schema als data in één keer gemigreerd kunnen worden. (Hoewel dit met Windows Azure SQL Database Migration Wizard ook mogelijk was)

Data-tier Applications (DACis vrij geruisloos geïntroduceerd in SQL Server 2008 R2. DAC beschrijft hoe een database eruit ziet (op metadata nivo). Hierbij moet je denken aan tabellen, stored procedures, views en nog veel meer. Een ontwikkelaar kan vanuit Visual Studio (Premium of hoger) eenvoudig werken op zo'n DAC. Hij kan zijn wijzigingen doorvoeren en vervolgens de hele DAC uitrollen naar een package file (DACPAC). Zo'n DACPAC kan vervolgens aan een database administrator worden doorgegeven, die er dan een nieuwe database van maakt of, mooier nog, een bestaande mee upgrade (DACPAC ondersteunt versies). Dit alles wordt fraai begeleid met allerlei controles, die in de stress schieten zodra er iets gebeurt dat niet in de haak is (zoals verlies van data). Zie Data Tier Applications voor meer informatie.
Naast DACPAC-bestanden is DAC ook in staat om backup packages (BACPAC) te maken. Zo'n BACPAC bevat dan, naast de DAC informatie, ook de data zelf. Hier wordt het nu interessant. Wellicht is het mogelijk om met een BACPAC onze database in de cloud te krijgen.

Allereerst moeten we zo'n BACPAC genereren. Dat kan vanuit SQL Server Management Studio door de database te selecteren en vanuit het contextmenu "Tasks->Export Data-tier Application" te kiezen. Na het informatiescherm kom je dan uit op het venster in afbeelding 1


Afbeelding 1. Export Data-tier
Hier kun je de naam van de BACPAC-file opgeven en vervolgens ben je klaar om hem te genereren (er volgen alleen nog wat informatieve vensters). Het BACPAC-bestand moet je dan vervolgens in de cloud zien te krijgen van waaruit je hem in Windows Azure SQL Database kunt importeren.
Interessant is de tweede optie. Die stelt mij in staat om het BACPAC-bestand meteen in de cloud te zetten. Daarvoor moeten we wel eerst een Blob storage aanmaken. We gaan dus eerst naar de Azure portal om die storage aan te maken (afbeelding 2). Van daaruit selecteren we "Create Storage Account" hetgeen leidt naar het scherm in afbeelding 3, waarin de naam en de locatie van de storage worden ingevuld.

Afbeelding 2: Azure Portal
Afbeelding 3: Creatie van de Blob storage
Wanneer dit allemaal gebeurd is, wordt de storage aangemaakt. Dit kan even duren. Eenmaal klaar kun je de storagedetails opvragen (afbeelding 4).

Afbeelding 4: de details van de storage
In dit venster zie je een drietal URL's:
  1. Blobs om grote bestanden, zoals plaatjes, images e.d. te plaatsen
  2. Tables om gestructureerde data kwijt te kunnen (bruikbaar voor NoSql)
  3. Queues om taken in te schieten, die door services (Workers) kunnen worden geconsumeerd.
Helemaal onderin het scherm staan twee knoppen; "Manage Keys" en "Delete". Het laat zich raden wat die laatste doet, maar de eerste is voor dit moment belangrijk. Wanneer je erop klikt krijg je een scherm (afbeelding 5) met de naam van de storage en een tweetal keys, de Primary Access Key en de Secondary Access Key. Beide dienen eenzelfde doel; toegang tot de storage. De tweede heb je nodig als je de eerste wilt veranderen zonder downtime. Voor nu hebben we alleen de naam van de storage en de primary access key nodig.

Afbeelding 5: Storage informatie
Nu het voorbereidende werk achter de rug is, kunnen we ons gaan bezighouden met het genereren van de BACPAC. Hiervoor gaan we weer naar SQL Server Management Studio (SSMS) en selecteren we de te exporteren database. In het contextmenu selecteren we "Tasks->Export Data-tier Application" welke ons leidt naar een introductiescherm, dat we meteen middels de "Next" knop wegdrukken zodat we op het scherm in afbeelding 6 uitkomen.

Afbeelding 6: Export Data-tier Application.
In dit venster selecteren we "Save to Windows Azure" en klikken vervolgens op de "Connect..." knop. In het popupvenster (afbeelding 7) geven we de naam van de storage en de primary access key op.

Afbeelding 7: Storage informatie opgeven
Vervolgens moeten we nog een container specificeren. Zo'n container is een logische groepering van soorten blob's; bijvoorbeeld plaatjes, video's en images. Je kunt er iedere naam specificeren, maar om het overzichtelijk te houden zullen we hem maar bacpacs noemen. "Next" en "Finish". De BACPAC wordt nu gegenereerd en in de storage gezet. Schrik niet als het venster even niet meer reageert. Het komt allemaal goed.

Nou ja, dat ging dus niet helemaal goed (afbeelding 8). SQL Azure ondersteunt geen Windows Authenticatie en ook geen assemblies. Daarnaast moet ik nog wat clustered indexen leggen op tabellen. Eerst maar eens die problemen oplossen en daarna nog een keer proberen.


Afbeelding 8. Database niet compatible met Windows Azure SQL Database
Wanneer de export geslaagd is, kun je vanuit de Azure Portal de BACPAC importeren. Selecteer hiervoor de "Database" node en klik op de import knop onderin beeld. Op het popup venster (afbeelding 9) selecteer je de BACPAC uit de storage en, als je nog geen databaseserver hebt, "New SQL Database Server". 


Afbeelding 9. BACPAC importeren.
Zet ook de optie "Configure Advanced Database Options" aan, zodat je kunt aangeven wat voor een database je wilt hebben (afbeelding 10). De import kan nu beginnen.


Afbeelding 10. Database opties
Alles leek goed te gaan, echter de volgende fout gooide roet in het eten:

Error encountered during the service operation. Could not import package. Warning SQL0: A project which specifies SQL Server 2012 as the target platform may experience compatibility issues with SQL Azure. Error SQL72014: .Net SqlClient Data Provider: Msg 3616, Level 16, State 1, Line 5 An error was raised during trigger execution. The batch has been aborted and the user transaction, if any, has been rolled back. Error SQL72045: Script execution error. The executed script: DECLARE @c AS INT = 1; WHILE @c = 1 BEGIN DELETE TOP (1000) [Core].[Brand]; IF @@rowcount < 1000 SET @c = 0; END

Dat is een hele mond vol, maar het komt erop neer dat een trigger hier de boosdoener is. Laten we die trigger eens verwijderen (Wel eerst een create script voor maken. Uiteindelijk hebben we hem wel nodig).
Dit bleek inderdaad een goede keus (afbeelding 11). De import is helemaal gelukt. Nu de trigger weer aanmaken en we zijn klaar om te gaan. (Nog wel even jouw ip-adres registreren in Windows Azure SQL Database)


Afbeelding 11. De import is geslaagd.


Geen opmerkingen:

Een reactie posten