4

稼働中の SQL Server 2005 データベースで最後の書き込み操作がいつ行われたかを知る方法はありますか?

現在、サーバーには 30 個の (そして増え続けている) データベースがあります。これらの一部のみが毎日のアクティビティを確認します (ただし、どのアクティビティが毎日のアクティビティを取得するかは時間の経過とともに変化します)。バックアップ スペースが限られているため、「前回のバックアップ以降に変更された」すべてのデータベースの毎日のバックアップを実行したいと考えています。

実際、私はこの質問の逆を尋ねています。バックアップを復元する必要があるかどうかを確認するためにバックアップからの最終書き込み日付を尋ねる代わりに、バックアップする必要があるかどうかを確認するために、ライブ データベースの最終書き込み日付を伝えたいと考えています。

バックアップはサーバー自体で実行されるため、ログの最終変更時刻を確認できましたが、それはあまりクリーンではなく、完全に信頼できるとは言えません。

4

7 に答える 7

9

これは役に立ちますか:

SELECT max(last_user_update) last_user_update
FROM sys.dm_db_index_usage_stats
WHERE database_id = DB_ID( 'YOUR_DBNAME_HERE')
于 2010-10-19T23:03:00.137 に答える
3

このブログ エントリには、SQL Server 2008 および 2005 での実行方法に関する情報が含まれています。

  • 2008 年: 新しいサーバー監査機能の使用
  • 2005 年: 動的管理ビュー (DMV) を使用
于 2010-10-19T15:25:03.660 に答える
2

たとえば、毎週の完全バックアップをベースラインとして取り、その週に差分バックアップを実行するなど、バックアップ戦略を再考することをお勧めします。もちろん、これはすべて、回復のためのビジネスとの SLA に依存します。

于 2010-10-19T15:25:10.237 に答える
0

levidos申し訳ありませんが、間違った情報を取得します。データベースごとに上位を並べ替えていないため、実際には最終変更日を取得していないため、最初に返されたレコードを取得しています。

私の結果をあなたの結果と比較してください。

これが私のアップデートです。

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)
于 2013-03-20T19:23:32.273 に答える
-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)
于 2012-08-17T11:46:48.277 に答える