セカンダリデータファイルを削除しています。DBCC SHRINKFILE:作業テーブルページであるため、ページを移動できませんでした


10

に対して作成したセカンダリデータファイル(.ndf)が多すぎますtempdb。余分なファイルを削除するには、ファイルを空にする必要があります(コンテンツは他のファイルに移動されます)。

DBCC SHRINKFILE('tempdbfile8', EMPTYFILE);

次にファイルを削除します。

ALTER DATABASE tempdb REMOVE FILE tempdbfile8;

しかし、EMPTYFILEコマンドはエラーを返します:

DBCC SHRINKFILE: Page 8:41920 could not be moved because it is a work table page.
Msg 2555, Level 16, State 1, Line 2
Cannot move all contents of file "tempdbfile8" to other places to complete the emptyfile operation.

心配する必要はありません。このページを使用しているオブジェクトを特定するだけで、それについて何かを行うことができます。

DBCC TRACEON (3604)
DBCC PAGE(2,8,41920) --dbid=2, fileid=8, pageid=41920

コマンドは多くの情報、object_idを返します。だが:

Metadata: ObjectId = 0 

私はそれについて何をすべきかわかりません。このページの移動を妨げている猫は何ですか?そのオブジェクト、プロセス、セッションなどを見つける方法は?どんな助けでも喜ばれますが、すべてをそのままにするか、代わりに他のファイルを削除することは、この問題の有効な解決策ではないことに注意してください;)

編集:

以前はプロセッサコアごとに1つのファイルを作成する "ベストプラクティス"(同じ初期サイズ、同じ成長率)を使用していたため、ファイルを削除しています。しかし、私の知る限りでは、競合の問題が発生するまで、同じデバイス上に追加のtempdbファイルを作成する意味はありません。私たちの場合、MPIOがオンになっていて、ストレージデバイスが4つのパスを処理できるため、それは理にかなっています。しかし、間違いがあり、6コアのCPUで合計5つのファイルが作成されました。これはMPIOパスよりも多く、CPUコアよりも少なく、偶数ではありません。それは問題を引き起こさないかもしれませんが、ちょうど正しくないようです:)。

データベースを1つ(問題の原因と思われる)をシングルユーザーモード(即時ロールバック)に設定することで、サーバーを再起動せずにファイルを空にして削除することができました。うまくいきましたが、幸運でした。私が本当に欲しいのは、常にページを追跡できるようにすることです:)。


DBCC PAGEコマンドが正しくありません。dbccpage(2,41920,1)のようにする必要があります。1、2、3は、出力に何を含めるかによって異なります。
Shanky 2014

上記が機能しない場合は、ハードウェアでファイルを削除し、SQLサーバーを再起動して、削除されなかったファイルのみを使用する必要がある可能性があります。このリンクを参照してくださいdaveturpin.com/2011/07/how-to-drop-a-tempdb-database-file
Shanky

2
@Shankyコマンドは正しいです。0..3は4番目のパラメーターとして渡すことができdbcc page ( {'dbname' | dbid}, filenum, pagenum [, printopt={0|1|2|3} ])ます。ソリューションについて:機能しますが、インスタンスを停止せずにこれを実行したいのですが。
Adam Luniewski、2014

わかりました。dbccページのより単純な形式について説明しました。文書化されていないコマンドであることに注意してください。投稿したリンクをチェックしましたか
Shanky

1
インスタンスを再起動せずにこの問題を解決するのは現実的ではないと思います。明らかに、あなたはこのワークテーブルが何であるかを追跡しようとしましたが(これは誰がそれを所有しているかを判断するのに役立ちます)、失敗しました。ヒットするか、再起動できるまで追加のファイルを使用してください。
アーロンバートランド

回答:


5

サーバーを再起動するだけで十分です-これらの作業テーブルはクリアされるはずです。ただし、これらのファイルを正常に削除する前に他のプロセスがワークテーブルを作成しないようにおそらくシングルユーザーモード(-m)で起動します。次に、に必要なファイルを再定義しますtempdb。おそらく、不要なファイルを削除したり、サイズを変更したりします。また、偶数のファイルがあり、それらがすべて同じサイズに設定され、すべてに同じ自動拡張設定(%ではなくMB)があることを確認する必要があります。そして、TF 1117とTF 1118も検討する良い機会かもしれません(開始点)。

SQL Serverを再起動する前にファイルシステムからファイルを削除するという提案には非常に注意します。まったく起動しない場合があります。

(ただし、実際の問題が何であるかについても知りたいと思います。ファイルが多すぎても問題はありません。)


@@ Aaronもちろん、削除する場合は空にする必要がありますが、これはmsdn.microsoft.com/en-gb/library/ms175574.aspxに記載されています。試してみると、SQl Server tempdbがオンラインになります。
シャンキー2014

5
@Shanky時速138マイルを1回運転してみましたが、乗り越えられませんでした。それは私がそれを続けなければならないことを意味します、そして私が明日引っ張られる可能性がないということですか?危険な方法を提案する前に、最初に適切な方法を試す方がはるかに安全です。私見では。特に彼は現在ファイルを空にできないので、エラーメッセージが表示されているワークテーブル以外に何かが存在する可能性はあると思いますか?このエラーは、すべてのオブジェクトの完全なリストを生成するのではなく、最初のオブジェクトのみを出力します。
アーロンバートランド

tempdbを実際に使用しているものが存在するため、推測するのが難しいファイルを空にすることができません。彼がソート演算子を使用している可能性がありますが、それでもtempdbを必要とするクエリです。DMVは、sys.dm_db_task_space_usage sys.dm_db_session_space_usage sys.dm_db_file_space_usage
Shanky

ここでの再起動はオプションですが、ファイルを空にせずにtempdbファイルを削除しようとしても、tempdbファイルは削除できませんが、同時にシステムカタログが更新され、再起動後にファイルが失われます。これはtempdbのデフォルトの動作だと思うので、データファイルを削除しても、それが使用されている場合でも機能すると考えて提案しました。同じことは、2番目のコメントで投稿したリンクにもあります。
シャンキー2014

1
@ShankyそれらのDMVは、問題のファイルとは何の関係もないすべての種類の何千もの行を返す可能性があります。また、あなたの方法では再起動する必要があるので、最初に単純な方法を試してみませんか?申し訳ありませんが、「難しい方法」が最初の提案であることに同意しません。
アーロンバートランド

2

https://social.msdn.microsoft.com/Forums/en-US/2a00c314-f35e-4900-babb-f42dcde1944b/dbcc-shrinkfile-page-411283400-could-not-be-moved-because-it-is- a-work-table-page?forum = sqldatabaseengine

Mikeがmsdnフォーラムで提案したように、作業テーブルは主にプランキャッシュに関連付けられています。それらをクリアすると、作業テーブルも削除され、Tempdbを縮小できます。これでうまくいきました。これにより、サーバーの再起動も節約できます。SQLサーバーは実行プランを再作成する必要があるため、オーバーヘッドが発生します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.