web-dev-qa-db-ja.com

SQL Serverxp_delete_fileがファイルを削除しない

7日より古いタイプ「.7z」のファイルを削除するSQLを作成しようとしています。

これが機能していないものです:

DECLARE @DateString CHAR(8)
SET @DateString = CONVERT(CHAR(8), DATEADD(d, -7, GETDATE()), 1)
EXECUTE master.dbo.xp_delete_file 0, 
                  N'e:\Database Backups',N'7z', @DateString, 1

また、末尾の「1」を「0」に変更してみました。

これは「成功」を返しますが、ファイルは削除されません。

SQL Server 2005、Standard、w/SP2を使用しています

13
Chris Burgess

私の知る限り xp_delete_file SQL Server 2005で認識されるファイル(バックアップファイル、トランザクションログなど)のみを削除します。おそらく、次のようなことを試すことができます。

xp_cmdshell'del <ファイル名> '
6
Jorge Ferreira

このspは、ネイティブSQLサーバーのバックアップファイルまたはネイティブメンテナンスレポートファイルのみを削除します(セキュリティ上の目的で)

スミンクが提案したように、あなたは使うことができます

xp_cmdshell 'del <filename>'

フォルダに対する適切な権限が必要です。

3
Eduardo Molteni

この質問を見つけましたが、解決策は私には当てはまりませんでした(.bakファイルであったため、SQL Server自体がメンテナンスプランの一部として作成しました)。

私の場合の問題はセキュリティでした。スクリプトは、SQL Server(MSSQL)を起動するユーザー(私の場合、おそらくほとんどの場合「ネットワークサービス」)が、ファイルを削除しようとしたフォルダーにアクセスできないために実行されていました。

したがって、「ネットワークサービス」を追加し、「変更」を許可すると役立ちました。

1
Holger

拡張ストアドプロシージャxp_deleteの問題を解決しようとしたときに、複数の個人が追求したさまざまなアプローチと解決策を読みました。解決策は次のとおりです。

  1. SSISメンテナンスタスクを設定するときは、拡張子にピリオド(。)を付けないでください。
  2. データベースのバックアップごとに存在する場合は、必ず[第1レベルのサブフォルダーを含める]をクリックしてください。
  3. 上部にあるバックアップファイルをクリックしてください。メンテナンスタスクはファイルタイプをチェックします。データベースのバックアップについては、バックアップファイルのヘッダーをチェックすると思います。

私のシナリオでは、上記のすべてが正しかった。ルーチンxp_deleteにバグがあると言われているコメントは、Web上にはほとんどありません。

バックアップファイルが削除されていないときに、メンテナンス用のSQLを抽出し、SSMSから実行しました。結果のメッセージは、ファイルがSQLサーバーのバックアップファイルではなかったというものでした。バックアップを正常に復元でき、データベースが動作可能になったため、このメッセージは誤っていました。

データベースの検証に使用されたデータベースコマンドは次のとおりです。

RESTORE HEADERONLY FROM DISK = N'<file path\filename>.Bak'
RESTORE VERIFYONLY FROM DISK = N'<file path\filename>.bak'

上記の両方のコマンドは、バックアップファイルが有効であることを示しています。

次に、イベントビューアを開いて、接続マネージャのログインエラーがあったことを示すメッセージを見つけました。テスト接続ボタンで接続を検証したので、これは奇妙でした。エラーは、私が作成したアカウントとは関係ありませんでした。

イベントビューアメッセージ:

*ソースMSSQLSERVERからのイベントID17052の説明が見つかりません。このイベントを発生させるコンポーネントがローカルコンピューターにインストールされていないか、インストールが破損しています。コンポーネントをローカルコンピューターにインストールまたは修復できます。イベントが別のコンピューターで発生した場合は、表示情報をイベントと一緒に保存する必要がありました。

イベントには以下の情報が含まれていました。

重大度:16エラー:18456、OS:18456 [Microsoft] [SQL Server Native Client 11.0] [SQLServer]ユーザー 'domain\servername $'のログインに失敗しました。*

次に、xp_deleteが正しく機能しているマシンにログオンしました。 Active Directoryを確認し、システムアカウントが見つからなかった後、イベントビューアに進んで、同様のメッセージを見つけました。ここで、domain\server $のアカウントがシステムセキュリティにマップされていることが明らかになりました。

次のステップは、xp_deleteが機能したデータベースのセキュリティと機能しなかったデータベースを比較することでした。 xp_deleteが機能しなかったデータベースで、セキュリティの下で2つの欠落したログインがありました。欠落している2つのログインは次のとおりです。NTAUTHORITY\ SYSTEM NT Service\MSSQLSERVER

NT service\MSSQLSERVERを追加した後、xp_deleteは正常に機能しました。

テストへの1つのアプローチは、メンテナンスタスクを使用して個々のファイルを削除することです。

1
user5923365

最初のパラメーターを0から1に変更してみてください。

ここに小さな xp_delete_fileの要約 私が見つけたところです。この手順では運が悪いように聞こえます。

0
Tomalak

通常、データベースを別のサーバーに移動した場合、またはSQLインスタンスが同じサーバーに再インストールされたが、バックアップが古いディレクトリに残っている場合に、このような状況が発生します。例:データベースをserver1からserver2に移動しましたが、定期的なバックアップを実行する保守計画のあるサーバーがあるか、server1にSQLインスタンスを再インストールして、データベースを復元します。

バックアップの場合、msdbに情報として保持されているセットは存在しません。したがって、バックアップセットのあるテーブルから派生した失敗から情報がチェックされないため、作成された古いバックアップはすべて削除されません。

EXECUTE master.sys.xp_delete_file  0, -- FileTypeSelected (0 = FileBackup, 1 = FileReport)

最初の引数は、msdbのテーブルが使用されていることを示しています。

これが誰かを助けることを願っています。

0
Jivomir Yovkov

これは少し古いことは知っていますが、私の欲求不満を皆さんと共有したいと思いました。私はこれらの投稿の多くと同じ問題を抱えていましたが、何も機能していないようでした。次に、データベースにNetLibという暗号化レイヤーがあることを思い出しました。これは、バックアップが暗号化されているため、xp_delete_fileがヘッダーを読み取れないことを意味します。 OSでバッチファイルを使用し、エージェントジョブから呼び出します。これが誰かを助けることを願っています。

0
dwjv