A. 问题和常见错误 / A.3. 与安装有关的事宜

A.3. 与安装有关的事宜

A.3.1. 与MySQL客户端库的链接问题
A.3.2. 如何以普通用户身份运行MySQL
A.3.3. 与文件许可有关的问题

A.3.1. 与MySQL客户端库的链接问题

当你链接到应用程序以使用MySQL客户端库时,可能会遇到以mysql_开始的未定义引用错误,如下所示:

/tmp/ccFKsdPa.o: 在函数`main':
/tmp/ccFKsdPa.o(.text+0xb): `mysql_init'的未定义引用。
/tmp/ccFKsdPa.o(.text+0x31): `mysql_real_connect'的未定义引用。
/tmp/ccFKsdPa.o(.text+0x57): `mysql_real_connect'的未定义引用。
/tmp/ccFKsdPa.o(.text+0x69): `mysql_error'的未定义引用。
/tmp/ccFKsdPa.o(.text+0x9a): `mysql_close'的未定义引用。

通过在链接命令后增加“-Ldir_path -lmysqlclient”选项,应能解决该问题,其中,dir_path代表客户端库所在目录的路径名。要想确定正确的目录,可尝试下述命令:

shell> mysql_config --libs

来自mysql_config的输出可能会指明应在链接命令上指定的其他库。

对于非压缩或压缩函数,如果遇到未定义引用错误,可在链接命令后添加-lz,并再次尝试。

对于应在系统上存在的函数(如connect),如果遇到未定义引用错误,请检查相关函数的手册页,以便确定应在链接命令上增加哪些库。

对于系统上不存在的函数,可能会遇到未定义引用错误,如下所示:

mf_format.o(.text+0x201): `__lxstat'的未定义引用。

它通常意味着你的MySQL客户端库是在与你的系统不100%兼容的系统上编译的。在该情况下,应下载最新的MySQL源码分发版,并自己编译MySQL。请参见2.8节,“使用源码分发版安装MySQL”

当你试图执行MySQL程序时,可能会遇到运行时未定义引用错误。如果这类错误指明了以mysql_开始的符号,或指明未发现mysqlclient,这意味着你的系统无法找到共享的libmysqlclient.so库。对其的更正方式是,通知系统在库所在位置搜索共享库。请使用与系统相适应的下述方法:

·         libmysqlclient.so所在目录的路径添加到LD_LIBRARY_PATH环境变量中。

·         libmysqlclient.so所在目录的路径添加到LD_LIBRARY环境变量中。

·         libmysqlclient.so拷贝到可被系统搜索的目录下,如/lib,然后通过执行ldconfig更新共享库信息。

解决该问题的另一种方法是,以静态方式将你的程序与“-static”选项链接在一起,或在链接代码之前删除动态MySQL库。使用第2种方法之前,应确保没有使用动态库的其它程序。

A.3.2. 如何以普通用户身份运行MySQL

Windows平台上,能够使用普通用户账户以Windows服务方式运行服务器。

Unix平台上,不是任何用户都能启动并运行MySQL服务器mysqld。但是,处于安全方面的原因,应避免以Unix根用户身份运行服务器。要想更改mysqld,使之能以正常的无特权Unix用户user_name身份运行,必须采取下述步骤:

如果服务器正在运行,停止它(使用mysqladmin shutdown)。

更改数据库目录和文件,允许user_name读写其中的文件(可能需要以Unix根用户身份完成这类设置):

shell> chown -R user_name /path/to/mysql/datadir

如果未这样做,当以user_name身份运行时,服务器无法访问数据库或表。

如果MySQL数据目录下的目录或文件采用的是符号链接,还需跟踪这些链接,并更改它们指向的目录和文件。chown –R可帮助你跟踪符号链接。

user_name身份启动服务器。如果你正在使用MySQL 3.22或更高版本,另一种可选方式是,以Unix根用户身份启动mysqld,并使用--user=user_name选项。mysqld启动,然后在接受任何连接前,切换至Unix用户user_name并以该用户身份运行。

要想在系统启动时自动以给定的用户身份启动服务器,可在服务器数据目录下的/etc/my.cnf选项文件或my.cnf选项文件的[mysqld]组中,通过增加用户选项来指定用户名。。例如:

[mysqld]
user=user_name

如果你的Unix机器本身并不安全,应在授权表中为MySQL根账户指定密码。如不然,任何在该机器上具有登录账户的用户都能使用“--user=root”选项运行mysql客户端,并执行任何操作。在任何情况下均应为MySQL账户指定密码,这是个好主意,尤其是在服务器主机上存在其他登录账户时,更是如此。请参见2.9节,“安装后的设置和测试”

A.3.3. 与文件许可有关的问题

如果遇到与文件许可有关的问题,可能数启动mysqldUMASK环境变量设置得不正确。例如,当你创建表时,MySQL可能会发出下述错误消息:

ERROR: 无法找到文件:'path/with/filename.frm' (Errcode: 13)

UMASK的默认值是0660。通过下述方式启动mysqld_safe,可改变该情况:

shell> UMASK=384  # = 600 in octal
shell> export UMASK
shell> mysqld_safe &

在默认情况下,MySQL0700的许可创建数据库和RAID目录。你可以通过设置UMASK_DIR变量更改该行为。如果你设置了它的值,将使用组合的UMASKUMASK_DIR值创建新目录。例如,如果你打算为所有新的目录授予组访问权限,可:

shell> UMASK_DIR=504  # = 770 in octal
shell> export UMASK_DIR
shell> mysqld_safe &

MySQL 3.23.25和更高版本中,如果是以0开始的,MySQL将认为UMASKUMASK_DIR的值均采用八进制形式。

请参见附录F:环境变量