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

How to check in AngularJS if a service was register or not

There are cases when you need to check in a service or a controller was register in AngularJS.
For example a valid use case is when you have the same implementation running on multiple application. In this case, you may want to intercept the HTTP provider and add a custom step there. This step don’t needs to run on all the application, only in the one where the service exist and register.
A solution for this case would be to have a flag in the configuration that specify this. In the core you would have an IF that would check the value of this flag.
Another solution is to check if a specific service was register in AngularJS or not. If the service was register that you would execute your own logic.
To check if a service was register or not in AngularJS container you need to call the ‘has’ method of ‘inhector’. It will return TRUE if the service was register.
if ($injector.has('httpInterceptorService')) { $httpProvider.interceptors.push('httpInterceptorService&#…

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.51EF 6.0.2VS2013
It seems that there …

Run native .NET application in Docker (.NET Framework 4.6.2)

Scope
The main scope of this post is to see how we can run a legacy application written in .NET Framework in Docker.

Context
First of all, let’s define what is a legacy application in our context. By a legacy application we understand an application that runs .NET Framework 3.5 or higher in a production environment where we don’t have any more the people or documentation that would help us to understand what is happening behind the scene.
In this scenarios, you might want to migrate the current solution from a standard environment to Docker. There are many advantages for such a migration, like:

Continuous DeploymentTestingIsolationSecurity at container levelVersioning ControlEnvironment Standardization
Until now, we didn’t had the possibility to run a .NET application in Docker. With .NET Core, there was support for .NET Core in Docker, but migration from a full .NET framework to .NET Core can be costly and even impossible. Not only because of lack of features, but also because once you…