Ideia central

Administrar o SQL Server envolve garantir disponibilidade, performance, segurança e recuperabilidade dos bancos de dados. As principais responsabilidades de um DBA incluem estratégia de backup/restore, gerenciamento de usuários e permissões, monitoramento de saúde e planos de manutenção.

Backup e Restore

Tipos de backup

TipoO que capturaDepende de
FullTodo o bancoNada
DifferentialMudanças desde o último FullÚltimo Full
LogTransações desde o último Log backupFull + Logs anteriores
Copy-OnlyFull independente (não quebra a cadeia)Nada
File/FilegroupApenas um arquivo de dadosFull do filegroup

Estratégia comum (Recovery Model: FULL)

Domingo 22h  → Full Backup
Seg-Sáb 22h  → Differential Backup
De hora em hora → Log Backup
-- Full backup comprimido
BACKUP DATABASE [MinhaDB]
TO DISK = 'D:\Backups\MinhaDB_full.bak'
WITH COMPRESSION, STATS = 10;
 
-- Differential backup
BACKUP DATABASE [MinhaDB]
TO DISK = 'D:\Backups\MinhaDB_diff.bak'
WITH DIFFERENTIAL, COMPRESSION;
 
-- Log backup
BACKUP LOG [MinhaDB]
TO DISK = 'D:\Backups\MinhaDB_log.bak'
WITH COMPRESSION;
 
-- Restore com NORECOVERY (para restaurar diferenciais/logs depois)
RESTORE DATABASE [MinhaDB]
FROM DISK = 'D:\Backups\MinhaDB_full.bak'
WITH NORECOVERY, REPLACE;
 
-- Restore differential
RESTORE DATABASE [MinhaDB]
FROM DISK = 'D:\Backups\MinhaDB_diff.bak'
WITH NORECOVERY;
 
-- Restore log com point-in-time
RESTORE LOG [MinhaDB]
FROM DISK = 'D:\Backups\MinhaDB_log.bak'
WITH RECOVERY, STOPAT = '2026-04-30 14:30:00';

Sempre teste o restore! Um backup que nunca foi testado não é um backup.

Gerenciamento de Usuários e Permissões

Hierarquia de segurança

Login (instância)
  └── User (banco de dados)
        └── Role (conjunto de permissões)
              └── Permissions (GRANT/DENY/REVOKE)
-- Criar login (nível de instância)
CREATE LOGIN app_user WITH PASSWORD = 'Senha@Forte123!';
 
-- Criar usuário no banco (nível de banco)
USE MinhaDB;
CREATE USER app_user FOR LOGIN app_user;
 
-- Adicionar a uma role
ALTER ROLE db_datareader ADD MEMBER app_user;
ALTER ROLE db_datawriter ADD MEMBER app_user;
 
-- Permissão granular
GRANT EXECUTE ON SCHEMA::dbo TO app_user;
DENY SELECT ON dbo.dados_sensiveis TO app_user;
 
-- Criar role customizada
CREATE ROLE leitura_relatorios;
GRANT SELECT ON SCHEMA::relatorio TO leitura_relatorios;
ALTER ROLE leitura_relatorios ADD MEMBER app_user;

Roles fixas de banco comuns

RolePermissão
db_ownerControle total do banco
db_datareaderSELECT em todas as tabelas
db_datawriterINSERT/UPDATE/DELETE em todas
db_ddladminCriar/alterar objetos (DDL)
db_securityadminGerenciar permissões

Manutenção de Índices

Índices fragmentados degradam performance de leitura. Fragmentação ocorre com INSERT/UPDATE/DELETE que causam page splits.

-- Verificar fragmentação de índices
SELECT
    OBJECT_NAME(i.object_id)    AS tabela,
    i.name                       AS indice,
    ips.avg_fragmentation_in_percent,
    ips.page_count
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') ips
JOIN sys.indexes i ON ips.object_id = i.object_id AND ips.index_id = i.index_id
WHERE ips.avg_fragmentation_in_percent > 10
ORDER BY ips.avg_fragmentation_in_percent DESC;
 
-- REORGANIZE (online, para fragmentação 10-30%)
ALTER INDEX idx_pedidos_data ON dbo.pedidos REORGANIZE;
 
-- REBUILD (offline por padrão, para fragmentação > 30%)
ALTER INDEX idx_pedidos_data ON dbo.pedidos REBUILD;
-- Com Enterprise Edition, pode ser ONLINE:
ALTER INDEX idx_pedidos_data ON dbo.pedidos REBUILD WITH (ONLINE = ON);
 
-- Atualizar estatísticas
UPDATE STATISTICS dbo.pedidos WITH FULLSCAN;

Monitoramento de Saúde

-- Verificar jobs com falha
SELECT name, enabled, last_run_outcome
FROM msdb.dbo.sysjobs j
JOIN msdb.dbo.sysjobactivity a ON j.job_id = a.job_id
WHERE last_run_outcome = 0; -- 0 = falha
 
-- Verificar tamanho dos bancos
SELECT
    name,
    size * 8 / 1024 AS tamanho_MB,
    log_size * 8 / 1024 AS log_MB
FROM sys.databases;
 
-- Verificar espaço em disco dos arquivos
EXEC sp_spaceused;
 
-- Sessions ativas e o que estão fazendo
SELECT
    s.session_id,
    s.login_name,
    s.status,
    s.cpu_time,
    s.memory_usage * 8 AS memory_kb,
    t.text AS query
FROM sys.dm_exec_sessions s
JOIN sys.dm_exec_requests r ON s.session_id = r.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE s.is_user_process = 1;
 
-- Verificar locks e bloqueios
SELECT
    blocking_session_id,
    session_id,
    wait_type,
    wait_time / 1000.0 AS wait_seconds
FROM sys.dm_exec_requests
WHERE blocking_session_id > 0;

SQL Server Agent

Ferramenta de agendamento nativa para jobs de manutenção, backups, ETL, etc.

-- Jobs comuns a automatizar:
-- 1. Backup Full (domingo)
-- 2. Backup Differential (dias úteis)
-- 3. Backup Log (de hora em hora)
-- 4. Rebuild/Reorganize de índices (semanal)
-- 5. Update Statistics (semanal)
-- 6. DBCC CHECKDB (verificação de integridade, semanal)
-- 7. Limpeza de backups antigos
 
-- Verificar integridade do banco (pode demorar em bancos grandes)
DBCC CHECKDB ('MinhaDB') WITH NO_INFOMSGS;

Database Mail

-- Configurar alertas por e-mail para falhas de job, espaço em disco, etc.
EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'Alertas DBA',
    @recipients = '[email protected]',
    @subject = 'Alerta SQL Server',
    @body = 'Job de backup falhou.';

Conexões

Referências