事先说明:这篇教程还在施工中……到目前写完的步骤都是一定程度上实验过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指令。
执行脚本导入数据
在dbgen目录下运行
mysql --local-infile -u root -p < loaddata.sql
记得要加那个 --local-infile。然后喝茶等导入……
如果你觉得它好像死在那里了,可以再开一个终端,登陆MySQL,用show processlist;看看它在干嘛。
测试
按照前面的步骤,如果你不加foreign key和primary key关联的话,导入还是挺快的……
我的本本CPU是i7-2670QM@2.20GHz,虚拟机分配了2个核和2G内存,日立的硬盘分了20G给它(现在一看貌似不够用啊囧),大概7分钟左右就能导入完的样子,用time来计时的结果是:
real 7m44.092s
user 0m0.136s
sys 0m11.029s
real还那边包括了我输密码io的时间。
导入完了之后可以用
SHOW TABLE STATUS FROM tpch;
看看是不是都导入进去了,我测试是都导进去了。