Legacy ASPをレンタルサーバー間で移行する手順とTips
更新:11/02/26 | ASPのレンタルサーバー移行 | ASP Moving
レンタルサーバー
7年ほど愛用していたレンタルサーバーのプロバイダーが店じまいをすることになったようです。「1週間後にサービスを終えるので、宜しく」とハガキが届きました。
Legacy ASP + MS-SQL + BASP21
ASP……特にLegacy ASP(ASP.Netではなくて前身のASP)をレンタルサーバー上で動作させている人はもう余りいないかも知れません。
しかも、それをレンタルサーバー間で移行しようという人は更に少ないかも知れません。しかし、私には7年ほど前にゴールデンウィークを潰して作ったASPサーバーアプリケーションや、自作ソフトウェアの領布サービスなどがASPのまま塩漬けになってサービスを続けているのです。
そのため、移行先のレンタルサーバーには次の要件が必須となります。
- ASP(ASP.Netではなく)
- MS-SQL(大量のSQL文がMySQLやPostgreSQLで動くかテストするのは大変なので)
- BASP21(これを使ってコーディングをしているため、変えるのが大変)
- DNS管理(.comドメインの移管受け入れ・管理)
- メールサーバー(ASPからのメール送信機能が必須)
- ある程度安価であること。但し、また移行となると面倒なので2〜3千円/月くらいでも良いので株式会社で継続性の見込まれるプロバイダーであること。
移行手順
サービス終息のハガキを受け取った当日に移行先のサーバーを決めましたが、そこから何十時間という時間と労力を掛けて5日ほど掛かってやっと移管が出来ました。
色々と問題やコードの改修が必要になったので備忘録としてここに書き残しておきます。
全体的な流れ
- 新レンタルサーバー・プロバイダーに申し込み
- 旧レンタルサーバー・プロバイダーにDNS移管許可の申し込み
- 新プロバイダーにDNS移管開始申し込み
- DBスキーマの移行(スキーマに移管後まで変更がないという前提)
- コードの修正
- 旧プロバイダー上のサービスを休止(DBの更新が新たに発生しないようにメンテナンス中とするなど)
- DBデータの吸い出しと移行
- 新プロバイダー上での動作確認
- 新プロバイダーにDNS切換の申し込み
- DNS変更伝搬の確認と動作確認(DNSが安定しないと、アクセスする度にあっちに行ったりこっちに行ったりする)
ポイントは、新プロバイダーにDNS切換の申し込みをするまでに色々とすることがあるということです。
DBスキーマ、データの移行方法
DBは最も重要なデータです。万が一コードが失われても改めてコーディングすれば済みますが(勿論大変なコストですが)、失われたデータは二度と戻りません。千件にも上るユーザーデータを戻しようがないためです。
MS-SQLをホスティングしているサービスでは、myLittleAdminというサードパーティーのソリューションを使っていることが多いようです。このツールは、ユーザーに公開するDBツールをプロバイダー側が指定できますが、必ず存在しているのはSQLクエリアナライザです。
データを投入するには、INSERT文を作れば良さそうです。
データを引き出すには、INSERT文の生成という機能が使えればあまり苦労はありません。時間は掛かりますが、全てのテーブルについてINSERT文を生成し、少し加工すればインポート可能なSQL文を生成できます。
- 生成する際にIDENTITYが指定された列があるのであれば、IDENTITY制約をINSERT時に無効化するチェックボックスを入れる。
- 冒頭のDBインスタンス指定を除外する。
- [dbo].などといったテーブルの前に付いている所有者プリフィクスを割愛する。
- nvarcharにする列にはNプリフィクスをつける。
前後しましたが、今回の移行には大きな誤算がありました。それは、移行先のレンタルサーバーが提供するMS-SQLが英語版で日本語をそのままvarchar格納できないという点です。
そのため、今までvarcharで作っていたDBをnvarcharとしてユニコード指定にした上で、ダブルバイトを扱う場合にはシングルクォートの前にNプリフィクスをつけなくてはならないのです。この修正はDBのINSERT文だけでなく、コードの中にあるSQL文にも施す必要があるのです。
コードの修正
MS-SQLサーバーが英語版であるため、ダブルバイトの日本語はnvarchar型の絡むに格納しなくてはならないことは分かりました。
今度は、格納する側のSQL文の修正をしなければなりません。
元々、SQL発行ルーチンを一つに統一して、必ずそこを通るような設計にしてあればシングルクォートの前にN(大文字半角のN)を配してからSQLを発行するように修正するだけで良いのですが、私のコードは文字のエスケープなどは関数化してあるもののSQLの組み立て、発行はハードコードされたものでした。
そのため、全てのSQL文を見直してNを付加して行かなくてはなりませんでした。
このnvarchar型のNですが、実はnvarchar型でない列に追加しても悪影響は与えません。そのため、疑わしい場合や見た目のインデントをそろえたい場合には全ての値の前にNを配置してしまっても問題有りません。(サーバー側の負荷については不明)
負荷する必要があるのは、概ねINSERT, DELETE, UPDATE文。そしてSELECT文中などに頻出しているであろうWHERE句中の文字列です。
UPDATE table_name SET lastname = '田中' WHERE login_name = 'タナカ星人'
のようなSQL文があったとしたら、
UPDATE table_name SET lastname = N'田中' WHERE login_name = N'タナカ星人'
のように修正する必要があります。
このようにハードコードされず、一般的に値は変数になっていると思いますが、この場合も勿論同様です。
データベース接続文字
SQLサーバーが変更となるので接続文字列も変わります。
myLittleAdminを利用している場合には、その画面から接続文字を特定することも可能です。(一般的にはレンタルサーバー・プロバイダーからメールや管理Web経由で提供される)
もしもmyLittleAdminへのログイン方法が分かっていれば、以下の様に記述可能です。また、逆もしかりで接続のための記述方法が分かっていれば、myLittleAdminにログインすることが出来ると言うことになります。
DBDRIVER = "Driver={SQL Server};Server=websql01.■■■.com;Database=db101■■■;Uid=u101■■■_admin;Pwd=●●●●●"
■■■の部分は、上記コネクションに記載がありませんが、ログイン後に左側に表示されるドラム缶の名前そのものとなります。
共有SSLの変更
共有SSLは自前のドメインにhttpsをつけてアクセスを可能にする場合に比べて安価です。通常は無料になっているはずです。ただし、共有と言うだけあってドメイン名はプロバイダーから提供される固有のものになるため、プロバーダーを変更すると必然的にhtmlやASP側のコードを修正しなくてはならなくなります。
ここで、httpsアクセスをしているかどうかを判定する方法などを記しておきます。
Javascriptで、SSLアクセスしているかどうかを判定する方法は
(("https:" == document.location.protocol) ? "https://ssl." : "http://www.")
などとすれば良いはずです。
ASPの中で判断をする方法として、Requestのセキュリティプロパティを確認するという方法が最もスマートだと思われましたが、IE、Firefoxなどアクセスするブラウザによって正しく判定が出来ないことが分かったため、以下の様に苦肉の策を講じました。
url = Request.ServerVariables("ALL_HTTP")
url = IIF(INSTR(url,"https") > 0, "https://共有SSLアドレス//", "http://")
つなりリクエスト全体を見渡してhttps://共有SSLアドレスが見受けられればSSLアクセスだと見なしてしまうということです。
この判定を利用して、SSL、通常アクセスなどをトグルで指定できるようにASPで操作しています。
メール送信機能
ASPにBASP21によるメール送信機能を実装していましたが、サーバーが変更となったためSMTPサーバー、ID、パスワードなどの変更が必要でした。
これらは、単純な置換で基本的には問題ありませんでした。
ファイルアップロード機能
ASPでファイルアップロード機能を実装していましたが、設定や変更が必要となりました。特にアップロードについてはアップロードされたファイルをサーバーのローカルフォルダに保存する必要があるため権限設定の確認が必要となります。
以前利用していたレンタルサーバーでは、管理者に依頼して権限設定を変更してもらう必要がありましたが、新しいレンタルサーバーでは管理Webから変更することでアップロードが出来るようになりました。
ファイルがアップロードされた際に、保存先に指定しているフォルダに対して、書き込み許可を設定する必要があります。
Anonymous Webユーザーに書き込み許可を設定することでアップロードが可能になりました。
bydata = objBasp.BinaryRead(Server.MapPath("folder/") & "\" & str_realfilename)
のようにファイルを保存します。
- お勧めリンク
- ダウンロード
- ストリーミング関連
- Macintosh関連
-
- Macでも使えるDVDドライブ
- Leopard詳解
- iLife詳解
- Macの修復方法特集
- Apple MacBook (Pro)
- Macで無線LAN802.11n
- 新旧MacBookベンチマーク
- フルHD編集Apple iMovie&Final Cut Express
- ROXIO Toast Platinum
- フルHD編集Apple Final Cut X
- MacBookのHDD換装方法
- MacとWindowsのファイル共有
- MacでWindowsを遠隔操作
- WinユーザーのためのMac概論
- 無料の辞書検索ツール 英辞郎
- 代表的なタブブラウザの比較
- Macお勧めのフリーソフト紹介
- 無料のOffice環境 NeoOffice
- エミュレータ比較
- Macで最適バックアップ
- iGeek Indelible
- intego PersonalBackup
- EMC® Retrospect® for Mac
- Mac版 ウイルス対策
- Ruby On Rails インストール(Mac編)
- Ruby On Rails 開発の初歩(Model)
- Ruby On Rails 開発環境RadRails
- Ruby On Rails DBメンテナンス
- Excel, Wordを使ってMacで年賀状宛名印刷
- Windows関連
-
- EaseUS Todo Backupで完璧バックアップ
- DVD, Blu-rayリッピングツール AnyDVD HD
- キャプチャーソフト hunuaaCap
- Windows2003でリモートデスクトップ7を動かす
- 最適なバックアップソフトは
- robocopyによるバックアップ
- リージョンフリー
- リージョンフリー化を有効活用
- マルチブート
- Antivir®
- eTrust Antivirus
- AVG AntiVirus
- C#徹底講座
- メーラー Mailer
- VBA徹底活用術
- JustSystemメーラーShuriken
- FTPソフトとコマンドライン解説
- DOS/Vパーツリンク集
- Oracle10gBronze試験対策
- CDからMP3へ簡単に変換する方法
- メディアなど
- ハードウェア
-
- iPhone 3G
- iPhone 4
- iPod+iTunes
- iPhone SDK
- 色域(AdobeRGB)
- hp mini 1000
- 環境紹介
- KDDI au新旧プラン研究
- DVDをMP4にコンバート
- 無線LAN環境802.11n
- キャプチャボード
- HD-LANによるネットワークストレージ構築
- NEC LavieJ LJ500/5A
- LavieJ HDD換装
- LavieJ 調子の悪いHDDの復旧
- LavieJ 無線LANモジュールの換装
- LavieJ メモリの追加
- LavieJ バックアップ作成と復元
- Intel PRO/Wireless 2200BG
- 液晶・プラズマテレビ比較
- プリンタ(hp PSC2550)
- 万能リモコン クロッサム
- 婦人体温計 プチソフィア
- 婦人体温計 マドンナ
- ソフトウェア/サービス/開発SDK
- デジタル一眼レフカメラ
- テクニカル記事
- 趣味関連
- ゲーム 〜楽しいゲームの紹介や攻略法
- RoverMNI(ローバーミニ)
- 雑記
- その他
-
- ネットバンキングに便利な金融機関
- 便利なサイト翻訳機能
- 便利ツール GMail
- 無料電話Gizmoの嘘とほんと
- リンク:一般ページへのリンク集
- 相互リンク:相互リンク募集中!
- 本ページの統計:本サイトの統計データ公開
- コメント・フィードバック