web-dev-qa-db-ja.com

ディストリビューションエージェントは一時ファイルの作成に失敗しました

私は4つのデータベース間のトランザクションレプリケーションをテストしています。1つはマシン(仮想)に2つ、もう1つ(仮想)に2つです。私の仮想マシンはどれもアンチウイルスを実行していません。

3kbのblobを挿入した場合にかなりのサイズ(この場合は65mb)のblobを挿入しようとしない限り、問題なく動作します。

次のエラーが発生しました。「ディストリビューションエージェントは 'C:\ Program Files\Microsoft SQL Server\100\COM'ディレクトリに一時ファイルを作成できませんでした。システムはエラーコード5を返しました。」.

この問題は文書化されています こちら 。そして、そのフォルダーの設定をすでに読み取り専用ではないように変更しました(フォルダーを右クリックして[プロパティ]をクリックし、[プロパティ]を読み取り専用属性を変更しました)。これがそれを行うためのアクセス許可を付与する正しい方法であるかどうかはわかりません。

私がアンチウイルスを実行していないと言ったのは、アンチウイルスがフォルダを検査している間、それをブロックする可能性があるため、これもこの問題の原因の1つであると読んだためです。

また、OLEDBストリーミングの配信プロファイルを変更しようとしましたが、これも機能しませんでした。

この問題を解決するために他に何ができますか?

6
RagnaRock

エラー5はNTFSアクセス許可の問題です。実行中のディストリビューターのSQLエージェントサービスはどのアカウントですか?

6
mrdenny

このエラーは、SQL ServerサービスがC:\Program Files\Microsoft SQL Server\100\COMに書き込めなかったために発生しました。

サービスアカウントをLocal Systemに変更すると、この問題は解決しますが、SQL Serverに不要な権限を与えすぎるため、ユーザーアカウント(ローカルまたはドメイン)を使用して実行するようにサービスを設定し、このアカウントをSQLServerMSSQLUserグループ、およびこのグループにこのフォルダーに対するWRITE権限を付与します(フォルダーのプロパティで「読み取り専用」をオフにすることと同じではありません)。

開発/テスト環境でLocal Systemを使用しても問題はありませんが、本番サーバーではより安全なオプションを検討してください。

4
MauricioRPP

このクエリを使用して、配布するジョブを見つけます

SELECT a.publication, j.name
  FROM distribution.dbo.MSdistribution_agents a
       JOIN msdb.dbo.sysjobs j ON a.job_id = j.job_id

ジョブが実行される資格情報を確認し、そのユーザーアカウントのディレクトリへのアクセス許可を付与します。ほとんどの場合、配布用に作成されたユーザーアカウントによって実行されます。

0
user824910