分类: Mysql/postgreSQL
2008-05-11 17:29:37
MySQL应当可以在Mac OS X 10.x(Darwin)中工作,不会有重大问题。
已知的问题有:
· 连接时间(wait_timeout、interactive_timeout和net_read_timeout)值不理想。
这可能是线程库中的信号处理问题,信号不能中断挂起的读命令,我们希望将来能对线程库进行更新以修复该问题。
在Darwin 6.3中用下面的configure行对Mac OS X二进制进行了编译:
CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc \CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors \ -fno-exceptions -fno-rtti" \ ./configure --prefix=/usr/local/mysql \ --with-extra-charsets=complex --enable-thread-safe-client \ --enable-local-infile --disable-shared
对于当前版本的Mac OS X服务器,编译MySQL之前不需要对操作系统进行更改。在服务器平台上的编译与客户端版本Mac OS X相同。
对于旧的版本(Mac OS X Server 1.2, a.k.a. Rhapsody),在配置MySQL之前必须先安装pthread软件包。
在Solaris中,甚至在解压缩MySQL分发版时,你也会遇到问题,因为Solaris tar不能处理长文件名。这说明解压缩MySQL分发版时会遇见错误。
如果出现这种问题,必须使用GNU tar(gtar)来解压缩分发版。可以从http://dev.mysql.com/downloads/os-solaris.html找到预编译的Solaris版本。
Sun原生线程只在Solaris 2.5和更高版本中工作。对于版本2.4和更早版本,MySQL自动使用MIT-pthreads。请参见2.8.5节,“MIT-pthreads注意事项”。
如果你运行configure时遇到下面的错误,说明编译器安装得有问题:
checking for restartable system calls... configure: error can notrun test programs while cross compiling
在这种情况下,应当将编译器升级到较新的版本。还可以在config.cache文件中插入下面的行来解决该问题:
ac_cv_sys_restartable_syscalls=${ac_cv_sys_restartable_syscalls='no'}
如果在SPARC上使用Solaris,建议使用编译器gcc 2.95.2或3.2。可以从下载。请注意egcs 1.1.1和gcc 2.8.1不能在SPARC上可靠地工作。
当使用gcc 2.95.2时建议的configure行:
CC=gcc CFLAGS="-O3" \CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti" \./configure --prefix=/usr/local/mysql --with-low-memory \ --enable-assembler
如果你使用UltraSPARC系统,在CFLAGS和CXXFLAGS环境变量中加上-mcpu=v8 -Wa,-xarch=v8plusa,性能可以提高4%。
如果你有Sun Forte 5.0(或更新版)编译器,可以运行:
CC=cc CFLAGS="-Xa -fast -native -xstrconst -mt" \CXX=CC CXXFLAGS="-noex -mt" \./configure --prefix=/usr/local/mysql --enable-assembler
要想用Sun Forte 编译器创建64-位二进制,使用下面的配置选项:
CC=cc CFLAGS="-Xa -fast -native -xstrconst -mt -xarch=v9" \CXX=CC CXXFLAGS="-noex -mt -xarch=v9" ASFLAGS="-xarch=v9" \./configure --prefix=/usr/local/mysql --enable-assembler
要想使用gcc创建64-位Solaris二进制,在CFLAGS和CXXFLAGS中增加-m64,并从configure行删掉--enable-assembler。
在MySQL基准测试中,在UltraSPARC上使用32位模式的Forte 5.0,同使用带-mcpu标记的gcc 3.2比较,速度提高了4%。
如果创建了64位的mysqld二进制,速度要比32-位二进制慢4%,但是可以处理更多的线程和内存。
当为x86_64使用Solaris 10时,你应当安装用forcedirectio选项保存InnoDB文件的文件系统。(默认情况不用该选项来安装)。如果不这样做,当在该平台上使用InnoDB 储存引擎时将会造成严重的性能下降。
如果fdatasync或sched_yield出现问题,你可以在configure行加LIBS=-lrt修复该问题。
对于早于WorkShop 5.3的编译器,你可能需要编辑configure脚本。应将该行:
#if !defined(__STDC__) || __STDC__ != 1
更该为:
#if !defined(__STDC__)
如果你用-Xc 选项打开__STDC__,Sun 编译器不能用Solaris pthreads.h 头文件编译。这是一个Sun 缺陷(中断的编译器或include文件)。
如果运行mysqld时出现下面的错误消息,原因是你企图不启用-mt multi-thread选项而用Sun编译器编译MySQL:
libc internal error: _rmutex_unlock: rmutex not held
将-mt加到CFLAGS和CXXFLAGS上并重新编译。
如果你正使用gcc的SFW版本(在Solaris 8安装包内),运行configure之前你必须将/opt/sfw/lib加到环境变量LD_LIBRARY_PATH上。
如果你正使用从sunfreeware.com下载的gcc,会遇到许多问题。要想避免,应当在运行机器上重新编译gcc和GNU binutils。
如果你用gcc编译MySQL时遇到下面的错误,说明gcc配置不适合Solaris的版本:
shell> gcc -O3 -g -O2 -DDBUG_OFF -o thr_alarm ...
./thr_alarm.c: In function `signal_hand':./thr_alarm.c:556: too many arguments to function `sigwait'
在这种情况下正确的做法是得到最新版本的gcc,并用你当前的gcc编译器编译。至少对于Solaris 2.5,几乎所有二进制版本的gcc有旧的不再使用的include文件,中断了所有使用线程的程序,也可能会中断其它程序。
Solaris不提供静态版本的系统库(libpthreads和libdl),因此你不能用--static编译MySQL。如果你试图这样做,会遇到下面的错误:
ld: fatal: library -ldl: not foundundefined reference to `dlopen'cannot find -lrt
如果你连接你自己的MySQL客户端程序,运行时会出现下面的错误:
ld.so.1: fatal: libmysqlclient.so.#:open failed: No such file or directory
可以通过下面的方法避免该问题:
· 用-Wl,r/full/path/to/libmysqlclient.so标记而不要用-Lpath)连接客户端。
· 将libmysqclient.so复制到/usr/lib。
· 运行客户端程序前,将libmysqlclient.so目录的路径名加到LD_RUN_PATH环境变量上。
如果你未安装zlib用 -lz连接时configure出现问题,你有两个选则:
· 如果你想要使用压缩通信协议,你需要从ftp.gnu.org获得并安装zlib。
· 构建MySQL时用--with-named-z-libs=no选项运行configure。
如果你正使用gcc,向MySQL调用用户定义函数(UDF)时出现问题,尝试向UDF连接行添加-lgcc到。
如果想让MySQL自动启动,可以将support-files/mysql.server复制到/etc/init.d,并创建/etc/rc3.d/S99mysql.server符号连接。
如果有太多进程试图快速连接mysqld,你应当能再MySQL日志只看见错误:
Error in accept: Protocol error
可以尝试用--back_log=50选项启动服务器来解决该问题。(在MySQL 4以前的版本中使用-O back_log=50)。
Solaris不支持setuid() 应用程序所需的内核文件,因此如果你使用--user选项你不能从mysqld遇到内核文件。
一般情况,可以在Solaris 2.7和2.8中使用Solaris 2.6二进制。大多数Solaris 2.6发布也适用Solaris 2.7和2.8。
MySQL应当能够自动检测到新的Solaris版本并解决下面的问题。
Solaris 2.7/2.8的include文件中有一些缺陷。当使用gcc时你会看见下面的错误:
/usr/include/widec.h:42: warning: `getwc' redefined/usr/include/wchar.h:326: warning: this is the location of the previousdefinition
如果出现该问题,修复的办法是将/usr/include/widec.h复制到.../lib/gcc-lib/os/gcc-version/include,并将41行从:
#if !defined(lint) && !defined(__lint)
更改为:
#if !defined(lint) && !defined(__lint) && !defined(getwc)
另外,可以直接编辑/usr/include/widec.h。用任何一种方法修复后,应当删掉config.cache并再次运行configure。
如果运行make时遇到下面的错误,这是因为configure不能检测到curses.h文件(可能是因为/usr/include/widec.h中的错误):
In file included from mysql.cc:50:/usr/include/term.h:1060: syntax error before `,'/usr/include/term.h:1081: syntax error before `;'
可以用下面任何一种方法解决该问题:
· 用CFLAGS=-DHAVE_CURSES_H CXXFLAGS=-DHAVE_CURSES_H ./configure配置。
· 根据前面的讨论编辑/usr/include/widec.h并重新configure。
· 删掉config.h文件中的#define HAVE_TERM行并重新运行make。
如果链接客户端程序时连接器找不到-lz,问题可能是libz.so文件安装到了/usr/local/lib。可以用下面任何一种方法解决该问题:
· 向LD_LIBRARY_PATH增加/usr/local/lib。
· 增加到libz.so from /lib的连接。
· 如果使用Solaris 8,可以安装Solaris 8 CD分发版中的可选项zlib。
· 构建MySQL时用--with-named-z-libs=no选项运行configure。
在x86 Solaris 8上, 如果使用strip删除调试符号,mysqld转储内核。
如果正在 Solaris x86上使用gcc或egcs,并且你碰到了在装载时的内核转储问题,应该使用下列configure命令:
CC=gcc CFLAGS="-O3 -fomit-frame-pointer -DHAVE_CURSES_H" \CXX=gcc \CXXFLAGS="-O3 -fomit-frame-pointer -felide-constructors \ -fno-exceptions -fno-rtti -DHAVE_CURSES_H" \./configure --prefix=/usr/local/mysql
用libstdc++库和与C++异常处理来避免这个问题。
如果这没有帮助,你应该编译一个调试版本并且用一个踪迹文件运行它或在gdb下运行它。请参见E.1.3节,“在gdb环境下调试mysqld”。
对于运行MySQL,推荐使用FreeBSD 4.x或更新版本,因为其线程包更加完整。要想遇到一个安全、稳定的系统,你应当只使用标记-RELEASE的FreeBSD内核。
最容易因此是比较受喜欢的安装方法是使用mysql-server和mysql-client移植,可从得到。
使用这些移植的益处包括:
· 用pkg_info -L察看哪个文件被安装的能力
· 如果你在那台机器上不再想要MySQL,用pkg_delete完全删除它们。
建议在FreeBSD 2.x版上使用 MIT-pthreads,在版本3和以上版本用原生线程。在一些2.2.x的以后版本使用原生线程运行是可能的,但是你可能碰到mysqld关掉的问题。
遗憾的是,FreeBSD调用的某些函数还不能完全保证线程安全。特别令人注意的是,包括gethostbyname()函数, MySQL使用该函数将主机名转换为IP地址。在某些环境中,mysqld进程会突然造成100%的CPU负荷,不再响应。如果你遇到该问题,尝试使用--skip-name-resolve选项启动MySQL。
另外,还可以将FreeBSD 4.x中的MySQL同LinuxThreads库连接,这样可以避免一些原生FreeBSD线程执行时的问题。为了更好地将LinuxThreads同原生线程进行对比,参见Jeremy Zawodny的文章FreeBSD or Linux for your MySQL Server? 地址:http://jeremy.zawodny.com/blog/archives/000697.html 。
在FreeBSD使用LinuxThreads的已知问题有:
· 连接时间(wait_timeout、interactive_timeout和net_read_timeout)值不理想。现象是永久连接挂起较长时间,不能关闭,只有线程执行新命令时 'kill'线程方有效。
这可能是线程库中的信号处理问题,信号不能中断挂起的读命令。期望在FreeBSD 5.0中修复。
MySQL构建进程需要GNU make(gmake)工作。如果没有GNU make,必须在编译MySQL前先安装它。
建议的在FreeBSD中用gcc(2.95.2和以上版本)编译和安装MySQL的方法是:
CC=gcc CFLAGS="-O2 -fno-strength-reduce" \ CXX=gcc CXXFLAGS="-O2 -fno-rtti -fno-exceptions \ -felide-constructors -fno-strength-reduce" \ ./configure --prefix=/usr/local/mysql --enable-assemblergmakegmake installcd /usr/local/mysqlbin/mysql_install_db --user=mysqlbin/mysqld_safe &
如果configure使用MIT-pthreads,应当阅读MIT-pthreads注意事项。请参见2.8.5节,“MIT-pthreads注意事项”。
如果你从make install遇到一个它不能找到“/usr/include/pthreads”的错误,configure没有检测出你需要MIT-pthreads。要修复该问题,移走config.cache,然后用--with-mit-threads选项重新运行configure。
确定让你的名字解析程序安装正确,否则当连接mysqld时,你可能会遇到解析延时或失败。保证在“/etc/hosts”文件中的localhost入口是正确的。“/etc/hosts”文件应该以下面一行开始:
127.0.0.1 localhost localhost.your.domain
已知FreeBSD的文件句柄限制默认值很低。请参见A.2.17节,“文件未找到”。使用--open-files-limit选项执行mysqld_safe启动服务器,或在/etc/login.conf为mysqld用户提高限制并用cap_mkdb /etc/login.conf重建它。如果你不使用默认名(即使用chpass mysqld-user-name),还要保证为该用户设置在密码文件中的相应级别。请参见5.1.3节,“mysqld_safe:MySQL服务器启动脚本”。
FreeBSD将进程空间限制到512MB,即使系统有很多的可用RAM也如此。因此你可能会遇到如下所示错误:
Out of memory (Needed 16391 bytes)
在当前版本的FreeBSD(至少4.x和更高版本)中,你可以在/boot/loader.conf文件中增加下面的条目并重启机器增加该限制(不能在运行时间用sysctl命令更改这些设定值):
kern.maxdsiz="1073741824" # 1GBkern.dfldsiz="1073741824" # 1GBkern.maxssiz="134217728" # 128MB
在旧版本的FreeBSD中,必须重新编译内核,以便更改进程的最大数据段空间。在这种情况下,应当查看LINT配置文件中的MAXDSIZ选项查看更详细的信息。
如果MySQL的当前日期有问题,设置TZ变量将会有帮助。请参见附录F:环境变量。
为了在NetBSD上编译,你需要GNU make,否则当make试图在C++文件上运行lint时,编译将失败。
CFLAGS=-pthread CXXFLAGS=-pthread ./configure --with-mit-threads=no
如果在编译MySQL时,遇到下列错误, 说明虚拟内存的ulimit值太低了:
item_func.h: In method`Item_func_ge::Item_func_ge(const Item_func_ge &)':item_func.h:28: virtual memory exhaustedmake[2]: *** [item_func.o] Error 1
试试使用ulimit -v 80000并再次运行make。如果这还不行并且你正在使用bash,试试换到csh或sh;一些BSDI用户报告了使用bash和ulimit有问题。
如果你正在使用gcc,可能必须为configure使用--with-low-memory标志才能编译“sql_yacc.cc”。
如果MySQL的当前日期有问题,设置TZ变量将会有帮助。请参见附录F:环境变量。
升级到BSD/OS 3.1。如果不能升级,则安装BSDI patch M300-038。
在配置MySQL时,使用下列命令:
env CXX=shlicc++ CC=shlicc2 \./configure \ --prefix=/usr/local/mysql \ --localstatedir=/var/mysql \ --without-perl \ --with-unix-socket-path=/var/mysql/mysql.sock
已知下面的项可以工作:
env CC=gcc CXX=gcc CXXFLAGS=-O3 \./configure \ --prefix=/usr/local/mysql \ --with-unix-socket-path=/var/mysql/mysql.sock
如果你愿意,可以改变目录位置,或不指定任何位置而使用默认目录。
如果在重负载下的性能有问题,试试使用--skip-thread-priority选项执行mysqld!这将以相同优先级运行所有线程;在BSDI 3.1上,可以得到较好的性能(至少直到BSDI可以修正其线程调度程序)。
如果在编译时遇到virtual memory exhausted错误,试试使用ulimit -v 80000并再次运行make。如果这还不行并且你正在使用bash,试试换到csh或sh;一些BSDI用户报告了使用bash和ulimit会有问题。
在一些 BSDI 4.x系统中,你可能会遇到共享库问题。现象是不能执行任何客户端程序,例如,mysqladmin。在这种情况下,需要重新配置,用disable-shared选项禁用库的共享以便进行配置。
一些客户在BSDI 4.0.1中遇到了严重问题,即mysqld二进制过一会儿不能打开表。这是因为一些库/系统相关错误使mysqld未得到指令便更改了当前目录。
修复方法是升级MySQL到最低3.23.34版或更高版,运行configure后,运行make前删掉config.h中的行#define HAVE_REALPATH。
请注意这说明你不能通过符号连接将数据库目录连接到另一个数据库目录,或通过符号连接将表连接到BSDI上的另一个数据库。(可以通过符号连接连接到另一个硬盘)。
在HP-UX上编译MySQL时,有一些“小”问题。我们推荐您使用gcc而不是HP-UX自己的编译器,因为gcc可以生成更好的代码!
我们推荐在HP-UX上使用gcc 2.95,不使用高度优化标志(类似-O6),因为这在HP-UX 上可能不安全。
下面的configure行在gcc 2.95中应当工作:
CFLAGS="-I/opt/dce/include -fpic" \CXXFLAGS="-I/opt/dce/include -felide-constructors -fno-exceptions \-fno-rtti" \CXX=gcc \./configure --with-pthread \ --with-named-thread-libs='-ldce' \ --prefix=/usr/local/mysql --disable-shared
下面的configure行在gcc 3.1中应当工作:
CFLAGS="-DHPUX -I/opt/dce/include -O3 -fPIC" CXX=gcc \CXXFLAGS="-DHPUX -I/opt/dce/include -felide-constructors \ -fno-exceptions -fno-rtti -O3 -fPIC" \./configure --prefix=/usr/local/mysql \ --with-extra-charsets=complex --enable-thread-safe-client \ --enable-local-infile --with-pthread \ --with-named-thread-libs=-ldce --with-lib-ccflags=-fPIC --disable-shared
PHKL_22840 Streams cumulativePHNE_22397 ARPA cumulative
这样可以解决在线程应用程序中运行recv()时得到EWOULDBLOCK和执行accept()时得到EBADF的问题。
如果你在未打补丁的HP-UX 11.x系统中使用gcc 2.95.1,可能会遇到下面的错误:
In file included from /usr/include/unistd.h:11, from ../include/global.h:125, from mysql_priv.h:15, from item.cc:19:/usr/include/sys/unistd.h:184: declaration of C function .../usr/include/sys/pthread.h:440: previous declaration ...In file included from item.h:306, from mysql_priv.h:158, from item.cc:19:
问题是HP-UX没有一致地定义pthreads_atfork()。它同/usr/include/sys/unistd.h:184和/usr/include/sys/pthreads.h:440中的原型冲突。
一个解决办法是将/usr/include/sys/unistd.h复制到MySQL/include并编辑unistd.h,对它进行更改以匹配pthreads.h中的定义。查找下列行:
extern int pthreads_atfork(void (*prepare)(),void (*parent)(),
void (*child)());
将它更改为:
extern int pthreads_atfork(void (*prepare)(void),void (*parent)(void),
void (*child)(void));
更改完后,下面的configure行应当工作:
CFLAGS="-fomit-frame-pointer -O3 -fpic" CXX=gcc \CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti -O3" \./configure --prefix=/usr/local/mysql --disable-shared
如果你使用HP-UX 编译器,可以使用下面的命令(已经用cc B.11.11.04进行了测试):
CC=cc CXX=aCC CFLAGS=+DD64 CXXFLAGS=+DD64 ./configure \ --with-extra-character-set=complex
你可以忽略下面类型的任何错误:
aCC: warning 901: unknown option: `-3': use +help for onlinedocumentation
如果运行configure时遇到下面的错误,请验证在到HP-UX C和C++编译器的路径前是否有到K&R编译器的路径:
checking for cc option to accept ANSI C... noconfigure: error: MySQL requires an ANSI C compiler (and a C++ compiler).Try gcc. See the Installation chapter in the Reference Manual.
不能编译的另一个原因可能是你没有按照前面所述定义+DD64标记。
对于HP-UX 11,另一个办法是使用http://dev.mysql.com/downloads/提供的MySQL二进制,这是我们已经构建并测试过的。我们也收到了MySQL的HP-UX 10.20二进制可以在HP-UX 11上成功运行的报告。如果你遇到问题,一定要检查HP-UX补丁的版本。
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=$CFLAGSexport CXXFLAGS=$CFLAGS ./configure --prefix=/usr/local \ --localstatedir=/var/mysql \ --sbindir='/usr/local/bin' \ --libexecdir='/usr/local/bin' \ --enable-thread-safe-client \ --enable-large-files
可以从找到上述编译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。从可以找到这些值的图表。
该图表可以给出你可以使用的机器类型和机器型号,确定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 _AIX41extern "C" int initgroups(const char *,int);#endif
如果你需要为mysqld进程分配大量内存,只使用ulimit -d unlimited是不够的。还可以需要修改mysqld_safe,增加下面的行:
export LDR_CNTRL='MAXDATA=0x80000000'
关于使用大量内存的信息请查阅。
在SunOS 4上,需要用MIT-pthreads编译MySQL,反过来这意味着需要使用GNU make。
一些SunOS 4系统的动态库和libtool有问题。可以使用下列configure行来避免这个问题:
./configure --disable-shared --with-mysqld-ldflags=-all-static
当编译readline时,可能会遇到关于重复定义的警告,可以忽略。
当编译mysqld的时候,将会遇到implicit declaration of function警告,可以忽略。
如果你在Digital Unix上使用egcs 1.1.2,应当升级到gcc 2.95.2,因为egcs在DEC上有一些严重缺陷!
当在Digital UNIX下编译线程程序时,文档推荐对于cc和cxx使用-pthread选项和-lmach -lexc库(除了-lpthread外)。你应该象下面这样运行configure:
CC="cc -pthread" CXX="cxx -pthread -O" \./configure --with-named-thread-libs="-lpthread -lmach -lexc -lc"
当编译mysqld时,会看见下面的警告:
mysqld.cc: In function void handle_connections()':mysqld.cc:626: passing long unsigned int *' as argument 3 ofaccept(int,sockadddr *, int *)'
你可以放心地忽略这些警告,它们的发生是因为configure只能检测出错误,而不是警告。
如果直接从命令行启动服务器,当退出时,可能有死掉的问题。(当你退出时,重要进程收到一个SIGHUP信号),如果如此,试着象这样启动服务器:
nohup mysqld [options] &
nohup使得后面的命令忽视从终端发来的任何SIGHUP信号了。另外,通过运行safe_mysqld启动服务器,可以让nohup调用mysqld。请参见5.1.3节,“mysqld_safe:MySQL服务器启动脚本”。
如果编译mysys/get_opt.c时遇到问题,只需要从启动文件删掉#define _NO_PROTO行。
如果使用Compaq的CC编译器,下面的configure行应当工作:
CC="cc -pthread"CFLAGS="-O4 -ansi_alias -ansi_args -fast -inline speed all -arch host"CXX="cxx -pthread"CXXFLAGS="-O4 -ansi_alias -ansi_args -fast -inline speed all \ -arch host -noexceptions -nortti"export CC CFLAGS CXX CXXFLAGS./configure \ --prefix=/usr/local/mysql \ --with-low-memory \ --enable-large-files \ --enable-shared=yes \ --with-named-thread-libs="-lpthread -lmach -lexc -lc"gnumake
如果用共享库编译时libtool出现问题,应当能够在链接mysql时通过下述命令解决该问题:
cd mysql/bin/sh ../libtool --mode=link cxx -pthread -O3 -DDBUG_OFF \ -O4 -ansi_alias -ansi_args -fast -inline speed \ -speculate all \ -arch host -DUNDEF_HAVE_GETHOSTBYNAME_R \ -o mysql mysql.o readline.o sql_string.o completion_hash.o \ ../readline/libreadline.a -lcurses \ ../libmysql/.libs/libmysqlclient.so -lmcd ..gnumakegnumake installscripts/mysql_install_db如果遇到编译问题并安装了DEC CC和gcc,尝试这样运行configure:
CC=cc CFLAGS=-O CXX=gcc CXXFLAGS=-O3 \./configure --prefix=/usr/local/mysql
如果遇到“c_asm.h”文件的问题,可以创建并使用一个“哑(dummy)”“c_asm.h”文件:
touch include/c_asm.hCC=gcc CFLAGS=-I./include \CXX=gcc CXXFLAGS=-O3 \./configure --prefix=/usr/local/mysql
请注意从下载最新的DEC(Compaq)补丁可以修复ld程序的下面问题。
在OSF1 V4.0D和编译器"DEC C V5.6-071 on Digital UNIX V4.0 (Rev. 878)" 上,编译器有了一些奇怪的行为(未定义asm标志)。/bin/ld好象也被破坏(当链接mysqld时,发生_exit undefined问题)。在这个系统上,从OSF 4.0C的版本替换了/bin/ld后,我们设法用下列configure命令行编译MySQL:
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql
用Digital编译器“C++ V6.1-029”,下列命令应该工作:
CC=cc -pthreadCFLAGS=-O4 -ansi_alias -ansi_args -fast -inline speed \ -speculate all -arch hostCXX=cxx -pthreadCXXFLAGS=-O4 -ansi_alias -ansi_args -fast -inline speed \ -speculate all -arch host -noexceptions -norttiexport CC CFLAGS CXX CXXFLAGS./configure --prefix=/usr/mysql/mysql \ --with-mysqld-ldflags=-all-static --disable-shared \ --with-named-thread-libs="-lmach -lexc -lc"
在OSF1的某些版本中,alloca()函数被破坏,通过删除定义'HAVE_ALLOCA'的“config.h”的行更正它。
alloca()函数也可能在/usr/include/alloca.h里面有一个不正确的原型,源于此的警告可以忽略。
configure将自动地使用下列线程库: --with-named-thread-libs="-lpthread -lmach -lexc -lc"。
当使用gcc时,也可以试试这样运行configure:
CFLAGS=-D_PTHREAD_USE_D4 CXX=gcc CXXFLAGS=-O3 ./configure ....
如果你的信号有问题(MySQL出人意料地在高负载下死掉),可能遇到了一个线程和信号有关的OS 缺陷。在这种情况下,你可以告诉MySQL按如下配置不使用信号:
CFLAGS=-DDONT_USE_THR_ALARM \CXXFLAGS=-DDONT_USE_THR_ALARM \./configure
这不影响MySQL性能,但是有副作用,就是不能用mysqladmin kill或mysqladmin shutdown杀死在一个连接上“睡眠”的客户端。相反,当客户端发出下一个命令时,它将死掉。
使用gcc 2.95.2,会遇到下面的编译错误:
sql_acl.cc:1456: Internal compiler error in `scan_region',at except.c:2566Please submit a full bug report.
要修复该问题,应当进入sql目录并剪切、复制最后一行gcc,但应将-O3 改为-O0 (或如果编译行没有任何-O选项,应在gcc后面增加-O0)。之后,可以回到顶级目录并重新运行make。
如果使用Irix 6.5.3或更新版,如果用拥有CAP_SCHED_MGT权限的用户(例如root)运行mysqld或用下面的shell命令给mysqld服务器该权限,mysqld能够创建线程:
chcap "CAP_SCHED_MGT+epi" /opt/mysql/libexec/mysqld
可能需要在运行configure后且在编译前定义“config.h”里面的一些符号。
在一些Irix实现中,alloca()函数被破坏。如果mysqld服务器死于一些SELECT语句,把“config.h”定义HAVE_ALLOC和HAVE_ALLOCA_H的行删除即可。如果mysqladmin create不工作,把“config.h”定义HAVE_READDIR_R的行删除,你也可能必须删除HAVE_TERM_H行。
SGI推荐将本页上的所有补丁作为一个整体来安装:
至少,应该安装最新的核心卷(rollup)、最新的rld卷和最新的libc卷。
很明确,对于pthreads支持,需要本页上所有的POSIX补丁:
如果在编译“mysql.cc”时,遇到类似于下面的错误:
"/usr/include/curses.h", line 82: error(1084):invalid combinati在of type
那么应在MySQL源码树的顶级目录输入下列命令:
extra/replace bool curses_bool < /usr/include/curses.h > include/curses.hmake
应该也有安排上的问题报告。如果只有一个线程正在运行,事情会变慢的。通过启动另外一个客户端来避免它,这可以导致此后其它线程的执行速度增加2到10倍。这是Irix线程难以理解的问题;可能必须临时准备找出解决方案直到它能被修正。
如果你正在用gcc编译,可以使用下列configure命令:
CC=gcc CXX=gcc CXXFLAGS=-O3 \./configure --prefix=/usr/local/mysql --enable-thread-safe-client \ --with-named-thread-libs=-lpthread
在用原生Irix C和C++编译器7.3.1.2的Irix 6.5.11上,下面的项工作:
CC=cc CXX=CC CFLAGS='-O3 -n32 -TARG:platform=IP22 -I/usr/local/include \-L/usr/local/lib' CXXFLAGS='-O3 -n32 -TARG:platform=IP22 \-I/usr/local/include -L/usr/local/lib' \./configure --prefix=/usr/local/mysql --with-innodb --with-berkeley-db \ --with-libwrap=/usr/local \ --with-named-curses-libs=/usr/local/lib/libncurses.a当前的移植仅在“sco3.2v5.0.5”,“sco3.2v5.0.6”和“sco3.2v5.0.7”系统上进行了测试,在“sco 3.2v4.2”上的移植也有很大进展。OpenServer 5.0.8(Legend)具有原生线程,允许文件大于2GB。目前最大的文件可以达到2GB。
我们可以在OpenServer上用gcc 2.95.3用下面的configure命令编译MySQL。
CC=gcc CXX=gcc ./configure --prefix=/usr/local/mysql \ --enable-thread-safe-client --with-innodb \ --with-openssl --with-vio --with-extra-charsets=complex
从可以得到gcc。
该开发系统需要在OpenServer 5.0.6O的penServer Execution Environment Supplement oss646B和oss656B,OpenSource库位于 gwxlibs。所有OpenSource工具位于opensrc目录。可以从获得。
我们建议使用最新的MySQL产品发布。
SCO提供的操作系统补丁:OpenServer 5.0.[0-6]:,OpenServer 5.0.7:。
SCO提供的关于安全修复的信息:Server 5.0.x:ftp://ftp.sco.com/pub/security/OpenServer。
OpenSever 5.0.x系统上最大的文件的大小为2GB。
在OpenServer 5.0.x上,可供串缓冲区、clist和锁定记录分配的总内存不能超出60MB。
串缓冲区的分配单位为4096 字节的页,clists为70字节,锁定记录为64字节,因此为:
(NSTRPAGES * 4096) + (NCLIST * 70) + (MAX_FLCKREC * 64) <= 62914560
按照以下步骤来配置Database Services选项。如果你不确定应用程序是否需要,参见随应用程序提供的文档。
1. 用root登录。
2. 编辑/etc/conf/sdevice.d/suds文件启用SUDS驱动程序。将第2个域内的N更改为Y。
3. 使用mkdev aio或Hardware/Kernel Manager来启用对asynchronous I/O的支持,并重新连接内核。要想让用户锁定内存用于该类I/O,更新aiomemlock(F)文件。应当对该文件进行更新,包括进可以使用AIO的用户和可以锁定的最大数量的内存。
4. 许多应用程序使用setuid二进制,因此你只能指定单个用户 。请参见随应用程序提供的文档来看是否应用程序是这种情况。
完成该进程后,重新启动系统,创建包括这些更改的新内核。
默认情况,/etc/conf/cf.d/mtune中的条目设置为:
Value Default Min Max----- ------- --- ---NBUF 0 24 450000NHBUF 0 32 524288NMPBUF 0 12 512MAX_INODE 0 100 64000MAX_FILE 0 100 64000CTBUFSIZE 128 0 256MAX_PROC 0 50 16000MAX_REGION 0 500 160000NCLIST 170 120 16640MAXUP 100 15 16000NOFILES 110 60 11000NHINODE 128 64 8192NAUTOUP 10 0 60NGROUPS 8 0 128BDFLUSHR 30 1 300MAX_FLCKREC 0 50 16000PUTBUFSZ 8000 2000 20000MAXSLICE 100 25 100ULIMIT 4194303 2048 4194303* Streams ParametersNSTREAM 64 1 32768NSTRPUSH 9 9 9NMUXLINK 192 1 4096STRMSGSZ 16384 4096 524288STRCTLSZ 1024 1024 1024STRMAXBLK 524288 4096 524288NSTRPAGES 500 0 8000STRSPLITFRAC 80 50 100NLOG 3 3 3NUMSP 64 1 256NUMTIM 16 1 8192NUMTRW 16 1 8192* Semaphore ParametersSEMMAP 10 10 8192SEMMNI 10 10 8192SEMMNS 60 60 8192SEMMNU 30 10 8192SEMMSL 25 25 150SEMOPM 10 10 1024SEMUME 10 10 25SEMVMX 32767 32767 32767SEMAEM 16384 16384 16384* Shared Memory ParametersSHMMAX 524288 131072 2147483647SHMMIN 1 1 1SHMMNI 100 100 2000FILE 0 100 64000NMOUNT 0 4 256NPROC 0 50 16000NREGION 0 500 160000
我们建议将这些值设置为:
NOFILES应当为4096或2048。
MAXUP应当为2048。
要想更改内核,进入/etc/conf/bin并使用./idtune name parameter来更改。例如,要将SEMMS改为200,用root账户执行命令:
# cd /etc/conf/bin# ./idtune SEMMNS 200
我们建议对该系统进行调节,但是使用的正确参数值取决于访问应用程序或数据库的用户数目和数据库空间(也就是使用的缓冲池)。下面的项影响/etc/conf/cf.d/stune中定义的内核参数:
SHMMAX(推荐设定值:128MB)和SHMSEG(推荐设定值:15)。这些参数影响创建用户缓冲池的MySQL数据库引擎。
NOFILES和MAXUP至少应达到2048。
MAXPROC至少应当设置到3000/4000(取决于用户数)或更大值。
建议使用下面的公式来计算SEMMSL、SEMMNS和SEMMNU的值:
SEMMSL = 13
发现13最适合进程和MySQL。
SEMMNS = SEMMSL * 系统上运行的db服务器数目。
将SEMMNS设置为SEMMSL值乘以你在该系统上一次运行的db服务器的(最大)数目。
SEMMNU = SEMMNS
将SEMMNU值设置为等于SEMMNS值。可以将该值设置为75%的SEMMNS,但是这是一个保守的估计。
至少需要安装"SCO OpenServer Linker and Application Development Libraries"或OpenServer开发系统来使用gcc。你不能只使用GCC Dev系统,而不安装它们。
你应当获得FSU PTHREADS安装软件包并先安装它。可以从获得。你还可以从 获得预编译的安装软件包。
FSU Pthreads能用带tcpip的SCO UNIX 4.2编译,或使用OpenServer 3.0或Open Desktop 3.0(OS 3.0 ODT 3.0),安装带有使用一个GCC 2.5.X的SCO开发系统。对ODT或OS 3.0,将需要一个GCC 2.5.x的良好移植。没有一个良好的移植会有很多问题。对这个产品的移植需要SCO UNIX开发系统,没有它,缺少所需的库和链接器。还需要SCO-3.2v4.2-includes.tar.gz。该文件包含SCO 开发include 文件的更改这是构建MySQL所需要的。需要用这些修改的头文件替换已有系统的include文件。可以从 获得。
为了在系统上构造FSU Pthreads,需要做的工作是运行GNU make。启动FSU-threads-3.14.tar.gz中的Makefile生成FSU-线程。
在“thread/src”目录下运行./configure并且选择SCO OpenServer选项。这个命令拷贝“Makefile.SCO5”到“Makefile”。然后运行make。
为了在默认的“/usr/include”目录安装,作为root登录,然后cd 到“thread/src”目录,并运行make install。
记得在制作MySQL时要使用GNU make。
注释:如果你不是作为root启动safe_mysqld,将可能每进程只有 默认的110个打开的文件。mysqld将在日志文件写下关于此的注解。
用SCO 3.2V4.2时,应当使用FSU PTHREADS 3.14或更新版。以下configure命令应当工作:
CFLAGS="-D_XOPEN_XPG4" CXX=gcc CXXFLAGS="-D_XOPEN_XPG4" \./configure \ --prefix=/usr/local/mysql \ --with-named-thread-libs="-lgthreads -lsocket -lgen -lgthreads" \ --with-named-curses-libs="-lcurses"
你可能遇到include文件的某些问题。在这种情况下,你能在找到新的SCO特定的include文件。你应该在MySQL源码树的“include”目录下打开这个文件。
SCO开发注意事项:
· 在FSU Pthreads中,下列系统调用是pthreads感知的:read()、write()、getmsg()、connect()、accept()、select()和wait()。
· CSSA-2001-SCO.35.2(补丁列为定制erg711905-dscr_remap安全补丁(版本 2.0.0))中断FSU线程并使mysqld不稳定。如果你想在 OpenServer 5.0.6机器上运行mysqld必须删除它。
· 如果你使用SCO OpenServer 5,可能需要用-DDRAFT7 in CFLAGS重新编译FSU pthreads。否则,mysqld启动时InnoDB会挂起。
· SCO在提供了OpenServer 5.0.x的操作系统补丁。
· SCO在ftp://ftp.sco.com/pub/security/sse和ftp://ftp.sco.com/pub/security/sse提供了OpenServer 5.0.x的安全修复和libsocket.so.2。
· Pre-OSR506安全修复。在ftp://stage.caldera.com/pub/security/openserver/或ftp://stage.caldera.com/pub/security/openserver/CSSA-2001-SCO.10/提供了libsocket.so.2和libresolv.so.1的telnetd修复,以及在pre-OSR506系统上的安装说明。
最好在编译/使用MySQL之前安装这些补丁。
Legend/ OpenServer 6.0.0有原生线程,没有2GB文件大小限制。
我们可以用下面的configure命令在UnixWare 7.1.x中编译MySQL:
CC="cc" CFLAGS="-I/usr/local/include" \CXX="CC" CXXFLAGS="-I/usr/local/include" \./configure --prefix=/usr/local/mysql \ --enable-thread-safe-client --with-berkeley-db=./bdb \ --with-innodb --with-openssl --with-extra-charsets=complex
如果你想要使用gcc,必须使用gcc 2.95.3或更新版。
CC=gcc CXX=g++ ./configure --prefix=/usr/local/mysql
当构建MySQL时不使用UnixWare 7.1.4或OpenServer 6.0.0中的Berkeley DB版本。MySQL使用自己的Berkeley DB。用来构建静态和动态库的configure命令在src_directory/bdb/build_unix/中,但是它不在MySQL自己的BDB版本中。工作区如下所示。
1. 按常规配置MySQL。
2. 进入(cd)bdb/build_unix/
3. 将 -p Makefile复制(cp)到Makefile.sav
4. 使用同样的选项并运行../dist/configure。
5. 运行gmake。
6. cp -p Makefile.sav Makefile
7. 进入顶级源目录并运行gmake。
允许生成共享和动态库并工作。
SCO在提供了UnixWare 7.1.1的操作系统补丁,在 提供了UnixWare 7.1.3的操作系统补丁, UnixWare 7.1.4的见, OpenUNIX 8.0.0的见 。
SCO提供的安全修复相关信息:OpenUNIX见ftp://ftp.sco.com/pub/security/OpenUNIX,UnixWare见 ftp://ftp.sco.com/pub/security/UnixWare。
默认情况,在UnixWare 7.1.1系统中最大文件的大小为1GB,但是UnixWare 7.1.4中文件大小限制是1 TB(用VXFS)。一些OS实用程序 的限制是2GB。在UnixWare 7中可能的最大文件大小是1TB(用VXFS)。
在UnixWare 7.1.4中,你不需要采取措施来获得大文件支持,但在UnixWare 7.1.x的以前版本中需要启用大文件支持,可以运行fsadm。
# fsadm -Fvxfs -o largefiles /# fsadm / * Note# ulimit unlimited# cd /etc/conf/bin# ./idtune SFSZLIM 0x7FFFFFFF ** Note# ./idtune HFSZLIM 0x7FFFFFFF ** Note# ./idbuild -B * This should report "largefiles".** 0x7FFFFFFF represents infinity for these values.
用shutdown重启系统。
默认情况,/etc/conf/cf.d/mtune中的条目设置为:
Value Default Min Max----- ------- --- ---SVMMLIM 0x9000000 0x1000000 0x7FFFFFFFHVMMLIM 0x9000000 0x1000000 0x7FFFFFFFSSTKLIM 0x1000000 0x2000 0x7FFFFFFFHSTKLIM 0x1000000 0x2000 0x7FFFFFFF
我们建议将这些值设置为:
SDATLIM 0x7FFFFFFFHDATLIM 0x7FFFFFFFSSTKLIM 0x7FFFFFFFHSTKLIM 0x7FFFFFFFSVMMLIM 0x7FFFFFFFHVMMLIM 0x7FFFFFFFSFNOLIM 2048HFNOLIM 2048
我们建议对该系统进行调节,但是使用的正确参数值取决于访问应用程序或数据库的用户数目和数据库空间(也就是使用的缓冲池)。下面的项影响/etc/conf/cf.d/stune中定义的内核参数:
SHMMAX(推荐设定值:128MB)和SHMSEG(推荐设定值:15)。这些参数影响创建用户缓冲池的MySQL数据库引擎。
SFNOLIM和HFNOLIM至少应达到2048。
NPROC至少应当设置到3000/4000(取决于用户数)。
建议使用下面的公式来计算SEMMSL、SEMMNS和SEMMNU的值:
SEMMSL = 13
据发现13最适合进程和MySQL。
SEMMNS = SEMMSL * 系统上运行的db服务器数目。
将SEMMNS设置为SEMMSL值乘以你在该系统上一次运行的db服务器的(最大)数目。
SEMMNU = SEMMNS
将SEMMNU值设置为等于SEMMNS值。可以将该值设置为75%的SEMMNS,但是这是一个保守的估计。
OpenServer6的主要改进包括:
· 大文件支持,可达到1 TB。
· 多处理器支持,从4个处理器增加到32个处理器。
· 增加的内存支持,可达到64GB。
· 将UnixWare的功能扩展到OpenServer6。
· 性能的改进
OpenServer6.0.0具有:
· /bin,用于与OpenServer5.0.x相同行为的命令。
· /u95/bin用于标准的命令,例如大文件系统(LFS)支持。
· /udk/bin用于UnixWare 7.1.4中相同的命令,默认是LFS支持。
下面是在OpenServer6上设置PATH的指导。如果用户想使用传统的OpenServer5.0.x,则路径应当首先为/bin。如果用户需要LFS支持,则 路径应当为/u95/bin:/bin。如果用户首选UnixWare 7支持,则路径应为/udk/bin:/u95/bin:/bin:。
我们建议使用最新的MySQL产品发布。
我们可以在OpenServer 6.0.x用下面的configure命令编译MySQL:
CC="cc" CFLAGS="-I/usr/local/include" \CXX="CC" CXXFLAGS="-I/usr/local/include" \./configure --prefix=/usr/local/mysql \ --enable-thread-safe-client --with-berkeley-db=./bdb \ --with-innodb --with-openssl --with-extra-charsets=complex \ --enable-readline
如果你想要使用gcc,必须使用gcc2.95.3或更新版。
CC=gcc CXX=g++ ./configure --prefix=/usr/local/mysql
当构建MySQL时不使用UnixWare 7.1.4或OpenServer 6.0.0中的Berkeley DB版本。MySQL使用自己的Berkeley DB。用来构建静态和动态库的configure命令在src_directory/bdb/build_unix/中,但是它不在MySQL自己的BDB版本中。工作区如下所示。
1. 按常规配置MySQL。
2. 进入(cd)bdb/build_unix/
3. 将 -p Makefile复制(cp)到Makefile.sav
4. 使用同样的选项并运行../dist/configure。
5. 运行gmake。
6. cp -p Makefile.sav Makefile
7. 进入顶级源目录并运行gmake。
允许生成共享和动态库并工作。OpenServer6.0.0 还需要MySQL源码树的补丁和适用于bdb/dist/config.guess的config.guess的补丁。你可以从和下载补丁。有一个README文件可以提供帮助。
SCO在提供了OpenServer6的操作系统补丁。
SCO在ftp://ftp.sco.com/pub/security/OpenServer提供关于安全修复的信息。
默认情况,在OpenServer6.0.0系统的最大文件大小为1TB。一些操作系统工具的限制是2GB。在UnixWare 7中最大文件大小可以是1TB(用 VXFS或HTFS)。
默认情况,/etc/conf/cf.d/mtune中的条目设置为:
Value Default Min Max----- ------- --- ---SVMMLIM 0x9000000 0x1000000 0x7FFFFFFFHVMMLIM 0x9000000 0x1000000 0x7FFFFFFFSSTKLIM 0x1000000 0x2000 0x7FFFFFFFHSTKLIM 0x1000000 0x2000 0x7FFFFFFF
我们建议将这些值设置为:
SDATLIM 0x7FFFFFFFHDATLIM 0x7FFFFFFFSSTKLIM 0x7FFFFFFFHSTKLIM 0x7FFFFFFFSVMMLIM 0x7FFFFFFFHVMMLIM 0x7FFFFFFFSFNOLIM 2048HFNOLIM 2048
我们建议对该系统进行调节,但是使用的正确参数值取决于访问应用程序或数据库的用户数目和数据库空间(也就是使用的缓冲池)。下面的项影响/etc/conf/cf.d/stune中定义的内核参数:
SHMMAX(推荐设定值:128MB)和SHMSEG(推荐设定值:15)。这些参数影响创建用户缓冲池的MySQL数据库引擎。
SFNOLIM和HFNOLIM至少应达到2048。
NPROC至少应当设置到3000/4000(取决于用户数)。
建议使用下面的公式来计算SEMMSL、SEMMNS和SEMMNU的值:
SEMMSL = 13
发现13最适合进程和MySQL。
SEMMNS = SEMMSL * 系统上运行的db服务器数目。
将SEMMNS设置为SEMMSL值乘以你在该系统上一次运行的db服务器的(最大)数目。
SEMMNU = SEMMNS
将SEMMNU值设置为等于SEMMNS值。可以将该值设置为75%的SEMMNS,但是这是一个保守的估计。
SET EMXOPT=-c -n -h1024
如果不这样做,将可能碰到下列错误:
File 'xxxx' not found (Errcode: 24)`
当OS/2 Warp 3上使用MySQL时,要求FixPack 29或以上版本。用OS/2 Wrap 4,要求FixPack 4或以上版本。这是Pthreads库的一个要求。MySQL必须安装在支持长文件名的一个分区上,如HPFS、FAT32等等。
“INSTALL.CMD”脚本必须从OS/2自己的“CMD.EXE”运行并且不能工作在替代外壳如“4OS2.EXE”。
“scripts/mysql-install-db”脚本已经被重新命名了:它称为“install.cmd”并且是一个REXX脚本,将安装 默认的MySQL安全配置并为MySQL创建WorkPlace Shell图标。
动态模块支持通过编译但没有充分测试,动态模块应该使用Pthreads运行时刻库编译。
gcc -Zdll -Zmt -Zcrtdll=pthrdrtl -I../include -I../regex -I.. \ -o example udf_example.cc -L../lib -lmysqlclient udf_example.defmv example.dll example.udf
注释:由于OS/2的限制,UDF模块名字的词干不能超过8个字符。模块存储在“/mysql2/udf”目录;safe-mysqld.cmd脚本将把这个目录放在BEGINLIBPATH环境变量中。当使用UDF模块时,指定的扩展名被忽略--它被假定为“.udf”。例如,在 Unix上,共享模块可能被命名为“example.so”并且可以象这样从它装载函数:
mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME 'example.so';
在OS/2中, 模块被命名为example.udf,但是不能指定模块扩展名:
mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME 'example';
Perl对MySQL的支持借助DBI/DBD客户端接口。接口要求Perl 5.6.0或以后版本。如果你的Perl版本更旧,接口将不能工作。
如果想要在Perl DBI中使用事务,需要有1.2216版或更新版DBD::mysql。建议使用2.9003版或更新版。
如果你使用MySQL 4.1客户端库,必须使用DBD::mysql 2.9003或更新版。
MySQL分发版不包含Perl支持。可以从获得Unix需要的模块,或在Windows中使用ActiveState ppm程序。以下章节描述了如何做。
如果你想要运行MySQL基准脚本,必须安装Perl支持。请参见7.1.4节,“MySQL基准套件”。
MySQL Perl支持也要求你安装了MySQL客户端编程支持(库和头文件)。大多数安装中安装了必要的文件。但是,如果你在Linux中从RPM文件安装MySQL,确保安装了开发者RPM。客户端程序在客户端RPM中,但是客户端编程支持在开发者RPM。
如果你想要安装Perl支持,需要的文件能从的CPAN (Comprehensive Perl Archive Network)获得。
在Unix中安装Perl模块最简单的方法是使用CPAN模块。例如:
shell> perl -MCPAN -e shell
cpan> install DBIcpan> install DBD::mysql
DBD::mysql安装运行许多测试。测试中使用默认用户名和密码尝试连接本地MySQL服务器。(默认用户名是Unix中的登录名和Windows中的ODBC。默认密码“没有密码。”) 如果你不能通过这些值连接服务器 (例如,如果你的账户有密码),测试失败。可以使用force install DBD::mysql忽略失败的测试。
DBI需要Data::Dumper模块。应该可以安装;如果不能,应当在安装DBI前安装Data::Dumper模块。
还可以下载tar文件压缩格式的模块分发版,并手动构建模块。例如,解压缩和构建DBI分发版的过程为:
1. 将分发版解压缩到当前目录:
2. shell> gunzip < DBI-VERSION.tar.gz | tar xvf -
该命令创建目录 DBI-VERSION。
3. 进入解压缩分发版的顶级目录:
4. shell> cd DBI-VERSION
5. 构建分发版并编译:
6. shell> perl Makefile.PL
7. shell> make
8. shell> make test
9. shell> make install
make test命令很重要,因为它验证模块正在工作。注意:在你DBD::mysql安装期间运行该命令试验接口代码时,MySQL服务器必须正在运行,否则测试将失败。
无论何时你安装一个新版本的MySQL,重建并且重新安装DBD::mysql分发版是一个好主意, 特别是在升级MySQL后,观察所有异常,如DBI脚本失败。
如果你没有权限在系统目录下安装Perl模块,或如果你安装本地Perl模块,下列参考书可以帮助你:
在标题“Installing New Modules that Require Locally Installed Modules”下面查找。
在Windows中,应当按照以下步骤安装带ActiveState Perl的MySQL DBD模块:
· 从获得ActiveState Perl并安装。
· 打开控制台窗口(“DOS窗口)。
· 如果需要,设置HTTP_proxy变量。例如,你可以试试:
· set HTTP_proxy=my.proxy.com:3128
· 启动PPM程序:
· C:\> C:\perl\bin\ppm.pl
· 如果你还没有安装DBI,则安装:
· ppm> install DBI
· 如果成功,运行下面的命令:
· install\
· ftp://ftp.de.uu.net/pub/CPAN/authors/id/JWIED/DBD-mysql-1.2212.x86.ppd
该进程应当在ActiveState Perl 5.6或更新版本中工作。
如果你不能使上述步骤工作,应该安装MyODBC驱动程序并且通过ODBC连接MySQL服务器:
use DBI;$dbh= DBI->connect("DBI:ODBC:$dsn",$user,$password) ||die "Got error $DBI::errstr when connecting to $dsn\n";
如果Perl报告它不能发现../mysql/mysql.so模块,可能试因为Perl不能定位共享库libmysqlclient.so。
可以使用下面的方法修复该问题:
· 用perl Makefile.PL -static -config而不要用perl Makefile.PL编译DBD::mysql分发版。
· 将libmysqlclient.so复制到其它共享库所在的目录 (可能为/usr/lib 或/lib)。
· 修改用来编译DBD::mysql的-L选项,反应libmysqlclient.so的实际位置。
· 在Linux中,你可以将libmysqlclient.so的目录路径名增加到/etc/ld.so.conf文件。
· 将libmysqlclient.so的目录路径名增加到LD_RUN_PATH环境变量。一些系统使用LD_LIBRARY_PATH。
注意如果连接器没有找到另一个库,你还可能需要修改-L选项。例如,如果因为libc在/lib下并且连接命令指定了-L/usr/lib,连接器不能找到它,将-L选项更改为-L/lib或在连接命令中增加-L/lib。
如果你遇到下面的DBD::mysql错误,你可能使用了gcc(或使用了用gcc编译的旧的二进制):
/usr/bin/perl: can't resolve symbol '__moddi3'/usr/bin/perl: can't resolve symbol '__divdi3'
当构建mysql.so库是在连接命令中增加-L/usr/lib/gcc-lib/... -lgcc(当编译Perl客户端时检查生成mysql.so的make的输出)。-L选项应指定libgcc.a在系统中的安装目录的路径名。
该问题的另一个原因是Perl和MySQL没有用gcc编译。在这种情况下,你可以用gcc编译二者来解决。
当你运行测试时你会从DBD::mysql看见下面的错误:
t/00base............install_driver(mysql) failed:Can't load '../blib/arch/auto/DBD/mysql/mysql.so' for module DBD::mysql:../blib/arch/auto/DBD/mysql/mysql.so: undefined symbol:uncompress at /usr/lib/perl5/5.00503/i586-linux/DynaLoader.pm line 169.
这意味着你需要在连接行包括-lz 压缩库。可以通过更改文件lib/DBD/mysql/Install.pm的下列行来实现:
$sysliblist .= " -lm";
更改为:
$sysliblist .= " -lm -lz";
然后,你必须运行make realclean 然后重新安装。
如果你想要在SCO上安装DBI,需要在DBI-xxx 和每个子目录中编辑Makefile。请注意下面的更新假定使用gcc 2.95.2或更新版:
旧: 新:
CC = cc CC = gccCCCDLFLAGS = -KPIC -W1,-Bexport CCCDLFLAGS = -fpicCCDLFLAGS = -wl,-Bexport CCDLFLAGS = LD = ld LD = gcc -G -fpicLDDLFLAGS = -G -L/usr/local/lib LDDLFLAGS = -L/usr/local/libLDFLAGS = -belf -L/usr/local/lib LDFLAGS = -L/usr/local/lib LD = ld LD = gcc -G -fpicOPTIMISE = -Od OPTIMISE = -O1 旧:CCCFLAGS = -belf -dy -w0 -U M_XENIX -DPERL_SCO5 -I/usr/local/include 新:CCFLAGS = -U M_XENIX -DPERL_SCO5 -I/usr/local/include
这些更改是必需的,因为用icc或cc编译的Perl动态装载器不装载DBI模块。
如果你想要在不支持动态链接(例如 SCO)的系统中使用Perl模块,可以生成一个包括DBI和DBD::mysql的静态版本的Perl。方法是生成一个用DBI代码连接的Perl版本,并将它安装到当前Perl的顶级目录。然后构建一个含DBD代码连接的Perl版本并安装。
在SCO中,必须将下面的环境变量设置为:
LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:/usr/progressive/lib
Or:
LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:\ /usr/progressive/lib:/usr/skunk/libLIBPATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:\ /usr/progressive/lib:/usr/skunk/libMANPATH=scohelp:/usr/man:/usr/local1/man:/usr/local/man:\ /usr/skunk/man:
首先,在DBD分发版的安装目录运行下述命令来创建一个包括静态连接的DBD模块的Perl:
shell> perl Makefile.PL -static -config
shell> make
shell> make install
shell> make perl
然后必须安装新的Perl。make perl的输出表示安装时需要执行的make命令。在SCO中,为make -f Makefile.aperl inst_perl MAP_TARGET=perl。
然后,使用刚刚创建的Perl,在DBD::mysql分发版的安装目录运行下述命令来创建另一个Perl,应包括静态连接的DBD::mysql:
shell> perl Makefile.PL -static -config
shell> make
shell> make install
shell> make perl
最后,应当安装新的Perl。make perl的输出指示了使用的命令。
这是MySQL参考手册的翻译版本,关于MySQL参考手册,请访问dev.mysql.com.。原始参考手册为英文版,与英文版参考手册相比,本翻译版可能不是最新的。