Дата последнего изменения действующей базы данных SQL Server 2005 - PullRequest
4 голосов
/ 19 октября 2010

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

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

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

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

Ответы [ 7 ]

9 голосов
/ 20 октября 2010

Поможет ли это:

SELECT max(last_user_update) last_user_update
FROM sys.dm_db_index_usage_stats
WHERE database_id = DB_ID( 'YOUR_DBNAME_HERE')
3 голосов
/ 19 октября 2010

Эта запись в блоге содержит информацию о том, как это сделать в SQL Server 2008 и 2005.

  • В 2008 году: использование новой функции аудита сервера
  • В 2005 году: использование Dynamic Management Views (DMV) * ​​1008 *
2 голосов
/ 19 октября 2010

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

0 голосов
/ 05 декабря 2016

Выше указан ряд неправильных сегментов кода.Я исправил приведенный выше фрагмент кода 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)
0 голосов
/ 18 июля 2014

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 голосов
/ 20 марта 2013

Извините, но вы получаете неверную информацию.Потому что вы не сортируете свой топ по каждой базе данных, поэтому вы действительно не получаете ПОСЛЕДНЮЮ МОДИФИЦИРОВАННУЮ ДАТУ, вы получаете первую возвращенную запись.

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

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)
0 голосов
/ 17 августа 2012

В этом списке перечислены все онлайн-базы данных на сервере и дата последнего изменения

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...