SQL Serverデータベースがまだ使用されているかどうかを確認するにはどうすればよいですか?
-
16-10-2019 - |
質問
いくつかのデータベースがまだ残っているSQL Serverインスタンスを廃止することを検討しています。
ユーザーがまだ使用されているのか、Webアプリケーションで使用されているのかを知るにはどうすればよいですか?
私はAを見つけました フォーラムスレッド T-SQLクエリがあり、最後のクエリ日を取得するために実行できます。動作しているようですが、この情報がデータベースを削除するのに十分に有効であるかどうかを知りたいです。それは...ですか?
同様に役立つ代替方法がある場合。
解決
キャッシュからパージされたアイテム、見逃したアイテム、またはまれな使用法のデータベースに関心がある必要があります。
データベースを手作業でドロップするのではなく、それらをオフラインにして、ドロップせずにアクセスを防ぐため、またはアクセスを制限するために制限された_userモードでアクセスを防ぐのではなく。これを行うと、その状態に1〜2か月間その状態を残して、時折使用されるかどうかを確認して確認できます。
また、そのデータベースでサーバーサイドプロファイラートレースフィルタリングを使用することもできます。
他のヒント
これらは私が過去に使用した方法です。
- データベースをオフライン/分離します
- ユーザー/ログインアクセスを拒否します
- プロファイラートレース
問題はこれです。誰もデータにアクセスしないことを確信するまで、どれくらい待ちますか?財務データの場合、毎日、毎週、毎月、四半期ごと、半年ごと、および年間いくつかのアイテムが実行されます。しかし、1年は十分ですか?また、少なくとも7年間データを利用できるようにするリクエストも見てきましたが、1つのケースでは、1つのシステムのデータは、誰も使用していなくても永遠に必要であると言われました。
最良のアドバイスはこれです。アクセスをオフにするために何をするにしても、すぐに戻すことができることを確認してください。 Detatchがこれに最適であることがわかりました。私は単にReattachをスクリプト化して、「誰かがどこにあるのか、このスクリプトを実行した場合、誰かが尋ねたら」と指示するだけです。それは私たちにできるだけ早く物事を元に戻すための最高の機会を与えてくれました。
私は彼のアドバイスでニックに同意します。確かに必要な場合は、SQLクエリの一部がキャッシュされないか、何らかの理由で手順キャッシュをパージできないため、プロファイラー(サービスサイドトレース)を使用する必要があります。
通常、仮想ファイルの統計情報をチェックして、OSファイルレベルで発生している読み取りまたは書き込みがあるかどうかを確認します。データベースがアクティブでなくても、ログバックアップ、フルバックアップなどを取得している場合、小さな読み取り/書き込みが表示されますが、そのデータベースで読み取り/書き込みアクティビティのアイデアも提供されます。
データベースを削除する前に、私はあなたが別の場所に2つまたは3つの読み取り可能なバックアップ(それらをテスト)を持っていることを確認します。いつ必要なのかわかりません。
次のクエリには、インデックス(およびヒープ)に対してユーザーIOが表示されるため、クエリプランがキャッシュに保持されることなく、最後の再起動以来使用されていないDBSを示しています。これは、仮想ファイルの統計を使用するという線に沿った一種ですが、ここで使用されるDMVはバックアップからIOアクティビティを除外します。プロファイラートレースを実行したり、トリガーや監査を必要としないようにする必要はありません。もちろん、SQLサーバーを頻繁に再起動する場合(または頻繁にデータベースを添付/シャットダウンします)、これは行くべき道ではないかもしれません:-)
そうは言っても、このクエリがDBを削除できることを確認しているように見える場合でも、まだ同意します。 絶対に しばらくの間、オフライン/分離またはユーザーアクセスを拒否し、さらに実際にドロップする前に尋ねることのデューデリジェンスを行います!
select [name] from sys.databases
where database_id > 4
AND [name] NOT IN
(select DB_NAME(database_id)
from sys.dm_db_index_usage_stats
where coalesce(last_user_seek, last_user_scan, last_user_lookup,'1/1/1970') >
(select login_time from sys.sysprocesses where spid = 1))
私は、多数の孤立したセミオルファンデータベースを持っている場所で働いていました。多くのタスクが季節的または年次であるため、彼らが本当に孤児になっているかどうかを判断するのは困難でした。そのため、ウェブサイトは年間3〜4か月間しか実行されていません(例として、W2フォームは1/31を電子的に提出する必要があるため、ウェブサイト処理はこれらは1月中旬から4月末までのみでした)。
行われたのは、次のような組み合わせでした。
*すべての開発者にデータベースを使用しているかどうかを尋ねます(これらのメールは毎月またはバックアップが長すぎるときはいつでも出ます)。
*データベースをオフラインにして、誰が文句を言うかを確認します。
*サーバーの名前を変更して、誰が文句を言うかを確認します。
先のとがった髪のボスは「完全かつ完全な」文書を喜んで許可していたため、Wikiは明示的に禁止されており、スタッフの削減は標準を満たす文書の劇的な減少につながりました。
それが私次第であれば、各データベースの連絡先名を備えたサーバーごとのwikiページがあります(そして、おそらくデータベースの目的の簡単な説明があります)。 Wikiで文書化されていないデータベースは、削除のための公正なゲームです。
2009年にはまだSQL Server 2000を使用している大規模な財務クライアントが1つありました。そのため、クライアントが最終的にSQL Server 2005に移動するまで、SQL Server 2000のインスタンスを1つ実行し続ける必要がありました。
別の2つの選択肢は次のとおりです。
- DBにトリガーを作成して、アクティビティを通知(またはテーブルに保存)します。
DBSで監査を有効にします。
- DBバージョンに依存します。
次のソリューションは、インスタンスの下で特定のデータベースのMBの一時的な合計、クリーン、ダーティページを示しています(インターネットで見つかり、少し変更されました):
SELECT
(CASE WHEN ([database_id] = 32767) THEN 'Resource Database' ELSE DB_NAME (database_id) END) AS 'Database Name',
COUNT(*) *8/1024 AS [TotalPages in MB],
SUM(CASE WHEN ([is_modified] = 1) THEN 0 ELSE 1 END) *8/1024 AS [CleanPages in MB],
SUM(CASE WHEN ([is_modified] = 1) THEN 1 ELSE 0 END) *8/1024 AS [DirtyPages in MB]
FROM sys.dm_os_buffer_descriptors
GROUP BY database_id
ORDER BY DB_NAME(database_id)
また
select value [DBid],attribute, last_execution_time ,text
from
sys.dm_exec_query_stats
cross apply
sys.dm_exec_plan_attributes(plan_handle)
cross apply
sys.dm_exec_sql_text(plan_handle)
where attribute = 'dbid'
order by last_execution_time desc
また
select value [DBid],attribute, last_execution_time ,text
from
sys.dm_exec_query_stats
cross apply
sys.dm_exec_plan_attributes(plan_handle)
cross apply
sys.dm_exec_sql_text(plan_handle)
--where dbid=8
where
text like '%idAdministrator%' and
attribute = 'dbid'
and value>= 5 -- dbid >=5 for user databases but include resource database which
--you can exclude by its numer I don't remember at the moment
order by last_execution_time desc