質問

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を使用しています

役に立ちましたか?

解決

同様の問題があり、さまざまな答えが見つかりました。ここに私が見つけたものがあります。

xp_delete_fileでは7zファイルを削除できません。これは、文書化されていない拡張ストアドプロシージャであり、SQL 2000から引き継がれています。削除するファイルの最初の行をチェックして、SQLバックアップファイルまたはSQLレポートファイルであることを確認します。ファイル拡張子に基づいてチェックしません。私がその用途を集めているのは、古いバックアップをクリーンアップしてレポートを計画するためのメンテナンス計画です。

これは、7日より古いバックアップファイルを削除するためのTomalakのリンクに基づくサンプルです。人をつまずかせるのは、「sys」スキーマ、フォルダーパスの末尾のスラッシュ、検索するファイル拡張子にドットがないことです。 SQL Serverを実行するユーザーには、フォルダーに対する削除権限も必要です。

DECLARE @DeleteDate datetime
SET @DeleteDate = DateAdd(day, -7, GetDate())

EXECUTE master.sys.xp_delete_file
0, -- FileTypeSelected (0 = FileBackup, 1 = FileReport)
N'D:\SQLbackups\', -- folder path (trailing slash)
N'bak', -- file extension which needs to be deleted (no dot)
@DeleteDate, -- date prior which to delete
1 -- subfolder flag (1 = include files in first subfolder level, 0 = not)

xp_delete_fileはSP2では壊れており、レポートファイルでは機能しません。 [ http://support.microsoft.com/kb/938085]。 SP3ではテストしていません。

文書化されていないため、xp_delete_fileはSQL Serverの将来のバージョンでなくなるか、変更される可能性があります。多くのサイトでは、代わりに削除を行うシェルスクリプトを推奨しています。

他のヒント

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

xp_cmdshell 'del <filename>'

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

Sminkが使用を提案したように

xp_cmdshell 'del <filename>'

フォルダに対する適切な権限。

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

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

したがって、「ネットワークサービス」を追加します。そして、「変更」を許可します;助けた。

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

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

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

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

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

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

上記のコマンドの両方で、バックアップファイルが有効であることが示されました。

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

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

  

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

次の情報がイベントに含まれていました:

  

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

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

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

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

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

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

小さな xp_delete_file 見つけました。この手順ではうまくいかないように思えます。

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

通常、データベースを別のサーバーに移動した場合、または同じインスタンスにSQLインスタンスを再インストールしたが、バックアップが古いディレクトリに残っている場合、このような状況になります。 例えば: データベースをserver1からserver2に移動しますが、定期的なバックアップを実行するメンテナンスプランを持つサーバーがあるか、server1にSQLインスタンスを再インストールして、 データベースを復元します。

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top