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(

Azure AD and AWS Cognito side-by-side

In the last few weeks, I was involved in multiple opportunities on Microsoft Azure and Amazon, where we had to analyse AWS Cognito, Azure AD and other solutions that are available on the market. I decided to consolidate in one post all features and differences that I identified for both of them that we should need to take into account. Take into account that Azure AD is an identity and access management services well integrated with Microsoft stack. In comparison, AWS Cognito is just a user sign-up, sign-in and access control and nothing more. The focus is not on the main features, is more on small things that can make a difference when you want to decide where we want to store and manage our users.  This information might be useful in the future when we need to decide where we want to keep and manage our users.  Feature Azure AD (B2C, B2C) AWS Cognito Access token lifetime Default 1h – the value is configurable 1h – cannot be modified

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