把tbl数据导入mysql_TPC-H数据导入MySQL教程(施工中) - Joyee

事先说明:这篇教程还在施工中……到目前写完的步骤都是一定程度上实验过OK的,虽然没有实验关联primary key和foreign key以及导入全部数据的后果……(因为导入要花太长时间)

获取文件

首先到官网 http://www.tpc.org/tpch/

在右边的 DBGEN & Reference Data Set

下载到下面那个.zip,然后自己选一个路径解压过去

修改 makefile

在解压的文件夹下面cd到dbgen下,找到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

#

改动的地方分别是:

设定C语言编译器为gcc(如果你用的是其他的编译器就改成其他对应名字)

DATABASE设为MYSQL(注意注释里写的提供的数据库格式没有mysql,所以等一下要自己写一个格式,见步骤3)

MACHINE = LINUX 和 WORKLOAD = TPCH 就不用说啥意思了……

改好之后保存为makefile,这样才好用make命令。

修改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;\n"

#define SET_DBASE "use %s;\n"

#endif

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

生成dbgen

接下来make,生成数据生成脚本dbgen,这个过程中会有一些关于数据类型的警告,一般可以无视。

make完dbgen目录下之后就会多出很多.o(等到你所有事都干完确定这些没有用了不想留着就make clean,或者直接整个文件夹删掉……)和一个叫dbgen的文件

生成tbl数据文件

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

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

./dbgen -s 1

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

生成之后可以用head命令检查一下tbl们

修改初始化脚本使mySQL可用

压缩包里自带两个脚本:

dss.ddl:用来建表

dss.ri:关联表中primary key和foreign key。

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

在dss.ddl的开头加上这么几句:

DROP DATABASE IF EXISTS tpch;

CREATE DATABASE tpch;

USE tpch;

翻译成人话就是:

如果tpch数据库已经存在,删除这个数据库;

建一个数据库tpch;

使用数据库tpch;

这个是给mySQL建立数据库连接用的。其中tpch可以改成你喜欢的随便什么名字。

改完之后保存之。

dss.ri的修改先挖个坑……如果你不想关联primary key和foreign key的话就不用管dss.ri了

以下可选,但本教程后面的步骤没有考虑这步

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

用vim打开dss.ddl,执行

:%s/TABLE\(.*\)/TABLE\L\1

就可以了。

如果你要事后改,就进到mySQL里,USE tpch,然后用类似于

alter table CUSTOMER rename to customer;

这样的语句改就行了。嫌一个个打麻烦的话就写脚本吧~

建表

打开mysql,执行

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

后面那部分是dss.ddl的路径,要按照你的实际存放地址修改

然后可以用

mysql> SHOW DATABASES;

看到有一个叫tpch的数据库,就说明建库成功了。(记得打分号,我老是忘记打分号……)

再执行

mysql> USE tpch;

mysql> SHOW TABLES;

可以看到生成的8个表就说明建表成功~ 到这步的时候光有一堆表,里面是没有数据的。

写个导入tbl文件的脚本

你也可以进到mysql然后写一堆类似于

LOAD DATA LOCAL INFILE '/home/joyeecheung/tpch_2_16_1/dbgen/supplier.tbl' INTO TABLE SUPPLIER

FIELDS TERMINATED BY '|' LINES TERMINATED BY '|\n';

的东西,不过实在太龟毛了……所以还是写一个bash脚本自动生成这些语句好了。

不懂bash的人可以看下面,懂的大牛看了这么弱的脚本请别来pia我……

在 dbgen目录下

新建一个load.sh(或者随便什么名字),把这些东西复制进去

#!/bin/bash

write_to_file()

{

file="loaddata.sql"

if [ ! -f "$file" ] ; then

touch "$file"

fi

echo 'USE tpch;\n' >> $file

DIR=`pwd`

for tbl in `ls *.tbl`; do

table=$(echo "${tbl%.*}" | tr '[:lower:]' '[:upper:]')

echo "LOAD DATA LOCAL INFILE '$DIR/$tbl' INTO TABLE $table" >> $file

echo "FIELDS TERMINATED BY '|' LINES TERMINATED BY '|\\\n';\n" >> $file

done

}

write_to_file

以load.sh为名保存到dbgen目录下,然后执行

sh load.sh

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

执行脚本导入数据

注意这一步我没有真正检验过是不是真的OK,因为导入等好久我还在磨蹭给导入过程计时的方案……不过试了几个小的tbl是没问题的

在dbgen目录下运行

mysql --local-infile -u root -p < loaddata.sql

记得要加那个 --local-infile。然后喝茶等导入……

挖坑中……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值