- PR -

BCP によるデータのインポートについて

1
投稿者投稿内容
YUKKY
会議室デビュー日: 2005/01/20
投稿数: 2
投稿日時: 2005-01-20 19:47
■現象・質問
SYBASE DB にあるテーブルからBCPコマンドで データを抽出し
同構造をもつテーブルにBCPでインポートしようとすると、
下記のエラーメッセージがでてしまう件について。原因・解決策を教えてください。

■エラーメッセージ
このデータベースで、ノンログ形式のバルク・コピーを実行することはできません。
DBOをチェックしてください。
CTLIB Message: - L0/O0/S0/N0/0/0:
blk_init(): blk layer: CT library error: Failed when CT_Lib routine ct_results() called.blk_init failed.

■状況説明
(1)本番用と開発用の2台のDBサーバがあり、データの統一性を持たせるため
   エクスポートとインポートを実施して、同じ環境にしたい。
(2)最新のデータが本番にはあるので、本番用からBCPによりエクスポートを実施。
   全テーブルに対してエラーメッセージはなく、正常にエクスポートが出来た。
(3)(2)のデータを開発用にデータをインポートしようとすると
   数10テーブルあるうち唯一、1つのテーブルのみBCPによるデータインポートが
   出来なかった。(エラーメッセージは上記記載)
(4)テーブル設計には同じスキーマ(SQL文)を使用している。
   またGUI上でテーブルの構造(TYPE・LENGTH・NULLなど)は確認済み。
   テーブルに相違はない。
(5)インポートしたデータの行数(row)は数千に及ぶため、
   1つのrowだけ抽出・保存したものを使用しても、同じエラーメッセージ。
(6)既に本番に入っているデータをエクスポート。
   加工せずそのままインポートしているけどもNG。
(7)他のテーブルでは上記のエラーはない。
(8)(6)のデータをinsert into〜value文で作り、ISQL上で実行すると
   問題なくデータはインサートされる(データ件数も問題なし)

問題となっているテーブルの構造は
Columnが 5個、全てNOT NULL。
Primary Keyは設定無し。Index(Unique含む)も設定無し。
→他テーブルでもPrimaryKeyは設定無し。ただし、Index(Unique含む)は貼っていて
唯一このテーブルのみ indexがない。(←関係あるかどうか・・・)


インポート・エクスポートは
コマンドプロンプト上※で
BCP テーブル名 in/out -Uユーザー名 -Pパスワード -Sサーバ名 -J文字コード -c
で実施。(テキスト形式・タブ区切り)

※エラーメッセージ表示のため、一部Tera Term SSHターミナルで実行しました。
 コマンドプロンプト上だと文字化けしてしまうので。

長文で失礼致しました。
過去に上記問題でぶつかった方、原因・解決策を知っている方、
ご教授願います。
fyaga
会議室デビュー日: 2005/01/21
投稿数: 1
投稿日時: 2005-01-21 12:03
SybaseASEのBCPには、高速BCPモード、低速BCPモードが用意されています。
その違いはデータの更新に対してログを取るか否かの違いです。
BCP in しようとするテーブルにindexやトリガが設定されていると、ASEは
低速BCPを選択します。一方ご質問の状況であるテーブルにindexがない場合、
ASEは高速BCPを選択しようとします。

しかしながらログを取らないということはdump transactionによるバック
アップができなくなるため、ASEはデフォルトでは高速BCPを選択できない設定
になっています。具体的にはデータベースオプションである「select into/bulkcopy/pllsort」がデフォルトでoffとなっています。

従いましてご質問の状況に際しては以下のコマンドでデータベースオプションを
設定の上高速BCPモードでロードすれば解決します。

use master
go
sp_dboption userdb, "select into/bulkcopy/pllsort", true
go

上記に書いたように、ログをとらない為、この設定を行った後はバック
アップの際に注意が必要です。具体的にはloadが完了した後、上記オプ
ションをもとにもどす(trueのかわりにfalse)か、常に
dump databaseコマンドを使ってフルバックアップを取る、そして
dump transaction with truncate_onlyを使用してログfullを回避
するようにしてください。いずれの際も、高速BCPの後はフルバック
アップを取るタイミングである事にもご注意ください。

以上です。
YUKKY
会議室デビュー日: 2005/01/20
投稿数: 2
投稿日時: 2005-01-21 19:00
fyaga様

お世話になります。
丁寧な解説本当に有り難うございました。

頂戴した内容で試したところ、悩んでいた問題も解決しまして
当方、ほっとひと安心をしている所です。
SybaseASE BCPのモードに違いがあることも初めて知りまして
今回は本当に勉強になりました。
(とても分かりやすく明記して頂いたおかげで理解も深まりました)

教えて頂いた理由から私も出来る限りですが調べた中で、
Sybase Java Central Edition というGUI ツールにも
データベースプロパティの中に「SELECT INTO/バルク・コピーを許可」
というチェックできるオプション項目があることも見つけました。

色々勉強させて頂きました。

ご親切にまた迅速に対応して頂き有り難うございます。
取り急ぎ、お礼まで。
1

スキルアップ/キャリアアップ(JOB@IT)