月度归档:2011年06月

mysqlslap 简单压力测试(转)

转自:http://xok.la/2010/01/mysqlslap_test.html

mysqlslap是官方提供的压力测试工具之一,官方介绍如下:

mysqlslap is a diagnostic program designed to emulate client load for a MySQL server and to report
the timing of each stage. It works as if multiple clients are accessing the server. mysqlslap is
available as of MySQL 5.1.4.

下面介绍一些常见参数:

–auto-generate-sql-write-number
每个线程中产生多少个insert
–auto-generate-sql-guid-primary
自动产生guid格式的主键
–number-of-queries=50000
每个连接客户端总共发起的查询次数
–concurrency=10,50,100
并发连接线程数,分别是10、50、100个并发
-i, –iterations
重复执行测试的次数
–number-char-cols=10
创建测试表的 char 型字段数量
–number-int-cols=10
创建测试表的 int 型字段数量

下面是一个完整的例子:

mysqlslap -hlocalhost -uroot –engine=innodb –auto-generate-sql-write-number=100000 \
–auto-generate-sql-guid-primary –concurrency=10,50,100 –number-of-queries=50000 \
–iterations=2 –number-char-cols=10 –number-int-cols=10 –auto-generate-sql \
–create-schema=sbtest –auto-generate-sql-load-type=mixed

具体的慢慢看手册吧,mysqlslap在mysql的目录的bin目录内。   


@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

安装 innotop 遇到的问题

按照如下步骤安装到 DBD::mysql 时,出错,提示找不到 mysql_config
perl -MCPAN -eshell
CPAN> install Time::HiRes
CPAN> install Term::ReadKey
CPAN> install DBI
CPAN> install DBD::mysql
需要到 mysql 网站下载
MySQL-devel-community-5.1.57-1.rhel5.x86_64.rpm
安装,才可以。
我找了半天。

vi替换命令用法详解(转)

转自:http://dolphin-ygj.iteye.com/blog/366314
vi替换命令用法详解
: ranges /pat1/pat2/g
其中
: 这是Vi的命令执行界面。
range 是命令执行范围的指定: 百分号(%)表示所有行
点(.)表示当前行
美元($)表示最末行
例如:
10,20表示第10到20行,
.,$表示当前行到最后一行,.
+2,$-5表示当前行后两行直到全文的倒数第五行
s 表示其后是一个替换命令。
pat1 这是要查找的一个正则表达式
pat2 这是希望把匹配串变成的模式的正则表达式
g 可选标志,带这个标志表示替换将针对行中每个匹配的串进行,否则则只替换行中第一个匹配串。
:/string #向下查找
:?stirng   # 向上查找
1
vi编辑命令责任编辑:黑色联想   更新日期:2006-9-7重复执行命令
数字N+命令     重复执行命令N次,如删除15行,就在命令状态下输入15dd
.              重复执行上一条命令
vi命令使用的一些选项及含义
-c sub-command 在对指定的文件编辑前,先执行指定的命令 sub-command .
-r filename 恢复指定的文件filename .
-R 将指定的文件以只读的方式放入编辑器中,这样不会保存对文件的任何修 改。
-y number 将编辑窗口的大小设为number行。
光标移动
命令模式下,在同一行上移动的子命令:
h   将光标左移一格
l   将光标右移一格
j   将光标下移一格
k   将光标上移一格
w   将光标移到下一个小字的前面
W  将光标移到下一个大字的前面
b   将光标移到前一个小字的前面
B   将光标移到前一个大字的前面
e   将光标移到下一个小字的后面
E   将光标移到前一个大字的后面
fc  把光标移到同一行的下一个c字符处
Fc  把光标移到同一行的前一个c字符处
tc  把光标移到同一行的下一个字符c的前一格
Tc  把光标移到同一行的前一个字符c的后一格
number|把光标移到递number列上
命令模式下在行间移动的子命令:     
+或Enter   把光标移至下一行第一个非空白字符
-   把光标移至上一行第一个非空白字符 
0   把光标移到当前行的第一个字符处
$   把光标移到当前行的最后一个字符处
H   把光标移到屏幕最顶端一行
L   把光标移到屏幕最底端一行
M  把光标移到屏幕中间
:number 光标移动到第number行
:$  光标移动到最后以行
屏幕翻滚类命令
Ctrl+u   向文件首翻半屏
Ctrl+d   向文件尾翻半屏
Ctrl+f   向文件尾翻一屏
Ctrl+b  向文件首翻一屏
nz     将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部
插入文本
I   在光标前
I   在当前行首
a   光标后
A   在当前行尾
o   在当前行之下新开一行
O  在当前行之上新开一行
r   替换当前字符
R   替换当前字符及其后的字符,直至按ESC键
s   从当前光标位置处开始,以输入的文本替代指定数目的字符
S   删除指定数目的行,并以所输入文本代替之
ncw或nCW  修改n个单词
nCC修改指定数目的行
删除
x       删除光标所指的一个字母
X      删除光标左边的一个字母
dd     删除光标所在的一行文字,同时本行文字会放到缓存中
d0     删至行首
d$     删至行尾
D      删除本行光标右边的所有文字,包括光标位置的字母
d$     删除本行光标右边的所有文字,包括光标位置的字母
dw     删除光标右边的一个单词
ndw    删除n个单词
d1G       删除光标所在行以上的所有行
dG     删除光标所在行及光标以下所有行
复制
yy          复制本行文字到缓存中
number yy   复制number行到缓存中
粘贴
p      把缓存中的行粘贴到光标所在的下一行,
P      把缓存中的行粘贴到光标所在的上一行
替换
:s/pattern1/pattern2/g    把光标当前行的pattern1替换为pattern2
:%s/pattern1/pattern2/g   把所有行的pattern1替换为pattern2
:g/parttern1/s//parttern2  把所有行的pattern1替换为pattern2
:num1,num2 s/pattern1/pattern2/g     把num1到num2的partten1替换为partten2
被替换的文字用^表示行首,$表示行尾,如:%s/^/111/g就表示在每一行的行首插入111
文件
:r filename   把文件filename的内容粘贴在光标以下行
:w         保存当前编辑的文件名
:w filename  当filename不存在时,把修改后的文件存为文件filename ,当文件filename
存在时,报错。
!w filename  如果文件filename存在时,把修改后的文件保存为文件filename
:q         退出vi ,若文件被修改,系统不会让用户使用q命令退出
q!         不保存退出
x          保存退出
wq         保存退出
在多个文件之间切换
:n开始编辑vi激活的文件列表中的下一个文件
:n filenames 指定将被编辑的新的文件列表
在当前文件和另外一个文件间切换:
:e filename  使用filename激活vi(在vi中装入另一个文件filename)
e!         重新装入当前文件,若当前文件有改动,则丢弃以前的改动
:e+filename  使用filename激活vi ,并从文件尾部开始编辑
:e+number filename  使用filename激活vi ,并在第number行开始编辑
:e#        开始编辑另外一个文件
查找
/pattern     向后寻找指定的pattern ,若遇到文件尾,则从头再开始。
?pattern   向前寻找指定的pattern ,若遇到文件头,则从尾再开始。
n          在上次指定的方向上,再次执行上次定义的查找。
N         在上次指定的方向的相反方向上,再次执行上次定义的查找。
/pattern/+number    将光标停在包含pattern的行后面第number行上。
/pattern/-number     将光标停在包含pattern的行前面第number行上。
%                移到匹配的”()”或”{}”上。
选项设置
all         列出所有选项设置情况
term        设置终端类型
ignorance   在搜索中忽略大小写
list         显示制表位(Ctrl+I)和行尾标志($)
number    显示行号
report       显示由面向行的命令修改过的数目
terse       显示简短的警告信息
warn        在转到别的文件时若没保存当前文件则显示NO write信息
nomagic     允许在搜索模式中,使用前面不带“\”的特殊字符
nowrapscan 禁止vi在搜索到达文件两端时,又从另一端开始
mesg       允许vi显示其他用户用write写到自己终端上的信息
、在vi中使用的查找替换方法
利用 :s 命令可以实现字符串的替换。具体的用法包括:
:s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串str1
:s/str1/str2/g 用字符串 str2 替换行中所有出现的字符串str1
:.,$ s/str1/str2/g 用字符串 str2 替换正文当前行到末尾所有出现的字符串str1
:1,$ s/str1/str2/g 用字符串 str2 替换正文中所有出现的字符串str1
:g/str1/s//str2/g 功能同上从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索字符串的首次出现进行替换;g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。
2、在shell中使用find结合grep进行文件的替换
# find ./ -exec grep str1 ‘{}’ \; -exec sed -i.bak s/str1/str2/g ‘{}’ \;
上面命令可以在当前目录下(包括子目录)查找包含str1的文件,自动替换成str2,并且生成源文件的bak文件。
 

dbsharding 中可能遇到的问题

准备写一个说不清楚的问题,我表示鸭梨很大。

背景:
    1. 业务分区,多用户,用户间无交叉
    2. 水平切分,一张表存到两个库里去
Bug:
    用户1引用了用户2的数据(这不算什么,后面一句才重要),平时看不出来
问题:
    第一场
    用户1来了,建了一大堆东西。
    用户2来了,关联了用户1的东西,因为都分库到 s1, s2,所以,相安无事。
    第二场
    用户1来了,又建了一大堆东西。
    用户2来了,又想关联用户1的数据。但是,却分库到 s2, s1,注意顺序不一样,然后,没关联到,出错了。
我另外发现了一个问题,我真无聊。

wrapper ibatis parameter 导致的问题

目前项目有个需要,就是在所有查询的参数中,增加一个属性。
自然想到使用 interceptor 将每个 parameter wraper 一下,加上这个属性
我就使用 cglib 生成了一个 wrapper class,然后再 proxy 到原来的 parameter 上。

后来,出了错误,找了好长时间,发现
ibatis sql 中写着 isPrimary,可其实在 java 里是这样的
private boolean isPrimary;
public boolean isPrimary() {
    return isPrimary;
}
其实属性名字是 primary 啊,为什么在 wrapper 之前就不出错呢。
找了一下,ibatis 是通过他自己的 probe 来获得属性值的,这个 probe 不仅会通过方法取值,还会通过 field name 取值,没访问权限的,还会加上权限。
就是 ClassInfo 的下面方法

  private void addFields(Class clazz) {

    Field[] fields = clazz.getDeclaredFields();

    for (int i = 0; i < fields.length; i++) {

      Field field = fields[i];

      if (canAccessPrivateMethods()) {

        try {

          field.setAccessible(true);

        } catch (Exception e) {

          // Ignored. This is only a final precaution, nothing we can do.

        }

      }

      if (field.isAccessible()) {

        if (!setMethods.containsKey(field.getName())) {

          addSetField(field);

        }

        if (!getMethods.containsKey(field.getName())) {

          addGetField(field);

        }

      }

    }

    if (clazz.getSuperclass() != null) {

      addFields(clazz.getSuperclass());

    }

  }

解决办法,将 isPrimary 改成 primary