Skip to main content

Cum putem sa importam/exportam un volum mare de date pe SQL Azure

Intr-un post anterior am discutat despre "SQL Azure Data Sync" - "Microsoft Sync Framework". Isi face treaba foarte bine dar este o solutie putin mai complicata. Parca as vrea o solutie mai simpla, care sa nu necesite cunostinte de programare.
Mai jos o sa va propun 3 variante:
  1. Generare scripturi
  2. BCP utility
  3. Data-tier Application Component Packages( DACPAC)
(solutiile date necisita SQL Server 2008 R2)

1. Generare scripturi
In prima varianta este nevoie sa generam scripturile de mana prin SQL Management Studio. Pentru a putea face acest lucru trebuie sa selectam baza de date la care vrem sa facem back-up, click dreapta pe ea, iar apoi Task-Generate Scripts. Atentia, este foarte important sa schimbam valoarea campului "Script for the database engine" din meniul "Advanced Scripting Option". Valoarea pe care trebuie sa o selectam este "SQL Azure Database". Aceasta optiune ne permite sa generam scripturi compatibile cu SQL Azure.
Odata ce avem fisierul generat, putem sa mergem pe portal la Windows Azure si sa cream o noua baza de date. Initial aceasta o sa fie goala, dar odata baza de date creata putem sa ne conectam cu ajutorul la "SQL Management Studio". La server name o sa scriem DNS-ul bazei noastre de date - [nume].database.windows.net. Click dreapta pe baza de date unde trebuie sa cream un nou query. In acesta o sa rulam scriptul generat la primul pas.
Ce nu imi place la aceasta solutie este ca deșii se poate automatiza procesul avem nevoie de "SQL Management Studio".

2. BCP utility
Iata ca am ajuns la a doua varianta. Acest utilitar vine cu Sql Server. In linii mari stie sa copieze informatia dintr-o baza de date intr-un format dorit de catre utilizator. Nu stie din pacate sa copieze direct informatia dintr-o baza de date in alta. Din aceasta cauza trebuie sa il apelam de doua ori. Odata pentru export, iar mai tarziu pentru import.
Cea ce trebuie spus despre BCP este ca nu stie sa faca export si la schema. Stie doar sa faca export la continutul tabelelor, dar face acest lucru extrem de bine.
De exemplu, pentru a putea exporta datele din tabele Cars trebuie sa rulam:
bcp TestDb.dbo.Cars out "C:\Cars.txt" -T -c -U local@localhost -P 123456789
Odata executa aceasta linie de cod, o sa avem in fisierul "C:\Cars.txt" tot continutul pentru tabela Cars. Pentru a putea face import la date in SQL Azure trebuie sa rulam
bcp TestDbCloud.dbo.Cars in "C:\Cars.txt" -c -U "radu.vunvulea@numeServerSqlAzure -S numeServerSqlAzure.database.windows.net -P 123456789
Putem sa filtram tabelul printr-un select scris de noi. Pentru mai multe informatii despre BCP
http://msdn.microsoft.com/en-us/library/ms187086%28SQL.105%29.aspx

3. Data Tier Packages( DACPAC)
Este un mecanism aparut cu VS2010 si SQL Server 2008 RC2. Acesta ne permite sa facem "deploy" la baza de date direct din VS2010. A.i. nu mai avem nevoie sa scripturi SQL pentru deployment.
Din pacate in momentul acesta DACPAC nu este inca un produs matur. La orice schimbare a baze de date acesta genereaza din nou baza de date de la 0. Scripturile pe care le genereaza sunt puse intr-un singur fisier( din pacate nu avem fisiere separate pentru create, modificare si inserare). Un alt minus esta ca nu stie sa copieze si user permission bazei de date pentru care genereaza scriptul. L-am incercat pe un proiect mic, dar mi-a lasat un gust amar, se descurca destul de greu si cu o baza de date destul de simpla.
Templat-ul pentru solutii DACPAC se gaseste in VS2010 sub numele "SQL Server Data-tier Application". Nu o sa explic pas cu pas cum se foloseste. Cred ca merita de spus modul in care se face deploy prin DACPAC. Pasii de mai jos se fac in mod automat:
  • creează o noua baza de date;
  • creează tabelele;
  • se face disable la constrîngeri;
  • baza de date deja existenta se trece pe single user( daca exista deja o baza de date cu numele dat);
  • toate datele din baza de date deja existenta se copiaza in noua baza de date;
  • vechia baza de date se redenumeste;
  • noua baza de date i-a denumirea corespunzătoare;
  • vechia baza de date se sterge;
Ce aduce in plus DACPAC si ii prevad un viitor este versionarea. In mod normal versionarea bazei de date este un lucru destul de complex si cu multe batai de cap.

Comments

  1. Nu s-ar putea si cu SSIS (SQL Server Integration Services) ? (daca export/import-ul e vazut ca un ETL..)

    ReplyDelete
  2. Da, se poate folosii si SSIS, unde se poate deveni orice flow pentru date. Trebuie doar un mic know how despre SSIS. Pentru o baza de date mare si complexa, unde pot sa existe mai multe flow-uri SSIS ar fi extrem de util.
    Cea mai simpla solutie mi s-a parut cea cu BCP.

    ReplyDelete

Post a Comment

Popular posts from this blog

Windows Docker Containers can make WIN32 API calls, use COM and ASP.NET WebForms

After the last post , I received two interesting questions related to Docker and Windows. People were interested if we do Win32 API calls from a Docker container and if there is support for COM. WIN32 Support To test calls to WIN32 API, let’s try to populate SYSTEM_INFO class. [StructLayout(LayoutKind.Sequential)] public struct SYSTEM_INFO { public uint dwOemId; public uint dwPageSize; public uint lpMinimumApplicationAddress; public uint lpMaximumApplicationAddress; public uint dwActiveProcessorMask; public uint dwNumberOfProcessors; public uint dwProcessorType; public uint dwAllocationGranularity; public uint dwProcessorLevel; public uint dwProcessorRevision; } ... [DllImport("kernel32")] static extern void GetSystemInfo(ref SYSTEM_INFO pSI); ... SYSTEM_INFO pSI = new SYSTEM_INFO(...

ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded

Today blog post will be started with the following error when running DB tests on the CI machine: threw exception: System.InvalidOperationException: The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' registered in the application config file for the ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded. Make sure that the assembly-qualified name is used and that the assembly is available to the running application. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information. at System.Data.Entity.Infrastructure.DependencyResolution.ProviderServicesFactory.GetInstance(String providerTypeName, String providerInvariantName) This error happened only on the Continuous Integration machine. On the devs machines, everything has fine. The classic problem – on my machine it’s working. The CI has the following configuration: TeamCity .NET 4.51 EF 6.0.2 VS2013 It see...

Navigating Cloud Strategy after Azure Central US Region Outage

 Looking back, July 19, 2024, was challenging for customers using Microsoft Azure or Windows machines. Two major outages affected customers using CrowdStrike Falcon or Microsoft Azure computation resources in the Central US. These two outages affected many people and put many businesses on pause for a few hours or even days. The overlap of these two issues was a nightmare for travellers. In addition to blue screens in the airport terminals, they could not get additional information from the airport website, airline personnel, or the support line because they were affected by the outage in the Central US region or the CrowdStrike outage.   But what happened in reality? A faulty CrowdStrike update affected Windows computers globally, from airports and healthcare to small businesses, affecting over 8.5m computers. Even if the Falson Sensor software defect was identified and a fix deployed shortly after, the recovery took longer. In parallel with CrowdStrike, Microsoft provi...