• TPC-H数据导入Mysql数据方案


    本文主要参考了以下几篇博文,以下内容主要来源于这些博文,并在此基础上做了相应的归纳整理。感谢他们!

    鉴于原博客github打不开,所以相关源码看不到,我当时也费了很多劲,本文将需要修改的代码以文本的形式展示出来,供大家参考。

    我的操作系统为 -------centos7

    参考文章:http://www.cnblogs.com/joyeecheung/p/3599698.html                    https://testerhome.com/topics/14409

                        https://blog.csdn.net/qq_33560172/article/details/78453812?utm_source=copy

    好啦请看正文:

    0:TPC-H简介:

           TPC-H是TPC提供的一个benchmark,用来模拟一个现实中的商业应用,可以生成一堆虚构的数据,且自带一些查询,可以导入到各种数据库中来模拟现实需求,检查性能。

    1:获取TPC-H文件

          首先进入官网 http://www.tpc.org/tpch/ ,在最左下边栏目里找到Downloads,点击进入,然后找到TPC-H那一栏对应的source code(是一个zip格式的文件),点击下载到本地,随便放个好找的地方就OK啦啦啦啦啦。

    2:准备MySql数据库

        由于是使用mysql数据库,所以需要安装mysql数据库。怎么安装就下去自己准备吧。

    3:修改makefile文件

         首先将咱们在第1步中下载的zip文件解压出来。在解压的文件夹下面cd到dbgen目录下,找到makefile.suite文件。

    ~/tpch_2_16_1$ cd dbgen
    ~/tpch_2_16_1/dbgen$ vi makefile.suite
    

         然后修改把103~112行左右这个样子

    CC      = gcc
    # Current values for DATABASE are: INFORMIX, DB2, TDAT (Teradata)
    #                                  SQLSERVER, SYBASE, ORACLE, VECTORWISE
    # Current values for MACHINE are:  ATT, DOS, HP, IBM, ICL, MVS, 
    #                                  SGI, SUN, U2200, VMS, LINUX, WIN32 
    # Current values for WORKLOAD are:  TPCH
    DATABASE = MYSQL
    MACHINE  = LINUX
    WORKLOAD = TPCH
    #
    

      
    注意:请确保你的系统上已有gcc编译器!!!若不确定是否有,请输入以下代码测试或安装

    yum install gcc
    

    改动的地方分别是:

    • 设定C语言编译器为gcc(如果你用的是其他的编译器就改成其他对应名字)
    • DATABASE设为MYSQL(注意注释里写的提供的数据库格式没有mysql,所以等一下要自己写一个格式,见步骤3)
    • MACHINE = LINUX 和 WORKLOAD = TPCH 就不用说啥意思了……

    改好之后保存,将makefile.suite的文件后缀去掉,保存为makefile,这样后面使用make命令时,才能正确应用。代码如下:

    mv makefile.suite makefile
    

     

    4:修改tpcd.h

    // 其实这一步好像没什么用 = =

    // 不过你上面把DATABASE设成了MYSQL的话就不要跳过这一步,不然编译不了。

    // 或者上面那步也可以设成SQLSERVER这步就不用管了

    //之前说了官方的生成程序没有mysql的格式,所以我们要自己写一个

    打开tpcd.h,在开头找一个空白的地方写上下面的宏定义

    #ifdef MYSQL
    #define GEN_QUERY_PLAN  ""
    #define START_TRAN      "START TRANSACTION"
    #define END_TRAN        "COMMIT"
    #define SET_OUTPUT      ""
    #define SET_ROWCOUNT    "limit %d;
    "
    #define SET_DBASE       "use %s;
    "
    #endif
    

     这样就定义了一个MYSQL的脚本格式可以用了。

    5:生成dbgen

    直接输入make命令,之后会在dbgen文件夹里面看到有许多.o格式的文件和一个dbgen文件被输出。

    ~/tpch_2_16_1/dbgen$ make
    

     6:生成.tbl数据文件

    接下来要用dbgen生成数据,一共会生成8个表(.tbl)。

    查看README里面有命令行参数解说,这里我们在dbgen目录下用

     ./dbgen -s 1
    

     其中1表示生成1G数据。如果你想生成10G。直接将1改为10就OK啦啦啦啦啦啦啦。

    ps:(如果你之前曾经尝试过生成数据,最好先make clean,再重新make,接着到这步加上-f覆盖掉)。

    如:

    ./dbgen -s -f 1
    

     

    7:修改初始化脚本使mySQL可用

    压缩包里自带两个脚本:

    • dss.ddl:用来建表
    • dss.ri   :关联表中primary key和foreign key。

    不过这些脚本不能直接在mySQL里用(看README就知道人家根本没考虑过mySQL……),要修改。

    7.1--->修改dss.ddl

    dss.ddl的开头需要加上一些给MySQL建立数据库连接用的指令。在最前面加上如下代码:

    DROP DATABASE tpch;
    CREATE DATABASE tpch;
    USE tpch;
    

     鉴于tpch自带的测试用的表名是小写的,而dss.ddl里面的表名是大写的,我们最好也改成小写,方法如下:

     用vim打开dss.ddl

    vi dss.ddl
    

     在普通模式下输入如下命令并执行:

    :%s/TABLE(.*)/TABLEL1
    

    7.2--->修改dss.ri(用vim打开dss.ri,然后全部复制、替换掉初始版本就能用)

    注意:若上述八个表的名字为小写字母,则下面的表名全部改为小写。如:tpch.REGION ---->tpch.region

    -- Sccsid:     @(#)dss.ri	2.1.8.1
    -- tpch Benchmark Version 8.0
    
    USE tpch;
    
    -- ALTER TABLE tpch.REGION DROP PRIMARY KEY;
    -- ALTER TABLE tpch.NATION DROP PRIMARY KEY;
    -- ALTER TABLE tpch.PART DROP PRIMARY KEY;
    -- ALTER TABLE tpch.SUPPLIER DROP PRIMARY KEY;
    -- ALTER TABLE tpch.PARTSUPP DROP PRIMARY KEY;
    -- ALTER TABLE tpch.ORDERS DROP PRIMARY KEY;
    -- ALTER TABLE tpch.LINEITEM DROP PRIMARY KEY;
    -- ALTER TABLE tpch.CUSTOMER DROP PRIMARY KEY;
    
    
    -- For table REGION
    ALTER TABLE tpch.REGION
    ADD PRIMARY KEY (R_REGIONKEY);
    
    -- For table NATION
    ALTER TABLE tpch.NATION
    ADD PRIMARY KEY (N_NATIONKEY);
    
    ALTER TABLE tpch.NATION
    ADD FOREIGN KEY NATION_FK1 (N_REGIONKEY) references 
    tpch.REGION(R_REGIONKEY);
    
    COMMIT WORK;
    
    -- For table PART
    ALTER TABLE tpch.PART
    ADD PRIMARY KEY (P_PARTKEY);
    
    COMMIT WORK;
    
    -- For table SUPPLIER
    ALTER TABLE tpch.SUPPLIER
    ADD PRIMARY KEY (S_SUPPKEY);
    
    ALTER TABLE tpch.SUPPLIER
    ADD FOREIGN KEY SUPPLIER_FK1 (S_NATIONKEY) references 
    tpch.NATION(N_NATIONKEY);
    
    COMMIT WORK;
    
    -- For table PARTSUPP
    ALTER TABLE tpch.PARTSUPP
    ADD PRIMARY KEY (PS_PARTKEY,PS_SUPPKEY);
    
    COMMIT WORK;
    
    -- For table CUSTOMER
    ALTER TABLE tpch.CUSTOMER
    ADD PRIMARY KEY (C_CUSTKEY);
    
    ALTER TABLE tpch.CUSTOMER
    ADD FOREIGN KEY CUSTOMER_FK1 (C_NATIONKEY) references 
    tpch.NATION(N_NATIONKEY);
    
    COMMIT WORK;
    
    -- For table LINEITEM
    ALTER TABLE tpch.LINEITEM
    ADD PRIMARY KEY (L_ORDERKEY,L_LINENUMBER);
    
    COMMIT WORK;
    
    -- For table ORDERS
    ALTER TABLE tpch.ORDERS
    ADD PRIMARY KEY (O_ORDERKEY);
    
    COMMIT WORK;
    
    -- For table PARTSUPP
    ALTER TABLE tpch.PARTSUPP
    ADD FOREIGN KEY PARTSUPP_FK1 (PS_SUPPKEY) references 
    tpch.SUPPLIER(S_SUPPKEY);
    
    COMMIT WORK;
    
    ALTER TABLE tpch.PARTSUPP
    ADD FOREIGN KEY PARTSUPP_FK2 (PS_PARTKEY) references 
    tpch.PART(P_PARTKEY);
    
    COMMIT WORK;
    
    -- For table ORDERS
    ALTER TABLE tpch.ORDERS
    ADD FOREIGN KEY ORDERS_FK1 (O_CUSTKEY) references 
    tpch.CUSTOMER(C_CUSTKEY);
    
    COMMIT WORK;
    
    -- For table LINEITEM
    ALTER TABLE tpch.LINEITEM
    ADD FOREIGN KEY LINEITEM_FK1 (L_ORDERKEY) references 
    tpch.ORDERS(O_ORDERKEY);
    
    COMMIT WORK;
    
    ALTER TABLE tpch.LINEITEM
    ADD FOREIGN KEY LINEITEM_FK2 (L_PARTKEY,L_SUPPKEY) references 
            tpch.PARTSUPP(PS_PARTKEY,PS_SUPPKEY);
    
    COMMIT WORK;
    
    ALTER TABLE CUSTOMER rename to customer;
    ALTER TABLE LINEITEM rename to lineitem;
    ALTER TABLE NATION rename to nation;
    ALTER TABLE ORDERS rename to orders;
    ALTER TABLE PART rename to part;
    ALTER TABLE PARTSUPP rename to partsupp;
    ALTER TABLE REGION rename to region;
    ALTER TABLE SUPPLIER rename to supplier;
    

    下一步执行如下 命令,添加外键等约束条件

    mysql> . 路径/dss.ri
    

     8:建tpch数据库及表

    启动mysql,键入如下命令:

    mysql> . ~/tpch_2_16_1/dbgen/dss.ddl
    

    代码中的 “/tpch_2_16_1” 应被替换为你电脑上,dss.ddl文件的实际位置。

    接下来我们使用如下语句查询是否创建成功,一般都没啥问题的。

    SHOW DATABASES;
    

    可以看到多了一个tpch名字的数据库,这就是第七步里,我们在dss.ddl开头添加的代码起作用了。

    到此我们得到了数据库以及8个空表。接下来开始导入数据。

    9:导入数据

    低配版:

    通过mysql语句,导入数据。比较麻烦,适合我这种渣渣使用:

    LOAD DATA LOCAL INFILE '/root/tpc-h/dbgen/customer.tbl' INTO TABLE customer FIELDS TERMINATED BY '|'  LINES TERMINATED BY '|
    ';
    LOAD DATA LOCAL INFILE '/root/tpc-h/dbgen/orders.tbl'   INTO TABLE orders   FIELDS TERMINATED BY '|'  LINES TERMINATED BY '|
    ';
    LOAD DATA LOCAL INFILE '/root/tpc-h/dbgen/lineitem.tbl' INTO TABLE lineitem FIELDS TERMINATED BY '|'  LINES TERMINATED BY '|
    ';
    LOAD DATA LOCAL INFILE '/root/tpc-h/dbgen/nation.tbl'   INTO TABLE nation   FIELDS TERMINATED BY '|'  LINES TERMINATED BY '|
    ';
    LOAD DATA LOCAL INFILE '/root/tpc-h/dbgen/partsupp.tbl' INTO TABLE partsupp FIELDS TERMINATED BY '|'  LINES TERMINATED BY '|
    ';
    LOAD DATA LOCAL INFILE '/root/tpc-h/dbgen/part.tbl'     INTO TABLE part     FIELDS TERMINATED BY '|'   LINES TERMINATED BY '|
    ';
    LOAD DATA LOCAL INFILE '/root/tpc-h/dbgen/region.tbl'   INTO TABLE region   FIELDS TERMINATED BY '|'  LINES TERMINATED BY '|
    ';
    LOAD DATA LOCAL INFILE '/root/tpc-h/dbgen/supplier.tbl' INTO TABLE supplier FIELDS TERMINATED BY '|'  LINES TERMINATED BY '|
    ';
    

    高配版:

    8个表就需要输入执行8条命令,这里joyee写了一个脚本,可以方便的生成sql命令,脚本如下。

    在dbgen目录下创建一个load.sh脚本文件:

    vi load.sh
     

    将以下代码输入并保存

    #!/bin/bash
    
    write_to_file()
    {
        file="loaddata.sql"
    
        if [ ! -f "$file" ] ; then
            touch "$file"
        fi
    
        echo 'USE tpch;' >> $file
        echo 'SET FOREIGN_KEY_CHECKS=0;' >> $file
    
        DIR=`pwd`
        for tbl in `ls *.tbl`; do
            table=$(echo "${tbl%.*}")
            echo "LOAD DATA LOCAL INFILE '$DIR/$tbl' INTO TABLE $table" >> $file
            echo "FIELDS TERMINATED BY '|' LINES TERMINATED BY '|
    ';" >> $file
        done
        echo 'SET FOREIGN_KEY_CHECKS=1;' >> $file
     }
    
    write_to_file
    

    开始执行:

    sh  load.sh
    

    同目录下就会生成一个loaddata.sql,里面是从8个tbl里导入数据的sql指令。

    在dbgen目录下运行

    mysql -u root -p < loaddata.sql即可。

    (这里如果运行有问题看看试试joyee说的加上 –local-infile。mysql --local-infile -u root -p < loaddata.sql)

    然后就等等等等等等等.........................................

     

     完毕~以上。

    感谢各位大佬的文章。

    你好啊
  • 相关阅读:
    服务器重启
    aliyun修复漏洞之后,重启php-fpm命令
    数据结构和算法绪论(一)
    微信小程序+微信公众号开发总结
    数字校园项目-学生失联预警系统(三)----数据库设计
    数字校园项目-学生失联预警系统(二)-----项目部署
    数字校园项目-学生失联预警系统(一)
    gdut极路由破解教程
    项目:JavaWeb聊天室(问题汇总)
    项目:点餐系统(问题汇总)
  • 原文地址:https://www.cnblogs.com/zyz2085/p/9762878.html
Copyright © 2020-2023  润新知