安装 MySQL 后,必须初始化数据目录,包括 mysql
系统模式中的表
对于某些 MySQL 安装方法,数据目录初始化是自动的,如 第 2.9 节,“安装后设置和测试” 中所述。
对于其他安装方法,您必须手动初始化数据目录。这包括在 Unix 和类 Unix 系统上从通用二进制文件和源代码发行版安装,以及在 Windows 上从 ZIP 存档包安装。
本节介绍如何手动初始化数据目录,适用于数据目录初始化不是自动的 MySQL 安装方法。有关一些建议的命令,这些命令可以用来测试服务器是否可访问且正常工作,请参见 第 2.9.3 节,“测试服务器”。
默认身份验证插件是 caching_sha2_password
,并且 'root'@'localhost'
管理帐户默认使用 caching_sha2_password
。
mysql_native_password(MySQL 8.0 之前默认的身份验证插件)仍然支持,但在 MySQL 8.4.0 中默认禁用,并在 MySQL 9.0.0 中移除。
在以下示例中,服务器旨在以 mysql
登录帐户的用户 ID 运行。如果帐户不存在,请创建该帐户(参见 创建 mysql 用户和组),或者替换您计划用来运行服务器的其他现有登录帐户的名称。
更改位置到 MySQL 安装的顶级目录,通常是
/usr/local/mysql
(根据需要调整系统上的路径名)cd /usr/local/mysql
在这个目录中,您可以找到几个文件和子目录,包括包含服务器以及客户端和实用程序程序的
bin
子目录。该
secure_file_priv
系统变量将导入和导出操作限制到特定目录。创建一个目录,其位置可以指定为该变量的值mkdir mysql-files
授予目录用户和组所有权给
mysql
用户和mysql
组,并设置目录权限chown mysql:mysql mysql-files chmod 750 mysql-files
使用服务器初始化数据目录,包括包含初始 MySQL 授权表的
mysql
模式,这些授权表决定用户如何被允许连接到服务器。例如bin/mysqld --initialize --user=mysql
有关该命令的重要信息,特别是关于您可能使用的命令选项,请参见 数据目录初始化过程。有关服务器如何执行初始化的详细信息,请参见 数据目录初始化期间的服务器操作。
通常,数据目录初始化只需要在您首次安装 MySQL 后进行。(对于现有安装的升级,请执行升级过程;请参见 第 3 章,升级 MySQL。)但是,初始化数据目录的命令不会覆盖任何现有的
mysql
模式表,因此在任何情况下运行都是安全的。在没有任何选项文件的情况下,服务器将使用其默认设置启动。(参见 第 7.1.2 节,“服务器配置默认值”。)要明确指定 MySQL 服务器在启动时应该使用的选项,请将它们放在选项文件中,例如
/etc/my.cnf
或/etc/mysql/my.cnf
。(参见 第 6.2.2.2 节,“使用选项文件”。)例如,您可以使用选项文件设置secure_file_priv
系统变量。要安排 MySQL 在系统启动时自动启动,请参见 第 2.9.5 节,“自动启动和停止 MySQL”。
数据目录初始化将在
mysql
模式中创建时区表,但不会填充它们。要执行此操作,请使用 第 7.1.15 节,“MySQL 服务器时区支持” 中的说明。
更改位置到 MySQL 安装的顶级目录,通常是 /usr/local/mysql
(根据需要调整系统上的路径名)
cd /usr/local/mysql
要初始化数据目录,请调用 mysqld,使用 --initialize
或 --initialize-insecure
选项,具体取决于您是否希望服务器为 'root'@'localhost'
帐户生成一个随机初始密码,或者创建该帐户时没有密码
使用
--initialize
进行 “默认安全” 安装(即,包括生成一个随机初始root
密码)。在这种情况下,密码被标记为已过期,您必须选择一个新的密码。使用
--initialize-insecure
时,不会生成任何root
密码。这是不安全的;假设您打算在将服务器投入生产使用之前及时为该帐户分配一个密码。
有关分配新 'root'@'localhost'
密码的说明,请参见 初始化后 root 密码分配。
服务器会将所有消息(包括任何初始密码)写入其标准错误输出。 这可能被重定向到错误日志,因此如果您没有在屏幕上看到这些消息,请查看该日志。 有关错误日志的信息(包括其位置),请参见第 7.4.2 节,“错误日志”。
在 Windows 上,使用--console
选项将消息定向到控制台。
在 Unix 和类 Unix 系统上,数据库目录和文件必须由mysql
登录帐户拥有,以便服务器在您稍后运行它时具有对它们的读写访问权限。 为确保这一点,请从系统root
帐户启动mysqld,并包含--user
选项,如下所示
bin/mysqld --initialize --user=mysql
bin/mysqld --initialize-insecure --user=mysql
或者,以mysql
用户身份登录后执行mysqld,在这种情况下,您可以从命令中省略--user
选项。
在 Windows 上,使用以下命令之一
bin\mysqld --initialize --console
bin\mysqld --initialize-insecure --console
如果缺少所需的系统库,数据目录初始化可能会失败。 例如,您可能会看到类似于以下内容的错误
bin/mysqld: error while loading shared libraries:
libnuma.so.1: cannot open shared object file:
No such file or directory
如果发生这种情况,您必须手动或使用系统的软件包管理器安装缺少的库。 然后重试数据目录初始化命令。
如果mysqld 无法识别安装目录或数据目录的正确位置,则可能需要指定其他选项,例如--basedir
或--datadir
。 例如(将命令输入到一行上)
bin/mysqld --initialize --user=mysql
--basedir=/opt/mysql/mysql
--datadir=/opt/mysql/mysql/data
或者,将相关选项设置放入选项文件,并将该文件名称传递给mysqld。 对于 Unix 和类 Unix 系统,假设选项文件名是/opt/mysql/mysql/etc/my.cnf
。 将以下行放入该文件中
[mysqld]
basedir=/opt/mysql/mysql
datadir=/opt/mysql/mysql/data
然后按如下方式调用mysqld(将命令输入到一行上,并将--defaults-file
选项放在最前面)
bin/mysqld --defaults-file=/opt/mysql/mysql/etc/my.cnf
--initialize --user=mysql
在 Windows 上,假设C:\my.ini
包含以下行
[mysqld]
basedir=C:\\Program Files\\MySQL\\MySQL Server 8.4
datadir=D:\\MySQLdata
然后按如下方式调用mysqld(同样,您应该将命令输入到一行上,并将--defaults-file
选项放在最前面)
bin\mysqld --defaults-file=C:\my.ini
--initialize --console
初始化数据目录时,不应指定除用于设置目录位置(如--basedir
或--datadir
)以及--user
选项(如果需要)之外的任何选项。 初始化后重新启动服务器时,可以设置 MySQL 服务器在正常使用期间采用的选项。 有关更多信息,请参见--initialize
选项的说明。
服务器执行的数据目录初始化序列不替代由mysql_secure_installation 执行的操作。
当使用--initialize
或--initialize-insecure
选项调用时,mysqld 在数据目录初始化序列期间执行以下操作
服务器按如下方式检查数据目录是否存在
如果不存在数据目录,服务器将创建它。
如果数据目录存在但不是空的(即,它包含文件或子目录),服务器将在生成错误消息后退出
[ERROR] --initialize specified but the data directory exists. Aborting.
在这种情况下,删除或重命名数据目录,然后重试。
如果每个条目名称都以句点 (
.
) 开头,则允许现有的数据目录非空。
在数据目录中,服务器将创建
mysql
系统模式及其表,包括数据字典表、授权表、时区表和服务器端帮助表。 请参见第 7.3 节,“mysql 系统模式”。服务器将初始化系统表空间 和管理
InnoDB
表所需的相关数据结构。注意在mysqld 设置
InnoDB
系统表空间 之后,对表空间特征的某些更改需要设置一个全新的实例。 符合条件的更改包括系统表空间中第一个文件的文件名和撤消日志的数量。 如果您不想使用默认值,请确保innodb_data_file_path
和innodb_log_file_size
配置参数的设置在运行mysqld 之前 已在 MySQL 配置文件 中到位。 还要确保根据需要指定影响InnoDB
文件创建和位置的其他参数,例如innodb_data_home_dir
和innodb_log_group_home_dir
。如果这些选项在您的配置文件中,但该文件不在 MySQL 默认读取的位置,请在运行mysqld 时,使用
--defaults-extra-file
选项指定文件位置。服务器将创建一个
'root'@'localhost'
超级用户帐户和其他保留帐户(请参见第 8.2.9 节,“保留帐户”)。 一些保留帐户被锁定,客户无法使用它们,但'root'@'localhost'
用于管理目的,您应该为它分配密码。服务器针对
'root'@'localhost'
帐户密码的操作取决于您调用它的方式使用
--initialize
但不使用--initialize-insecure
,服务器将生成随机密码,将其标记为已过期,并写入显示密码的消息[Warning] A temporary password is generated for root@localhost: iTag*AfrH5ej
使用
--initialize-insecure
(无论是否使用--initialize
,因为--initialize-insecure
意味着--initialize
),服务器不会生成密码或将其标记为已过期,并且会写入警告消息[Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
有关分配新
'root'@'localhost'
密码的说明,请参见 初始化后 root 密码分配。服务器将填充用于
HELP
语句(请参见第 15.8.3 节,“HELP 语句”)的服务器端帮助表。 服务器不会填充时区表。 要手动执行此操作,请参见第 7.1.15 节,“MySQL 服务器时区支持”。如果
init_file
系统变量用于命名 SQL 语句文件,服务器将执行文件中的语句。 此选项使您能够执行自定义引导序列。当服务器在引导模式下运行时,某些功能不可用,这限制了文件中允许的语句。 这些包括与帐户管理相关的语句(如
CREATE USER
或GRANT
)、复制和全局事务标识符。服务器退出。
使用--initialize
或--initialize-insecure
启动服务器以初始化数据目录后,以正常方式启动服务器(即,不使用任何一个选项),并为'root'@'localhost'
帐户分配新密码
启动服务器。 有关说明,请参见第 2.9.2 节,“启动服务器”。
连接到服务器
如果您使用
--initialize
但不使用--initialize-insecure
初始化数据目录,请以root
用户身份连接到服务器mysql -u root -p
然后,在密码提示符处,输入服务器在初始化序列期间生成的随机密码
Enter password: (enter the random root password here)
如果您不知道此密码,请查看服务器错误日志。
如果您使用
--initialize-insecure
初始化数据目录,请以root
用户身份连接到服务器,无需密码mysql -u root --skip-password
连接后,使用
ALTER USER
语句分配新的root
密码ALTER USER 'root'@'localhost' IDENTIFIED BY 'root-password';
另请参见第 2.9.4 节,“保护初始 MySQL 帐户”。
尝试连接到主机127.0.0.1
通常会解析到localhost
帐户。 但是,如果服务器使用启用skip_name_resolve
的方式运行,则会失败。 如果您打算这样做,请确保存在一个可以接受连接的帐户。 例如,要能够使用--host=127.0.0.1
或--host=::1
以root
用户身份连接,请创建以下帐户
CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY 'root-password';
CREATE USER 'root'@'::1' IDENTIFIED BY 'root-password';
可以将这些语句放在一个文件中,使用init_file
系统变量执行,如数据目录初始化期间的服务器操作 中所述。