文档主页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  初始化数据目录

2.9.1 初始化数据目录

安装 MySQL 后,必须初始化数据目录,包括 mysql 系统模式中的表。

  • 对于某些 MySQL 安装方法,数据目录初始化是自动的,如 第 2.9 节 “安装后设置和测试” 中所述。

  • 对于其他安装方法,您必须手动初始化数据目录。这些方法包括从 Unix 和类 Unix 系统上的通用二进制文件和源代码发行版安装,以及从 Windows 上的 ZIP 存档包安装。

本节介绍如何为数据目录初始化不是自动的 MySQL 安装方法手动初始化数据目录。有关一些建议的命令,这些命令可用于测试服务器是否可访问和正常工作,请参阅 第 2.9.3 节 “测试服务器”

注意

默认的身份验证插件是 caching_sha2_password,并且 'root'@'localhost' 管理帐户默认使用 caching_sha2_password

数据目录初始化概述

在本文档中显示的示例中,服务器旨在以 mysql 登录帐户的用户 ID 运行。如果该帐户不存在,请创建该帐户(请参阅 创建 mysql 用户和组),或者替换您计划用于运行服务器的其他现有登录帐户的名称。

  1. 将位置更改为 MySQL 安装的顶级目录,通常是 /usr/local/mysql(根据您的系统需要调整路径名)。

    cd /usr/local/mysql

    您可以在此目录中找到多个文件和子目录,包括包含服务器的 bin 子目录,以及客户端和实用程序。

  2. secure_file_priv 系统变量将导入和导出操作限制到特定目录。创建一个目录,其位置可以指定为该变量的值。

    mkdir mysql-files

    将目录用户和组所有权授予 mysql 用户和 mysql 组,并适当地设置目录权限。

    chown mysql:mysql mysql-files
    chmod 750 mysql-files
  3. 使用服务器初始化数据目录,包括包含初始 MySQL 授权表的 mysql 模式,这些表确定允许用户如何连接到服务器。例如:

    bin/mysqld --initialize --user=mysql

    有关该命令的重要信息,尤其是您可能使用的命令选项,请参阅 数据目录初始化过程。有关服务器如何执行初始化的详细信息,请参阅 数据目录初始化期间的服务器操作

    通常,只有在您首次安装 MySQL 后才需要进行数据目录初始化。(对于现有安装的升级,请执行升级过程;请参阅 第 3 章 “升级 MySQL”。)但是,初始化数据目录的命令不会覆盖任何现有的 mysql 模式表,因此在任何情况下运行都是安全的。

  4. 在没有任何选项文件的情况下,服务器将以其默认设置启动。(请参阅 第 7.1.2 节 “服务器配置默认值”。)要显式指定 MySQL 服务器在启动时应使用的选项,请将它们放在选项文件中,例如 /etc/my.cnf/etc/mysql/my.cnf。(请参阅 第 6.2.2.2 节 “使用选项文件”。)例如,您可以使用选项文件来设置 secure_file_priv 系统变量。

  5. 要安排 MySQL 在系统启动时无需手动干预即可启动,请参阅 第 2.9.5 节 “自动启动和停止 MySQL”

  6. 数据目录初始化会在 mysql 模式中创建时区表,但不会填充它们。为此,请使用 第 7.1.15 节 “MySQL 服务器时区支持” 中的说明。

数据目录初始化过程

将位置更改为 MySQL 安装的顶级目录,通常是 /usr/local/mysql(根据您的系统需要调整路径名)。

cd /usr/local/mysql

要初始化数据目录,请使用 --initialize--initialize-insecure 选项调用 mysqld,具体取决于您是希望服务器为 '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 9.0
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 在数据目录初始化序列期间执行以下操作

  1. 服务器按如下方式检查数据目录是否存在

    • 如果数据目录不存在,则服务器会创建它。

    • 如果数据目录存在但不是空的(即,它包含文件或子目录),则服务器会在生成错误消息后退出

      [ERROR] --initialize specified but the data directory exists. Aborting.

      在这种情况下,请删除或重命名数据目录,然后重试。

      如果每个条目的名称都以句点 (.) 开头,则允许现有数据目录非空。

  2. 在数据目录中,服务器会创建 mysql 系统架构及其表,包括数据字典表、授权表、时区表和服务器端帮助表。请参见第 7.3 节 “mysql 系统架构”

  3. 服务器初始化管理 InnoDB 表所需的 系统表空间 和相关数据结构。

    注意

    mysqld 设置 InnoDB 系统表空间 后,对表空间特性的某些更改需要设置全新的 实例。符合条件的更改包括系统表空间中第一个文件的名称以及撤消日志的数量。如果您不想使用默认值,请确保在运行 mysqld 之前 在 MySQL 配置文件 中设置 innodb_data_file_pathinnodb_log_file_size 配置参数。还要确保根据需要指定其他影响 InnoDB 文件创建和位置的参数,例如 innodb_data_home_dirinnodb_log_group_home_dir

    如果您的配置文件中包含这些选项,但该文件不在 MySQL 默认读取的位置,请在运行 mysqld 时使用 --defaults-extra-file 选项指定文件位置。

  4. 服务器会创建一个 '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 密码分配

  5. 服务器填充用于 HELP 语句的服务器端帮助表(请参见第 15.8.3 节 “HELP 语句”)。服务器不会填充时区表。要手动执行此操作,请参见第 7.1.15 节 “MySQL 服务器时区支持”

  6. 如果已给出 init_file 系统变量来命名 SQL 语句文件,则服务器会执行该文件中的语句。此选项使您能够执行自定义引导序列。

    当服务器在引导模式下运行时,某些功能不可用,这限制了文件中允许的语句。这些语句包括与帐户管理(例如 CREATE USERGRANT)、复制和全局事务标识符相关的语句。

  7. 服务器退出。

初始化后 root 密码分配

使用 --initialize--initialize-insecure 启动服务器来初始化数据目录后,请正常启动服务器(即,不使用这两个选项中的任何一个),并为 'root'@'localhost' 帐户分配一个新密码

  1. 启动服务器。有关说明,请参见第 2.9.2 节 “启动服务器”

  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
  3. 连接后,使用 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=::1root 身份连接,请创建以下帐户

CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY 'root-password';
CREATE USER 'root'@'::1' IDENTIFIED BY 'root-password';

可以将这些语句放在一个文件中,以便使用 init_file 系统变量执行,如数据目录初始化期间的服务器操作 中所述。