Ext JS に関しては,新しい記事は Sunvisor Lab. ExtJS 別館 にあります。そちらもよろしくお願いいたします。
SQL Server 2005のデータベースコピーウィザードを使う
SQL Server 2005のデータベースコピーウィザードは,旧サーバから新サーバへデータを移行するときにとても便利そうだったので,これを使って稼働中のSQL Server 2000から,データベースをコピーしてみたが,最初はどうにもこうにもうまく動かなかった。そのときの記録。
各DBサーバへの接続
エラーログの出力先をテキストファイルにしてじっくり見てみると,
Windows認証でログインする方法でやっていると,それぞれのデータ ベースにうまくログインできていないようだった。ログインしているユーザ名ではなくコンピュータ名でSQL Serverに接続しようとしているみたいだ。そりゃ繋がらないよと思う。SQLのサービスがローカルシステムアカウントだからこうなるのかな?よくわか らない。どうしたら良いのかわからないので,Windows認証ではなくSQLServer認証に切り替えてsaで接続するようにしてみた。(両方とも混 在モードを使っているので)
転送方法の選択
転送方法の選択の画面では,「デタッチ後にアタッチする方法を使用する」というのと「SQL管理オブジェクトの方法を使用する」というのがある。動作中のDBからコピーするので,「SQL管理オブジェクトの方法を使用する」を使ってやってみる。
この方法だと,うまくコピーできるDBとエラーが出るDBがある。ビューが含まれないDBだと成功するみたいだが,ビューがあるとうまくいかないこ とが多い,あるDBのエラーログを見ていると,どうもビューの依存関係を解析し切れていないような感じがする。サンプルDBのNorthWindでは ビューがあるのに成功した。ビューを修正してなんとか依存関係エラーをクリアできるかもしれないが,現状はなにがどうなったときに依存関係を把握できなく なるのかが不明。(今後の調査でわかったことがあれば追記する)
実際にすべてのデータをコピーするときには稼働したままということは考えていないので,サービスを止めても大丈夫なDBを「デタッチ後にアタッチす る方法を使用する」方式でもコピーしてみる。この方法で成功すれば,DBを止めてもよい時間帯にすべてのDBをコピーすればよい。
ファイル共有の設定
この方法はコピー元でDBをデタッチした後に,DBのファイル自体をWindowsファイル共有でコピー先にコピーしてアタッチするという方法であ る。だからDBのデータファイルがどこにあるかをUNCで指定しなければならない。作業中はドメインの管理者権限があるアカウントで入っていたので,最初 は,C$などの管理共有から開いていって格納先を指定した。指定はできるのだが,実行時にエラーで終了した。ログを見るとアクセス権がないというエラーが 記録されていた。そこでデータが格納されているフォルダに新たに共有を作った。アクセス許可はEveryoneフルアクセスにした。するとコピーが成功し た。初めての成功である。とはいえEveryoneのフルアクセスの共有というのも,短期間とはいえなんなのでちゃんとしたアクセス権を設定したい。前に SQLへの接続も,コンピュータ名で接続しようとしていたのを思いだし,ひょっとしてここもコンピュータ名で接続しているのかもと思い,Everyone を外してから,コピー先のサーバ名に対してアクセス権を与えてみた。それでもコピーは成功した。
ログインとユーザー
あとでわかったことだが,コピーウィザードでコピーした場合,データベースでのユーザーとSQL Server認証のログインがちゃんとリンクされないようだ。データベースのユーザー自体ははちゃんとコピーされる。しかしそれがSQL Server認証のログインとリンクされない。Windows認証に関してはちゃんとリンクされる。dboのログインがsaの場合でもリンクされない。リ ンクされないとどうなるかというと,ログインが割り当てられていないユーザーとなってしまう。アプリケーションがSQL Server認証で動作するものの場合は,サーバーと接続できない状態になる。なのでコピーウィザードでコピーが終了したら,これらのユーザーとログイン をリンクさせてやる必要がある。
USE [database] <----- データベースを指定 EXECUTE sp_changedbowner 'sa' <----- dboのログインをsaにする EXECUTE sp_change_users_login 'Update_One','db_login','db_login' <----- ユーザーとログインをリンク
dboのログインを指定するには,sp_changedbownerを使う。ユーザーとログインをリンクさせるには sp_change_users_loginを使う。複数のデータベースを一括してコピーする場合は,元のデータベースを見てユーザーとログインを関連づ けるスクリプトを書いておくとよいだろう。
まとめ
他にも成功する方法はいくつもあるだろうが,環境が許せばとりあえず次のようにすればデータベースのコピーは成功する。コピーウィザードが成功しなくて困っている人は試してもらいたい。
- 転送元,転送先のDBへの接続はSQLServer認証でsaでログインするように指定する。
- データのコピーは「デタッチ後にアタッチする方法を使用する」を使う。
- 転送元のデータファイルのフォルダに共有を設定し,転送先サーバのコンピュータ名アカウントに対して許可を与える。