Dicas AG – Falha ao sincronizar bancos de dados com automatic-seeding (Secondary database is not joined)

A partir do SQL Server 2016, o Always On Availability Groups possui um recurso chamado Automatic Seeding como mais uma opção para sincronização inicial ao configurar réplicas e bancos de AG.

Basicamente, tal como mirroring, o sincronismo inicial depende de um backup e restore, e o que o automating seeding da forma mais simples faz é, bem, backup e restore, teoricamente sem intervenção alguma do DBA (você pode fazer de forma híbrida também backup+restore+automatic_seeding se quiser). Basta marcar essa opção durante a configuração, sair pra passear e esperar os servidores SQL das réplicas primárias e secundárias tocarem o trabalho.

Bem, sabemos que às vezes coisas estranhas acontecem. Ocorreu que utilizei o automatic seeding pra sincronizar uma réplica assíncrona de um AG com cinco bancos. Quando fui conferir, dos cinco (5) bancos, dois (2) tiveram falhas de sincronização, indicando que não foi possível ingressar o banco de dados:

 

Mais informações:

  • As duas bases problemáticas não estavam sendo visualizadas na listagem de banco de dados;
  • Explorei o diretório das bases e descobri que tanto o .mdf e o .ldf dos dois bancos problemáticos já estavam criados;

 

O ERRORLOG já “cantou a pedra”:

Não é muito intuitivo, mas aqui está a resposta:

“Necessário conceder permissão para criação de banco para o AG”.

ALTER AVAILABILITY GROUP AGMeuNomeFicticio01 GRANT CREATE ANY DATABASE

Depois disso bastou resumir a sincronia dos dois bancos envolvidos, podendo fazer isso via interface ou através do comando:


ALTER DATABASE DBMeubanco1 SET HADR RESUME
GO
ALTER DATABASE DBMeubanco2 SET HADR RESUME

Resumindo o banco, ele realiza backup e restore se necessário e se resolve normalmente depois de algum tempo:

Espero ter ajudado.

[]’s

Dicas AG – Criação de listener e adição de IP em arquiteturas AG multi-subnet

Resultado de imagem para esquilos familia

Olá, post rápido sobre listener com Always On Availability Groups, envolvendo redes diferentes.

Introdução extremamente simplificada 

O post chama Always On Availability Groups de AG pela simplicidade.
Dependendo da sua arquitetura de AG, existe a opção de adicionar um listener, nome virtual que pode ser utilizado pelas aplicações.
O listener (que é um nome) precisa estar vinculado a um ou mais IP’s.
O seu cluster que contém um AG pode envolver servidores e IP’s de uma única rede ou pode envolver IP’s de redes diferentes (multi-subnet).
Esse post pretende ajudar quem precisa adicionar um IP em listener já existente ou a partir de um novo listener (e por bônus, como remover)

 

Criar listener com diferentes IP’s (Multi-subnet AG)


USE MASTER;
ALTER AVAILABILITY GROUP [AGJennifer]
ADD LISTENER N'List001' (
WITH IP
(
(N'10.231.31.25', N'255.255.255.0'),
(N'10.91.1.25', N'255.255.255.0')
)
, PORT=1433);
GO

Caso seu cluster já tenha réplicas (aka servidores na linguagem AG) de redes diferentes ingressadas no AG, você pode criar um listener contendo os IP’s que atendam todos os nós envolvidos.

Caso por exemplo você adicione dois nós da rede A, e um nó da rede B, caso você crie um listener com apenas um endereço de IP  não reconhecido pela rede B, você receberá o seguinte erro:

Msg 19456, Level 16, State 0, Line 69
None of the IP addresses configured for the availability group listener can be hosted by the server ‘ReplicaEstrangeira’. Either configure a public cluster network on which one of the specified IP addresses can be hosted, or add another listener IP address which can be hosted on a public cluster network for this server.

 

Adicionar IP em um listener já existente

Bem comum quando você precisa ingressar uma máquina de outra rede (rede B por exemplo) no AG e já existe um listener que NÃO contém um IP reconhecido pela rede B. Nesse caso o recomendado é primeiro você adicionar o IP e depois a réplica (o contrário que seria adicionar a réplica antes do IP não dá bom).


USE [master]
GO
ALTER AVAILABILITY GROUP [AGJennifer]
MODIFY LISTENER N'List001' (
ADD IP(N'10.231.31.25', N'255.255.255.0'))

Após adicionar o IP de outra rede no listener, adicionar uma réplica desta rede deverá ocorrer sem problemas.

BONUS: Como remover um IP de um listener

Dessa vez a interface gráfica do Management Studio não ajuda, portanto, você tem duas boas opções:
a) Via powershell (Get-ClusterGroup <Nome AG> | Get-ClusterResource <Nome AG>_<IP_A_SER_REMOVIDO> | Remove-ClusterResource)
b) Via interface gráfica, no cluster manager

Até o próximo post, pessoal.

 

Error: Windows cannot find the Microsoft Software License Terms. Make sure the installation sources are valid and restart the installation.

Olá pessoal, mais um post rápido pra documentar um pequeno e simples troubleshooting encontrado ao configurar ambientes  com Virtualbox e o Windows Server 2016. Não é sempre que posto erros relacionados a S.O, mas tem tudo a ver com SQL Server porque geralmente andam lado a lado.Apesar disto, o erro não é restrito à máquinas virtuais e nem especificamente o Hypervisor em questão.

Mensagem de erro

A mensagem erro ocorre praticamente no início do processo de instalação do Sistema Operacional, com a seguinte mensagem:

Windows cannot find the Microsoft Software License Terms. Make sure the installation sources are valid and restart the installation.

Cenário (como simulei o problema)

Instalando o Windows Server 2016 em uma VM (Virtualbox), selecionei a edição desejada (Desktop Experience)  e prossegui com a instalação utilizando as configurações padrões do Virtualbox. No momento em que o contrato de licença deveria ser carregado, um erro selvagem aparece  e impede a instalação. Abaixo duas telas que indicam como simular o problema:

 Windows cannot find the Microsoft Software License Terms  - Gerando mensagem

Selecionando a mídia de instalação

Windows cannot find the Microsoft Software License Terms - Gerando mensagem de erro

Mensagem de erro gerada com sucesso

Windows cannot find the Microsoft Software License Terms. Make sure the installation sources are valid and restart the installation.

Resolução do problema 

Descartei a possibilidade da ISO utilizada para instalação estar corrompida porque já tinha realizado uma instalação usando a mesma dias antes do problema. Também refiz o procedimento quatro (4) vezes, e apenas uma vez o instalador pode prosseguir, então parece ser um intermitemente e não mídia corrompida. Parti pra documentação oficial do S.O pra ver se achava alguma pista nos requerimentos de instalação do servidor, e bingo:

  • [PT-BR] https://docs.microsoft.com/pt-br/windows-server/get-started/system-requirements
  • [EN-US] https://docs.microsoft.com/en-us/windows-server/get-started/system-requirements

O texto abaixo descreve o problema de fato que estava encarando. Criei o servidor com o padrão de memória no Virtualbox que é de 512MB, que se encaixava neste cenário de inconformidade com os requisitos mínimos de hardware:

If you create a virtual machine with the minimum supported hardware parameters (1 processor core and 512 MB RAM) and then attempt to install this release on the virtual machine, Setup will fail.

To avoid this, do one of the following:

  • Allocate more than 800 MB RAM to the virtual machine you intend to install this release on. Once Setup has completed, you can change the allocation to as little as 512 MB RAM, depending on the actual server configuration.

  • Interrupt the boot process of this release on the virtual machine with SHIFT+F10. In the command prompt that opens, use Diskpart.exe to create and format an installation partition. Run Wpeutil createpagefile /path=C:\pf.sys (assuming the installation partition you created was C:). Close the command prompt and proceed with Setup.

Conclusão

A solução foi ajustar a memória da VM pra acima de 800MB que é um valor de memória aceitável e refazer a instalação para resolver o erro. Trata-se de uma mensagem de erro interessante, pois tudo parece indicar que a mídia de instalação está inválida de alguma forma quando na verdade é um comportamento já documentado pela Microsoft.

Achou interessante o problema, ou já topou com ele em outro cenário diferente do que foi descrito aqui? Fique à vontade para comentar.

Exame 1Z0-071 – Impressões – Oracle Database

exame-1Z0-071

Olá pessoal, gostaria de compartilhar  minhas impressões sobre o exame 1Z0-071 da Oracle, pré-requisito para obter o título de  OCA – Oracle 12c Administrator. Faço aqui observações no estilo de outros posts aqui do blog, com certificações Microsoft.
Clique aqui para saber o que é cobrado no exame.

Impressões gerais sobre o exame


O exame 1Z0-071 estava 100% alinhada com todos os tópicos declarados como tópicos do exame (Review Exam Topics) e ponto forte da Oracle em descrever após o término do exame, no resultado final, tópico por tópico onde o candidato respondeu incorretamente as questões, excelente forma de feedback. Além disso, ao meu ver, não é uma prova que subestima o candidato entregando respostas óbvias e usa e abusa de questões com armadilhas (tanto de sintaxe como de comportamento de comando).

Sobre o exame em geral, deixo poucos tópicos de atenção (já que a prova é bem diversificada):

Tópicos importantes sobre o exame

  • Questões com TO_DATE e TO_CHAR em caem em peso neste exame, principalmente formatações de data;
  • Diversas pegadinhas envolvendo ORDER BY (no UNION);
  •  Domine operações de agrupamento (GROUP BY) e JOINS (todos os tipos, natural, using, outer, inner, etc) pois são bem cobradas no exame, inclusive de forma textual sem comandos.
  • Caiu poucas questões sobre views de dicionário, mas as que cairam, são facilmente cobertas pelos materiais de estudo da Oracle;
  • Muita questão (73) pra pouco tempo (1h40). Se notar que está perdendo mais que cinco minutos, marque pra revisão e parta pra próxima. Dica padrão de exames porém especialmente efetiva em exames de query;
  • Se você veio do TSQL como eu, não apenas leia sobre PL-SQL, teste cada consulta e observe o resultado com cautela! Tente concatenar uma STRING com um NULL nos dois SGBD’s por exemplo…Domine a sintaxe básica e não seja surpreendido(a)! O exame 1Z0-071 cobra conhecimento preciso de sintaxe.

Materiais de estudo exame 1Z0-071

Recomendo os materiais da Oracle Press que cobrem o exame 1Z0-061 ou 1Z0-071 , curso na Udemy para o exame e Oracle Magazine (esse último é muito bom porém leia de de modo seletivo de acordo com os tópicos do exame), todos estes foram os únicos materiais que utilizei.

Até a próxima!

SQL Server 2016 – Modo de compatibilidade mais abrangente

Como todos sabem, o SQL Server 2016 trouxe diversas melhorias na engine e algumas delas extremamente bem vindas, por menores que possam parecer (tipo o comando TRUNCATE funcionando para partições, rs).

Uma delas é uma melhoria modo de compatibilidade que agora permite a compatibilidade mínima de três (3) versões inferiores à atual ao invés de duas (2) como nas últimas versões.

Segue matriz de compatibilidade:

 

matriz

Em suma, o SQL Server 2016 suporta até o nível de compatibilidade do SQL Server 2008.

Seguindo os padrões anteriores o mínimo de compatibilidade exigida seria o 110, que é o SQL Server 2012.

Logo, para quem tem interesse em fazer a migração e ainda manter o nível de compatibilidade no 2008 por qualquer motivo que seja (mas supondo, Cardinality Estimator e outras particularidades do 2008), agora existe tal possibilidade.

Att.

 

SQL Saturday #573 em Brasília-DF (26/11)

titulosat

Olá,

No dia 26/11 acontecerá o nosso terceiro SQL Saturday aqui em Brasília-DF.

A iniciativa, promovida pela comunidade técnica é o melhor evento de capacitação e networking para profissionais de SQL Server.

Maiores informações, assim como o cadastro para participar do evento você encontra neste link.

Abaixo o agendamento retirado no site hoje 12h do dia 23/11 para apreciação.

Importante lembrar que os horários ou as palestras podem ser alteradas antes ou no dia do evento.: 

Agendamento Sat #573

Porque vale a pena participar?

A plataforma Microsoft SQL Server está em evidência agora e provavelmente nunca foi tão comentada como agora:

  • Existe uma versão pra linux em desenvolvimento;
  • Está cada vez mais integrada com “novas” tecnologias (Big Data, Cloud, Analytics), citando como exemplo o suporte à R nativo;
  • Uma quebra de paradigma na quantidade de features que são entregues na versão Standard do produto a partir do SQL Server 2016 é de impressionar e deve popularizar ainda mais o produto;

Então, dispensa comentários sobre o quão é importante este evento para você que é profissional de dados. Mesmo que você trabalhe com outras tecnologia, continua interessante pois no momento de relevância do SQL Server, tá aí uma boa oportunidade para se informar mais do que tem de bom na plataforma da Microsoft. Isso sem contar a quantidade de profissionais de alto nível que estarão no evento pra trocar uma ideia, tirar dúvidas, etc.

Cya!

[]’s

 

 

 

DBCC CHECKDB em cópias da MASTER – Um caso interessante

Ilustrando um DB generico a lot

Olá,

Executei o CHECKDB em uma base chamada MASTER_SHADOW, que é uma cópia da master de um servidor de produção.

Erros pipocam na tela conforme ilustrado abaixo (resumido com as partes relevantes, pois os erros abaixo se repetem para diferentes classes):

Msg 8992, Level 16, State 1, Line 1
Check Catalog Msg 3851, State 1: An invalid row (class=12,depid=0,depsubid=0) was found in the system table sys.syssingleobjrefs (class=12).
Msg 8992, Level 16, State 1, Line 1
Check Catalog Msg 3851, State 1: An invalid row (class=13,depid=1,depsubid=0) was found in the system table sys.syssingleobjrefs (class=13).
(…)
(…)
CHECKDB found 0 allocation errors and 61 consistency errors not associated with any single object.
DBCC results for ‘sys.sysrscols’.

Msg 8906, Level 16, State 1, Line 1
Page (1:10) in database ID 7 is allocated in the SGAM (1:3) and PFS (1:1), but was not allocated in any IAM. PFS flags ‘MIXED_EXT ALLOCATED 0_PCT_FULL’.

CHECKDB found 1 allocation errors and 61 consistency errors in database ‘master_shadow’.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.


O que era:

Assim que analisei o resultado, executei o CHECKDB na master em produção, a mãe desse “backup”. Nenhum erro, tudo no grau.

Suspeitei que fosse particularidade de alguma página da master que perdia referência ao virar uma base de usuário.

Fiz aquela pesquisa básica e cheguei no seguinte artigo do Paul Randal que elucidou o motivo do erro: Is my master Database really corrupt?

Em suma, realmente era particularidade da master, especificamente a página #10 da master que possui metadados “especiais”, que não pode existir em nenhuma outra base de usuário, o que era o caso dessa cópia da MASTER. Pelas mensagens de erro, nota-se que todos os erros de consistência apontavam para a mesma página (#10), então estava lendo sobre o assunto certo pro problema certo.


Finalizando

Conclusões do artigo original já supracitados no artigo do sqlmag: É interessante manter a MASTER na sua rotina de checagem de backup/restore mas tire as cópias de testes de integridade pra evitar diversos falso-positivos.

Conclusão: MASTER na rotina de RESTORE? Sim. Na rotina de CHECKDB? Só direto em produção.
Já restaurei master em várias oportunidades. Mas nunca havia executado CHECKDB até então. Topando com esse erro pela primeira vez. Vivendo e aprendendo.
[]’s

Script – Relatório dos Últimos Backups

Olá,

Script para visualização dos últimos backups de banco de dados.

Baseado e adaptado do script: http://timradney.com/2014/02/17/how-to-check-for-last-sql-server-backup/

/***********************************************************

Script: Verifica backup
Descrição:
Retorna, para cada base de dados, as últimas datas para os backups FULL, Diferencial (Diff) e também retorna a data dos dois
últimos backups de log.
Compatibilidade: SQL Server 2005 e versões superiores

************************************************************/

SELECT
DISTINCT

@@servername as [Servidor],
a.Name AS [Banco de Dados] ,
CONVERT(SYSNAME, DATABASEPROPERTYEX(a.name, 'Recovery')) [Recovery Model] ,
COALESCE((SELECT CONVERT(VARCHAR(50), MAX(backup_finish_date), 121)
FROM msdb.dbo.backupset
WHERE database_name = a.name
AND type = 'D'
AND is_copy_only = '0'
), '-') AS 'Full' ,
COALESCE((SELECT CONVERT(VARCHAR(50), MAX(backup_finish_date), 121)
FROM msdb.dbo.backupset
WHERE database_name = a.name
AND type = 'I'
AND is_copy_only = '0'
), '-') AS 'Diferencial' ,
COALESCE((SELECT CONVERT(VARCHAR(20), MAX(backup_finish_date), 121)
FROM msdb.dbo.backupset
WHERE database_name = a.name
AND type = 'L'
), '-') AS 'Log (Último)' ,
COALESCE((SELECT CONVERT(VARCHAR(20), backup_finish_date, 120)
FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY backup_finish_date DESC ) AS 'rownum' ,
backup_finish_date
FROM msdb.dbo.backupset
WHERE database_name = a.name
AND type = 'L'
) withrownum
WHERE rownum = 2
), '-') AS 'Log (penúltimo)'
FROM sys.databases a
LEFT OUTER JOIN msdb.dbo.backupset b ON b.database_name = a.name
WHERE a.name <> 'TEMPDB'
GROUP BY a.Name

Fim de suporte – Microsoft SQL Server 2005

2005end

 

Como diria uma prezada cantora contemporânea de uma riqueza musica inagualável: É hoje.

É hoje que acaba o suporte estendido do SQL Server 2005, que em outras palavras significa o fim definitivo de suporte.

Para os nostálgicos, segue um What’s New de tudo o que a versão trouxe de novidade. Sem dúvida minha favorita foi a quantidade expressiva de DMV’s.

O uso de versões não suportadas significa ausência de suporte técnico do fabricante e maior riscos de sofrer com vulnerabilidades.

Não vamos alimentar os zumbis: considere migrar o quanto antes se você possuir uma versão dessas em ambiente de produção.

Até!

Fonte:

https://support.microsoft.com/en-us/lifecycle?c2=1044

 

Dica – Renomear base com mesmo nome, texto em caixas diferentes

O motivo de postar esse sapo é pelo mesmo motivo que a O'reilly publica seus livros com animais na capa

Olá,

Dica rápida de hoje.
Como renomear uma base para o mesmo nome com o texto em diferentes caixas (caixas baixas e altas).
Exemplo: alterar EssEnOme para EsseNome.O post leva em consideração também apenas instâncias com case insensitive.

Pra renomear bases de dados é muito comum utilizar a sp_renamedb por bons motivos:

  •  Procedure antiga já. Bem conhecida;
  • Sintaxe simples: EXEC SP_RENAMEDB ‘NomeBaseAtual’, ‘NovoNome’;
  • Antes de trocar o nome, faz algumas verificações (óbvias, mas necessárias);

Entretanto, a mesma tarefa pode ser executada com o comando ALTER DATABASE:

Mas o que acontece ao renomear uma base com o mesmo nome, com diferenças apenas nas fontes minúsculas e maiúsculas?

Ao usar a SP_RENAMEDB

Resulta na seguite mensagem:

The database ‘DB_aCesso’ already exists. Specify a unique database name.

O comando ALTER DATABASE vai funcionar tranquilo, e favorável:

Vale lembrar que tanto a sp quanto o comando ALTER DATABASE necessitam de lock exclusivo para efetuar a mudança no nome da base. Além de que comandos que alteram o nome da base exigem permissões de db_creator (na base), control server ou sysadmin.

[]’s
Fonte: