No disks suitable for cluster disks were found.

Depois de tanto tempo sem escrever, mas já que tenho me deparado com tantos troubleshooting ultimamente, que acredito que o de hoje  merece a escrita de um artigos. Pois certamente muitos de vocês cedo ou tarde passaram ou passarão pele mesmo problema.

Brincando em um lab de clusterização sql server, me deparei com este problema: um disco que embora estivesse disponível e apresentado para o SO, uma vez removido do cluster por alguma razão qualquer, já não era mais possível adiciona-lo novamente ao cluster. Todas as vezes em que se tentava adicionar um novo disco recebia-se a mensagem que nenhum disco foi encontrado e apto para ser adicionado ao cluster.

No disks suitable for cluster disks were found.

Aí pesquisando um pouco encontrei este artigo:

Windows Server 2012 (R2) – Failover Cluster can’t access disks after outage

Powershell clean disk on cluster

Clear-ClusterDiskReservation -disk 1

Onde rodando o comando em powershell como administrador para limpar as referências do disco no cluster, e via Disks  Management do windows, colocando o disco offline e online (em alguns casos é necessário recriar) o disco volta a ficar disponível para ser adicionado ao cluster. A atenção no comando powershell é quanto a número do disco, que você consegue pegar através do Disk Management do windows, que aparece através do atalho Win + X.

untitled1

untitled2

#troubleshotted

 

Database em recovery pending mode

Se o seu banco foi atachado ou recuperado de maneira parcial, e no instante da reinicialização está faltando algum data file  e por esta razão o banco não inicializa e fica sempre em recovery pending mode. Observei que isso ocorreu comigo em um cenário de restore parcial, de um banco que contem mais 100 filegroups, na hora do restore o banco ficou on-line sem problemas. Porém como ele foi restaurado parcialmente, isso é, faltam um ou mais filegroups em relação ao banco original. Sempre que a instância sofrer uma reinicialização, o banco não ficará on-line, ficará inacessível com o status “recovery pending”. Aí você pode pensar que é o fim da linha, e terá que realizar todo o processo de restore parcial desde o inicio. Só que não. não entre em desespero.

Para este cenário, fazendo os passos seguintes você poderá deixar o banco on-line com os filegroups que você possui, ainda que parcialmente, sem a necessidade de esperar um  processo de restore demorado.

Primeiro esteja atendo e identifique todos os datafiles que estão com o status recovery pending, observando os registros da tabela sys.master_files.

select * from master_files
where
database_id = db_id("nome_do_banco");

Antes de atachar, esteja seguro que o usuário que está executando o script tenham permissão nos diretórios dos datafiles, além é claro do user da instancia no configuration manager.

Basta seguir os passos:


  1. Coloque o banco em modo off-line
  2. Detach o banco
  3. e gere um novo script de attachar referenciando apenas os datafiles que você possuí e que estejam íntegros e pronto.

Um ponto de atenção é que o script wizard do management studio para atachar um banco com filegroups com filestream, em algumas situações é bugado, então você pode se basear no modelo do script abaixo e executar manualmente. No caso, você terá que indicar todos os datafiles individualmente, em caso de filestream terá que apontar o diretório do filestream. Desta maneira você montando e guardando este script em mãos, você poderá manter um banco parcialmente restaurado com o status on-line, sem medo de ser feliz. E isso pode acreditar, é um recurso muito útil quando se tem pouco recurso de storage.

USE [master]
GO
CREATE DATABASE [teste] ON 
( FILENAME = N'F:\data\testePrimary.MDF' ),
( FILENAME = N'F:\data\teste1.NDF' ),
( FILENAME = N'F:\data\teste02.NDF' ),
( FILENAME = N'F:\data\teste03.NDF' ),
( FILENAME = N'F:\data\teste04.NDF' ),
( FILENAME = N'F:\data\teste05.NDF' ),
( FILENAME = N'C:\data\teste06.NDF' )
 FOR ATTACH
GO

 

Atachar banco Sql server com filestream em caminho diferente

Sim é possível, mas sempre que estiver trabalhando com uma base de multiplos datafile e deseja atachar mudando os caminhos físicos esqueça tentar utilizar o wizard do managment studio. Você deve especificar um a um dos arquivos que deseja atachar. Pode utilizar o wizard apenas para gerar o script ao invés de executar, pelo menos até a versão 2012 do sql server eu tenho certeza que este wizard não lista o diretório de filestream que deseja atachar. Mas quando for atachar o banco, se o diretório de filestream estiver no mesmo caminho físico, não terá problemas, se deseja move-lo para outro local, vc deverá informar manualmente este diretório no script de atachamento, com a seguinte sintaxe:

Ler maisAtachar banco Sql server com filestream em caminho diferente

DBCC CHECKIDENT reseed e truncate table

O auto-incremento do Sql Server sofre automáticamente um reseed para reiniciar a contagem do ponto de partida definido anteriormente, isso ocorre sempre que a tabela sofrer um truncate table.

DBCC CHECKIDENT ('nome tabela', reseed, 1)

Desta forma aplicar o DBCC CHECKIDENT após um truncate table é completamente redundante.

 

 

Bug conexão dbx Sql Server 2012 com RAD Studio XE6

Ao tentar efetuar conexão, utilizando o componente dbxpress do RAD Studio xe6, com o meu Sql Server 2012 64bits, me deparava com o erro.

DBX Error: Driver could not be properly initialized. Client library may be missing, not installed properly, of the wrong version, or the driver may be missing from the system path.

Verifiquei no código fonte da Data.DbxMSSQL que dll cliente utilizanda era do instalador cliente do Sql Server 2008.

Values[TDBXPropertyNames.LibraryName] := 'dbxmss.dll';
Values[TDBXPropertyNames.VendorLib] := 'sqlncli10.dll';
Values[TDBXPropertyNames.VendorLibWin64] := 'sqlncli10.dll';

Para resolver o problema bastou instalar o client do Sql server 2008 R2, e consegui conexão normalmente com o sql server 2012.

 

 

 

Atualização parcial de banco com Erwin

Quando estamos habituados a modelagem de banco de dados, principalmente em cenários de Data warehouse, nos deparamos com situações onde é muito trabalhoso promover uma atualização da estrutura do banco tentando preservar algum dado que já esteja populado, manter sua estrutura dentro do Erwin ainda é muito útil durante todo o ciclo do desenvolvimento, pois entre as muitas vantagens na agilidade da manutenção do banco, poderia citar por exemplo a simples alteração de um tipo de campo em uma chave primária por exemplo, parece simples mas se torna uma tortura pois precisa ser refletida em todas as chaves estrangeiras, e vejo amigos meus que abandonam o Erwin sofrerem com este tipo de situação.

Para quem está vivendo o drama de ter que alterar uma estrutura de banco em cascata, não fique desesperado,  ainda é possível de forma ágil promover atualização parcial da estrutura do banco de dados  preservando dados e estrutura pré-existente. O que nós iremos fazer é exportar apenas o script da estrutura de tabelas que desejamos e executa-lo. No Erwin quando você promove uma alteração assim, na chave primária, ele automaticamente já altera o tipo em todas as chaves estrangeiras relacionadas. E acreditem isso é uma grande mão na roda em bancos corporativos com projetos de missão crítica, onde uma chave primária tem relação até com 30 tabelas. Se você utilizava a opção Forward sem antes filtrar as entidades que desejava alterar, pode acabar perdendo alguma coisa que não queria, o que você precisa fazer é um forward parcial, utilizando a opção Filter. 

image1

Para isso, basta selecionar as entidades que deseja atualizar, e clicar sobre o botão “Forward Engineer Schema Generation”  indicado na imagem acima, após isso você deverá validar a filtragem apenas dos elementos selecionados clicando sobre o botão “Filter”.

image2image1

E ao invés de implementar a alteração diretamente no banco conforme possibilitaria o botão “Generate”, clique sobre o botão “Report”, ele lhe permitirá salvar todo o ddl de criação da estrutura dos dados, e assim permite muito maior controle sobre possíveis erros na execução da atualização.

image1É importante ainda antes mesmo de exportar o script de alteração do banco, desmarcar todas as opções de exportação de index conforme ilustração, sem isso ele gera baste index desnecessário, além de primary keys e foreign keys .

image1

E pronto, geralmente executo o script diretamente sem resultar erros.

Abraços

 

Translate »