Archive

Posts Tagged ‘Administração’

Especificação de Capacidade Máxima no SQL Server

Pessoal, boa tarde.

Hoje apenas apareci para dar uma dica rápida e acredito que seja de interesse em geral…rsrs. Quem nunca se pegou pensando: Qual a capacidade máxima de colunas em uma instrução SELECT ? Qual a quantidade de linhas por tabela? Ou até mesmo tabelas por database? “Passeando” pelo BING uma pesquisa me direcionou para um link no MSDN que gostaria de compartilhar com vocês. O link se refere a Capacidade máxima de especificação do SQL Server:

http://msdn.microsoft.com/en-us/library/ms143432.aspx

Muito Obrigado.

Abs

O que é o DTA?

Amigos da comunidade, blz? Esse post é dedicado a um outro amigo de trabalho. O DBA Felipe Melo , conhecimento SQL Geek em replicação, tunning e T-SQL. Sempre trocamos uma “figurinha” nos desafios profissionais, afinal, sempre é bom ter uma outra opinião. A certeza é: Nunca estamos totalmente certos! Mão na massa!?

O Database Engine Tuning Advisor é uma das “novas” features do SQL Server, ele analisa arquivos de carga de trabalho e propõe alterações no banco de dados, a fim de melhorar seu desempenho geral.

Para as alterações propostas, o Tuning Advisor também mostra o impacto que causará cada modificação.

Entre as suas capacidades, estão:

  • Query Optimazer, para propor índices e visões indexadas;
  • Recomendação de particões;
  • Análise de impacto das recomendações;
  • Fornecimento de informações sobre o número de consultas e o número de índices.

Opções de ajuste:

  • Quais objetos o Tuning Advisor poderá recomendar;
  • Quais partições analisará;
  • Quais estruturas serão mantidas no banco de dados;
  • Espaço máximo para recomendações;
  • Número máximo de columas por índice.

Criando analises com o DTA

Para iniciar o DTA, vá em StartAll / Programs / Microsoft SQL Server 2008 / Performance Tools / DataBase Engine Tunning Advisor.

Quando o programa for iniciado, clique em File/New Connection.

Aparecerá a tela de conexão para qual servidor você deseja criar a análise

Obs: Para o exemplo será usado um ambiente de testes.

O servidor será mostrado no canto superior direito da tela, clique com o botão direito e escolha a opção New Session.

A seguinte tela será mostrada:

Clique na guia Tunning Options e será mostrado a seguinte tela:

Physical Design Structure(PDS) to use in database: Esta opção avalia o que a Engine do DTA irá analisar referente a objetos de design na estrutura do banco(índex,índex views e etc). A opção de Índex views é desabilitada no SQL Server STD.

Partitioning strategy to employ: A opção de particionamento, verifica se existem objetos que podem ser particionados e avalia o particionamento que já existente. Disponível somente na versão Enterprise do SQL Server.

Physical Design Structure(PDS) to keep in database: Avalia a estrutura fisica do banco, abalia se existem índices clustereds e nonclustereds devem ser deletados(ele não deleta os indices), ou se existe algo divergente na no modelo como um todo. O padrão é Keep All existing PDS.

Voltando a guia General, aonde:

  • Session Name: Nome da Sessão
  • WorkLoad: A origem de ondes virão os dados que serão analisados(no caso do profiler o mesmo pode ser um arquivo ou uma tabela)
  • DataBase for WorkLoad Analysis: Aonde serão gaurdadas as analises temporarias.
  • Select DataBase and tables to tune: Lista de banco de dados e de tabelas que serão parte da analise. (sempre coloque os bancos de dados que [*] foram filtrados no profiler)

Coloque o nome no profiler e escolha o caminho aonde está o arquivo de trace do profiler. Ao clicar no Radio Button File, clique no binóculo a esquerda e será aberta a tela do Windows. Escolha o profiler que deseja analisar.

Clique em abrir.

Caso o trace tenha sido guardado em uma tabela, marque o Radio Button Table, clique no binóculo a esquerda e será aberta a tela de conexão:
Escolha qual banco, schema e tabelas estão os profilers que foram armazeandos.

Obs:  O login qual abriu a sessão no DTA deve ter acesso as tabelas que estão os traces, caso contrário, uma mensagem de erro será retornada.

 

O preenchimento deve ficar parecido com a tela abaixo:

 

Clique no botão Start Analysis. Após clicar em Star Analysis, uma tela de progresso será exibida.

 

Na guia recomendações, é apresenta a porcentagem de melhoria da análise.

 

No menu Actions aparecerá a opção de aplicar as recomendações ou savá-las.
Clique em Save Recommendations

Será gerado um arquivo .sql com as recomendações.

Espero Ter ajudado

 

Atualizando a Edição do SQL Server 2008

Caros, bom dia.

Este post é dedicado ao meu amigo Lucas Souza, um DBA com quem venho aprendendo muito. Está sempre me acompanhando nos processos aqui na empresa e me instruindo.

Hoje vamos falar sobre um assunto bastante simples, porém, foi a primeira vez que tive que realizar o procedimento, atualizar a edição do SQL Server. Hoje temos aqui na empresa o ambiente de desenvolvimento, produção, testes e homologação. Junto com a equipe começamos uma iniciativa de padronizar a instalação do SQL Server, isso inclui Edição utilizada, service pack e cumulative updates. Após baixar o SP2 da versão do SQL Server 2008 R2, comecei a aplicar a instalação no ambiente de desenvolvimento, testes e homologação. Quando me deparei com um ambiente de homologação que está com a versão Standard do produto. E agora? Preciso reinstalar o SQL Serve novamente? Claro que não…

Vamos ao passo-a-passo

Inicialmente você deve copiar o instalador do SQL Server para a máquina qual deseja atualizar. De um duplo clique no setup.exe a seguinte tela será apresentada:

Clique em Yes e aparecerá o SQL Server Installation Center. No lado esquerdo clique em Maintenance.

Clique no Edition Upgrade, após isso, apenas devemos seguir os passos. Vamos fazer juntos?

O SQL Server irá fazer uma verificação, se todos os itens verificados passarem por essa verificação, prossiga. Caso algum item falhar, recomendo que seja ajustadoo item em questão e o processo seja refeito.

É altamente recomendado que todos os itens sejam aprovados no check que o SQL Server faz, só assim podemos garantir que não teremos problema futuramente.

Clique em OK.

Esse processo é bem parecido com o processo de instalação, após o OK confirmado na tela acima, aparecerá a opção da chave do produto, Clique em Next:

Marque o checkbox de “Aceito os termos” e clique em next:

Na próxima tela, podemos perceber que o instalador traz a versão atual do produto e para qual instancia será feito o “upgrade”.

Clique em next.O SQL Server fará uma verificação antes de lhe dar a opção de Update.

Clique em next. Você verá um sumario bem importante, que diz para qual versão está sendo modificado o SQL Server, qual ação está sendo tomada (No caso Edition Upgrade) e a lista de features que sofrerão com esta atualização:

Clique em Upgrade. Após isso é só aguardar o SQL Server terminar de atualizar todos os binários necessários para essa atualização. Quando isso acontecer, reinicie a máquina.

Obs: No post não foi focado cuidados que devem ser tomados no caso dessa atualização. É uma boa prática sempre realizar backup dos databases de sistema, quando for realizar alguma alteração que afeta as configurações da instancia do SQL Server

Espero ter ajudado

Abs

Trabalhando com Certificados no SQL Server 2008

Boa tarde pessoal.

Este post é dedicado a um amigo da empresa, Rogério Santini, extremamente inteligente, sempre me da os conselhos certos.No post anterior falamos sobre a importância de utilizar database roles para controlar o acesso aos servidores de banco de dados através das aplicações. Hoje iremos falar sobre um caso real que foi aplicado aqui na nossa empresa. Temos nossas aplicações executando as procedures através de database roles, porém, existe uma migração acontecendo que estamos trabalhamos com informações se sistemas legados.

Vamos partir do nosso exemplo anterior onde tínhamos uma tabela de clientes com a coluna IdCliente que tem a propriedade identity de 1,1. Imagine que essa tabela será populado pelo nosso sistema atual. A cada inserção, será atribuído um valor incremental, até ai nenhuma novidade, comportamento normal. Agora aparece uma variável em nossa implantação. O sistema legado que temos, ainda ficará em funcionamento, sendo assim, ele precisará realizar inserções em nossa tabela de clientes. Thiago não entendi!? Aonde você quer chegar? Vamos lá meu caro blog…rs.

O sistema legado já existe os seus IdClientes, com uma sequencia própria dele, neste caso, as procedures farão uso da opção SET IDENTITY_INSERT. E dai? Como já tenho permissão de execução de procedures no sistema, nada muda certo? ERRADO. Para realizar a operação de SET IDENTITY_INSERT o usuário deve ter permissão de DDL_ADMIN. No momento que liberar essa permissão, o login da aplicação pode criar qualquer objeto dentro do banco de dados e esse é um risco muito grande. Thiago então qual a solução? Vamos lá bloguinho. A partir do SQL Server 2005, aprimorou-se as features de segurança do produto. Uma das “novidades” é o uso de certificados e máster key. Podemos realizar o uso dessas features, para fazer com que o login que chamou a procedure possa executar a mesma com o comando set identity_insert sem ter permissão de DDL_ADMIN. Vamos ver como isso funciona?

Vamos se conectar ao banco de dados dbPermissoes e alterar a procedure stp_ins_cliente que usamos no exemplo anterior para pode adicionar o comando SET_IDENTITY_INSERT.

alter  PROCEDURE dbo.stp_ins_cliente(@Id int, @Nome VARCHAR(50), @Cpf CHAR(11))

AS

begin

       SET IDENTITY_INSERT dbo.Clientes ON

            INSERT INTO dbo.Clientes(IdCliente, NomeCliente,CpfCliente) VALUES(@id, @Nome, @Cpf)

      SET IDENTITY_INSERT dbo.Clientes OFF

 END

go

Executando a procedure após de alterada, temos a seguinte mensagem de erro:

EXECUTE AS LOGIN = ‘AplSistema’

go

EXEC dbo.stp_ins_cliente @id = 8 ,@Nome = ‘Alencar’,@Cpf =’133xxx63215′

GO

REVERT

Msg 1088, Level 16, State 11, Procedure stp_ins_cliente, Line 5

Cannot find the object “dbo.Clientes” because it does not exist or you do not have permissions.

A mensagem acima é clara, ou não tenho permissão ou o objeto não existe. Segundo que a hipótese da permissão é verdadeira. Vamos dar permissão de DDL_ADMIN para o login e testar a execução, para garantir que é isso mesmo.

USE [dbPermissoes]

GO

EXEC sp_addrolemember N’db_ddladmin’, N’AplSistema’

GO

Executando novamente:

EXECUTE AS LOGIN = ‘AplSistema’

go

EXEC dbo.stp_ins_cliente @id = 8 ,@Nome = ‘Alencar’,@Cpf =’133xxx63215′

GO

REVERT

Vejamos o resultado e o ID 8 foi inserido.

Iremos remover o login do database role do DD_ALMIN e faremos a solução “Elegante”.

Criaremos o database máster key dentro da base dbPermissoes:

use dbPermissao

go
CREATE MASTER KEY ENCRYPTION BY password = ‘MkE2012@#’

Criamos o certificado:

CREATE CERTIFICATE CrtPermissoes WITH SUBJECT = ‘Schema user Certificate’

Agora precisamos criar um usuário para a base de dados em questão. Esse usuário é o que chamamos de “without login”. Quando criamos um usuário no banco de dados que não está atribuído a nenhum login, a sintax é completamente simples. Na criação do usuário, atribuo ele aio certificado:

CREATE USER UsrCert FROM CERTIFICATE CrtPermissoes

No momento da mágica, apenas realizamos o comando abaixo:

GRANT ALTER ANY SCHEMA TO UsrCert ADD SIGNATURE TO dbo.stp_ins_cliente BY CERTIFICATE CrtPermissoes

GO

Esse comando da permissão de “ANY SCHEMA” para o usuario UsrCert que criamos, e essa permissão é atribuida pelo certificado CrtPermissoes. Como o Usuario AplSistema tem permissão de execução de procedures a solução torna-se viável e “clean”.  Iremos remover o login do DDL_ADMIN e realizar uma execução de insert, inserindo o IdCliente 666.

USE [dbPermissoes]

GO

EXEC sp_droprolemember N’db_ddladmin’, N’AplSistema’

GO

Executamos a procedure:

EXECUTE AS LOGIN = ‘AplSistema’

go

EXEC dbo.stp_ins_cliente @id = 666 ,@Nome = ‘Alencar’,@Cpf =’133xxx63215′

GO

REVERT

E BAZINGA!!!!!

Permissão – Database Role

Galera, boa tarde

O post de hoje é dedicado para o meu Amigo Silas Mendes, um ótimo DBA e um tremendo SQL Geek. O cara esté me pentelhando para eu instalar um plugin que deixa os códigos coloridos,mas, infelizmente ficará para o próximo  post. Nesse ficará tudo em AZUL o que for script.

Hoje vamos falar sobre uma coisa que “teoricamente”, não deveria acontecer no desenvolvimento de softwares, porém, é bem comum acontecer quando a aplicação está sendo desenvolvida, o desenvolvedor ou o mesmo DBA coloca o login da aplicação como owner do database, assim os problemas de permissão serão “resolvidos” mais rápidos.

O  login da aplicação que acessa o servidor de banco de dados deve ter as permissões mais restritivas possiveis. Na maioria das vezes o usuário deve estar dentro de um database role, e esse database role deve apenas ter permissão de execução nas procedures.

Quando o cenário acima é verdadeiro, nem o próprio login tem acesso de realizar qualquer operação diretamente nas tabelas, só através das procedures, isso é uma das vantagens da utilização de stored procedures, isolamento. As vezes acontece do usuário estar dentro dos roles: db_datareader e db_datawriter. Mas, se todas as interações entre banco de dados e aplicação for via stored procedures isso não deveria acontecer, o login apenas deve estar no role de execução.

Vamos colocar a mão na massa.

–Cria o banco de dados dbPermissoes

CREATE DATABASE dbPermissoes

USE dbPermissoes

go

–Cria o login AplSistema

CREATE LOGIN AplSistema WITH PASSWORD =’$@123456′ ,CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF

go

–Cria o role que receberá as permissões de execução

CREATE ROLE [DR_EXEC]

go

–Crio usuario no banco de dados dbPermissoes. Ao fazer isso, estou atribuindo o usuario ao login que foi criado anteriormente

CREATE USER AplSistema FOR LOGIN AplSistema

–Adiciono o usuario AplSistema ao Role: DR_EXEC

EXEC sp_addrolemember N’DR_EXEC’, N’AplSistema’

No script acima criamos um banco de dados chamado:dbPermissoes, com um usuário e um database role. Vendo pelo modo gráfico, ficou da seguinte maneira:

Atribuição ao banco de dados:

Roles:

Agora criaremos uma tabela de clientes e realizaremos algumas inserções.

USE dbPermissoes

go

 IF EXISTS(SELECT 1 FROM sys.tables WHERE object_id = OBJECT_ID(‘dbo.Clientes’))

BEGIN

      DROP TABLE db.Clientes

END

go

CREATE TABLE dbo.Clientes

(

      IdCliente INT IDENTITY(1,1) NOT NULL

      ,NomeCliente VARCHAR (50) NOT NULL

      ,CpfCliente CHAR(11) NOT NULL

)

INSERT INTO dbo.Clientes (NomeCliente,CpfCliente) VALUES(‘Sheldon Cooper’,’12345685961′),(‘Leonard Hofstadter’,’98632156978′),(‘Penny’,’85236974112′)

Após nossa tabela ser criada, iremos criar duas procedures: Uma de inserção e outra de seleção. No código dessas procedures, iremos atribuir permissão de execute para o database role DR_EXEC que criamos no banco de dados em questão.

USE dbPermissoes

go

IF EXISTS(SELECT 1 FROM sys.procedures WHERE object_id= OBJECT_ID(‘dbo.STP_INS_Cliente’))

BEGIN

      DROP PROCEDURE dbo.stp_ins_cliente

END

go

CREATE PROCEDURE dbo.stp_ins_cliente(@Nome VARCHAR(50), @Cpf CHAR(11))

AS

begin

      INSERT INTO dbo.Clientes(NomeCliente,CpfCliente) VALUES(@Nome, @Cpf)

 END

GO

GRANT EXECUTE ON  dbo.stp_ins_cliente TO [DR_EXEC]

go

 IF EXISTS(SELECT 1 FROM sys.procedures WHERE object_id= OBJECT_ID(‘dbo.STP_SEL_Cliente’))

BEGIN

      DROP PROCEDURE dbo.STP_SEL_Cliente

END

go

CREATE PROCEDURE dbo.STP_SEL_Cliente

AS

begin

       SELECT IdCliente AS Id,  NomeCliente AS Nome ,CpfCliente AS CPF

            FROM dbo.Clientes

END

GO

GRANT EXECUTE ON  dbo.STP_SEL_Cliente TO [DR_EXEC]

go

Agora executaremos a instrução utilizando o login que foi criado no inicio do artigo. No nosso exemplo, não precisamos nem conectar na instancia, pois, podemos simular a execução de um outro usuário, utilizando a opção: Execute as Login.

Faremos os seguintes testes:

1º -Inserção na tabela de Clientes com o login AplSistema
2º -Inserção na tabela Clientes atraves da execução da procedure
3º -Select  na tabela de Clientes com o login AplSistema
4º -Select na tabela Clientes atraves da execução da procedure

Ao executar o teste 1º e 2º, veja o que acontece:

EXECUTE AS LOGIN = ‘AplSistema’

go

INSERT INTO dbo.Clientes(NomeCliente,CpfCliente) VALUES(‘Alencar’,’133xxx63215′)

GO

REVERT

Erro:

Msg 229, Level 14, State 5, Line 1

The INSERT permission was denied on the object ‘Clientes’, database ‘dbPermissoes’, schema ‘dbo’.

Com a procedure o registro é inserido:

EXECUTE AS LOGIN = ‘AplSistema’

go

EXEC dbo.stp_ins_cliente @Nome = ‘Alencar’,@Cpf =’133xxx63215′

GO

REVERT

Teste 2º e 3º:

EXECUTE AS LOGIN = ‘AplSistema’

go

SELECT IdCliente AS Id,  NomeCliente AS Nome ,CpfCliente AS CPF

            FROM dbo.Clientes

GO

REVERT

Msg 229, Level 14, State 5, Line 1

The SELECT permission was denied on the object ‘Clientes’, database ‘dbPermissoes’, schema ‘dbo’.

 EXECUTE AS LOGIN = ‘AplSistema’

go

EXEC dbo.STP_SEL_Cliente

GO

REVERT

Como podemos ver utilizar roles para restringir o acesso das nossas aplicações à recursos dos nossos banco de dados, pode aumentar drasticamente o esquema da segurança. Lembrando que a aplicação só pode realizar comandos DMLs e Execução de procedures. No conceito do mundo perfeito a aplicação não tem direito de criar objetos no banco de dados, e é disso que iremos falar no próximo post.

 

Restore Parcial no SQL Server

Galera, boa tarde.

Como de costume, sempre dedico meu post as pessoas próximas a mim, pois, são elas que nos moldam e nos incentivam a sempre dar um passo a frente. Este post é dedicado ao líder que tive, um verdadeiro líder, Eduardo G. Pinho.

Muito tempo que não posto nada, mesmo tendo os posts no meu note não estou arrumando tendo de publicar, espero que todo mundo entenda. Hoje gostaria de dar uma pequena pausa na seção de índices e falar sobre um assunto que não vejo muito na net. Restore de banco de dados por file groups. Vamos lá!?

O leitor deve esta se perguntando quando devo realmente usar esse cenário? Uma coisa interessante que percebi nas empresas onde passei é que os DBAs anteriores não seguiam realmente as boas práticas à risca. Esse cenário, seria mais adequado para ambientes que existam tabelas realmente gigantescas e que não podem sofrer expurgo. Quando o banco de dados é criado do zero a tarefa torna-se mais simples. É possível dimensionar todos os filegroups com a sua real necessidade. Uma vez que o desenho do banco não seguiu as boas práticas, fica realmente difícil ajustá-lo depois que o mesmo está sendo utilizado em produção.

Imagine o cenário que o sistema foi feito por módulos e as tabelas do módulo de clientes estão em um Filegroup e as tabelas de Produtos em outro filegroup, você pode voltar o módulo de clientes ONLINE enquanto vai fazendo restore parcial dos outros módulos (se os mesmos foram criados em filegroups distintos).

Para este post iremos criar um banco de dados com a seguinte estrutura:

Um arquivo de dados com a extensão .mdf em um filegroup primário , um segundo arquivos de dados com a extensão .ndf no filegroup FG_USER_SECUNDARIO e um arquivo de log.

CREATE DATABASE [VariosGruposDeArquivos]

ON  PRIMARY

(

      NAME = N’VariosGruposDeArquivos_Primary’,

      FILENAME = N’C:\T\VariosGruposDeArquivos_Primary.mdf’ , SIZE = 4096KB , FILEGROWTH = 10%

),  FILEGROUP [FG_USER_SECUNDARIO]

(

      NAME = N’VariosGruposDeArquivos_Secondary’,

      FILENAME = N’C:\T\VariosGruposDeArquivos_Secondary.ndf’ , SIZE = 4096KB , FILEGROWTH = 10%

)

LOG ON

(

      NAME = N’VariosGruposDeArquivos_log’,

      FILENAME = N’C:\T\VariosGruposDeArquivos_log.ldf’ , SIZE = 1024KB , FILEGROWTH = 10%

)

GO

EXEC dbo.sp_dbcmptlevel @dbname=N’VariosGruposDeArquivos’, @new_cmptlevel=90

GO

Obs: Os arquivos estão sendo criados no C: apenas pra propósitos de testes, em um ambiente real esse cenário NUNCA deve ser real.

Após o banco ser criado, colocaremos o seu recovery model como full.

ALTER DATABASE [VariosGruposDeArquivos] SET RECOVERY FULL

Agora criaremos duas tabelas no nosso banco de dados, sendo que a tabela de Cliente será criado no filegroup PRIMARY e a tabela Produto será criada no filegroup FG_USER_SECUNDARIO.

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE TABLE [dbo].[Cliente](

      [ClienteID] [int] IDENTITY(1,1) NOT NULL,

      [ClienteCadastro] [datetime] NULL,

 CONSTRAINT [PK_Cliente] PRIMARY KEY CLUSTERED

(

      [ClienteID] ASC

) ON [PRIMARY]

) ON [PRIMARY]

GO

CREATE TABLE [dbo].[Produto](

      [ProdutoID] [int] IDENTITY(1,1) NOT NULL,

      [ProdutoCadastro] [datetime] NULL,

 CONSTRAINT [PK_Produto] PRIMARY KEY CLUSTERED

(

      [ProdutoID] ASC

) ON [FG_USER_SECUNDARIO]

) ON [FG_USER_SECUNDARIO]

GO

Obs: Como boa prática, sempre crie um arquivo secundário e atribua-o a um filegroup de usuário. Coloque o filegroup de usuário como padrão. O filegroup PRIMARY deve apenas ter os metadados do banco de dados em si, e nunca nenhuma informação de usuário. O estado do filegroup PRIMARY define o estado do database.

Agora iremos inserir informação nas duas tabelas.

INSERT INTO dbo.Cliente(ClienteCadastro) VALUES (GETDATE())

INSERT INTO dbo.Produto(ProdutoCadastro) VALUES (GETDATE())

INSERT INTO dbo.Cliente(ClienteCadastro) VALUES (GETDATE())

INSERT INTO dbo.Produto(ProdutoCadastro) VALUES (GETDATE())

Agora realizaremos um backup full do nosso banco de dados.

BACKUP DATABASE [VariosGruposDeArquivos] TO  DISK = N’C:\T\VariosGruposDeArquivos.bak’ WITH NOFORMAT, INIT, 

      NAME = N’VariosGruposDeArquivos-Full Database Backup’, SKIP, NOREWIND, NOUNLOAD,  STATS = 10

GO

Se fizermos um select nas tabelas, veremos que cada uma delas possuem duas linhas.

Agora o que iremos fazer é o seguinte: Vamos “dropar” esse database e aplicar os restores com os arquivos de backups que já criamos anteriormente. Abaixo segue o script:

use master

go

drop database VariosGruposDeArquivos

Imagine o cenário que o banco de dados está corrompido e será necessário realizar o restore do seu banco parcial e liberando os módulos para os usuários conforme o restore vai acontecendo. O script abaixo traz o script de restore do banco de dados. Nesse script o “pulo do gato” está em duas clausulas: FILE e PARTIAL. Na clausula file você pode passa qual o datafile que você que realizar o restore e a clausula partial informa que o restore será feito em “pedaços”.

RESTORE DATABASE [VariosGruposDeArquivos]

FILE = N’VariosGruposDeArquivos_Primary’

FROM  DISK = N’C:\T\VariosGruposDeArquivos.bak’

WITH  FILE = 1,  NOUNLOAD,  REPLACE,  STATS = 10, PARTIAL

GO

Se fizermos um select na tabela de clientes os dados serão retornados, conforme o print:

Ao fazer um select na tabela de produtos que está em um outro datafile, um erro será retornado:

Msg 8653, Level 16, State 1, Line 1

The query processor is unable to produce a plan for the table or view ‘Produto’ because the table resides in a filegroup which is not online.

Vamos deixar o outro filegrouo online, aplicaremos novamente o comando de restore. O arquivo do backup será o mesmo, o que mudará dessa vez é o valor do parâmetro “FILE”. Agora nos iremos informar o nome do segundo datafile.

RESTORE DATABASE [VariosGruposDeArquivos]

FILE = N’VariosGruposDeArquivos_Secondary’

FROM  DISK = N’C:\T\VariosGruposDeArquivos.bak’

WITH  FILE = 1,  NOUNLOAD,  REPLACE,  STATS = 10

GO

Como podemos ver a tabela foi restaurada:

Ate a próxima KIDS

Realizando Backups T-SQL

Como foi visto anteriormente, podemos usar o SSMS para criar rotinas de backups de maneira intuitiva e visual, mas, existe ocasiões que precisamos apenas fazer um backup de um banco de dados. É mais conveniente usar a linguagem T-SQL do Microsoft SQL Server, além de ser simples é mais rápido. Ou até mesmo quando precisamos criar rotinas de backup mais flexíveis.

Se conecte ao SQL Server:

Abra uma nova janela no SSMS e digite a seguinte linha de comando:
Syntax:

–Comando de Backup Full de banco de Dados

BACKUP DATABASE database

TO backup_device [ ,n ]

[ WITH with_options [ ,o ] ] ;

Exemplo:

BACKUP DATABASE [TMKT]

TO DISK = N’D:TMKT.BAK’ WITH INIT,

STATS = 10

Acima podemos ver que criar um backup via T-SQL é muito simples. Caso fosse necessário executar o backup de forma regular através de um schedule, era só colocar o comando T-SQL em um job. Abaixo cito as opções mais utilizadas no arquivo de backup, para mais informações sempre usem a documentação do produto.
Parâmetros:
INIT – Especifica que todos os conjuntos de backup devem ser substituídos, mas preserva o cabeçalho da mídia. Se INIT é especificado, nenhum conjunto de dados de backup existentes nesse dispositivo é substituído.

STATS [= percentage] – Exibe uma mensagem cada vez que uma percentagem concluída, e é usado para medir o progresso. Se o percentual for omitido, o SQL Server exibe uma mensagem após cada 10 por cento é concluída.
Obs: Existem outros parâmetros além dos dois citados acima, consulte o BOL (Books On Line) do SQL Server.

MIRROR TO = Cria um “espelho” do backup para um outro dispositivo. Em caso que você queira ter o “backup do backup”. Uma restrição muito importante para esta clausula é que todos os dispositivos de backup devem ser do mesmo tipo, por exemplo: Um backup não pode ser mandado para uma fita se uma das cópias foi feita em disco.

COPY_ONLY – Especifica que o backup será apenas uma cópia. O copy_only é criado independente de seu regular scheduler. Sem afetar a sequência dos logs. Essa feature foi disponibilizada a partir do SQL Server 2005.

Obs: Se a opção differential e copy_only forem usadas juntas, a opção copy_only é ignorada e o backup diferencial é criado. Quando você usa a opção copy_only em um baclup de log, a sequência não é afetada e os logs não são truncados.