none
BCPインポートで全行が入らない RRS feed

  • 質問

  • 現在SQLSERVER2005EEで環境構築中です。

    BCPを利用しDBの移行を実施していて妙な現象に出会っています。

     

    1.ADBからBCPOUTを実施しテキストファイルに出力

    2.BDBへBCPINを実施してテーブルに格納

     

    といういたって単純な処理を行いました。

    動かし方は各テーブルのBCPコマンドをバッチファイルに記述して

    それを起動させるという方法をとりました。

     

    複数有るテーブルの中で2テーブルのみインポートで1行だけ

    欠落していることがわかり、再度ADBを復元してBCPOUTを

    実施してみましたが、最初にOUTしたものと同じ件数であることは

    確認できました。

    そこで、別のDBにテーブルをクリエイトし同じテキストファイルを

    インポートするとやはり1行欠落してしまいました。

     

    欠落した1行を元のテーブルとJOINして無い行をINSERTすると

    正常に終了します。

     

    BCPを使用してこのような現象が発生する可能性として考えられる

    事象はありますでしょうか?

     

    ちなみにこのテーブルのデータ件数は845397件あり、インポートすると

    845396件になります。

    他のテーブルで4900万件といったインポートは問題なく終了しています。

     

    以上

    よろしくお願いいたします。

    2008年10月28日 12:17

回答

  • > ちなみにこのテーブルのデータ件数は845397件あり、インポートすると
    > 845396件になります。

    考えられる要因は色々ありますが、ADBからのエクスポートに問題があるかBDBへのインポートに問題があるかの切り分けをする必要があると思います。

     

    ADBからのエクスポートですが、欠落するテーブルをエクスポートしたテキストファイルの件数は何件でしょうか?
    (レコード件数が多いので調べるのが大変ですが)
    この件数がADBのテーブルと同じであれば、エクスポートについては問題がないと思われます。
    逆にこの件数が食い違うのであれば、データベースの整合性が壊れている可能性があります。
    テーブルの整合性をチェックするために、DBCC CHECKTABLE、もしくはDBCC CHECKDBで整合性を確認してみてください。

    次に、BDBへインポートする際ですが、何らかのエラーは発生していないでしょうか?

    エラーが発生しているようであれば、そのメッセージを教えてください。

     

     

    2008年10月29日 1:50
  • > ADBからBCPOUTしたときの件数は行数が多いため確認できていません。

     

    テキストファイルの行数ですが、コマンドプロンプトを開いて以下のコマンドを実行する事で行数を表示できます。

    Code Snippet

    FIND /C /V "" < ファイル名

     

    今までの経験でインポートできない場合は、以下のような原因がありました。

     ・どこかのレコードの文字列中に改行コードが含まれている。

     ・文字列で定義された桁数以上の文字列をインポートしようとした。

     ・データベースの定義とテキストファイルの内容が合わない。

    ただし、どの場合でもエラーメッセージは表示されていたので、エラーメッセージが表示されていないというのは気になります。

    (ありえないと思いますが、最後のレコードに改行コードが入ってなくてとりこまれていないとか)

     

    後、ADBとBDBの差分をとる事は出来ませんか?

    例えば、主キーを指定してNOT INで、ADBに存在してBDBに存在しないレコードを表示して、テキストファイルでそのレコードを探してみるとか。

     

    他の方法としてはADBとBDBからエクスポートした結果を、コマンドプロンプトを開いてFCコマンドで比較してみるとか。

    Code Snippet
    FC ADB.TXT BDB.TXT

     

    あと、フォーマットファイルを使ってインポートしているのでしょうか?

    それとも何らかの区切り文字を指定してインポートしているのでしょうか?

     

    どちらにしても、エラーメッセージが出ていないという事で手がかりがありませんので、問題の切り分けも含めて調査してみる必要があると思います。

     

    2008年10月31日 18:12

すべての返信

  • > ちなみにこのテーブルのデータ件数は845397件あり、インポートすると
    > 845396件になります。

    考えられる要因は色々ありますが、ADBからのエクスポートに問題があるかBDBへのインポートに問題があるかの切り分けをする必要があると思います。

     

    ADBからのエクスポートですが、欠落するテーブルをエクスポートしたテキストファイルの件数は何件でしょうか?
    (レコード件数が多いので調べるのが大変ですが)
    この件数がADBのテーブルと同じであれば、エクスポートについては問題がないと思われます。
    逆にこの件数が食い違うのであれば、データベースの整合性が壊れている可能性があります。
    テーブルの整合性をチェックするために、DBCC CHECKTABLE、もしくはDBCC CHECKDBで整合性を確認してみてください。

    次に、BDBへインポートする際ですが、何らかのエラーは発生していないでしょうか?

    エラーが発生しているようであれば、そのメッセージを教えてください。

     

     

    2008年10月29日 1:50
  • CatTail殿

    ありがとうございます。

     

    ADBからBCPOUTしたときの件数は行数が多いため確認できていません。

    そこで別の方法でと考え下記の様な検証を実施してみました。

     

    別のDBを作成しSSISにてエクスポートを実施したところ件数一致(845,397→845,397)

    ADBからBCPOUTしたときのメッセージの件数も一致(845,397)

    BDBへBCPINしたときのログのメッセージでのエラーはなく表示件数は1件少ない(845,396)

     

    でした。

    ご指摘のようにBCPOUTには問題はなさそうです。

    BCPINするときに何かあるのでしょうか???

     

    リトライできる日時が限定されていますので次回いつできるか不明ですが早々に

    やってみようと考えています。

    あわせてDBCCでのチェックも念のために実施してみようと考えています。

     

     

    2008年10月31日 9:24
  • > ADBからBCPOUTしたときの件数は行数が多いため確認できていません。

     

    テキストファイルの行数ですが、コマンドプロンプトを開いて以下のコマンドを実行する事で行数を表示できます。

    Code Snippet

    FIND /C /V "" < ファイル名

     

    今までの経験でインポートできない場合は、以下のような原因がありました。

     ・どこかのレコードの文字列中に改行コードが含まれている。

     ・文字列で定義された桁数以上の文字列をインポートしようとした。

     ・データベースの定義とテキストファイルの内容が合わない。

    ただし、どの場合でもエラーメッセージは表示されていたので、エラーメッセージが表示されていないというのは気になります。

    (ありえないと思いますが、最後のレコードに改行コードが入ってなくてとりこまれていないとか)

     

    後、ADBとBDBの差分をとる事は出来ませんか?

    例えば、主キーを指定してNOT INで、ADBに存在してBDBに存在しないレコードを表示して、テキストファイルでそのレコードを探してみるとか。

     

    他の方法としてはADBとBDBからエクスポートした結果を、コマンドプロンプトを開いてFCコマンドで比較してみるとか。

    Code Snippet
    FC ADB.TXT BDB.TXT

     

    あと、フォーマットファイルを使ってインポートしているのでしょうか?

    それとも何らかの区切り文字を指定してインポートしているのでしょうか?

     

    どちらにしても、エラーメッセージが出ていないという事で手がかりがありませんので、問題の切り分けも含めて調査してみる必要があると思います。

     

    2008年10月31日 18:12
  • こんにちは。中川俊輔 です。

     

    CatTailさん、回答ありがとうございます。

     

    fumyさん、初めまして。フォーラムのご利用ありがとうございます。

    インポートはうまくいきましたでしょうか?

    有用な情報と思われたため、CatTailさんの回答へ回答済みチェックをつけさせていただきました。

    追加の質問等ありましたら、ぜひ投稿してみてください。

     

    今後ともフォーラムをよろしくお願いします。

    それでは!

    2008年11月13日 8:01