私の個人的な趣向によりますが、私の部署でもBlogに".Text"を使っています。使い出してからは、特にバックアップはせずに過ぎておりましたが、休暇中に結構コンテンツが溜まってきたので、バックアップをすることにしました。
日々のバックアップは、シンプルに、bcpを使って必要なデータだけをファイルに書き出すように設定。
あわせて、別のSQL Serverにオブジェクトごとバックアップしようと思い、Database Copy Wizardを使ってみることにしました。
まず、シンプルに「デタッチ」->「アタッチ」でのコピーは問題無く成功。では、と思い、次にSMOオプション(SQL管理オブジェクトを使用する方法)を使ってオンラインでコピーができるかどうか試してみました。
コピーウィザードを使うと、SSISのパッケージが作成され、それがSQL Agentのジョブに登録されるわけですが、予想通り失敗....。
よく話題に上がる、「Integration ServicesやVisual Studio上ではSSISパッケージは実行できるけれど、SQL Agent上のジョブでは失敗する」という状況に。SQL Agent上では、プロキシアカウントのコンテキストでジョブが実行されるので、権限設定を行って、再度挑戦。?
で、色々と試してみたのですが、サンプルデータベースのAdventureWorksだと、うまくオンラインでコピーが出来るのに、対象のデータベースだとコピーに失敗してしまうという状況になってしまいました。
しかも、コピー作業の途中までは上手く行っていて、コピー先のデータベースは作成されているものの、オブジェクトの転送が途中で失敗しているという状況でした。ただ、SQL Agentのジョブの履歴には、「プロキシアカウントでのパッケージの実行に失敗しました」とのメッセージしか表示されないので、原因が良く判らず....。
思考錯誤した挙句、プロキシアカウントで直接Integration Servicesにログインし、SSISパッケージを実行してみることに。で、やっとのことでエラーの原因がわかりました。
- コピー先のSQL ServerへのログインはOK。
- コピー先となるデータベースの作成はOK。(この時点ではオブジェクトは転送されていない)
- コピー元のデータベースの参照はOK。 オブジェクトの転送が開始される。
- コピー元のオブジェクトが参照できるので、あとはつつがなくオブジェクト転送が出来ると思ったら....
- パッケージ(ジョブ)を実行しているプロキシアカウントと同じユーザが、すでにコピー元のデータベースにあった場合、CREATE USER 「自分」という状況になって、失敗しているらしい。
- エラー: ERROR; errorCode=-1073548784 description=クエリ “CREATE USER [DOMAIN\sqlagent] FORLOGIN [DOMAIN\sqlagent] WITH DEFAULT_SCHEMA=[xxxx]“の実行が次のエラーで失敗しました: ”ログインは別のユーザ名でアカウントがあります。”。考えられるエラーの理由.....(省略)
そもそもSQL Agent用のプロキシアカウントは、sysadminロールを与えているので、個別のデータベースに明示的にユーザとして登録していなくても、もちろんデータベースにアクセスできます。でも、以前SQL Agentの設定をしたときに、わざわざデータベースにユーザ登録をしていたのでした。成功していたAdventureWorksには、このプロキシアカウントはユーザとして登録はされていなかったので、問題無かったのでしょうか.....。
結局、コピー元のデータベースから、プロキシアカウントのユーザを削除してみました。
その後、再度コピーのパッケージを実行すると、サラリと成功して処理が完了...。Integration Servicesからの実行はOKとなったので、次にSQL Agentのジョブのほうから、プロキシアカウントのコンテキストで実行しても、問題なくコピーが完了となりました。
「SQL AgentとSSISパッケージの実行の辺りは、たぶん自分もハマルだろうなあ.....」とは思っていたのですが、プロキシの動作は問題なく、さらにその先のことで詰まっていた、という結果でした。
SQL Agentのジョブの履歴からは、ここまでは判らなかったので、気が付くのに時間がかかってしまいました。(ただし、この方法が正解なのかどうかも怪しいのですが)
あいかわらずヘナチョコな日々でお恥ずかしい限りです。なかなか難しいですね(^^;