Autoconf中没有了xlC自动检测,因此运行configure前,需要设置许多变量。以下例子使用IBM编译器:
export CC="xlc_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192 " export CXX="xlC_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192" export CFLAGS="-I /usr/local/include" export LDFLAGS="-L /usr/local/lib" export CPPFLAGS=$CFLAGS export CXXFLAGS=$CFLAGS ./configure --prefix=/usr/local \ --localstatedir=/var/mysql \ --sbindir='/usr/local/bin' \ --libexecdir='/usr/local/bin' \ --enable-thread-safe-client \ --enable-large-files
可以从http://www-frec.bull.com/找到上述编译MySQL分发版的选项。
如果你将前面的configure行中的-O3改为-O2,必须删掉-qstrict选项。这是对IBM C编译器的限制。
如果你正在使用gcc或egcs编译MySQL,必须使用-fno-exceptions标志,因为gcc/egcs的异常处理不是对线程安全的!(已经用egcs1.1测试过)。IBM汇编程序也有一些已知问题,当使用gcc时可以生成坏的代码。
在 AIX 上使用egcs和gcc 2.95,我们推荐下列configure行:
CC="gcc -pipe -mcpu=power -Wa,-many" \ CXX="gcc -pipe -mcpu=power -Wa,-many" \ CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti" \ ./configure --prefix=/usr/local/mysql --with-low-memory
为了成功编译,需要使用-Wa,-many选项。IBM知道该问题,但是由于工作区的原因,不急于修复它。我们不知道gcc 2.95是否需要-fno-exceptions选项,但是因为MySQL不使用例外,并且该选项可以产生快速的代码,我们建议使用egcs/gcc时使用该选项。
如果汇编码有问题,试试更改-mcpu=xxx选项以匹配你的CPU。一般情况可能需要使用power2、power或powerpc。另外,你可能需要使用604或604e。我们不能绝对肯定但怀疑power一般应安全,即使在power2机器上也安全。
如果你不知道你的CPU是什么样的,可以执行uname -m命令。可以产生类似000514676700的字符串,格式为xxyyyyyymmss,其中xx和ss总是00,yyyyyy是唯一的系统ID,mm是CPU Planar的ID。从http://www16.boulder.ibm.com/pseries/en_US/cmds/aixcmds5/uname.htm可以找到这些值的图表。
该图表可以给出你可以使用的机器类型和机器型号,确定CPU的类型。
如果遇到信号问题(MySQL在高负载下出人意料地死掉),你可能已经发现了与线程和信号有关的一个OS 缺陷。在这种情况下,你可以用如下配置告诉MySQL不使用信号:
CFLAGS=-DDONT_USE_THR_ALARM CXX=gcc \ CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti \ -DDONT_USE_THR_ALARM" \ ./configure --prefix=/usr/local/mysql --with-debug \ --with-low-memory
这不影响MySQL的性能,但是有副作用,就是不能用mysqladmin kill或mysqladmin shutdown杀死在一个连接上“睡眠”的客户端。相反,当客户端发出下一个命令时,它将死掉。
在AIX的一些版本上用libbind.a链接使得getservbyname()内核转储,这是AIX的一个缺陷并且应该报告IBM。
对于AIX 4.2.1和gcc,进行下面的更改。
配置完后,编辑config.h和include/my_config.h,将下面的行:
#define HAVE_SNPRINTF 1
更改为:
#undef HAVE_SNPRINTF
最后需要在mysqld.cc中为initgroups ()添加:
#ifdef _AIX41 extern "C" int initgroups(const char *,int); #endif
如果你需要为mysqld进程分配大量内存,只使用ulimit -d unlimited是不够的。还可以需要修改mysqld_safe,增加下面的行:
export LDR_CNTRL='MAXDATA=0x80000000'
关于使用大量内存的信息请查阅http://publib16.boulder.ibm.com/pseries/en_US/aixprggd/genprogc/lrg_prg_support.htm 。