none
データベースメールにてサイズの大きいメールを送信・削除してもsysmail_mailitemsの領域が開放されない RRS feed

  • 質問

  • 同様の症状が検索できなかったので、情報として書かせていただきます。

     

    環境:Win2K3 SP1, SP2, XP SP3 + SQL 2005 SP2 + 各種累積パッチ(CU9でも確認)

     

    データベースメールにてサイズの大きいメール(8000バイト以上です)を定期的に送信していますが、送信したメールはmsdbのsysmail_mailitemsに残っています。これを削除するためBooks Onlineに例示のあるストアド(sysmail_delete_mailitems_sp)にて削除しているのですが、ストアド実行後のテーブル内の行数がゼロにもかかわらず、テーブルの領域が全て開放されないことがあります。このため日々msdbのデータベース全体が拡張されてしまう現象が起きています。

     

    サイズが大きくないメールの場合は、ちゃんと開放されるようですが、LOBと判断されるメールの場合は一部か全てが開放されないように見えます(Reporting Serviceにて領域の確認してます)。どうにもできないので、危険と思われますが、以下のコードのように外部キー制約を削除してTruncate Tableにて対応しています。

     

    Code Snippet

    use msdb

    ALTER TABLE [dbo].[sysmail_attachments]  drop CONSTRAINT [FK_sysmail_mailitems_mailitem_id]
    ALTER TABLE [dbo].[sysmail_send_retries]  drop CONSTRAINT [FK_mailitems_mailitem_id]
    go

    use msdb

    truncate table sysmail_send_retries
    truncate table sysmail_attachments
    truncate table sysmail_mailitems
    go

    use msdb

    ALTER TABLE [dbo].[sysmail_attachments]  WITH CHECK ADD  CONSTRAINT [FK_sysmail_mailitems_mailitem_id] FOREIGN KEY([mailitem_id])
    REFERENCES [dbo].[sysmail_mailitems] ([mailitem_id])
    ON DELETE CASCADE

    ALTER TABLE [dbo].[sysmail_send_retries]  WITH CHECK ADD  CONSTRAINT [FK_mailitems_mailitem_id] FOREIGN KEY([mailitem_id])
    REFERENCES [dbo].[sysmail_mailitems] ([mailitem_id])
    ON DELETE CASCADE

    ALTER TABLE [dbo].[sysmail_attachments] CHECK CONSTRAINT [FK_sysmail_mailitems_mailitem_id]
    ALTER TABLE [dbo].[sysmail_send_retries] CHECK CONSTRAINT [FK_mailitems_mailitem_id]
    go

     

     

    同様の現象にあわれている方の参考になれば幸いです。

    2008年10月14日 1:52

回答

  • yakkenさん、こんにちは!中川俊輔です。

     

    領域が解放されないことについて、下記の技術文書がありました。

    FIX: ゴースト行クリーンアップ スレッドは、 SQL Server 2005 でデータベースのいくつかのデータ ファイルの非実体行を削除しません。

    http://support.microsoft.com/?scid=kb%3Bja%3B932115&x=13&y=11

     

    Cumulative update8に含まれる修正なので、Cumulative update9が適用済みならば

    回避策に書いてあるように、DBCC SHRINKFILEコマンドを実行することで領域を解放できるようです。

     

    違う原因だったらごめんなさい!

    それでは。

     

    この投稿は現状のまま何の保証もなく掲載しているものであり、何らかの権利を許諾するものでもありません。

    コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。詳しくは http://www.microsoft.com/japan/communities/msp.mspx をご覧ください。

    2008年10月20日 9:41

すべての返信

  • yakkenさん、こんにちは!中川俊輔です。

     

    領域が解放されないことについて、下記の技術文書がありました。

    FIX: ゴースト行クリーンアップ スレッドは、 SQL Server 2005 でデータベースのいくつかのデータ ファイルの非実体行を削除しません。

    http://support.microsoft.com/?scid=kb%3Bja%3B932115&x=13&y=11

     

    Cumulative update8に含まれる修正なので、Cumulative update9が適用済みならば

    回避策に書いてあるように、DBCC SHRINKFILEコマンドを実行することで領域を解放できるようです。

     

    違う原因だったらごめんなさい!

    それでは。

     

    この投稿は現状のまま何の保証もなく掲載しているものであり、何らかの権利を許諾するものでもありません。

    コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。詳しくは http://www.microsoft.com/japan/communities/msp.mspx をご覧ください。

    2008年10月20日 9:41
  • 中川様

     

    情報ありがとうございます。こちらの環境でリンク先の情報をもとに試したところ、解放されたりされなかったりとよくわからない状態です。そもそもシステムデータベースであるmsdbをDBCC SHRINKFILEコマンドでどうにかするというのは、いかがなものと思っていますが...

     

    2008年10月24日 6:21
  • こんにちは、フォーラムオペレータの田中麻記子です。
     
    yakkenさん、フォーラムのご利用と貴重な情報の投稿をどうもありがとうございます。
    弊社中川俊輔の情報がすっきりと問題を解決、とはいかなかったようで心苦しいのではありますが
    yakkenさんさんから頂いた情報と弊社中川が提供させて頂いた情報を他のユーザーの方々とも共有していただくために私のほうで回答済みチェックをつけさせていただきました。
    もし、yakkenさんがこの件に関してさらに投稿がおありの場合は回答済みチェックを外していただいてもかまいませんのでよろしくお願いします。
     
    それでは、今後も是非フォーラムをご利用ください!

     

    2008年11月14日 7:49