segunda-feira, 22 de abril de 2013

sexta-feira, 19 de abril de 2013

SQL Server: Problema com Database Mirroring (Error 1418)

Eu estava configurando um espelhamento de um banco de dados e tomei todos os cuidados necessários:

  1. Banco com recovery model Full
  2. Restaurei o backup na instância que iria hospedar o espelhamento (Full backup + transaction log backups) e deixei o banco em recovery (WITH NORECOVERY)
  3. Como as duas máquinas estavam no mesmo domínio, apenas segui o wizard para estabelecer o espelhamento
Tudo certo e, ao final, após decidir iniciar o espelhamento (Start Mirroring), recebo a seguinte mensagem:
The server network address "TCP://servidor02.dominio.local:5022" can not be reached or does not exist. Check the network address name and that the ports for the local and remote endpoints are operational. (Microsoft SQL Server, Error: 1418)
Bom, imediatamente, chequei como estava o firewall do Windows e vi que as portas que eu estava utilizando estavam ambas liberadas nos dois servidores. E ativas! Inclusive, consegui dar um telnet nelas (telnet servidor02.dominio.local 5022). O que mais poderia ser?

A parte interessante: as duas instâncias estavam usando a conta NETWORK SERVICE para executar o serviço SQL Server, e não uma conta de domínio (ou local) exclusiva para esse fim. Como eram duas instâncias não configuradas por mim (normalmente eu crio uma conta para o serviço do SQL Server e habilito dois recursos que eu gosto muito: "Instant File Initialization" e permitir  "Lock Pages in Memory") e não tinha janela para efetuar essa alteração, iniciei o serviço "as is".

Como resolver esse problema? Criei um login com as contas de computador do domínio e dei permissão CONNECT em ambas máquinas. Veja como ficou:

Na instância principal:
CREATE LOGIN [DOMINIO\SERVIDOR02$] FROM WINDOWS
GO
GRANT CONNECT ON endpoint::[Nome-do-Mirror-Endpoint] to [DOMINIO\SERVIDOR02$]
GO
Onde,
SERVIDOR02 é o nome do servidor onde está a instância que será o espelho;
Nome-do-Mirror-Endpoint é o nome do endpoint criado quando você configurou o espelhamento; pode ser obtido pela consulta SELECT name FROM sys.database_mirroring_endpoints.


Na instância espelho:
CREATE LOGIN [DOMINIO\SERVIDOR01$] FROM WINDOWS
GO
GRANT CONNECT ON endpoint::[Nome-do-Mirror-Endpoint] to [DOMINIO\SERVIDOR01$]
GO

Onde,
SERVIDOR01 é o nome do servidor onde está a instância principal;

Após isso, iniciei o espelhamento e tudo ficou funcionando!

sexta-feira, 12 de abril de 2013

Descobrindo o espaço usado por cada tabela no banco de dados

Para saber quanto uma tabela está usando de espaço num banco de dados, basta usar a stored procedure 'sp_spaceused' e o nome da tabela como parâmetro:


sp_spaceused tabela

name rows reserved  data index_size  unused
tabela 3650326  1415392 KB 1204728 KB  210440 KB  224 KB


Mas se eu quiser saber quanto cada tabela de um banco de dados está ocupando?
Vamos usar uma outra stored procedure, 'sp_MSforeachtable'.

É aí que entra esse script que resolve nosso problema:


CREATE TABLE #TabelaTemporaria
(
    [name] NVARCHAR(128),
    [rows] CHAR(11),
    reserved VARCHAR(18),
    data VARCHAR(18),
    index_size VARCHAR(18),
    unused VARCHAR(18)
)

insert #TabelaTemporaria exec sp_MSforeachtable 'EXEC sp_spaceused ''?'''

select [name] as Tabela, [rows] as Linhas,
cast(replace(reserved, ' KB','') as int) as Reservado,
cast(replace(data, ' KB','') as int) as Dados,
cast(replace(index_size, ' KB','') as int) as Tam_Index,
cast(replace(unused, ' KB','') as int) as NaoUsado
into #TabelaFinal
from #TabelaTemporaria

select * from #TabelaFinal order by Reservado desc

drop table #TabelaFinal
drop table #TabelaTemporaria

O resultado será parecido com esse:









Neste caso, já sabemos quem é a tabela que está alocando mais espaço dentro do banco de dados.

quinta-feira, 4 de abril de 2013

Powershell: Diretiva de execução de scripts

Ao executar pela primeira vez um script powershell num computador é comum que a seguinte mensagem seja retornada:


.\script.ps1 : File C:\Path-to-Script\script.ps1 cannot be loaded because running
scripts is disabled on this system. For more information, see about_Execution_Policies at
http://go.microsoft.com/fwlink/?LinkID=135170.
At line:1 char:1
+ .\script.ps1
+ ~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : SecurityError: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

Isso significa que a diretiva padrão está habilitada, que é a mais restritiva.
Ao executar o cmdlet Get-ExecutionPolicy é possível ver qual está em uso:


PS C:\> Get-ExecutionPolicy
Restricted


As diretivas de execução do Windows PowerShell são as seguintes:
  • Restricted (padrão)  
  • AllSigned 
  • RemoteSigned 
  • Unrestricted 
  • Bypass 
  • Undefined
Para maiores detalhes, visite http://technet.microsoft.com/pt-BR/library/dd347641.aspx
Para alterar o comportamento conforme suas necessidades, utilize o cmdlet 
Set-ExecutionPolicy <nome-da-diretiva>

Lembre-se sempre da importância da segurança e do uso da política do menor privilégio.
Um abraço!