Existem muitos bancos de dados no servidor SQL do meu cliente. Esses bancos de dados estão em desenvolvimento, para que os desenvolvedores possam projetar, refatorar, fazer modificações nos dados e assim por diante. Existem alguns bancos de dados que mudam raramente. Meu cliente precisa manter todos eles seguros (com backup) e gastar algum tempo gerenciando o ambiente. (Não há posição de administrador de banco de dados na empresa.) Após uma longa discussão, o cliente decidiu usar uma estratégia diária de backup completo, devido à facilidade de restauração.
Então, aqui está o resumo da situação:
- O número de bancos de dados pode variar todos os dias.
- Os bancos de dados que foram alterados (significando que dados e / ou estrutura foram alterados) devem ser copiados.
- Os bancos de dados que não foram alterados NÃO devem ser copiados.
- A solução não deve afetar a estrutura do banco de dados (não é um requisito restrito)
- Este "mecanismo de backup" deve funcionar automaticamente.
O principal problema: como detectar que um banco de dados foi alterado. A primeira parte do problema (alterações de DDL) pode ser resolvida usando gatilhos de DDL . Mas as alterações de dados (alterações de DML) são um problema. É impossível aplicar gatilhos DML a todas as tabelas de todos os bancos de dados para rastrear alterações (desempenho, gerenciamento de objetos estendidos ...). O mecanismo de backup deve rastrear todas as alterações para marcar cada banco de dados como pronto para o backup.
O Change Data Capture é uma solução, mas parece muito pesada (também requer o SQL Server Enterprise Edition).
Outra maneira é rastrear alterações no arquivo de banco de dados (tamanho ou hora da última alteração), mas não funciona corretamente: um banco de dados pode alterar seu tamanho quando exceder todo o espaço livre reservado e sp_spaceused não é uma solução.
O rastreamento é uma solução, mas causa problemas de desempenho e requer gerenciamento adicional.
Existem soluções para calcular o tamanho real de uso do banco de dados sem afetar outros objetos de gerenciamento de banco de dados (como estatísticas ..)? Concedido que uma alteração nos dados de uma tabela que não altera o tamanho da tabela não seria acionada (eu acho), mas é melhor que nada. Realmente, estou procurando uma solução direta ou indireta para o SQL Server 2008.
Obrigado por quaisquer comentários, soluções e pensamentos.
ADICIONADO:
Aqui está a solução (graças a Marian ):
Select
NextLSN = MAX(fn.[Current LSN])
,Databasename = DB_NAME()
from fn_dblog(NULL, NULL) fn
LEFT JOIN sys.allocation_units au
ON fn.AllocUnitId = au.allocation_unit_id
LEFT JOIN sys.partitions p
ON p.partition_id = au.container_id
LEFT JOIN sys.objects so
ON so.object_id = p.object_id
WHERE
(
(Operation IN
('LOP_INSERT_ROWS','LOP_MODIFY_ROW',
'LOP_DELETE_ROWS','LOP_BEGIN_XACT','LOP_COMMIT_XACT')
AND so.is_ms_shipped = 0)
OR
([Lock Information] like '%ACQUIRE_LOCK_SCH_M OBJECT%')
)