2.9.2.1 解决启动 MySQL 服务器时出现的问题
本节提供了解决启动服务器的问题的建议。对于 Windows 系统的额外建议,请见第2.3.4节,“Troubleshooting a Microsoft Windows MySQL Server Installation”.
如果您遇到启动服务器的问题,以下是一些您可以尝试的事情:
-
检查错误日志以了解服务器为什么不能启动。日志文件位于数据目录(通常在 Windows 上为
C:\Program Files\MySQL\MySQL Server 8.4\data
,在 Unix/Linux 的二进制分布中为/usr/local/mysql/data
,在 Unix/Linux 的源分布中为/usr/local/var
)。在数据目录中查找以
和host_name
.err
形式命名的文件,其中host_name
.loghost_name
是您的服务器主机名称。然后,检查这些文件的最后几行。使用tail
命令来显示它们:$> tail host_name.err $> tail host_name.log
-
指定存储引擎需要的特殊选项。您可以创建一个
my.cnf
文件并指定要使用的引擎的启动选项。如果您计划使用支持事务表的存储引擎(InnoDB
,NDB
),请确保您已经将它们配置为您想要的方式。如果您使用InnoDB
表,见第17.8节,“InnoDB Configuration”了解指南和第17.14节,“InnoDB Startup Options and System Variables”了解选项语法。虽然存储引擎使用默认值,但 Oracle 建议您查看可用的选项并为任何默认值指定明确的值,以便确保您的安装符合您的需求。
-
确保服务器知道数据目录的位置。服务器
mysqld使用该目录作为当前目录。这是它期望找到数据库的地方也是它期望写日志文件的地方。服务器还将在数据目录中写入pid(进程 ID)文件。
默认数据目录位置是在服务器编译时硬编码的。要确定默认路径设置,可以使用mysqld命令,带有
--verbose
和--help
选项。如果数据目录位于您的系统其他地方,可以使用--datadir
选项来指定mysqld或mysqld_safe命令行或选项文件中。否则,服务器将无法正常工作。作为--datadir
选项的替代方案,可以使用mysqld指定 MySQL 安装目录的基础目录--basedir
,然后mysqld将在该目录下查找data目录。要检查路径选项的效果,可以使用mysqld命令,带有选项和
--verbose
和--help
选项。例如,如果您将目录更改到mysqld安装目录,然后运行以下命令,它将显示使用基础目录/usr/local的效果:$> ./mysqld --basedir=/usr/local --verbose --help
您可以指定其他选项,如
--datadir
,但--verbose
和--help
必须是最后一个选项。一旦确定了路径设置,您可以在不带
--verbose
和--help
选项的情况下启动服务器。如果mysqld当前正在运行,可以使用以下命令来确定当前使用的路径设置:
$> mysqladmin variables
或:
$> mysqladmin -h host_name variables
host_name
是 MySQL 服务器主机的名称。 -
确保服务器可以访问数据目录。数据目录和其内容的所有权和权限必须允许服务器读取和修改它们。
如果您在启动mysqld时收到
Errcode 13
(表示Permission denied
),这意味着数据目录或其内容的权限不允许服务器访问。在这种情况下,您可以改变相关文件和目录的权限,使服务器能够使用它们。您也可以以root
身份启动服务器,但这会引发安全问题并且应该避免。更改到数据目录,并检查数据目录和其内容的所有权,以确保服务器有访问权限。例如,如果数据目录是
/usr/local/mysql/var
,可以使用以下命令:$> ls -la /usr/local/mysql/var
如果数据目录或其文件或子目录不属于您用于运行服务器的登录账户,改变它们的所有权。如果账户名是
mysql
,可以使用以下命令:$> chown -R mysql /usr/local/mysql/var $> chgrp -R mysql /usr/local/mysql/var
即使所有权正确,MySQL也可能无法启动,如果您的系统上运行其他安全软件,用于管理应用程序对文件系统的访问。在这种情况下,您需要重新配置该软件,以便mysqld可以访问它使用的目录。
-
验证服务器想要使用的网络接口是否可用。
如果出现以下错误之一,这意味着其他程序(可能是另一个mysqld服务器)正在使用TCP/IP端口或Unix套接字文件,该mysqld服务器正在尝试使用:
Can't start server: Bind on TCP/IP port: Address already in use Can't start server: Bind on unix socket...
使用ps命令确定是否有另一个mysqld服务器正在运行。如果是,关闭服务器,然后重新启动mysqld。 (如果另一个服务器正在运行,并且您真的想运行多个服务器,可以在Section 7.8, “Running Multiple MySQL Instances on One Machine”中找到相关信息。)
如果没有其他服务器正在运行,请执行命令:
telnet
。(默认MySQL端口号为3306。)然后按下Enter键两次。如果您没有收到错误消息类似于your_host_name
tcp_ip_port_number
telnet: Unable to connect to remote host: Connection refused
,那么其他程序正在使用TCP/IP端口,该mysqld服务器正在尝试使用。跟踪该程序,并将其禁用,或者将mysqld设置为监听不同的端口使用--port
选项。在这种情况下,客户端程序在使用TCP/IP时需要指定相同的非默认端口号。另一个可能的原因是,您可能正在运行防火墙,它阻止了对该端口的连接。如果是这样,请修改防火墙设置,以允许对端口的访问。
如果服务器启动,但是您无法连接到它,请确保您在
/etc/hosts
中有一个类似的条目。127.0.0.1 localhost
-
如果您无法启动 mysqld,请尝试使用
--debug
选项创建一个跟踪文件,以便找到问题。请参阅第7.9.4节,“DBUG 包”。