quarta-feira, 1 de maio de 2013

Consumo de CPU por base


Pra quem gerencia instâncias com mais de uma base, fica fácil evidenciar o consumo de CPU com o script abaixo:
WITH DB_CPU_Stats
AS
(SELECT DatabaseID, DB_Name(DatabaseID) AS [DatabaseName], SUM(total_worker_time) AS [CPU_Time_Ms]
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY (SELECT CONVERT(int, value) AS [DatabaseID]
FROM sys.dm_exec_plan_attributes(qs.plan_handle)
WHERE attribute = N'dbid') AS F_DB
GROUP BY DatabaseID)
SELECT ROW_NUMBER() OVER(ORDER BY [CPU_Time_Ms] DESC) AS [row_num],
DatabaseName, [CPU_Time_Ms],
CAST([CPU_Time_Ms] * 1.0 / SUM([CPU_Time_Ms]) OVER() * 100.0 AS DECIMAL(5, 2)) AS [CPUPercent]
FROM DB_CPU_Stats
WHERE DatabaseID > 4 -- system databases
AND DatabaseID <> 32767 -- ResourceDB
ORDER BY row_num OPTION (RECOMPILE);
Resultado:

Alterar a porta padrão - SQLServer 2008R2


Abra o SQL Server Configuration Manager
Clique em Iniciar | Todos os programas | Microsoft SQL 2008 R2 | Configuration Tools | SQL Server Configuration Manager
Desative o protocolo Shared Memory
Clique com o botão direito em SQL Server Network Configuration | Protocols for MSSQLSERVER | Shared Memory e clique em disabled.

Altere a porta de conexão do SQL Server
Clique em SQL Server Network Configuration | Protocols for MSSQLSERVER | TCP/IP e abra a caixa propriedades.
Na guia IP Address, utilize a barra de rolagem para encontrar IPALL.
Mude a porta de 1433 para 14333 e aplique.

Reinicie a instância
Clique com o direito em SQL Server Services | SQL Server (MSSQLSERVER) | Restart

Pare o SQL Server Agent
Na mesma janela onde reiniciou a instância, pare o serviço do SQL Server Agent.

Somente você deve estar online


Altere a base para single user
Abra o SQL Server Management Studio. Para se conectar, utilize o nome do servidor, uma vírgula e o número atual da porta.

Clique em New Query (Ctrl+N) e execute a instrução abaixo:
ALTER DATABASE NomeBase SET SINGLE_USER WITH ROLLBACK IMMEDIATE
Verifique se somente sua sessão está aberta para a base a ser migrada:
SELECT spid, status, loginame as 'user', hostname, db_name(dbid) as 'database', cmd 
FROM master..sysprocesses 
WHERE db_name(dbid) = 'NomedaBase'  -- coloque o nome da base migrada aqui
O resultado deve ser em branco, a não ser que alguma sessão ainda esteja aberta ou você mesmo esteja no escopo da base.

O ideal é o servidor estar isolado, sem interfaces de rede ativas e você logado na console, de frente pra máquina. Vai que alguém acessa o servidor por remote desktop porque não consegue se conectar, percebe que a porta foi alterada e "arruma". Falo isso em casos onde os servidores ficam isolados em CPDs ou em Data Centers.