日記帳
本ページはプロモーションが含まれています
カテゴリー
Links
blog(ブログ)マスター
アンドロイドの巣
ゼロから始めるベランダ菜園
タイトル
ラジコン
2024年5月
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

Firebird upgrade 2.1 to 2.5

カテゴリー: General
2011-03-07 00:09
Firebird upgrade 2.1 to 2.5


執筆:2011/03/02
編集:2011/03/05


【まとめ】
  • SQL-2003対応になった
  • UTF8とShift_JIS間でコンバートが発生すると
    コンバートエラーを起こしやすい( Ⅱ など)
  • Malformed stringと表示され、リストアなどができない
    全角が使えないわけではない。
    コードページの再確認:SJIS,CP943C,UTF8
    Firebird Language Reference Update
      Firebird-2.1-LangRef-Update.pdf
        New character sets
  • CHARACTER SET のチェックが厳しくなった。
    いままで適当なことをしているとgbakなどで返り討ちされる。
    DEFAULT CHARACTER SET NONE;
【考察】
 移行には、ある程度アプリケーションの修正が必要になると思います。
新しい構文を使いたい場合やUTF8アプリケーションの場合は、移行すると便利と思います。
Shift_JISでデータをやりとりしている場合は、移行する必要性が感じられません。手間など不利益のほうが大きいでしょう。
 どうしても移行したく、エラーで変換できない場合は、テーブルをSQLダンプできるツールを使用するか、新規にデータベースを作成して、テーブルをコ ピーするといいだろう。
 構造が複雑な場合以外は問題ないと思いますが、
Firebird Roadmapには、2.5は、当面バグふぃっすに重点をおくと書いてあるので
急ぐ必要がない場合は、ある程度バグができってしまってから2.5に乗り換えた方がいいように思います。



【試してみた手順】
(0)Firebird停止、DBをバックアップ。
(1)通常版2.5をインストール。
(2)管理ツールでユーザーを追加する。
   互換性でガタガタいわれるのも面倒なので
   ユーザーが少ないため新規で追加で済ませた。
   gsec -user sysdba -password masterkey
   add ユーザー -pw 'パスワード'
(3)接続テスト
   特に問題はなかった。
(4)Firebird_v2.5.0.ReleaseNotes.pdf
   Chapter 12: International Language Support (INTL)
   Chapter 15: Compatibility Issues
   Effects of Unicode Metadata
   misc\upgrade\metadata\metadata_charset.txt
   に書いてあった。
   チェックしたが問題なし。
isql -u sysdba -p masterkey データベース名
SQL> input 'pathto/misc/upgrade/metadata/metadata_charset_create.sql';
select * from rdb$check_metadata;

   特に変更は必要なさそう。

(5)バックアップとリストアテスト
   結果:失敗:リストアでデータ破壊が起こった

gbak: ERROR:Malformed string
gbak:Invalid metadata detected. Use -FIX_FSS_METADATA option.
gbak:Exiting before completion due to errors

-FIX_FSS_METADATA と -FIX_FSS_DATA オプションを試してみる
データは、NONEでShift-JISが入っています
Shift_JIS
SJIS
gbak: ERROR:bad parameters on attach or create database
gbak: ERROR: CHARACTER SET Shift_JIS is not defined
Shift_JIS , SJISは定義されていないようだ。
UTF8 データはShift_JISだが、 UTF8で試してみる。
gbak: ERROR:arithmetic exception, numeric overflow, or string truncation
gbak: ERROR:    Cannot transliterate character between character sets
gbak:Exiting before completion due to errors
当然の結果だろう
SJIS_0208 fbintl.confを開くと載っている SJIS_0208 で試してみる。
gbak: ERROR:Column has been unexpectedly deleted
gbak: ERROR:gds_$send failed
gbak:Exiting before completion due to errors
CP943C Firebird-2.1-LangRef-Update.pdfに 載っている。
Japanese CP943C を試してみる
gbak: ERROR:Column has been unexpectedly deleted
gbak: ERROR:gds_$send failed
gbak:Exiting before completion due to errors
結果:全滅

試しに古いバージョンでバックアップして、2.5でリストアしても状況は同じだった。
リストアできないんじゃ困る...。

どうなっているのだろう?
もー ギタギタにこわしたろうか!って感じだけど
実体のない無敵のFirebirdには、攻撃ができない。

データベース自体は、接続表示できるので、破損でもなさそう。

doc/README.incompatibilities.txt を読んでもさっぱり。

isqlは、SET NAMESしても内容に変化がないようだ。バグか?
それとも古いバージョンのデータは無視するのだろうか。

Mysqlの場合は、4.0から5.0にアップグレード時は、テキストダンプを一括文字コード変換ですんだのだが・・・。
Mysqlのように内部でUTF8で保存して、出し入れ時に変換しているのだろうか。
だととすると、新しいファイルにデータを完全に移し替える方が確実だと思う。
接続する際には、文字コードを指定しないといけなくなるし、導入するにはそれなりの労力が必要になりそうだ。

結局、gbakでアップグレードできないので
新規にデータベースを作成して、
2つのデータベースファイルを同時に開いて、
テーブルをコピーすることで、アップグレードに成功した。
アップグレード時以外に行わない操作なので、これでよしとしよう。

移行するには、
ver2.1とver2.5をポートを変えてインストールして、完全に新しくデータをコピー展開した方が速そうだ。
アプリケーション側の変更もかなり必要になってくる。
今回は、データベースがNONEだったこともあって、ver2.5だけでコピー バージョンアップできました。

今日のキーワード:
-FIX_FSS_METADATA CP943C -FIX_FSS_DATA CP943C
-FIX_FSS_METADATA SJIS -FIX_FSS_DATA SJIS
-FIX_FSS_METADATA SJIS -FIX_FSS_DATA NONE
isql -ch CP943C
SQL>SET NAMES CP943C
ALTER CHARACTER SET CP943C SET DEFAULT COLLATION CP943C
isql -u sysdba -p masterkey -ch CP943C
CREATE DATABASE "test-new-fb2_5.FDB"
DEFAULT CHARACTER SET CP943C
;
select "RDB$GENERATOR_NAME" from "RDB$GENERATORS" where RDB$SYSTEM_FLAG =0;
GEN_ID( <GeneratorName>, 0 );

【今回の乗り換えに成功した方法】
gbakでデータ部分でエラーが起きて置換ができなかったので、
Firebirdサーバーを2つ用意して、2つのデータベース間でテーブルの内容をコピーしました。
  1. Firebirdサーバーを2つ用意します。(今回は、2.5サーバー 1つしか使っていません。)
    2.1 必用に応じて、ポート(firebird.conf : RemoteServicePort)を変えるか
    VirtualPCなど利用します。
    ※VirtualPCなど別のマシンに入れる場合は、そのままでいけると思います。

    一時的な利用なら
    Firebird_v2.1.2.ReleaseNotes.pdf の Installing on Windows(Simplified setup)
    の fbserver.exe -a を利用すると便利です。
    2.5
    通常版をインストールします

  2. Firebird2.5のisqlで、新規データベースを作成し、テーブルなどの構造をあらかじめ作成しておきます
    gbakでメタデータだけで移行してもいいかもしれないです(やってないのでわかりません)。

  3. 接続します
    2.1のデータ
    NONE
    user_name=sysdba
    password=masterkey
    2.5で新しく作るデータ
    Shift-JIS
    user_name=sysdba
    password=masterkey
    lc_ctype=CP943C
    古い方は、正常に表示される方法で接続します。
  4. 新しいバージョンにコピーします。
      try
        FIBDatabase1.GetTableNames(tables, False);
        FIBDatabase1.DefaultTransaction.StartTransaction;
        try
          for i:= 0 to tables.Count-1 do
           begin
             CopyTable(tables.Strings[i]);
           end;

          FIBDatabase1.DefaultTransaction.Commit;
          Result := True;
        except
          Writeln('変更を戻します');
          FIBDatabase1.DefaultTransaction.Rollback;
        end;
    IBDatabase1.GetTableNames(tables, False);でテーブル名を取得して、
    TIBTable;でひたすらループしながらコピーするだけです。

    GENERATOR や TRIGGERがある場合は、注意が必要です。
  5. その他必用な設定を修正します(GENERATOR や システムテーブルなど)
  6. comitして終了

移行後は、gbakでのバックアップとリストアは正常に動作しました。

【 その他の方法】
×
FBExport
http://fbexport.sourceforge.net/
1個ずつしかテーブルをダンプできない。
面倒以前に、
WARNING: Datatype not supported!
改造するより、他を探した方がよさそうだ。




 Firebird upgrade 2.1 to 2.5(その2) へ 続く・・・



トラックバック
トラックバックはありません。
PR

[PR]