2011年1月28日星期五

安装sql-bench 所需模块

安装DBI
开始想是采用 cpan方式安装,但是一直提示找不到源,利用o conf init重新配置cpan 源后,还是失败,决。定还是采用源代码安装。参照源代码中的README 如下步骤:
[bash]
BUILDING

perl Makefile.PL
make
make test
make test TEST_VERBOSE=1 (if any of the t/* tests fail)
make install (if the tests look okay)
[/bash]

试过很多次,但每次都是以出现如下错误而失败而告之:
[text]
30 tests and 225 subtests skipped.
Failed 56/178 test scripts, 68.54% okay. 1428/5109 subtests failed, 72.05% okay.
make: *** [test_dynamic] Error 255
[/text]

再看README,里面提到
[text]
2. The output of perl -V

3. If you get a core dump, try to include a stack trace from it.
(Try installing the Devel::CoreStack module to get a stack trace.)
If the stack trace mentions XS_DynaLoader_dl_load_file then rerun
make test after setting the environment variable PERL_DL_DEBUG to 2.
[/text]

依照上面提示,从中得知,perl 5以上版本可以安装 Devel::CoreStack这个模块跟踪,因为之前 cpan 安装都失败,所以直接到 perl module 这下载源代码。 Devel::CoreStack 编译很顺利,之后,设置好环境变量 PERL_DL_DEBUG。重新执行安装 DBI 的命令, 失败,跟踪错误——某个文件里变量有重复定义。

不得以,问一同事,才得知我此时使用的测试服务器的 DNS 设置有问题。修改 DNS, 再次使用 cpan 方式安装,失败。后来,想到有可能是 cpan 配置的 source 有问题,于是,将另外一台机器上 cpan 的 source 完全 copy 过来,再使用
[bash]
cpan>reload index
[/bash]
重新加载源的索引。这之后
[bash]
cpan>install DBI
[/bash]
执行成功。


安装DBD::mysql
[bash]
cpan>install DBD::mysql
[/bash]
失败,错误提示是关于sql-bench 执行时测试的参数没有设置有关。因为不太了解这里要怎么设置,所以转而采用源代码编译安装。执行 perl MakeFile.PL,还是报跟采用 cpan 方式时的错误。求助于README后,试着加上如下参数编译
[bash]
perl Makefile.PL --testhost='127.0.0.1' --testuser='test' --testpassword='123456' testdb='test'
[/bash]
这次编译算是提示半成功,还是有提示
[text]
libs -rdynamic -L/usr/local/mysql/lib -lmysqlclient -lz -lcrypt -lnsl -lm -lmygcc
[/text]
libs 中的 -rdynamic 标识无法识别,为了避免这个对于之后的编译有影响。于是,重新用如下参数设置
[bash]
perl Makefile.PL --libs='-L/usr/local/mysql/lib -lmysqlclient -lz -lcrypt -lnsl -lm -lmygcc' --testhost='127.0.0.1' --testuser='test' --testpassword='123456' testdb='test'
[/bash]
这次终于没报任何错误,顺利编译。
这里有点疑问,不知道是我理解错误还是参数设置的问题,为什么一定要设置好测试的主机,用户及其库才能编译成功呢?源代码正确安装步骤如下:
[bash]
tar xvzf DBD-mysql-4.018.tar.gz
cd DBD-mysql-4.018
perl Makefile.PL --libs='-L/usr/local/mysql/lib -lmysqlclient -lz -lcrypt -lnsl -lm -lmygcc' --testhost='127.0.0.1' --testuser='test' --testpassword='123456' testdb='test'
make
make install
[/bash]

安装Data::ShowTable
这个我采用的还是源代码安装,一路下来,很顺利。
[bash]
tar xvzf Data-ShowTable-3.3.tar.gz
cd Data-ShowTable-3.3
perl Makefile.PL
make
make install
[/bash]


这番准备后,应该可以正常运行sql-bench。

这里测试时有点小问题,bench-init.pl 是在 sql-bench 目录下,同各测试程序是在同一目录,但是,好像加载这个配置文件时使用的目录却是当前命令行所在的目录,所以,开始时一度总是报找不到测试配置文件的错误。等把当前目录转到 sql-bench 所在的目录时,再执行,OK。

2011年1月23日星期日

MySQL 互备份master-master

机器信息

MySQL 5.1.17
A. 192.168.0.2
B. 192.168.0.9


创建用户并授权

A.
[sql]
mysql> GRANT REPLICATION SLAVE, FILE on *.* TO 'slave_2'@'192.168.0.9' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
B.
mysql> GRANT REPLICATION SLAVE, FILE on *.* TO 'slave_9'@'192.168.0.2' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
[/sql]


修改配置文件

A.
[bash highlight="10,12-14"]
[mysqld]
server-id = 1
user = mysql
log_bin = mysql-bin
binlog_do_db = example
binlog_ignore_db = mysql
binlog_ignore_db = test
replicate_do_db = example
replicate_ignore_db = mysql
replicate_ignore_db = test
log_slave_updates
slave_skip_errors = all
sync_binlog = 1
auto_increment_increment = 2
auto_increment_offset = 1
master_host = 192.168.0.9
master_port = 3306
master_user = slave_9
master_password = 123456
master_connect_retry = 60
report_host = 192.168.0.5
[/bash]

B.
[bash highlight="10,12-14"]
[mysqld]
server-id = 2
user = mysql
log_bin = mysql-bin
binlog_do_db = example
binlog_ignore_db = mysql
binlog_ignore_db = test
replicate_do_db = example
replicate_ignore_db = mysql
replicate_ignore_db = test
log_slave_updates
slave_skip_errors = all
sync_binlog = 1
auto_increment_increment = 2
auto_increment_offset = 1
master_host = 192.168.0.2
master_port = 3306
master_user = slave_2
master_password = 123456
master_connect_retry = 60
report_host = 192.168.0.5
[/bash]


启动MySQL服务,在A和B上执行如下相同的步骤

[bash]
[root@localhost ~]# /usr/local/mysql/bin/mysqld_safe --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/log/localhost.localdomain.pid --skip-external-locking &
[/bash]

查看备份是否成功

[sql]
mysql> SHOW SLAVE STATUS \G
[/sql]

当看到Slave_IO_Running,Slave_SQL_Running 都是Yes,就说明备份成功 :
[bash]
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
[/bash]



如下是手动指定Master
A.
[sql]
mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW MASTER STATUS \G
*************************** 1. row ***************************
File: mysql-bin.000004
Position: 520
Binlog_Do_DB: example
Binlog_Ignore_DB: mysql,test
1 row in set (0.00 sec)
[/sql]

B.
[sql]
mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW MASTER STATUS \G
*************************** 1. row ***************************
File: mysql-bin.000003
Position: 519
Binlog_Do_DB: example
Binlog_Ignore_DB: mysql,test
1 row in set (0.00 sec)
[/sql]

A.
[sql]
mysql> CHANGE MASTER TO
-> master_host='192.168.0.9',
-> master_user='slave_9',
-> master_password='123456',
-> master_log_file='mysql-bin.000003',
-> master_log_pos=519;
Query OK, 0 rows affected (0.01 sec)
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
[/sql]

B.
[sql]
mysql> CHANGE MASTER TO
-> master_host='192.168.0.2',
-> master_user='slave_2',
-> master_password='123456',
-> master_log_file='mysql-bin.000004',
-> master_log_pos=520;
Query OK, 0 rows affected (0.01 sec)
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
[/sql]


查看各自机器上的IO进程和 SLAVE进程是否都开启。
[sql]
mysql> SHOW SLAVE STATUS \G
[/sql]

释放掉各自的锁
[sql]
mysql> UNLOCK TABLES;
[/sql]

2011年1月3日星期一

skip-name-resolve 参数

[bash]
[mysqld]
skip-name-resolve
[/bash]

mysql 配置文件中添加如上信息,表示客户端登录时取消DNS的反向解析,即如果需要使用Mysql服务,主机必须用IP地址(eg: mysql -h 127.0.0.1 -u root -p123)


如下转自 http://blog.csdn.net/kanon_lgt/archive/2009/04/30/4138660.aspx
在mysql客户端登陆mysql服务器的登录速度太慢的解决方案一篇文章中,我介绍了如何通过在my.ini文件(linux下是my.cnf文件)中添加"skip-name-resolve"的参数设置,使得客户端在登录服务器的时候不通过主机解析这一关,直接登陆的方法,以此来提高登录速度。

这里要介绍一下这种方法的负面作用,以及不合理的时机使用这种方法会引发的不可发现的错误。

首先,回顾一下在my.ini/my.cnf文件中添加"skip-name-resolve"参数来提高访问速度的原理:

在没有设置该参数的时候,客户端在登陆请求发出后,服务器要解析请求者是谁,经过解析,发现登录者是从另外的电脑登录的,也就是说不是服务器本机,那么,服务器会到mysql.user表中去查找是否有这个用户,假设服务器IP是192.168.0.1,而客户机的IP是192.168.0.2;那么查询的顺序是先找'root'@'192.168.0.2'这个user是否存在,若存在,则匹配这个用户登陆,并加载权限列表。若没有该用户,则查找'root'@'%'这个用户是否存在,若存在,则加载权限列表。否则,登录失败。

在设置了skip-name-resolve参数后,客户端的登录请求的解析式同上面一样的,但是在服务器本机的解析过程却发生了改变:服务器会把在本机登录的用户自动解析为'root'@'127.0.0.1';而不是'root'@'localhost';这样一来就坏了,因为我们在服务器上登录是为了进行一些维护操作,但是显然,'root'@'127.0.0.1'这个用户是被默认为'root'@'%'这个用户的,这个用户还没有足够得权限去执行一些超级管理员'root'@'localhost'才能执行的大作。因为未分配权限。

所以结论是:加入你在服务器本机上登录mysql服务器的话,要么先取消skip-name-resolve的参数设置,重新启动服务器再登陆,设置完成后,再设置上该参数;要么就给'root'@'127.0.0.1'分配超级管理员权限,但这么做显然是不明智的,因为任何人在任何机器上都可以用这个用户执行管理员操作,前提是知道了密码。

我有一次在mysql服务器上执行数据库创建脚本,并同时创建表、触发器、存储过程等。结果,总是失败,经过了一上午的折腾,最后发现时这个参数造成我以'root'@'127.0.0.1'这个用户登陆了服务器,这个用户没有创建触发器的权限。后来,取消了skip-name-resolve参数后,执行成功,再把该参数设置回去。重启。OK。

所以,在设置这个参数的时候一定要注意时机:先用超级管理员将所有的用户创建好,再将权限分配好之后,才设置这个参数生效。

Linux 查看机器配置信息

[bash]#cat /proc/cpuinfo[/bash]
processor 从0开始计数,flags 如果有ht 说明和支持超线程技术(附1)。


[bash]#cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
1 Intel(R) Pentium(R) Dual CPU E2180 @ 2.00GHz
[/bash]
查看CPU信息,这里信息显示只有1个逻辑CPU,型号为 E2180
[bash]
#cat /proc/cpuinfo | grep processor | wc -l
1
[/bash]
查看CPU的个数
[bash]#cat /proc/cpuinfo | grep physical | uniq -c


#getconf LONG_BIT
32
[/bash]
说明当前CPU运行在32bit模式下,但不代表CPU 不支持64bit


[bash]# cat /proc/cpuinfo | grep flags | grep "lm" | wc -l
0
[/bash]
结果大于0,说明支持64位计算, lm 是指long mode, 支持lm即是指支持64 bit


[bash]#cat /proc/cpuinfo | grep -i "model name"
model name : Intel(R) Pentium(R) Dual CPU E2180 @ 2.00GHz

#cat /proc/cpuinfo | grep -i "cpu cores"

#cat /proc/cpuinfo | grep -i "cache size"
cache size : 1024 KB

#dmidecode | gerp "Processor Information"[/bash]
查看CPU信息

[bash]#dmicode | grep CPU

#dmidecode | grep Proc[/bash]

[bash]#cat /proc/meminfo[/bash]
查看内存信息

[bash]#cat /proc/meminfo | grep -i memtotal
MemTotal: 1035292 kB[/bash]

[bash]#dmesg | grep hd[/bash]
查看硬盘信息

[bash]#uname -a [/bash]
查看当前操作系统的内核

[bash]#cat /etc/issue | grep Linux[/bash]
查看当前操作系统发行版本信息


[bash]#dmidecode | grep "Product Name"[/bash]
查看机器信息

[bash]#dmesg | grep -i eth[/bash]
查看网卡信息

附1 : 超线程 HT Hyper-Threading
超线程技术是利用特殊的硬件指令,把多线程处理器内部的两个逻辑内核模拟成两个物理芯片,从而使单个处理器就能“享用”线程级的并行计算的处理器技术。多线程技术可以在支持多线程的操作系统和软件上,有效的增强处理器在多任务、多线程处理上的处理能力。