Legacy ASPをレンタルサーバー間で移行する手順とTips

ホーム / Software

更新:11/02/26 | ASPのレンタルサーバー移行 | ASP Moving

レンタルサーバー

7年ほど愛用していたレンタルサーバーのプロバイダーが店じまいをすることになったようです。「1週間後にサービスを終えるので、宜しく」とハガキが届きました。

Legacy ASP + MS-SQL + BASP21

ASP……特にLegacy ASP(ASP.Netではなくて前身のASP)をレンタルサーバー上で動作させている人はもう余りいないかも知れません。
しかも、それをレンタルサーバー間で移行しようという人は更に少ないかも知れません。しかし、私には7年ほど前にゴールデンウィークを潰して作ったASPサーバーアプリケーションや、自作ソフトウェアの領布サービスなどがASPのまま塩漬けになってサービスを続けているのです。

そのため、移行先のレンタルサーバーには次の要件が必須となります。

移行手順

サービス終息のハガキを受け取った当日に移行先のサーバーを決めましたが、そこから何十時間という時間と労力を掛けて5日ほど掛かってやっと移管が出来ました。

色々と問題やコードの改修が必要になったので備忘録としてここに書き残しておきます。

全体的な流れ

  1. 新レンタルサーバー・プロバイダーに申し込み
  2. 旧レンタルサーバー・プロバイダーにDNS移管許可の申し込み
  3. 新プロバイダーにDNS移管開始申し込み
  4. DBスキーマの移行(スキーマに移管後まで変更がないという前提)
  5. コードの修正
  6. 旧プロバイダー上のサービスを休止(DBの更新が新たに発生しないようにメンテナンス中とするなど)
  7. DBデータの吸い出しと移行
  8. 新プロバイダー上での動作確認
  9. 新プロバイダーにDNS切換の申し込み
  10. DNS変更伝搬の確認と動作確認(DNSが安定しないと、アクセスする度にあっちに行ったりこっちに行ったりする)

ポイントは、新プロバイダーにDNS切換の申し込みをするまでに色々とすることがあるということです。

DBスキーマ、データの移行方法

DBは最も重要なデータです。万が一コードが失われても改めてコーディングすれば済みますが(勿論大変なコストですが)、失われたデータは二度と戻りません。千件にも上るユーザーデータを戻しようがないためです。

MS-SQLをホスティングしているサービスでは、myLittleAdminというサードパーティーのソリューションを使っていることが多いようです。このツールは、ユーザーに公開するDBツールをプロバイダー側が指定できますが、必ず存在しているのはSQLクエリアナライザです。

データを投入するには、INSERT文を作れば良さそうです。

データを引き出すには、INSERT文の生成という機能が使えればあまり苦労はありません。時間は掛かりますが、全てのテーブルについてINSERT文を生成し、少し加工すればインポート可能なSQL文を生成できます。

  1. 生成する際にIDENTITYが指定された列があるのであれば、IDENTITY制約をINSERT時に無効化するチェックボックスを入れる。
  2. 冒頭のDBインスタンス指定を除外する。
  3. [dbo].などといったテーブルの前に付いている所有者プリフィクスを割愛する。
  4. 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経由で提供される)

SQL-Server

もしも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ユーザーに書き込み許可を設定することでアップロードが可能になりました。

Set objBasp = Server.CreateObject("Basp21")
bydata = objBasp.BinaryRead(Server.MapPath("folder/") & "\" & str_realfilename)

のようにファイルを保存します。

 
コメント・フィードバック
ダウンロード
ストリーミング関連
Macintosh関連
Windows関連
メディアなど
 
ハードウェア
ソフトウェア/サービス/開発SDK
デジタル一眼レフカメラ
趣味関連
ゲーム 〜楽しいゲームの紹介や攻略法
RoverMNI(ローバーミニ) 
雑記
その他
Copyright (c)1998-2016 CNXGROUP All Rights Reserved.
このページの全部あるいは一部を無断で利用(コピー)することを禁じます。
>