2010-10-19 2 views
4

Есть ли способ узнать, произошла ли последняя операция записи в базе данных Live SQL Server 2005?Дата последней модификации для текущей базы данных SQL Server 2005

В настоящее время у меня есть 30 (и растущих) баз данных на моем сервере. Только некоторые из них видят ежедневную активность (но каждый из которых получает ежедневную активность со временем меняется.) Мое резервное пространство ограничено, и я бы хотел сделать ежедневную резервную копию всех баз данных «с момента последнего резервного копирования».

Фактически, я спрашиваю об обратном this вопрос. Вместо того, чтобы просить последнюю дату записи из резервной копии, чтобы увидеть, следует ли мне ее восстановить, я хочу сообщить последнюю дату записи базы данных в реальном времени, чтобы посмотреть, следует ли мне ее поддерживать.

Поскольку резервные копии запускаются на самом сервере, я могу проверить последнее время изменения журнала, но это не очень чисто, и я уверен, что он полностью надежный.

+0

Не было бы самым простым решением переключиться на резервное программное обеспечение, которое выполняет сжатие? – Thomas

+0

@Thomas: Я уже использую сжатые резервные копии –

ответ

3

This Blog entry содержит информацию о том, как это сделать на SQL Server 2008 и 2005

  • В 2008 году: с помощью нового аудита сервера функцию
  • В 2005 году: с помощью Dynamic Management Views (DMV)
2

Возможно, вы захотите переосмыслить свою стратегию резервного копирования, возможно, взяв еженедельную полную резервную копию в качестве базовой линии, а затем запустив differential backups в течение недели. Конечно, все это зависит от вашего SLA с бизнесом для восстановления.

+0

Выполнение дифференциальных резервных копий делает вещи намного сложнее, чем реальный выигрыш в моем случае (также мой инструмент резервного копирования не поддерживает их) –

10

ли эта помощь:

SELECT max(last_user_update) last_user_update 
FROM sys.dm_db_index_usage_stats 
WHERE database_id = DB_ID('YOUR_DBNAME_HERE') 
+1

Нет, это не будет - возвращает NULL;) –

+0

Возможно, это связано с тем, что ваша база данных не изменилась с момента последнего перезапуска сервера. Такой DMV запускается «пустым» для каждого перезапуска сервера или присоединения/отсоединения базы данных. См. Запись в блоге, на которую ссылается MicSlim. – Andreas

-1

Это один перечислит все онлайновые базы данных на сервере и дату последнего изменения

DECLARE @sqlString NVARCHAR(max) 
DECLARE @union NVARCHAR(max) 
SET @sqlString = '' 
SET @union = '' 
DECLARE @name nvarchar(50); 

DECLARE crs CURSOR FOR 
SELECT Name FROM sys.databases WHERE state = 0 
OPEN crs 
FETCH NEXT FROM crs INTO @name 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @sqlString = @sqlString + @union 
    SET @sqlString = @sqlString + ' 
    SELECT 
    TOP 1 
    ''' + @name + ''' as DBName, modify_date 
    FROM 
    [' + @name + '].sys.tables' 

SET @union = ' UNION ' 

    FETCH NEXT FROM crs INTO @name 
END 

SET @sqlString = @sqlString + ' ORDER BY DBName ASC' 
CLOSE crs; 
DEALLOCATE crs; 
EXEC(@sqlString) 
0

levidos жаль, но вы получите неверную информацию. Поскольку вы не сортируете свою первую по одной базе данных, так что вы действительно не получаете LAST MODIFIED DATE, вы получаете первую возвращенную запись.

Просьба сравнить мои результаты с вашими.

Это мое обновление.

DECLARE @sqlString NVARCHAR(MAX) , 
    @union NVARCHAR(MAX) , 
    @name NVARCHAR(50), 
    @Counter AS Int 

SET @sqlString = '' 
SET @union = '' 
SET @counter = 0 

DECLARE crs CURSOR 
FOR 
    SELECT Name 
    FROM sys.databases 
    WHERE state = 0 
OPEN crs 
FETCH NEXT FROM crs INTO @name 

WHILE @@FETCH_STATUS = 0 
    BEGIN 

     SET @counter = @counter + 1 

     SET @sqlString = @sqlString + @union 
     SET @sqlString = @sqlString + ' 
    SELECT * 
    FROM ( 
     SELECT TOP 1 
      ''' + @name + ''' as DBName, modify_date 
     FROM [' + @name + '].sys.tables 
     ORDER BY modify_date DESC 
      ) as Table' + CAST(@Counter AS VARCHAR(20)) 

     SET @union = ' UNION ' 

     FETCH NEXT FROM crs INTO @name 

    END 

--PRINT @sqlString 

SET @sqlString = @sqlString + ' ORDER BY DBName ASC' 
CLOSE crs ; 
DEALLOCATE crs ; 
EXEC(@sqlString) 
-1

DECLARE @sqlString NVARCHAR(max) = '' 
DECLARE @union NVARCHAR(max) = '' 
DECLARE @name nvarchar(50) 

DECLARE crs CURSOR FOR 
SELECT Name FROM sys.databases WHERE state = 0 
OPEN crs 
FETCH NEXT FROM crs INTO @name 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @sqlString = @sqlString + @union 
    SET @sqlString = @sqlString + ' 
    SELECT 
    ''' + @name + ''' as DBName, Max(modify_date) as modDate 
    FROM 
    [' + @name + '].sys.tables' 

SET @union = ' UNION ' 

    FETCH NEXT FROM crs INTO @name 
END 

SET @sqlString = @sqlString + ' ORDER BY modDate desc' 
CLOSE crs; 
DEALLOCATE crs; 
EXEC(@sqlString) 
+0

Это почти то же самое, что и два других ответа, уже отправленных. –

0

Есть целый ряд неправильных сегментов кода выше. Я исправил фрагмент кода SQLEagle выше, и теперь вы действительно должны увидеть последние измененные даты - я считаю, что измененная дата должна поступать из sys.objects, а не из sys.tables. Я вижу, что Эндрю Арнольд прокомментировал фрагмент кода Дебби «точно так же». Однако Эндрю явно не выполнял эти два сегмента кода, или он знал бы, что результат Дебби получает лучший результат, чем вклад WaterCooler в плане фактического предоставления почти правильного результата, но может быть дополнительно улучшен согласно ниже.

DECLARE @sqlString NVARCHAR(MAX) , 
    @union NVARCHAR(MAX) , 
    @name NVARCHAR(50), 
    @Counter AS Int 

SET @sqlString = '' 
SET @union = '' 
SET @counter = 0 

DECLARE crs CURSOR 
FOR 
    SELECT Name 
    FROM sys.databases 
    WHERE state = 0 
OPEN crs 
FETCH NEXT FROM crs INTO @name 

WHILE @@FETCH_STATUS = 0 
    BEGIN 

     SET @counter = @counter + 1 

     SET @sqlString = @sqlString + @union 
     SET @sqlString = @sqlString + ' 
    SELECT * 
    FROM ( 
     SELECT TOP 1 
      ''' + @name + ''' as DBName, modify_date 
     FROM [' + @name + '].sys.objects 
     ORDER BY modify_date DESC 
      ) as Table' + CAST(@Counter AS VARCHAR(20)) 

     SET @union = ' UNION ' 

     FETCH NEXT FROM crs INTO @name 

    END 

--PRINT @sqlString 

SET @sqlString = @sqlString + ' ORDER BY DBName ASC' 
CLOSE crs ; 
DEALLOCATE crs ; 
EXEC(@sqlString) 
Смежные вопросы