Firebird upgrade 2.1 to 2.5
カテゴリー: General
2011-03-07
Firebird upgrade 2.1 to 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
に書いてあった。
チェックしたが問題なし。
特に変更は必要なさそう。
(5)バックアップとリストアテスト
結果:失敗:リストアでデータ破壊が起こった。
試しに古いバージョンでバックアップして、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だけでコピー バージョンアップできました。
今日のキーワード:
【今回の乗り換えに成功した方法】
gbakでデータ部分でエラーが起きて置換ができなかったので、
Firebirdサーバーを2つ用意して、2つのデータベース間でテーブルの内容をコピーしました。
移行後は、gbakでのバックアップとリストアは正常に動作しました。
【 その他の方法】
Firebird upgrade 2.1 to 2.5(その2) へ 続く・・・
執筆:2011/03/02
編集:2011/03/05
編集: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に乗り換えた方がいいように思います。
新しい構文を使いたい場合や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;
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
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が入っています
データは、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つのデータベース間でテーブルの内容をコピーしました。
- 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 通常版をインストールします - Firebird2.5のisqlで、新規データベースを作成し、テーブルなどの構造をあらかじめ作成しておきます
gbakでメタデータだけで移行してもいいかもしれないです(やってないのでわかりません)。
- 接続します
2.1のデータ NONE user_name=sysdba
password=masterkey2.5で新しく作るデータ Shift-JIS user_name=sysdba
password=masterkey
lc_ctype=CP943C - 新しいバージョンにコピーします。
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がある場合は、注意が必要です。 - その他必用な設定を修正します(GENERATOR や システムテーブルなど)
- comitして終了
移行後は、gbakでのバックアップとリストアは正常に動作しました。
【 その他の方法】
× |
FBExport |
http://fbexport.sourceforge.net/ 1個ずつしかテーブルをダンプできない。 面倒以前に、 WARNING: Datatype not supported! 改造するより、他を探した方がよさそうだ。 |
Firebird upgrade 2.1 to 2.5(その2) へ 続く・・・