随着数据库应用的蓬勃发展,越来越多的系统都将数据库作为数据永久存储的重要媒介。随着时间的推移,数据库中的数据量越来越大,数据库逐渐成为了应用的性能瓶颈。如何在开发及后期运营阶段对数据库做合理的优化,成为开发人员和DBA重要的工作内容。数据库压力测试工具也就应运而生。我本人选择的是super-smack 1.3作为数据库的压力测试工具。为什么选择它?因为它可以自定义数据库结构,自定义压力测试语句,配置相当的灵活,只要仔细构造配置文件,就能很好的满足各种压力测试需求。
当然,任何工具都有瑕疵,super-smack也不例外。我目前就遇到了问题,数据库中的日期格式,用super-smack的gen-data工具,无法很好的生成出来。由于没有原生支持,只有想替代方案了。有两个替代方案,一种是直接把日期写在gen-data的--format参数里面,如gen-data -n 100 -f %s,2012-01-01,%d。
但是问题也出来了,如果我要跟时间,中间的空格就会导致后面的列都无法生成,也就是说,只能精确到天,不能精确到秒。这显然不是我想要的结果。因此,就考虑第二种方案,那就是自己动手修改gen-data程序的源代码,添加对time格式的支持。
浏览super-smack 1.3的源代码目录,会发现里面有个src目录,进去之后,就发现了gen-data.cc文件。这个,就是gen-data程序的c++源代码了。好了,动手(记得提前备份原始版本啊,出问题了也还有得救)。
1. 在#include
2. 找到usage()函数,在d - integer下面新增一行,添加:t - datetime(use system time zone) \n\
3. 在print_str函数后面,编写print_date函数,源代码如下:
void print_date(int min_rand_days, int max_rand_days)
{
time_t rawtime;
struct tm * timeinfo;
time(&rawtime);
int second_per_day = 24*60*60;
int rand_seconds = second_per_day;
min_rand_days = min_rand_days == 0 ? 1 : min_rand_days;
max_rand_days = max_rand_days == 0 ? 1 : max_rand_days;
if((min_rand_days == max_rand_days))
{
rand_seconds = min_rand_days * second_per_day;
rand_seconds -= rand()%second_per_day;
}
else
{
rand_seconds = (rand()%(max_rand_days - min_rand_days) + min_rand_days)*second_per_day;
rand_seconds = rand_seconds == 0 ? second_per_day : rand_seconds;
rand_seconds = rand()%((rand_seconds - min_rand_days*second_per_day)==0?rand_seconds:(rand_seconds - min_rand_days*second_per_day)) + min_rand_days*second_per_day;
}
rawtime = rawtime + rand_seconds;
timeinfo = localtime(&rawtime);
fprintf(out, "%d-%d-%d %d:%d:%d",timeinfo->tm_year+1900,timeinfo->tm_mon+1,timeinfo->tm_mday,timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec);
}
4. 在print_row函数中,在case 'd'和default之间,添加如下代码:
case 't':
print_date(min_width, width);
parse_state = ST_PLAIN;
break;
到了这一步,对源代码的修改工作就完成了,保存文件。
然后就可以开始编译源代码了。编译指令如下:
cd super-smack-1.3
./configure --prefix=/usr/local/supersmack --with-mysql=/usr/local/mysql
make
这里要注意:
第一行命令,是进入super-smack-1.3所在的目录,需要根据你的实际文件目录来决定,不要完全照搬我的命令啊。
第二行命令,configure里面的prefix是make install用的,你可以不用加,如果你后面打算make install,你就加上。路径根据实际情况修改。 --with-mysql这里,根据你的实际情况,选择是oracle,mysql还是其他数据库,详细参考./configure --help。至于后面的路径,是你的数据库安装路径,根据实际情况修改。
make完成之后,如果一切顺利,你就可以获取到修改后的gen-data程序了,拷贝覆盖你的旧程序,就可以搞定了。
下面贴几个我机器上的运行结果:
[root@localhost src]# gen-data --help
gen-data version 1.1
MySQL AB, by Sasha Pachev
Prints lines random data to stdout in given format
Usage: gen-data [options]
-?, --help - this message
-V, --version - show version
-n, --num-rows=num - number of rows
-f, --format=fmt_str - format string
Format can contain any character + % followed by
a format specifier. Valid format specifiers:
s - string
d - integer
t - datetime
Additionally, you can prefix a format speficier with:
n - generate exactly n characters
m-n - generate between m and n characters
===========================================================
[root@localhost src]# gen-data -n 2 -f %t
2012-8-27 3:13:58
2012-8-27 3:13:58
如果要把数据结果放文件里面去,可以用以下命令:
gen-data -n 2 -f %t > /root/test.dat
赶紧试试吧,如果你需要这样的功能的话。