2.12.4. BSD注意事项

本节提供在各种 BSD Unix中使用 MySQL的相关信息。

2.12.4.1. FreeBSD注意事项

对于运行MySQL,推荐使用FreeBSD 4.x或更新版本,因为其线程包更加完整。要想遇到一个安全、稳定的系统,你应当只使用标记-RELEASEFreeBSD内核。

最容易因此是比较受喜欢的安装方法是使用mysql-servermysql-client移植,可从http://www.freebsd.org得到。

使用这些移植的益处包括:

  • 一个全优化的工作在FreeBSD版本上的MySQL
  • 自动配置和构建。
  • 启动脚本安装在/usr/local/etc/rc.d

·         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中的MySQLLinuxThreads库连接,这样可以避免一些原生FreeBSD线程执行时的问题。为了更好地将LinuxThreads同原生线程进行对比,参见Jeremy Zawodny的文章FreeBSD or Linux for your MySQL Server? 地址:http://jeremy.zawodny.com/blog/archives/000697.html

FreeBSD使用LinuxThreads的已知问题有:

·         连接时间(wait_timeoutinteractive_timeoutnet_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-assembler
gmake
gmake install
cd /usr/local/mysql
bin/mysql_install_db --user=mysql
bin/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.confmysqld用户提高限制并用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" # 1GB
kern.dfldsiz="1073741824" # 1GB
kern.maxssiz="134217728" # 128MB

在旧版本的FreeBSD中,必须重新编译内核,以便更改进程的最大数据段空间。在这种情况下,应当查看LINT配置文件中的MAXDSIZ选项查看更详细的信息。

如果MySQL的当前日期有问题,设置TZ变量将会有帮助。请参见附录F:环境变量

2.12.4.2. NetBSD注意事项

为了在NetBSD上编译,你需要GNU make,否则当make试图在C++文件上运行lint时,编译将失败。

2.12.4.3. OpenBSD 2.5版注意事项

OpenBSD 2.5上,可以用下列选项编译带原生线程的 MySQL
CFLAGS=-pthread CXXFLAGS=-pthread ./configure --with-mit-threads=no

2.12.4.4. BSD/OS 2.x版注意事项

如果在编译MySQL时,遇到下列错误, 说明虚拟内存的ulimit值太低了:

item_func.h: In method
`Item_func_ge::Item_func_ge(const Item_func_ge &)':
item_func.h:28: virtual memory exhausted
make[2]: *** [item_func.o] Error 1

试试使用ulimit -v 80000并再次运行make。如果这还不行并且你正在使用bash,试试换到cshsh;一些BSDI用户报告了使用bashulimit有问题。

如果你正在使用gcc,可能必须为configure使用--with-low-memory标志才能编译“sql_yacc.cc

如果MySQL的当前日期有问题,设置TZ变量将会有帮助。请参见附录F:环境变量

2.12.4.5. BSD/OS 3.x版注意事项

升级到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,试试换到cshsh;一些BSDI用户报告了使用bashulimit会有问题。

2.12.4.6. BSD/OS 4.x版注意事项

BSDI 4.x有一些线程有关的缺陷。如果你想要在这上面使用 MySQL,应该安装所有与线程相关的补丁,至少应该安装 M400-023

在一些 BSDI 4.x系统中,你可能会遇到共享库问题。现象是不能执行任何客户端程序,例如,mysqladmin。在这种情况下,需要重新配置,用disable-shared选项禁用库的共享以便进行配置。

一些客户在BSDI 4.0.1中遇到了严重问题,即mysqld二进制过一会儿不能打开表。这是因为一些库/系统相关错误使mysqld未得到指令便更改了当前目录。

修复方法是升级MySQL到最低3.23.34版或更高版,运行configure后,运行make前删掉config.h中的行#define HAVE_REALPATH

请注意这说明你不能通过符号连接将数据库目录连接到另一个数据库目录,或通过符号连接将表连接到BSDI上的另一个数据库。(可以通过符号连接连接到另一个硬盘)

关注编程学问公众号