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á,

Post rápido pra documentar um pequeno e simples troubleshooting encontrado ao configurar ambiente para testes caseiros, usando Virtualbox (não testei mas acredito que envolva outros virtualizadores) e o Windows Server 2016.

 

Mensagem de erro:

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

Cenário

Instalando o Windows Server 2016 em uma VM (Virtualbox), selecionei a edição desejada (Desktop Experience)  e tentei prosseguir com a instalação. No momento em que o contrato de licença deveria ser carregado, um erro impede a instalação.

 

Selecionando qual edição será instalada.

 

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

Resolução

Descartei a possibilidade da ISO utilizada para instalação estar corrompida porque já tinha realizado uma instalação da 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 algo intermitemente. 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:

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.

 

A solução, adivinhe você, foi ajustar a memória da VM pra acima de 800MB  e refazer a instalação. Achei interessante registrar sobre esse problema porque a mensagem de erro não é exatamente muito intuitiva e até leva a crer que possa se tratar de um problema na mídia de instalação.

Funcionou com tranquilidade.

Att.

 

Impressões sobre o exame Oracle Database SQL – 1Z0-071


Olá,

Gostaria de compartilhar  minha impressão sobre a prova 1Z0-071 da Oracle, pré-requisito para obter o título de  OCA – Oracle 12c Administrator.
Para saber o que é cobrado no exame, clique aqui .

 Impressões + dicas
A prova estava 100% alinhada com TODOS os tópicos declarados como tópicos do exame (Review Exam Topics) e notei respeito por parte da Oracle em, descrever no resultado do exame, tópico por tópico onde o candidato respondeu incorretamente as questões. Melhor feedback que esse, nunca nem vi. 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):

+ Questões com TO_DATE e TO_CHAR em peso, 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). É uma prova com muitas questões “armadilha” que exigem constante releitura, então se notar que está perdendo tempo demais (5min+), marque a questão pra revisão e parta pra próxima. Essa dica é padrão pra qualquer exame de longa duração, mas é especialmente válida em exames de query.

+ Se você veio do TSQL como eu, não apenas leia sobre PL-SQL, teste cada consulta e acredite…alguns comportamentos são bem diferentes entre os dialetos. Tente concatenar uma STRING com um NULL nos dois produtos e observe os resultados. Domínio da sintaxe é algo que o exame já espera de você como candidato e ele não vai te apresentar 5 questões onde 1 é a resposta certa e as outras 4 são visivelmente absurdas já julgando pela sintaxe. Na verdade a maioria das respostas se parecem MUITO e pra mim esse é o desafio da prova.

Materiais de estudo

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 mas deve ser lido de modo seletivo de acordo com os tópicos do exame).

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: