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
| Tipo | O que captura | Depende de |
|---|---|---|
| Full | Todo o banco | Nada |
| Differential | Mudanças desde o último Full | Último Full |
| Log | Transações desde o último Log backup | Full + Logs anteriores |
| Copy-Only | Full independente (não quebra a cadeia) | Nada |
| File/Filegroup | Apenas um arquivo de dados | Full 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
| Role | Permissão |
|---|---|
db_owner | Controle total do banco |
db_datareader | SELECT em todas as tabelas |
db_datawriter | INSERT/UPDATE/DELETE em todas |
db_ddladmin | Criar/alterar objetos (DDL) |
db_securityadmin | Gerenciar 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
- sqlserver-visao-geral - Arquitetura e edições do SQL Server
- sqlserver-boas-praticas - Boas práticas de configuração e uso
- sqlserver-ferramentas - SSMS, Azure Data Studio e outras ferramentas
- sqlserver-tuning-queries - Identificar queries problemáticas com DMVs
Referências
- SQL Server Backup and Restore - Microsoft Learn
- SQL Server Security - Microsoft Learn
- Ola Hallengren - SQL Server Maintenance Solution (scripts de manutenção open source)