2.9.2. Unix下安装后的过程

Unix上安装MySQL后,需要初始化 授权表、启动服务器,并确保服务器工作正常。你还要让服务器随系统的启动和停止自动启动和停止。应当为授权表中的账户指定密码。

Unix中,由mysql_install_db设置 授权表。在某些安装中,该程序自动运行:

·         如果你使用RPM分发版在Linux上安装MySQL,服务器RPM运行mysql_install_db

·         如果你使用PKG分发版在Mac OS X上安装MySQL,安装器运行mysql_install_db

否则,你需要自己运行mysql_install_db

下面的过程描述了如何初始化授权表 (如果还没有初始化)并启动服务器。还推荐了一些你可以用来测试服务器是否可以访问以及是否工作正确的命令。关于自动启动和停止服务器的信息,参见2.9.2.2节,“自动启动和停止MySQL”

你完成过程并让服务器运行后,你应当为mysql_install_db创建的账户指定密码。2.9.3节,“使初始MySQL账户安全”中列出了相关说明。

在本节的例子中,服务器用MySQL登录账户的用户ID运行。假定存在这样的账户。如果不存在,要么创建账户,或用其它已有的用来运行服务器的登录账户来替代。

1.    进入MySQL的顶级安装目录,此处为BASEDIR

2.            shell> cd BASEDIR

BASEDIR可能为/usr/local/mysql /usr/local。以下步骤假定你位于该目录。

3.    根据需要,运行mysql_install_db 程序设置含有确定如何让用户连接服务器的权限的初始MySQL授权表。如果你使用的分发版类型不能运行程序,你需要执行该步骤。

典型,只有首次安装MySQL时,才需要运行mysql_install_db,因此如果你升级已有的安装你可以跳过该步骤,但mysql_install_db不会覆盖已有的 授权表,因此可以在任何环境下安全运行。

要想初始化授权表,根据mysql_install_db是位于bin还是scripts目录下,使用下面的一个命令:

shell> bin/mysql_install_db --user=mysql
shell> scripts/mysql_install_db --user=mysql

mysql_install_db脚本创建数据目录、拥有所有数据库权限的mysql数据库和可以用来测试MySQLtest数据库。脚本为root账户和匿名用户账户创建 授权表条目。账户一开始没有密码。2.9.3节,“使初始MySQL账户安全”中描述了初始权限。简单说,这些权限允许MySQL root用户执行任何操作,允许任何人使用test名创建或使用数据库或用test_启动。

一定要确保由mysql登录账户拥有数据库目录和文件,以便在以后运行时 服务器具有读、写访问权限。为此,如果你用root用户运行mysql_install_db,应当使用--user选项。否则,当以mysql登录时,应当执行脚本,你可以省略命令中的--user选项。

mysql_install_dbmysql数据库中创建几个表,包括userdbhosttables_privcolumns_privfunc以及其它。5.7节,“MySQL访问权限系统”中有完整的列表和描述。

如果你不想要test数据库,启动服务器后,可以用mysqladmin -u root drop test卸掉。

如果有mysql_install_db相关问题,参见2.9.2.1节,“与运行mysql_install_db有关的问题

有一些选择运行mysql_install_db脚本,正如MySQL分发版中所提供的:

·         如果想让初始权限与标准默认值不同,你可以在运行前修改mysql_install_db。然而,最好是在设置 授权表后使用GRANTREVOKE来更改权限。换句话说,你可以运行mysql_install_db,然后通过MySQL root用户使用mysql -u rootMySQL来连接服务器,以便发出GRANTREVOKE命令。

如果你想要在几个机器上用相同的权限安装MySQL,可以将GRANTREVOKE语句放入一个文件中,以脚本方式执行文件,运行mysql_install_db之后使用mysql。例如:

shell> bin/ mysql_install_db --user=mysql
shell> bin/mysql -u root < your_script_file
 

这样,你就可以避免在每台机器上手动发出命令。

·         完全可以重新创建授权表。如果你刚刚知道如何使用GRANTREVOKE并且运行mysql_install_db 之后进行了许多修改,想要关闭表重新启动,你可能想要这样操作。

要想重新创建授权表,从含有MySQL数据库的目录中移走所有 .frm.MYI.MYD文件。(这是数据目录下面的mysql目录,当你运行mysqld --help 时,列为datadir)。然后再次运行mysql_install_db 脚本。

·         可以使用--skip-grant-tables选项手动启动mysqld,并使用mysql自己增加权限信息:

·                      shell> bin/mysqld_safe --user=mysql --skip-grant-tables &
·                      shell> bin/mysql mysql

手动从mysql执行mysql_install_db中的SQL命令。确保后面钥运行mysqladmin flush-privilegesmysqladmin reload,让服务器重载授权表。

请注意不使用mysql_install_db,不仅需要手动安装授权表,还需要先创建。

4.    启动MySQL服务器:

5.                     shell> bin/mysqld_safe --user=mysql &

一定要让MySQL服务器使用非权限(non-root) 登录账户运行。为此,如果你以系统root运行mysql_safe,应当使用--user选项。否则,你应当用mysql登录到系统来执行脚本,这样可以省略命令中的--user选项。

A.3.2节,“如何以普通用户身份运行MySQL”中给出了非特权用户运行MySQL的说明。

如果在执行该步前你忘记了创建授权表,当你启动服务器时,在错误日志文件中将出现下面的消息:

mysqld: Can't find file: 'host.frm'

如果启动服务器时遇到其它问题,查阅2.9.2.3节,“启动MySQL服务器以及其故障诊断和排除”

6.    使用mysqladmin验证服务器在运行中。以下命令提供了简单的测试,可检查服务器是否已经启动并能响应连接:

7.            shell> bin/mysqladmin version
8.            shell> bin/mysqladmin variables

 mysqladmin version的输出根据平台和MySQL版本的不同而稍有变化,但是应当类似于:

shell> bin/mysqladmin version
mysqladmin  Ver 8.41 Distrib 5.1.2-alpha, for pc-linux-gnu on i686
Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license
 
Server version          5.1.2-alpha-Max
Protocol version        10
Connection              Localhost via UNIX socket
UNIX socket             /var/lib/mysql/mysql.sock
Uptime:                 14 days 5 hours 5 min 21 sec
 
Threads: 1  Questions: 366  Slow queries: 0  
Opens: 0  Flush tables: 1  Open tables: 19  
Queries per second avg: 0.000
 

要想看还可以怎样使用mysqladmin,用-- help选项调用它。

9.    验证可以关闭服务器:

10.        shell> bin/mysqladmin -u root shutdown

11.验证是否可以重启服务器。可以直接使用mysqld_safe或调用mysqld。例如:

12.        shell> bin/mysqld_safe --user=mysql --log &

如果mysqld_safe失败,参见2.9.2.3节,“启动MySQL服务器以及其故障诊断和排除”

13.进行一些简单的测试,验证你可以从服务器查询信息。输出应当类似于:

14.        shell> bin/mysqlshow
15.        +-----------+
16.        | Databases |
17.        +-----------+
18.        | mysql     |
19.        | test      |
20.        +-----------+
21.         
22.        shell> bin/mysqlshow mysql
23.        Database: mysql
24.        +---------------------------+
25.        |          Tables           |
26.        +---------------------------+
27.        | columns_priv              |
28.        | db                        |
29.        | func                      |
30.        | help_category             |
31.        | help_keyword              |
32.        | help_relation             |
33.        | help_topic                |
34.        | host                      |
35.        | proc                      |
36.        | procs_priv                |
37.        | tables_priv               |
38.        | time_zone                 |
39.        | time_zone_leap_second     |
40.        | time_zone_name            |
41.        | time_zone_transition      |
42.        | time_zone_transition_type |
43.        | user                      |
44.        +---------------------------+
45.         
46.        shell> bin/mysql -e "SELECT Host,Db,User FROM db" mysql
47.        +------+--------+------+
48.        | host | db     | user |
49.        +------+--------+------+
50.        | %    | test   |      |
51.        | %    | test_% |      |
52.        +------+--------+------+

53.sql-bench目录(MySQL安装目录下)中有一个基准套件,可以用来比较MySQL在不同平台上的执行情况。基准套件在Perl中编写。它使用Perl DBI模块来为各种数据库提供一个与数据库无关的接口,并且还需要其它Perl模块来运行基准套件。必须安装以下模块:

54.        DBI
55.        DBD::mysql
56.        Data::Dumper
57.        Data::ShowTable

可以从CPAN(http://www.cpan.org/)获得这些模块。请参见2.13.1节,“在Unix中安装Perl”

 sql-bench/Results目录包含了在不同数据库和平台上的各种运行结果。要想进行测试,执行命令:

shell> cd sql-bench
shell> perl run-all-tests

如果没有sql-bench目录,你可能使用RPM文件安装了MySQL,没有使用源码RPM(源码RPM包括sql-bench benchmark目录)此时,必须先安装基准套件后才能使用。有一个单独的mysql-bench-VERSION-i386.rpm基准RPM文件,其中包含了基准代码和数据。

如果你有源码分发版,其tests子目录中也有一些测试可供运行。例如,要运行auto_increment.tst,从源码分发版的顶级目录执行该命令:

shell> mysql -vvf test < ./tests/auto_increment.tst

期望的结果被显示在 ./tests/auto_increment.res文件中。

58.至此,你应当可以运行服务器了。然而,初始MySQL账户均没有密码,因此应当使用2.9.3节,“使初始MySQL账户安全”中的说明来指定密码。

MySQL 5.1安装过程在MySQL数据库中创建时区表。但是,必须手动装载表。相关说明参见5.10.8节,“MySQL服务器时区支持”

2.9.2.1. 与运行mysql_install_db有关的问题

mysql_install_db 脚本的目的是生成新的MySQL授权表。它不覆盖已有的MySQL授权表,并且它不影响任何其它数据。

如果你想要重新创建授权表,首先停止mysqld服务器(如果它正运行)。然后重新命名数据目录下的MySQL目录并保存,然后运行mysql_install_db。例如:

shell> mv mysql-data-directory/mysql mysql-data-directory/mysql-old
shell> mysql_install_db --user=mysql

本节列出了运行mysql_install_db时你可能遇到的问题:

·         mysql_install_db fails to install the grant tables

你会发现mysql_install_db不能安装 授权表,显示下面的消息后终止:

Starting mysqld daemon with databases from XXXXXX
mysqld ended

在这种情况下,你应该很小心地检验日志文件!日志文件应该位于目录XXXXXX,用错误消息命名,并且应该指出为什么mysqld没启动。如果你不理解发生的事情,邮寄一份错误报告,包含日志文件!参见1.7.1.3节,“如何通报缺陷和问题”

·         已经有一个amysqld进程在运行

表示服务器在运行,这种情况下可能已经创建了授权表。如果如此,则不再需要运行mysql_install_db,因为只需要运行一次(当你首次安装MySQL)

·         当一个服务器正运行时,安装第二个服务器不工作

这只有在当你已经有已存在的MySQL安装但是想要把新安装放在一个不同的地方时才会发生。例如,你可能已经有了一个产品安装,但为了测试想要同时运行2个安装。通常当你试着运行第二个服务器时,发生的问题是它试图和第一个使用同样的套接字和端口。在这种情况下,你将遇到错误消息:

Can't start server: Bind on TCP/IP port:
Address already in use
Can't start server: Bind on unix socket...

关于设置多个服务器的说明,参见5.12节,“在同一台机器上运行多个MySQL服务器”

·         你没有 /tmp 的写权限

如果你没有写权限在默认位置(/tmp)创建一个Unix套接字文件,或没有在“/tmp创建临时文件的许可,在运行mysql_install_dbmysqld服务器时,你将遇到一个错误。

你可以在开始mysql_install_dbmysqld之前执行以下命令指定一个不同的Unix套接字文件位置和临时目录:

shell> TMPDIR=/some_tmp_dir/
shell> MYSQL_UNIX_PORT=/some_tmp_dir/mysql.sock
shell> export TMPDIR MYSQL_UNIX_PORT

some_tmp_dir应该是你有写许可的某个目录的全路径。

然后,你应当能够用这些命令运行mysql_install_db并启动服务器:

shell> bin/mysql_install_db --user=mysql
shell> bin/mysqld_safe --user=mysql &

如果mysql_install_db位于scripts目录下,首先修改命令scripts/mysql_install_db

参见A.4.5节,“如何保护或更改MySQL套接字文件/tmp/mysql.sock。请参见附录F:环境变量

2.9.2.2. 自动启动和停止MySQL

通常你可以用以下方法启动mysqld服务器:

·         直接调用mysqld。该方法适合任何平台。

·         作为Windows服务运行MySQL服务器。可以在支持服务的Windows版本(例如 NT2000XP2003)上实现。可以将服务设置为在Windows 启动时自动启动服务器,或根据需要启动的手动服务。相关说明参见2.3.12节,“以Windows服务方式启动MySQL”

·         调用mysqld_safe,可以为mysqld确定正确的选项然后使用这些选项来运行。该脚本适用于基于BSD Unix的系统。请参见5.1.3节,“mysqld_safe:MySQL服务器启动脚本”

·         调用mysql.server。该脚本主要用于使用系统V-style运行目录的系统的启动和关闭,它通常安装到mysql下。mysql.server脚本调用mysqld_safe来启动服务器。请参见5.1.4节,“mysql.server:MySQL服务器启动脚本”

·         你可以在Mac OS X上安装一个单独的MySQL Startup Item安装包来使系统启动时自动启动MySQLStartup Item调用mysql.server来启动服务器。详细介绍参见 2.5节,“在Mac OS X上安装MySQL”

mysql.servermysqld_safe脚本和Mac OS X Startup Item可以用来手动启动服务器,或自动启动系统。mysql.serverStartup Item还可以用来停止服务器。

mysql.server脚本可以被用来启动或停止服务器,通过用startstop参数调用它:

shell> mysql.server start
shell> mysql.server stop

mysql.server启动服务器之前,它把目录改变到MySQL安装目录,然后调用safe_mysqld。如果你想要作为一些特定的用户运行服务器,在/etc/my.cnf选项文件的[mysqld]组增加相应user选项,如本节后面所示。(如果你有在一个非标准的地点安装的二进制分发版,你可能需要编辑mysql.server。修改它,运行safe_mysqld前,cd到正确的目录。注意如果你修改mysql.server,那么某个时候升级MySQL时,你的修改版本将被覆盖,因此你应该做一个你可重新安装的编辑过的版本的拷贝)

mysql.server stop通过向服务器发出一个信号停止它。你可手动执行mysqladmin shutdown关闭服务器。

要想在服务器上自动启动和停止MySQL,应在/etc/rc * 文件中适当的地方增加启动、停止命令。

如果你使用Linux服务器RPM安装软件包(MySQL-server-VERSION.rpm)mysql.server脚本安装在/etc/init.d目录中,名为MySQL。你不需要手动安装它。关于Linux RPM软件包的详细信息参见2.4节,“在Linux下安装MySQL”

一些供应商提供的RPM软件包安装的启动脚本名字不同,例如mysqld

如果从不自动安装mysql.server的源码分发版或二进制分发版格式来安装MySQL,可以手动安装它。可以在MySQL安装目录下或MySQL 源码树的support-files目录中找到脚本。

要想手动安装mysql.server,用名称mysql将它复制到/etc/init.d目录,然后将它变为可执行文件。只需要将位置更改为mysql.serveris所在并执行这些命令的相应目录:

shell> cp mysql.server /etc/init.d/mysql
shell> chmod +x /etc/init.d/mysql

旧的Red Hat系统使用/etc/rc.d/init.d目录,不使用/etc/init.d。相应地调节前面的命令。也可以首先创建指向/etc/rc.d/init.d的符号连接/etc/init.d

shell> cd /etc
shell> ln -s rc.d/init.d .

安装脚本后,用来激活它以便在系统启动时运行所需要的命令取决于你的操作系统。在Linux中,你可以使用chkconfig

shell> chkconfig --addMySQL

在一些Linux系统中,还需要下面的命令来完全激活MySQL脚本:

shell> chkconfig --level 345MySQL on

FreeBSD中,启动脚本通常应当位于/usr/local/etc/rc.d/。手册的rc(8)页内说明只有该目录脚本的基本名匹配*.sh shell文件名模式,脚本才会执行。目录内的其它文件或目录将被忽略掉。换句话说,在FreeBSD中,应当将mysql.server脚本安装为 /usr/local/etc/rc.d/mysql.server.sh以便自动启动。

前面设置的另一种情况是,一些操作系统启动时也使用/etc/rc.local/etc/init.d/boot.local 来启动其它服务。要想使用该方法启动MySQL,你可以在相应启动文件后面追加一条命令:

/bin/sh -c 'cd /usr/local/mysql; ./bin/mysqld_safe --user=mysql &'

对于其它系统,查阅操作系统的文档来查看安装启动脚本的方法。

你也可以在一个全局/etc/my.cnf文件中增加mysql.server的选项。一个典型的“/etc/my.cnf文件可能看起来像这样:

[mysqld]
datadir=/usr/local/mysql/var
socket=/var/tmp/mysql.sock
port=3306
user=mysql
 
[mysql.server]
basedir=/usr/local/mysql

mysql.server脚本使用下列变量:basedirdatadirpid-file。定义后,必须将它们放到选项文件中,不能放到命令行。mysql.server只识别startstop命令行参数。

下面的表显示了服务器和每个启动脚本从选项文件读取哪个选项组:

脚本

选项组

mysqld

[mysqld], [server], [mysqld-major-version]

mysql.server

[mysqld], [mysql.server], [server]

mysqld_safe

[mysqld], [server], [mysqld_safe]

[mysqld-major-version]意味着名为[mysqld-5.0][mysqld-5.1]用于版本为5.0.x5.1.x等的服务器。该特性可以用来指定只被给定发布系列的服务器读取的选项。

为了向后兼容,mysql.server还读取[mysql_server]组,mysqld_safe还读取[safe_mysqld]组。然而,当使用MySQL 5.1时,你应当更新选项文件,使用[mysql.server][mysqld_safe]组。

参见4.3.2节,“使用选项文件”

2.9.2.3. 启动MySQL服务器以及其故障诊断和排除

如果启动服务器时有问题,可以尝试:

·         指定你使用的储存引擎需要的任何特殊选项。

·         确保服务器知道从哪里找到数据目录。

·         确保服务器可以使用数据目录。数据目录和内容的所有权和允许必须设置成服务器可以访问和修改它们。

·         检查错误日志查看服务器为何不启动。

·         验证服务器想要使用的网络接口可用。

一些储存引擎有一些选项可以控制其行为。你可以创建一个my.cnf文件并为计划使用的引擎设置启动选项。如果你将要使用支持事务处理表 (InnoDBBDB)的储存引擎,应确保启动服务器之前按照你的期望对它们进行了配置:

·         如果你正使用InnoDB表,参阅InnoDB-specific启动选项。如果你未指定选项,InnoDB使用默认值作为配置选项。请参见15.2.3节,“InnoDB配置”

·         如果你正使用BDB (Berkeley DB)表,你应当熟悉不同的BDB-specific启动选项。请参见15.5.3节,“BDB启动选项”

mysqld服务器启动时,它进入数据目录。在这里它可以找到数据库并写入日志文件。在Unix中,服务器还在数据目录中写pid(过程 ID)文件。

当编译服务器时确定数据目录。这是服务器默认寻找数据目录的位置。如果数据目录位于系统中的其它位置,服务器不能正确工作。用--verbose--help选项调用mysqld你可以找出默认路径设定值。

如果默认值与你的系统中的MySQL安装布局不匹配,你可以在命令行中为mysqld mysqld_safe指定选项来覆盖它们。你还可以在选项文件中列出选项。

要想明显指定数据目录的位置,使用--datadir选项。一般情况下,你可以告诉mysqld基本目录的位置,MySQL安装在该目录下,并且它在该目录中寻找数据目录。你可以使用--basedir选项来实现。

要想检查指定路径选项的结果,用--verbose--help选项调用mysqld。例如,如果你进入mysqld的安装目录,然后运行下面的命令,它显示启动服务器的结果,基本目录为/usr/local

shell> ./mysqld --basedir=/usr/local --verbose --help

你可以指定其它选项,例如--datadir,但是请注意--verbose--help必须为最后的选项。

一旦你确定了你想要的路径设定值,用--verbose-- help启动服务器。

如果mysqld正在运行,执行下列命令你可以找出它所使用的路径设定值:

shell> mysqladmin variables

或:

shell> mysqladmin -h host_name variables

host_nameMySQL服务器主机的名称。

如果启动mysqld时遇到Errcode 13(意味着Permission denied),这意味着数据目录或其内容的访问权限不允许服务器访问。此时,你需要更改所调用文件和目录的权限,使服务器有权使用它们。你还可以用root启动服务器,但是这样会造成安全问题,应当避免。

Unix中,进入数据目录,检查数据目录和其内容的所有权,确保服务器可以访问。例如,如果数据目录是/usr/local/mysql/var,使用命令:

shell> ls -la /usr/local/mysql/var

如果数据目录或其文件或子目录不属于你运行服务器使用的账户,将所有权改为该账户:

shell> chown R mySQL /usr/local/mysql/var
shell> chgrp R mySQL /usr/local/mysql/var

如果服务器不能正确启动,检查错误日志文件,看看是否可以找到原因。日志文件位于数据目录(Windows中一般为C:\Program Files\MySQL\MySQL Server 5.1\dataUnix二进制分发版为/usr/local/mysql/dataUnix源码分发版为/usr/local/var)。查找数据目录中的host_name.errhost_name.log文件,其中host_name是你的服务器主机名。然后检查文件的最后几行。在Unix中,可以使用tail来显示:

shell> tail host_name.err
shell> tail host_name.log

错误日志包含指示服务器不能启动的信息。例如,你可以看见日志中:

000729 14:50:10  bdb:  Recovery function for LSN 1 27595 failed
000729 14:50:10  bdb:  warning: ./test/t1.db: No such file or directory
000729 14:50:10  Can't init databases

这意味着你没有用--bdb-no-recover选项启动mysqldBerkeley DB恢复数据库时发现其日志文件有一些问题。要想继续,你应当将旧的Berkeley DB 日志文件从数据库目录移到其它地方,以后你可以在那儿检查它们。BDB日志文件以log.0000000001开头,按顺序命名。

如果你运行支持BDB 表的mysqld,mysqld启动时内核崩溃,该可能是由于BDB 恢复日志的问题。此时,你可以尝试用--bdb-no-recover启动mysqld。如果有帮助,你应当从数据目录移走所有BDB日志文件并尝试不用--bdb-no-recover选项重新启动mysqld

如果出现下面的错误,说明其它程序(也许是另一个mysqld服务器)正使用mysqld正试图使用的TCP/IP端口或Unix 套接字文件:

Can't start server: Bind on TCP/IP port: Address already in use
Can't start server: Bind Unix socket...

使用ps来确定是否另有一个mysqld服务器正在运行。如果如此,关闭服务器重新启动mysqld(如果另一个服务器正运行,你的确想要运行多个服务器,你可以在5.12节,“在同一台机器上运行多个MySQL服务器”中发现相关信息)

如果没有其它服务器在运行,尝试执行命令 telnet your-host-name tcp-ip-port-number(默认MySQL端口号是3306然后按两次Enter(回车)键。如果出现telnet: Unable to connect to remote host: Connection refused错误消息,其它程序正使用mysqld试图使用的 TCP/IP端口。你需要跟踪这是哪个程序并禁用它,或让mysqld--port选项帧听其它端口。此时,当通过TCP/IP协议连接服务器时,你还需要为客户端程序指定端口号。

端口不能访问的另一个原因可能是防火墙正运行,阻挡了与它的连接。如果如此,修改防火墙设置允许对该端口的访问。

如果服务器已经启动但是你不能与它连接,你应当确保在/etc/hosts中有下面所示条目:

127.0.0.1       localhost

该问题只发生在没有工作线程库,并且MySQL必须配置为使用MIT-pthreads的系统。

如果你不能启动mysqld,你可以使用--debug选项尝试编写一个跟踪文件来找到问题。请参见E.1.2节,“创建跟踪文件”

关于在Windows安装中排错的详细信息,参见2.3.14节,“在Windows环境下对MySQL安装的故障诊断与排除”

关注编程学问公众号