Migrando SQL Server para o SQL Azure

Posted on junho 26, 2012

2


 

Introdução ao Serviço à Nuvem

 

A computação na nuvem referido como Cloud Computing é um serviço de capacidades e armazenamentos de informações disponibilizados através de servidores interligados por meio da internet.

 

Ou seja, a diponibilidade dessas informações estão em qualquer lugar do mundo, a qualquer hora a qualquer momento, e isso faz com que diversos paradigmas sejam quebrados.  Antigamente um dos maiores trabalhos de uma equipe de infra-estrutura e o DBA era manter a alta disponibilidade dos serviços e informações mantidos dentro da empresa.

 

cloud-computing-technology

(Figura 1 – A facilidade das informações em suas maõs.)

 

Quando possuímos nossas informações em nuvem, não possuímos mais essa “preocupação” de manter as informações disponíveis, isso é demandado para a nuvem, fazendo com que possamos nos preocupar mais com as necessidades reais do nosso negócio.

 

cloud-computing2

(Figura 2 – Facilidade de acesso das informações através da nuvem.)

 

Pensando na evolução desse conceito, empresas como Microsoft, IBM, Amazon e Google começaram a disponibilizar esse novo recurso, e a partir disso, os serviços começaram a se especializar e se tornarem uma grande potência dentro do mercado.

 

Atualmente, a computação em nuvem é dividida em seis tipos:

 

  • IaaSInfrastructure as a Service ou Infra-estrutura como Serviço (em português): quando se utiliza uma porcentagem de um servidor, geralmente com configuração que se adeque à sua necessidade.
  • PaaSPlataform as a Service ou Plataforma como Serviço (em português): utilizando-se apenas uma plataforma como um banco de dados, um web-service, etc. (p.ex.: Windows Azure).
  • DaaSDevelopment as a Service ou Desenvolvimento como Serviço (em português): as ferramentas de desenvolvimento tomam forma no cloud computing como ferramentas compartilhadas, ferramentas de desenvolvimento web-based e serviços baseados em mashup.
  • CaaSCommunication as a Service ou Comunicação como Serviço (em português): uso de uma solução de Comunicação Unificada hospedada em Data Center do provedor ou fabricante (p.ex.: Microsoft Lync).
  • EaaSEverything as a Service ou Tudo como Serviço (em português): quando se utiliza tudo, infraestrurura, plataformas, software, suporte, enfim, o que envolve T.I.C. (Tecnologia da Informação e Comunicação) como um Serviço.

 

Sendo assim vemos com clara certeza que a computação na nuvem tende a crescer potencialmente ao longo desses anos.

 

O Azure Services

 

O Azure services é um serviço baseado em Cloud-Based Service – Serviço Baseado em Nuvem como falado acima, oferecendo assim ao seu cliente uma Plataforma Completa de Serviços.

 

 

Esse novo recurso consiste em um vários serviços disponibilidade em demanda e armazenado dentro dos Data Centers da Microsoft, aonde você não se preocupa com a disponibilidade e disposição dos dados e informações.

 

O Windows Azure é o sistema operacional de todo esse produto, provendo assim todos os requisitos como:  Armazenamento da informação, disponibilidade dos serviços, escalabilidade, armazenamento e outras facilidades. A coleção dessas informações é chamada de AppFabric da Microsoft.

 

AzureServicesPlatform

(Figura 3 – Serviços disponibilizados pelo Azure Services.)

 

Com todos esses serviços sendo disponibilizados, possuímos dentro desse conjunto o SQL Azure, que nada mais é o serviço de banco de dados disponibilizado dentro da nuvem.

 

O SQL Azure

 

O SQL Azure  mais conhecido como SQL Server Data Services é um versão especial do banco de dados SQL Server. Sendo assim essa nova versão provê alta disponiblidade, escalabilidade, provisionamento dos dados alêm de oferecer a maioria das funcionalidaddes do SQL Server.  A linguaguem de programação no SQL Azure é a mesma do SQL Server o T-SQL alêm de se comunicarem pelo TDS (Tabular Data Stream), protocolo para acesso dos serviços pela internet.

 

(Figura 4 – Acesso ao SQL Azure.)

 

Migrando Base de Dados (SQL Server) para a Nuvem (SQL Azure)

 

Com todos esses recursos, agora estamos apto a transpor as informações do banco de dados SQL Server (On-Premise) para o SQL Azure (On-Cloud) como são mais conhecidos.

 

Essa necessidade de migrar as informações é uma nova facilidade que possúimos e no SQL Server 2012 esse recurso está melhor otimizado e disponibilizado.

 

Sendo assim para iniciarmos o processo de migração usaremos o SQL Server 2012, base de dados AdventureWorksDW2008R2 que você pode baixar aqui – http://msftdbprodsamples.codeplex.com/releases/view/59211

 

Após isso é necessário realizar a criação da conta no Windows Azure, para isso utilize esse ótimo tutorial – http://channel9.msdn.com/posts/Criando-uma-conta-no-Windows-Azure

 

Agora com a conta criada e a base de dados instalada localmente, podemos iniciar o processo de migração.

 

Iremos realizar a criação da base de dados.

 

image

(Figura 5 – Acessando o windowsazure.com)

 

Após login no site, iremos agora realizar a criação do banco de dados para isso iremos na aba de Banco de Dados

 

image

(Figura 6 – Acessando a aba Banco de Dados.)

 

É necessário criar um novo servidor,  para que seja possível criar a base de dados. Durante a criação do servidor é possivel criar o mesmo no datacenter mais perto do seu país ou estado, alêm do login e  senha do administrador.

 

image

(Figura 7 – Criando o servidor que hospedará o banco de dados.)

 

image

(Figura 8 – Localização do servidor.)

 

image

(Figura 9 – Login e senha do Administrador.)

 

image

(Figura 10 – IP de Acesso.)

 

Como layout de segurança é requisitado um IP para acesso ao servidor, nesse momento não iremos selecionar nenhum, somente permitir que os outros serviços do Windows Azure acessem esse servidor.

 

Logo após a criação de todos os requisitos, será disponibilizado a seguinte tela para gerenciamento e administração das informações da instãncia do banco de dados no SQL Azure (Windows Azure Platform).

 

image

(Figura 11 – Painel de gerenciamento do SQL Azure.)

 

Logo após a instância do SQL Azure instalada, iremos criar o banco de dados para nossa migração das informações.

 

image

(Figura 12 – Servidor criado no SQL Azure.)

 

image

(Figura 13 – Criação do banco de dados.)

 

image

(Figura 14 – Realizando a criação do banco de dados AdventureWorksDW2008R2 no SQL Azure.)

 

Logo após a criação da base de dados iremos ver o painel de administração da seguinte forma

 

Capture

(Figura 15 – Banco de dados criado e aparecendo no Painel de administração.)

 

Agora como já temos o banco de dados criado e configurado, o próximo passar e realizar o acesso do mesmo dentro do SSMS do SQL Server 2012, para isso devemos saber do seguinte:

 

image

(Figura 16 – Informações do servidor do SQL Azure.)

 

Conforme as informações disponibilziadas, temos na aba Gerenciar Url  o caminho e a string na qual precisamos para acessar, sendo que o login e senha é o criado anteriormente.

 

image

(Figura 17 – SQL Server Management Studio (SSMS) do SQL Server 2012.)

 

Agora entrando no SQL Server 2012, devemos colocar a string de conexão do banco de dados sem o Http: , o login e senha para assim realizar a conexão do SQL Azure.

 

Realizando a conexão temos a seguinte mensagem:

 

image

(Figura 18 – Mensagem de erro gerada pelo SSMS.)

 

 

Esse erro é gerado:

 

Cannot open server ‘pjvg9ths3x’ requested by the login. Client with IP address ‘177.99.200.3’ is not allowed to access the server.  To enable access, use the SQL Azure Portal or run sp_set_firewall_rule on the master database to create a firewall rule for this IP address or address range.  It may take up to five minutes for this change to take effect.
Login failed for user ‘LuanMoreno’.
This session has been assigned a tracing ID of ‘4a32911e-02ed-4812-af56-dd8ab6d0321c’.  Provide this tracing ID to customer support when you need assistance. (.Net SqlClient Data Provider)

 

O problema aqui é que na especificamos nenhum IP para acesso, sendo assim qualquer acesso externo é negado. Como disse anteriormente, é necessário de um IP para acesso, então para termos acesso faremos o seguinte.

 

Como temos já o IP disponibilizado na mensagem de erro, o que faremos é adicioná-lo na excessão de firewall para que o mesmo possua acesso.

 

image

(Figura 19 – Painel de gerenciamento do Firewall do SQL Azure.)

 

Agora iremos adicionar o IP negado.

 

image

(Figura 20 – Inserindo IP para acesso.)

 

Agora voltando ao SSMS, podemos ter acesso a instância do SQL Azure.

 

image

(Figura 21 – Instância do SQL Azure no SQL Server SSMS 2012.)

 

Agora temos as duas bases de dados uma no SQL Server (On-Premise)  e no SQL Azure (On-Cloud).

 

Capture

(Figura 22 – Bases de Dados Criadas no On-Premise e On-Cloud.)

 

Como possúimos todas as informações no SQL Server, devemos realizar a migração dessas informações, porém para isso devemos nos atentar a algumas regras. Como dito anteriormente o SQL Azure é uma versão do SQL Server, porém á alguns cuidados que os difere, para isso iremos realizar primeiramente a migração da estrutura do banco de dados.

 

Para isso faremos o seguinte…..

 

Botão direito na base de dados que iremos migrar – AdventureWorksDW2008R2 –Tasks – Generate Scripts

 

image

(Figura 23 –Geração de Script dos objetos do banco de dados.)

 

Logo após o wizard iremos escolher somente o script das tabelas, views e UDF.

 

DDL Triggers não são aceitas no SQL Azure, portanto não iremos marcar essa opção.

 

image

(Figura 24 – Escolhendo os objetos para a criação da estrutura.)

 

Porém antes de realizarmos a criação do script, devemos procurar todas as tabelas que não possuem Primary Key, isso porque no SQL Azure não é permitido tabelas sem PK.

 

Sendo assim podemos resolver esse probema da seguinte forma:

 

USE AdventureWorksDW2008R2

go

 

SELECT OBJECT_NAME(i.object_id) AS Nome

FROM sys.indexes AS i

INNER JOIN sys.objects AS o

ON i.object_id = o.object_id

WHERE i.type_desc = ‘HEAP’

     AND o.schema_id <> 4

ORDER BY Nome

image

(Figura 25 – Tabelas sem primary key.)

 

Sendo assim iremos desmarcar essas tabelas na criação do script.

 

image

(Figura 26 – Retirando as tabelas que não possuem PK.)

 

Capture

(Figura 27 – Selecionando a opção avançado para a migração para o SQL Azure.)

 

Capture

(Figura 28 – Selecionando a opção para o SQL Azure e criação de índices.)

 

image

(Figura 29 – Conclusão da criação dos scripts.)

 

Feito a criação com sucesso desse procedimento teremos todo o script para criação dentro do nosso SQL Azure.

 

Agora iremos realizar a troca de conexão a executar esse script dentro do SQL Azure.

 

image

(Figura 30 – Script de criação dos objetos dentro do SQL Azure.)

 

Após isso iremos selecionar o banco de dados AdventureWorks2008R2 que criamos anteriormente e executar esse script.

 

image

(Figura 31 – Estrutura criada com sucesso.)

 

Nesse momento realizamos a criação da estrutura do banco de dados.

 

Agora iremos nos beneficiar de duas procedures, elas iram nos ajudar no processo de migração das informações.

 

Procedure 1 – SetForeignKeyEnabledStatus = Essa procedure irá desabiltar todas as constraints durante a importação das informações. Essa procedure será utilizada após a inserção das informações dentro das tabelas, ela restabelecerá a as constraints.

 

Procedure 2 – SetIndexEnabledStatus = Irá desabiltar todos os índices secundários para que assim a importação da informações eja mais efetiva. Após a importação concluída ela realizará o rebuild dos índices.

 

Sendo assim realizaremos a criação das stored procedures dentro do nosso servidor SQL Azure, bancon de dados AdventureWorksDW2008R2.

 

IF OBJECT_ID(‘[dbo].[SetForeignKeyEnabledStatus]’,‘P’) IS NOT NULL

    DROP PROCEDURE [dbo].[SetForeignKeyEnabledStatus];

GO

CREATE PROCEDURE [dbo].[SetForeignKeyEnabledStatus]

(

    @enabled bit

)

AS

BEGIN

    DECLARE

        @schema_name sysname,

        @table_name sysname,

        @fk_constraint_name sysname,

        @cmd_txt varchar(8000);

DECLARE fk_cursor CURSOR FOR

        SELECT

            sc.name AS schema_name,

            so.name AS table_name,

            so2.name AS fk_constraint_name

        FROM

            sys.objects so

            inner join sys.schemas sc ON so.schema_id = sc.schema_id

            inner join sys.foreign_key_columns fk ON so.object_id = fk.parent_object_id

            inner join sys.objects so2 ON so2.object_id = fk.constraint_object_id

        WHERE

            so.type = ‘U’;

OPEN fk_cursor;

FETCH NEXT FROM fk_cursor INTO

        @schema_name,

        @table_name,

        @fk_constraint_name;

WHILE @@FETCH_STATUS = 0

    BEGIN

        IF @enabled = 0

            SET @cmd_txt = ‘ALTER TABLE [‘ + @schema_name + ‘].[‘ + @table_name + ‘] NOCHECK CONSTRAINT [‘ + @fk_constraint_name + ‘];’

        ELSE

            SET @cmd_txt = ‘ALTER TABLE [‘ + @schema_name + ‘].[‘ + @table_name + ‘] WITH CHECK CHECK CONSTRAINT [‘ + @fk_constraint_name + ‘];’;                    

        PRINT @cmd_txt;

        EXECUTE (@cmd_txt);

        FETCH NEXT FROM fk_cursor INTO

            @schema_name,

            @table_name,

            @fk_constraint_name;

    END;

CLOSE fk_cursor;

    DEALLOCATE fk_cursor;

END;

GO

IF OBJECT_ID(‘[dbo].[SetIndexEnabledStatus]’,‘P’) IS NOT NULL

    DROP PROCEDURE [dbo].[SetIndexEnabledStatus];

GO

CREATE PROCEDURE [dbo].[SetIndexEnabledStatus]

(

    @enabled bit

)

AS

BEGIN

    DECLARE

        @schema_name sysname,

        @table_name sysname,

        @index_name sysname,

        @cmd_txt varchar(8000);

DECLARE idx_cursor CURSOR FOR

        SELECT

            sc.name AS schema_name,

            so.name AS table_name,

            si.name AS index_name

        FROM

            sys.objects so

            inner join sys.schemas sc ON so.schema_id = sc.schema_id

            inner join sys.indexes si ON so.object_id = si.object_id

        WHERE

            so.type = ‘U’

            AND si.index_id > 1;

    OPEN idx_cursor;

FETCH NEXT FROM idx_cursor INTO

        @schema_name,

        @table_name,

        @index_name;

WHILE @@FETCH_STATUS = 0

    BEGIN

        IF @enabled = 0       

            SET @cmd_txt = ‘ALTER INDEX [‘ + @index_name + ‘] ON [‘ + @schema_name + ‘].[‘ + @table_name + ‘] DISABLE;’

        ELSE

            SET @cmd_txt = ‘ALTER INDEX [‘ + @index_name + ‘] ON [‘ + @schema_name + ‘].[‘ + @table_name + ‘] REBUILD;’

        PRINT @cmd_txt;

        EXECUTE (@cmd_txt);

        FETCH NEXT FROM idx_cursor INTO

            @schema_name,

            @table_name,

            @index_name;

    END;

CLOSE idx_cursor;

    DEALLOCATE idx_cursor;

END;

GO

 

Script Disponibilizado –

 

image

(Figura 32 – Stored Procedures dentro do banco de dados AdventureWorksDW2008R2 no Servidor do SQL Azure. )

 

Utilizando o SQLCMD iremos executar essas duas procedures para que possamos realizar a inserção das informações.

 

Abra o Prompt e digite o seguinte:

 

sqlcmd -S  myserver.database.windows.net  -U  mysqladminuser@myserver  -P  mysqladminuserpassword  -d AdventureWorksDW2008R2 -Q “EXECUTE [dbo].[SetForeignKeyEnabledStatus] 0” –b

sqlcmd –S  
myserver.database.windows.net  
-U  mysqladminuser@myserver  -
P  mysqladminuserpassword  -d 
AdventureWorksDW2008R2 –Q 
"EXECUTE [dbo].[SetIndexEnabledStatus] 
0" -b

 

image

(Figura 33 – Execução das Stored Procedures acima. )

 

Agora podemos realizar a migração das informações dentro da base de dados.

 

Para realizar a importação dos dados iremos utilizar o recurso BCP.

 

O arquivo tem extensão .cmd então abriremos o mesmo e realizaremos a alteração da String de conexão.

 

image

(Figura 34 – Alteração da String de conexão. )

 

SET DestSqlServerName=REPLACE_SQLAZURE_SERVER

SET DestSqlDbName=AdventureWorksDW2008R2

SET DestSqlUserName=REPLACE_USERNAME

SET DestSqlUserPassword=REPLACE_PASSWORD

 

Logo após alteração dessas informações, salve o arquivo .cmd e realize a execução.

 

image

(Figura 35 – Execução do script – download do arquivo  – https://skydrive.live.com/#cid=6E894476A77CD2F2&id=6E894476A77CD2F2%21142)

 

 

Após a conclusão da importação dos dados é necessário que restabelecemos  os índices e as foreigns keys. Assim iremos executar as procedures já criadas e restabelecer seus relacionamentos.

 

sqlcmd -Smyserver.database.windows.net-Umysqladminuser@myserver-Pmysqladminuserpassword-d AdventureWorksDW2008R2 -Q “EXECUTE [dbo].[SetForeignKeyEnabledStatus] 1” –b

sqlcmd –S
myserver.database.windows.net
-Umysqladminuser@myserver-
Pmysqladminuserpassword-d 
AdventureWorksDW2008R2 –Q 
"EXECUTE [dbo].[SetIndexEnabledStatus] 
1" -b

 

Depois de restabelecido, agora temos nossos dados migrados para o SQL Azure com sucesso.

 

Fonte: http://pt.wikipedia.org/wiki/Computa%C3%A7%C3%A3o_em_nuvem

Posted in: SQL Azure