Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Initializing the Data Directory

2.9.1 数据目录初始化

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

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

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

本节描述了如何手动初始化数据目录,以便于 MySQL 安装方法中数据目录初始化不是自动的。有关服务器是否可访问和正常工作的测试命令,请参阅 第 2.9.3 节,“测试服务器”

Note

默认身份验证插件是 caching_sha2_password,并且 'root'@'localhost' 管理账户默认使用 caching_sha2_password。在 MySQL 8.0 之前,默认身份验证插件是 mysql_native_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. 如果您想部署服务器以自动支持安全连接,请使用 mysql_ssl_rsa_setup 实用程序创建默认的 SSL 和 RSA 文件:

    bin/mysql_ssl_rsa_setup

    有关更多信息,请参阅 第 6.4.3 节,“mysql_ssl_rsa_setup — 创建 SSL/RSA 文件”

    Note

    实用程序 mysql_ssl_rsa_setup 已弃用。

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

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

  7. 数据目录初始化在 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 密码分配

Note

服务器将任何消息(包括初始密码)写入标准错误输出。这可能会重定向到错误日志,因此如果您没有在屏幕上看到消息,请查看错误日志。有关错误日志的信息,包括其位置,请参阅 第 7.4.2 节,“错误日志”

在 Windows 上,使用 --console 选项将消息定向到控制台。

在 Unix 和类 Unix 系统上,对数据库目录和文件的所有权非常重要,以便服务器在以后运行时拥有读取和写入访问权限。为确保这一点,请以系统 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
Note

数据目录初始化可能会失败,如果缺少必需的系统库。例如,您可能会看到类似这样的错误:

bin/mysqld: error while loading shared libraries:
libnuma.so.1: cannot open shared object file:
No such file or directory

如果发生这种情况,您必须手动安装缺少的库或使用系统的包管理器。然后,重新尝试数据目录初始化命令。

可能需要指定其他选项,例如 --basedir--datadir,如果 mysqld 无法确定安装目录或数据目录的正确位置。例如(在一行中输入命令):

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.3
datadir=D:\\MySQLdata

然后,按照以下方式调用 mysqld(再次输入单行命令,以 --defaults-file 选项开头):

bin\mysqld --defaults-file=C:\my.ini
   --initialize --console
Important

在初始化数据目录时,不应指定除设置目录位置的选项外,如 --basedir--datadir,以及可能需要的 --user 选项。在初始化后重新启动服务器时,可以设置其他选项。请参阅 --initialize 选项的描述以获取更多信息。

服务器在数据目录初始化期间的操作

当使用 --initialize--initialize-insecure 选项调用 mysqld 时,服务器在数据目录初始化序列中执行以下操作:

  1. 服务器按照以下方式检查数据目录的存在:

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

    • 如果数据目录存在但不为空(即包含文件或子目录),服务器将在产生错误消息后退出:

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

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

      如果数据目录存在且不为空,但每个条目的名称以点(.)开头,则允许数据目录非空。

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

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

    Note

    mysqld 设置 InnoDB 系统表空间 后,一些更改表空间特征需要设置一个全新的 实例。这些更改包括系统表空间的第一个文件名和撤销日志的数量。如果您不想使用默认值,请确保 innodb_data_file_pathinnodb_log_file_size 配置参数在 MySQL 配置文件 中设置在 mysqld 运行之前。同时,确保指定其他影响 InnoDB 文件创建和位置的参数,如 innodb_data_home_dirinnodb_log_group_home_dir

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

  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 帐户”

Note

尝试连接到主机127.0.0.1通常会解析为localhost账户。但是,如果服务器以skip_name_resolve启用方式运行,这将失败。如果您计划这样做,请确保存在可以接受连接的账户。例如,要能够以root身份使用--host=127.0.0.1--host=::1连接,创建这些账户:

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

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