600万人のユーザーデータをMYSQL、MSSQL、Oracleデータベースにインポートする方法



 
1.MySqlデータベースのインポート
参考文献:http://zhuaxia.org/blog/post/145
1.1.LOAD DATA INFILE構文
得られたデータベースファイルはテキストファイルwww.csdnであるからである.net.sql、そのためmysqlの中のLOAD DATA INFILEコマンドを使う必要があります.LOAD DATA INFILEの文法構造は以下の通りです.


View Code
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'

    [REPLACE | IGNORE]

    INTO TABLE tbl_name

    [CHARACTER SET charset_name]

    [{FIELDS | COLUMNS}

        [TERMINATED BY 'string']

        [[OPTIONALLY] ENCLOSED BY 'char']

        [ESCAPED BY 'char']

    ]

    [LINES

        [STARTING BY 'string']

        [TERMINATED BY 'string']

    ]

    [IGNORE number LINES]

    [(col_name_or_user_var,...)]

    [SET col_name = expr,...]


1.2.データを格納するテーブルの作成
テキスト構造を観察すると、各行は次のように構成されています.
username # password # email

中間は「#」で分割します.したがって、作成したテーブルには必ずusername、password、emailフィールドが含まれていますが、テーブルにプライマリ・キー列を追加し、自動的に成長させる必要があります.これにより、データを追加するときに手動でプライマリ・キー列を追加する必要はありません.したがって、テーブル構造は次のとおりです.


View Code
CREATE TABLE `csdnuser` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `username` varchar(255) DEFAULT NULL,

  `password` varchar(255) DEFAULT NULL,

  `email` varchar(255) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;


注意:MySQLではMyISAMエンジンとInnoDBエンジンの違いがありますが、このブログのテーマではありませんので、省略します.
1.3.データのインポート
テーブルの作成後、load data infileコマンドでデータをインポートできます.具体的なインポートコマンドは次のとおりです.
load data local infile 'd:\\www.csdn.net.sql' into table csdnuser2 fields terminated by ' # ' (username,password,email);

およそ1分ほど運転するとインポートが完了し、インポートが完了すると次のように表示されます.
Query OK, 6428632 rows affected, 2030 warnings (54.47 sec)

Records: 6428632  Deleted: 0  Skipped: 0  Warnings: 295

注意:
インストールMySQL 5.1デフォルトのデータベース・ファイルの保存先は、C:Documents and SettingsAll UsersApplication DataMySQLです.たとえば、私たちのcsdndbはパスC:Documents and SettingsAll UsersApplication DataMySQLMySQL Server 5.1datacsdndbにあります.システムを頻繁に復元する場合は、cディスクに置くのは安全ではありません.インストール時にインストールパスを変更することができます.次の図に示します.
600万用户数据导入MYSQL、MSSQL、Oracle数据库方法
2.Sql Serverデータベースのインポート
参考文献:http://qiaolevip.iteye.com/blog/1324649
2.1.BULK INSERT構文
Sql Serverでは、BULK INSERTコマンドを使用してデータをインポートします.このコマンドは、ユーザーが指定した形式でデータベース・テーブルまたはビューにデータ・ファイルをインポートします.BULK INSERT構文は次のとおりです.


View Code
BULK INSERT 

   [ database_name . [ schema_name ] . | schema_name . ] [ table_name | view_name ] 

      FROM 'data_file' 

     [ WITH 

    ( 

   [ [ , ] BATCHSIZE = batch_size ] 

   [ [ , ] CHECK_CONSTRAINTS ] 

   [ [ , ] CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ] 

   [ [ , ] DATAFILETYPE = 

      { 'char' | 'native'| 'widechar' | 'widenative' } ] 

   [ [ , ] FIELDTERMINATOR = 'field_terminator' ] 

   [ [ , ] FIRSTROW = first_row ] 

   [ [ , ] FIRE_TRIGGERS ] 

   [ [ , ] FORMATFILE = 'format_file_path' ] 

   [ [ , ] KEEPIDENTITY ] 

   [ [ , ] KEEPNULLS ] 

   [ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ] 

   [ [ , ] LASTROW = last_row ] 

   [ [ , ] MAXERRORS = max_errors ] 

   [ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ] 

   [ [ , ] ROWS_PER_BATCH = rows_per_batch ] 

   [ [ , ] ROWTERMINATOR = 'row_terminator' ] 

   [ [ , ] TABLOCK ] 

   [ [ , ] ERRORFILE = 'file_name' ] 

    )] 


2.2. データベーステーブルの作成


View Code
if exists(select * from sysobjects where name = 'csdn1')

    drop table csdn1

create table csdn1(

    --id int identity(1,1) primary key,

    username varchar(50) not null,

    [password] varchar(50) not null,

    email varchar(50) not null

)


2.3.bulk insertを使用してデータをインポートする


View Code
bulk insert csdn1

from 'D:\www.csdn.net.sql'

with(

    --FORMATFILE = 'C:\BCPFORMAT.xml',

    --FirstRow --default 1

    --KEEPIDENTITY,

    fieldterminator = ' # ',

    rowterminator = '
' )


(6428632行が影響を受ける)、所要時間:00:02:00
ここでfieldterminator='#'、列区切り記号を表し、rowterminator='、行区切り記号を表します.
2.4.プライマリ・キー列の追加
参照:http://topic.csdn.net/u/20090913/15/fa2e7e65-73d8-4b64-b6e0-bd583f564d86.html?95717
上記の操作では、データベースにデータをインポートするが、データベーステーブルcsnd 1にプライマリ・キー列がないことがわかり、テーブルにwww.csdnを追加する.net.sqlファイルにないプライマリ・キー列以降、データベースのインポートはどのように行いますか?複数回のテストでは、元のbulk insertコマンドではインポートできませんが、bulkのようなコマンドでインポートできます.
まず、プライマリ・キーid付きcsdnuserテーブルを作成します.


View Code
--  csdnuser 

if exists(select * from sysobjects where name = 'csdnuser')

    drop table csdnuser

create table csdnuser(

    id int identity(1,1) primary key,

    username varchar(50) not null,

    [password] varchar(50) not null,

    email varchar(50) not null

)


次に、次のコマンドを使用してインポートします.


View Code
--    

INSERT INTO csdnuser([username],[password],[email]) 

SELECT * FROM OPENROWSET(

    BULK 'D:/www.csdn.net.sql',

    FORMATFILE='d:/BCPFORMAT.xml'

) AS T;


(6,428,632行が影響を受ける)、所要時間:00:01:25
3.Oracleデータベースのインポート
3.1.ターゲット・テーブルは3列のみ
参照:http://www.cnblogs.com/nocode/archive/2011/12/26/2302343.html
まずデータベース・テーブルを作成し、scottユーザーの下でcsdnテーブルを作成します.


View Code
CREATE TABLE "SCOTT"."CSDN"

  (

    "USERNAME"    VARCHAR2(256 BYTE),

    "PASSWORD"   VARCHAR2(256 BYTE),

    "EMAIL" VARCHAR2(256 BYTE)

  )


制御ファイルD:www.csdnを作成する.net.sql


View Code
UNRECOVERABLE

LOAD DATA INFILE 'D:\www.csdn.net.sql' 

INSERT into table CSDN 

fields terminated by '#'

(

    USERNAME,

    PASSWORD,

    EMAIL

)


cmdコマンドラインを開き、sqlldrコマンドを使用してインポートします.インポートコマンドは次のとおりです.
C:\Users\xuwei>sqlldr userid=scott/tiger@orcl control=D:/ora_csdn.ctrl DIRECT=TRUE log=resulthis.out

出力されたログファイルはresulthisです.out、彼はC:Usersxuweiディレクトリの下にいます.上記のsqlldrはこのディレクトリの下で実行されているからです.resulthis.outの内容は以下の通りです.


View Code
SQL*Loader: Release 11.1.0.6.0 - Production on     6  11 15:17:07 2012



Copyright (c) 1982, 2007, Oracle.  All rights reserved.



    :      D:/ora_csdn.ctrl

    :      D:\www.csdn.net.sql

      :    D:/www.csdn.net.bad

      :        

 

(       )



     : ALL

     : 0

     : 50

  :        

    :         





    UNRECOVERABLE;         。



  CSDN,          

        INSERT   



                                                  

------------------------------ ---------- ----- ---- ---- ---------------------

USERNAME                            FIRST     *   #       CHARACTER            

PASSWORD                             NEXT     *   #       CHARACTER            

EMAIL                                NEXT     *   #       CHARACTER            





  CSDN:

  6428632       。

        , 0       。

       WHEN     , 0       。

            , 0       。



                。

       :    5000

       :  256000

           : 1048576



         :          0

         :       6428632

         :          0

         :        0

  SQL*Loader             :     1370

  SQL*Loader              :        0



      6   11 15:17:07 2012     

      6   11 15:17:22 2012      



     : 00: 00: 15.08

CPU    : 00: 00: 05.52

上記のログから、インポートにかかる時間は29.86秒であることがわかります.
3.2データテーブルにプライマリ・キー列を追加し、自動的に増加
参照先:
(1) Mysql,SqlServer,Oracleプライマリ・キーの自動増加の設定
(2) sqlldrでsequenceを使用する
最初はプライマリ・キーのsequenceを作成し、トリガでプライマリ・キーを挿入することを考慮しましたが、エラーが発生していました.その後、制御ファイルでsequenceを使用してプライマリ・キーを挿入して操作を完了します.
データベース表の作成:CSDNUSER


View Code
CREATE TABLE "SCOTT"."CSDNUSER"

  (

    "ID" int primary key not null,

    "USERNAME"    VARCHAR2(256),

    "PASSWORD"   VARCHAR2(256),

    "EMAIL" VARCHAR2(256)

  )

_______________________________________________
PS:2012-6-11
インデックスのレベルBLEVELが必要な場合は、次のクエリ文で求めることができます.
select index_name, blevel, num_rows from user_indexes where table_name = 'CSDNUSER'; 

ただし、検索結果は0です.その後、上記のテーブルに問題が発生したため、primary keyに名前が付けられていないこと、primary keyの名前が指定されていない場合、システムはデフォルトでSYS_などの名前を設定します.C 0036842などのキー名.そこで、上記のプライマリ・キーを削除してから、プライマリ・キーを追加します.


View Code
--    

alter table csdnuser drop constraint SYS_C0038642;

--    

alter table csdnuser add constraint pk_csdnuser primary key(ID);

もちろん、テーブルを作成するときにプライマリ・キー名を直接作成することもできます.


View Code
CREATE TABLE "CSDNUSER"

  (

    "ID"      INT ,

    "USERNAME" VARCHAR2(256),

    "PASSWORD" VARCHAR2(256),

    "EMAIL"    VARCHAR2(256),

    CONSTRAINT "PK_CSDNUSER" PRIMARY KEY ("ID") 

)

プライマリ・キーを作成するときに、プライマリ・キーも一定のディスク領域を占めているため、時間がかかることがわかりました.
————————————————————————————
制御ファイルの作成:ora_csdn2.ctrl


View Code
load data

infile 'D:\www.csdn2.net.sql'

Append into table CSDNUSER2

fields terminated by ' # '

trailing nullcols

(    ID sequence(max,1),

    USERNAME,

    PASSWORD,

    EMAIL

)

cmdでsqlldrコマンドを実行する
C:\Users\xuwei>sqlldr userid=scott/tiger@orcl control=D:/ora_csdn2.ctrl direct=true  log=resulthis.out

resulthis.outの内容は以下の通りです.


View Code
SQL*Loader: Release 11.1.0.6.0 - Production on     6  11 15:30:00 2012



Copyright (c) 1982, 2007, Oracle.  All rights reserved.



    :      D:/ora_csdn2.ctrl

    :      D:\www.csdn.net.sql

      :    D:/www.csdn.net.bad

      :        

 

(       )



     : ALL

     : 0

     : 50

  :        

    :         





    UNRECOVERABLE;         。



  CSDNUSER,          

        INSERT   

TRAILING NULLCOLS     



                                                  

------------------------------ ---------- ----- ---- ---- ---------------------

ID                                                        SEQUENCE (MAX, 1)

USERNAME                            FIRST     *           CHARACTER            

          :  ' # '

PASSWORD                             NEXT     *           CHARACTER            

          :  ' # '

EMAIL                                NEXT     *           CHARACTER            

          :  ' # '



  CSDNUSER         :

   SCOTT.SYS_C0038642      ,    6428632     



  CSDNUSER:

  6428632       。

        , 0       。

       WHEN     , 0       。

            , 0       。



                。

       :    5000

       :  256000

           : 1048576



         :          0

         :       6428632

         :          0

         :        0

  SQL*Loader             :     1370

  SQL*Loader              :        2



      6   11 15:30:00 2012     

      6   11 15:31:02 2012      



     : 00: 01: 02.45

CPU    : 00: 00: 15.32

3.3データテーブルに年齢列を追加する(2012-6-13)
上記のデータを用いてデータ分析を行うと、内容が単調すぎることがわかります.次に、元のデータに年齢age列を追加します.元の「username#password#email」のデータソースファイルを「username#password#email#age」のファイルにします.ageはjavaコードでファイルに書き込まれた[18,99]区間のランダム数です.乱数の生成は、前のブログ:JAva指定範囲の乱数を生成を参照できます.
Javaプログラムでwww.csdn.net.sqlソースファイルageの列を追加し、新しいファイルwww.csdn 22を生成する.net.sql


View Code
package edu.sjtu.erplab.io;



import java.io.BufferedReader;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.FileReader;

import java.io.IOException;

import java.util.Random;



public class FileAddCol {

    public static void main(String[] args) {

        File file = new File("D:\\www.csdn22.net.sql");//

        try {

            FileOutputStream fos = new FileOutputStream(file);//     

            BufferedReader br = new BufferedReader(new FileReader("D:\\www.csdn.net.sql"));

            String temp = null;//

            StringBuffer sb = new StringBuffer();//         StringBuffer

    

            /**

             *      

             */

            int max=99;

            int min=18;

            Random random = new Random();

            while ((temp = br.readLine()) != null) //      ,      。

            {

                //     ,    :java.lang.OutOfMemoryError: Java heap space

                if(sb.length()>1000000)

                {

                    fos.write(sb.toString().getBytes());

                    sb.delete(0, sb.length()-1);

                }

                int s = random.nextInt(max)%(max-min+1) + min;

                temp =temp+" # "+s;

                sb.append(temp + "\r
"); } fos.write(sb.toString().getBytes()); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

データベース・テーブルの作成:csdnuser 3


View Code
  CREATE TABLE "SCOTT"."CSDNUSER3"

  (

    "ID"       INT,

    "USERNAME" VARCHAR2(256),

    "PASSWORD" VARCHAR2(256),

    "EMAIL"    VARCHAR2(256),

    "AGE" INT,

    CONSTRAINT "PK_CSDNUSER3_ID" PRIMARY KEY ("ID") 

  )

制御ファイルora_の作成csdn3.ctrl


View Code
UNRECOVERABLE

load data

infile 'D:\www.csdn22.net.sql'

insert into table CSDNUSER3

fields terminated by ' # '

trailing nullcols

(    ID sequence(max,1),

    USERNAME,

    PASSWORD,

    EMAIL,

    AGE

)

cmdコマンドラインを開き、sqlldrコマンドを使用してインポートします.インポートコマンドは次のとおりです.
C:\Users\xuwei>sqlldr userid=scott/tiger@orcl control=D:/ora_csdn3.ctrl DIRECT=TRUE log=resulthis.out

出力されたログファイルはresulthisです.out、彼はC:Usersxuweiディレクトリの下にいます.上記のsqlldrはこのディレクトリの下で実行されているからです.resulthis.outの内容は以下の通りです.


View Code
SQL*Loader: Release 11.1.0.6.0 - Production on     6  13 12:18:21 2012



Copyright (c) 1982, 2007, Oracle.  All rights reserved.



    :      D:/ora_csdn3.ctrl

    :      D:\www.csdn22.net.sql

      :    D:/www.csdn22.net.bad

      :        

 

(       )



     : ALL

     : 0

     : 50

  :        

    :         





    UNRECOVERABLE;         。



  CSDNUSER3,          

        INSERT   

TRAILING NULLCOLS     



                                                  

------------------------------ ---------- ----- ---- ---- ---------------------

ID                                                        SEQUENCE (MAX, 1)

USERNAME                            FIRST     *           CHARACTER            

          :  ' # '

PASSWORD                             NEXT     *           CHARACTER            

          :  ' # '

EMAIL                                NEXT     *           CHARACTER            

          :  ' # '

AGE                                  NEXT     *           CHARACTER            

          :  ' # '



  CSDNUSER3         :

   SCOTT.PK_CSDNUSER3_ID      ,    6428632     



  CSDNUSER3:

  6428632       。

        , 0WHEN     , 0       。

            , 0       。



                。

       :    5000

       :  256000

           : 1048576



         :          0

         :       6428632

         :          0

         :        0

  SQL*Loader             :     1523

  SQL*Loader              :     1202



      6   13 12:18:21 2012     

      6   13 12:18:59 2012      



     : 00: 00: 38.00

CPU    : 00: 00: 15.88

上記のログから、インポートに38.00秒かかることがわかります.
SQL*Loaderのパフォーマンスの向上:
  • 単純で無視しやすい問題は、インポートされたテーブルにインデックスおよび/または制約(プライマリ・キー)が使用されていないことです.これを行うと、ROWS=パラメータを使用する場合でも、データベースインポートのパフォーマンスが大幅に低下します.
  • は、DIRECT=TRUEを追加して、データのインポート性能を向上させることができる.もちろん、多くの場合、このパラメータは使用できません.
  • UNRECOVERABLEオプションを指定すると、データベースのログを閉じることができます.このオプションはdirectとのみ使用できます.
  • では、複数のインポート・タスクを同時に実行できます.

  • 一般的なインポートとdirectインポートの違い:
    通常のインポートでは、INSERT文を使用してデータをインポートできます.Directインポートでは、データベースの関連ロジック(DIRECT=TRUE)をスキップし、データファイルに直接データをインポートできます.たとえばdirectインポートでは、プライマリ・キーの一意性は検出されません.
    SQLLDRの使い方
    用法:SQLLDR keyword=value[,keyword=value,...]有効なキーワード:


    View Code
    userid -- ORACLE username/password
    
    control -- Control file name
    
    log -- Log file name
    
    bad -- Bad file name
    
    data -- Data file name
    
    discard -- Discard file name
    
    discardmax -- Number of discards to allow        (    )
    
    skip -- Number of logical records to skip  (  0)
    
    load -- Number of logical records to load  (    )
    
    errors -- Number of errors to allow          (  50)
    
    rows -- Number of rows in conventional path bind array or between direct path data saves(  :      64,       )
    
    bindsize -- Size of conventional path bind array in bytes(  256000)
    
    silent -- Suppress messages during run (header,feedback,errors,discards,partitions)
    
    direct -- use direct path                    (  FALSE)
    
    parfile -- parameter file: name of file that contains parameter specifications
    
    parallel -- do parallel load                   (  FALSE)
    
    file -- File to allocate extents from
    
    skip_unusable_indexes -- disallow/allow unusable indexes or index partitions(  FALSE)
    
    skip_index_maintenance -- do not maintain indexes, mark affected indexes as unusable(  FALSE)
    
    readsize -- Size of Read buffer                (  1048576)
    
    external_table -- use external table for load; NOT_USED, GENERATE_ONLY, EXECUTE(  NOT_USED)
    
    columnarrayrows -- Number of rows for direct path column array(  5000)
    
    streamsize -- Size of direct path stream buffer in bytes(  256000)
    
    multithreading -- use multithreading in direct path
    
    resumable -- enable or disable resumable for current session(  FALSE)
    
    resumable_name -- text string to help identify resumable statement
    
    resumable_timeout -- wait time (in seconds) for RESUMABLE(  7200)
    
    date_cache -- size (in entries) of date conversion cache(  1000)

    インポートされた4つのタイプ
  • insert--デフォルトでは、データ・マウントの開始時に必要なテーブルは空の
  • です.
  • append--表に新記録
  • を追加
  • replace--古いレコード(delete from table文)を削除し、新しくマウントされたレコード
  • に置き換えます.
  • truncate--古いレコード(truncate table文で)を削除し、新しくマウントされたレコード
  • に置き換えます.
    TRAILING NULLCOLS--テーブルのフィールドに対応する値がない場合は空にします.