### 2.10.1 初始化数据目录

MySQL安装后，必须初始化数据目录，包括数据库中的表`mysql`系统架构：

-   对于某些 MySQL 安装方法，数据目录初始化是自动的，如中所述[第 2.10 节，“安装后设置和测试”](postinstallation.html).

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

    本节介绍如何手动初始化数据目录的 MySQL 安装方法，其数据目录初始化不是自动的。有关启用测试服务器是否可访问和正常工作的一些建议命令，请参阅[第 2.10.3 节，“测试服务器”](testing-server.html).

笔记

在 MySQL 8.0 中，默认的身份验证插件已从`mysql_native_password`到`cache_sha2_password`, 和`'根'@'本地主机'`管理帐户使用`cache_sha2_password`默认。如果您更喜欢`根`帐户使用以前的默认身份验证插件（`mysql_native_password`）， 看[缓存\_沙2\_密码和根管理帐户](upgrading-from-previous-series.html#upgrade-caching-sha2-password-root-account).

-   [数据目录初始化概述](data-directory-initialization.html#data-directory-initialization-overview)

-   [数据目录初始化程序](data-directory-initialization.html#data-directory-initialization-procedure)

-   [数据目录初始化期间的服务器操作](data-directory-initialization.html#data-directory-initialization-server-actions)

-   [初始化后根密码分配](data-directory-initialization.html#data-directory-initialization-password-assignment)

#### 数据目录初始化概述

在此处显示的示例中，服务器旨在在`mysql`登录帐户。如果帐户不存在，请创建帐户（请参阅[创建一个mysql用户和组](binary-installation.html#binary-installation-createsysuser))，或替换您计划用于运行服务器的不同现有登录帐户的名称。

[](<>)[](<>)[](<>)

1.  将位置更改为 MySQL 安装的顶级目录，通常是`/usr/local/mysql`（根据需要调整系统的路径名）：

    ```
    cd /usr/local/mysql
    ```

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

2.  这[`secure_file_priv`](server-system-variables.html#sysvar_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
    ```

    有关该命令的重要信息，尤其是您可能使用的命令选项，请参阅[数据目录初始化程序](data-directory-initialization.html#data-directory-initialization-procedure).服务端如何进行初始化，详见[数据目录初始化期间的服务器操作](data-directory-initialization.html#data-directory-initialization-server-actions).

    通常，只有在首次安装 MySQL 之后才需要进行数据目录初始化。（对于现有安装的升级，请执行升级过程；请参阅第 2.11 节，“升级 MySQL”[.) 但是，初始化数据目录的命令不会覆盖任何现有的](upgrading.html)mysql`模式表，因此在任何情况下运行都是安全的。`如果要部署自动支持安全连接的服务器，请使用

4.  mysql[**\_ssl_RSA\_设置创建默认 SSL 和 RSA 文件的实用程序：**](mysql-ssl-rsa-setup.html)有关详细信息，请参阅

    ```
    bin/mysql_ssl_rsa_setup
    ```

    第 4.4.3 节，“mysql[\_ssl_RSA_setup — 创建 SSL/RSA 文件”.](mysql-ssl-rsa-setup.html)在没有任何选项文件的情况下，服务器将以其默认设置启动。

5.  （看[第 5.1.2 节，“服务器配置默认值”](server-configuration-defaults.html).) 要明确指定 MySQL 服务器在启动时应使用的选项，请将它们放在选项文件中，例如`/etc/my.cnf`要么`/etc/mysql/my.cnf`.（看[第 4.2.2.2 节，“使用选项文件”](option-files.html).) 例如，您可以使用选项文件来设置[`secure_file_priv`](server-system-variables.html#sysvar_secure_file_priv)系统变量。

6.  要安排 MySQL 在系统启动时无需人工干预即可启动，请参阅[第 2.10.5 节，“自动启动和停止 MySQL”](automatic-start.html).

7.  数据目录初始化在`mysql`架构但不填充它们。为此，请使用中的说明[第 5.1.15 节，“MySQL 服务器时区支持”](time-zone-support.html).

#### 数据目录初始化程序

将位置更改为 MySQL 安装的顶级目录，通常是`/usr/local/mysql`（根据需要调整系统的路径名）：

```
cd /usr/local/mysql
```

要初始化数据目录，请调用[**mysqld**](mysqld.html)与[`- 初始化`](server-options.html#option_mysqld_initialize)要么[`--初始化不安全`](server-options.html#option_mysqld_initialize-insecure)选项，取决于您是否希望服务器为`'根'@'本地主机'`帐户，或创建没有密码的帐户：

-   采用[`- 初始化`](server-options.html#option_mysqld_initialize)用于“默认安全”安装（即包括生成随机初始`根`密码）。在这种情况下，密码被标记为过期，您必须选择一个新密码。

-   和[`--初始化不安全`](server-options.html#option_mysqld_initialize-insecure)， 不`根`生成密码。这是不安全的；假设您打算在将服务器投入生产使用之前及时为帐户分配密码。

    有关分配新的说明`'根'@'本地主机'`密码，见[初始化后根密码分配](data-directory-initialization.html#data-directory-initialization-password-assignment).

笔记

服务器将任何消息（包括任何初始密码）写入其标准错误输出。这可能会被重定向到错误日志，因此如果您在屏幕上看不到消息，请查看那里。有关错误日志的信息，包括它的位置，请参阅[第 5.4.2 节，“错误日志”](error-log.html).

在 Windows 上，使用[`- 安慰`](server-options.html#option_mysqld_console)将消息定向到控制台的选项。

在 Unix 和类 Unix 系统上，数据库目录和文件由`mysql`登录帐户，以便服务器在您以后运行它时对它们具有读写访问权限。为了确保这一点，开始[**mysqld**](mysqld.html)从系统`根`帐户并包括[`- 用户`](server-options.html#option_mysqld_user)如下所示的选项：

```
bin/mysqld --initialize --user=mysql
bin/mysqld --initialize-insecure --user=mysql
```

或者，执行[**mysqld**](mysqld.html)登录为`mysql`, 在这种情况下你可以省略[`- 用户`](server-options.html#option_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
```

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

可能需要指定其他选项，例如[`--basedir`](server-system-variables.html#sysvar_basedir)要么[`--数据目录`](server-system-variables.html#sysvar_datadir)如果[**mysqld**](mysqld.html)无法识别安装目录或数据目录的正确位置。例如（在一行中输入命令）：

```
bin/mysqld --initialize --user=mysql
  --basedir=/opt/mysql/mysql
  --datadir=/opt/mysql/mysql/data
```

或者，将相关的选项设置放在选项文件中，并将该文件的名称传递给[**mysqld**](mysqld.html).对于 Unix 和类 Unix 系统，假设选项文件名是`/opt/mysql/mysql/etc/my.cnf`.将这些行放入文件中：

```
[mysqld]
basedir=/opt/mysql/mysql
datadir=/opt/mysql/mysql/data
```

然后调用[**mysqld**](mysqld.html)如下（在一行中输入命令[`--defaults 文件`](option-file-options.html#option_general_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.0
datadir=D:\\MySQLdata
```

然后调用[**mysqld**](mysqld.html)如下（在一行中输入命令[`--defaults 文件`](option-file-options.html#option_general_defaults-file)选项第一）：

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

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

笔记

服务器执行的数据目录初始化序列不能替代由服务器执行的操作[**mysql\_安全的\_安装**](mysql-secure-installation.html)和[**mysql_ssl_rsa\_设置**](mysql-ssl-rsa-setup.html).看[第 4.4.2 节，“mysql\_安全的\_安装——提高 MySQL 安装安全”](mysql-secure-installation.html)， 和[第 4.4.3 节，“mysql_ssl_rsa_setup — 创建 SSL/RSA 文件”](mysql-ssl-rsa-setup.html).

当调用[`- 初始化`](server-options.html#option_mysqld_initialize)要么[`--初始化不安全`](server-options.html#option_mysqld_initialize-insecure)选项，[**mysqld**](mysqld.html)在数据目录初始化序列期间执行以下操作：

1.  服务器检查数据目录是否存在，如下所示：

    -   如果不存在数据目录，则服务器创建它。

    -   如果数据目录存在但不为空（即它包含文件或子目录），则服务器在产生错误消息后退出：

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

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

        如果每个条目的名称都以句点 (`.`）。

2.  在数据目录中，服务器创建`mysql`系统模式及其表，包括数据字典表、授权表、时区表和服务器端帮助表。看[第 5.3 节，“mysql 系统架构”](system-schema.html).

3.  服务器初始化[系统表空间](glossary.html#glos_system_tablespace)以及需要管理的相关数据结构[`InnoDB`](innodb-storage-engine.html)表。

    笔记

    后[**mysqld**](mysqld.html)设置`InnoDB` [系统表空间](glossary.html#glos_system_tablespace), 对表空间特性的某些更改需要设置一个全新的[实例](glossary.html#glos_instance).符合条件的更改包括系统表空间中第一个文件的文件名和撤消日志的数量。如果您不想使用默认值，请确保[`innodb_data_file_path`](innodb-parameters.html#sysvar_innodb_data_file_path)和[`innodb_log_file_size`](innodb-parameters.html#sysvar_innodb_log_file_size)配置参数在 MySQL 中就位[配置文件](glossary.html#glos_configuration_file) *前*跑步[**mysqld**](mysqld.html).还要确保根据需要指定影响创建和位置的其他参数`InnoDB`文件，例如[`innodb_data_home_dir`](innodb-parameters.html#sysvar_innodb_data_home_dir)和[`innodb_log_group_home_dir`](innodb-parameters.html#sysvar_innodb_log_group_home_dir).

    如果这些选项在您的配置文件中，但该文件不在 MySQL 默认读取的位置，请使用[`--defaults-额外文件`](server-options.html#option_mysqld_defaults-extra-file)运行时的选项[**mysqld**](mysqld.html).

4.  服务器创建一个`'根'@'本地主机'`超级用户帐户和其他保留帐户（请参阅[第 6.2.9 节，“预留帐户”](reserved-accounts.html)）。部分预留账户被锁定，客户无法使用，但`'根'@'本地主机'`用于管理用途，您应该为其分配密码。

    与密码相关的服务器操作`'根'@'本地主机'`帐户取决于您如何调用它：

    -   和[`- 初始化`](server-options.html#option_mysqld_initialize)但不是[`--初始化不安全`](server-options.html#option_mysqld_initialize-insecure)，服务器生成一个随机密码，将其标记为过期，并写入一条显示密码的消息：

        ```
        [Warning] A temporary password is generated for root@localhost:
        iTag*AfrH5ej
        ```

    -   和[`--初始化不安全`](server-options.html#option_mysqld_initialize-insecure), （无论有无[`- 初始化`](server-options.html#option_mysqld_initialize)因为[`--初始化不安全`](server-options.html#option_mysqld_initialize-insecure)暗示[`- 初始化`](server-options.html#option_mysqld_initialize))，服务器不会生成密码或将其标记为过期，并写入警告消息：

        ```
        [Warning] root@localhost is created with an empty password ! Please
        consider switching off the --initialize-insecure option.
        ```

        有关分配新的说明`'根'@'本地主机'`密码，见[初始化后根密码分配](data-directory-initialization.html#data-directory-initialization-password-assignment).

5.  服务器填充用于[`帮助`](help.html)声明（见[第 13.8.3 节，“帮助声明”](help.html)）。服务器不填充时区表。要手动执行此操作，请参阅[第 5.1.15 节，“MySQL 服务器时区支持”](time-zone-support.html).

6.  如果[`初始化文件`](server-system-variables.html#sysvar_init_file)系统变量被赋予命名 SQL 语句的文件，服务器执行文件中的语句。此选项使您能够执行自定义引导序列。

    当服务器在引导模式下运行时，某些功能不可用，从而限制了文件中允许的语句。其中包括与账户管理相关的声明（例如[`创建用户`](create-user.html)要么[`授予`](grant.html))、复制和全局事务标识符。

7.  服务器退出。

#### 初始化后根密码分配

通过启动服务器初始化数据目录后[`- 初始化`](server-options.html#option_mysqld_initialize)要么[`--初始化不安全`](server-options.html#option_mysqld_initialize-insecure)，正常启动服务器（即，没有这些选项中的任何一个）并分配`'根'@'本地主机'`帐户新密码：

1.  启动服务器。有关说明，请参阅[第 2.10.2 节，“启动服务器”](starting-server.html).

2.  连接到服务器：

    -   如果你用过[`- 初始化`](server-options.html#option_mysqld_initialize)但不是[`--初始化不安全`](server-options.html#option_mysqld_initialize-insecure)初始化数据目录，连接到服务器为`根`：

        ```
        mysql -u root -p
        ```

        然后，在密码提示下，输入服务器在初始化序列期间生成的随机密码：

        ```
        Enter password: (enter the random root password here)
        ```

        如果您不知道此密码，请查看服务器错误日志。

    -   如果你用过[`--初始化不安全`](server-options.html#option_mysqld_initialize-insecure)初始化数据目录，连接到服务器为`根`没有密码：

        ```
        mysql -u root --skip-password
        ```

3.  连接后，使用[`更改用户`](alter-user.html)分配新的声明`根`密码：

    ```
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'root-password';
    ```

    也可以看看[第 2.10.4 节，“保护初始 MySQL 帐户”](default-privileges.html).

笔记

尝试连接到主机`127.0.0.1`通常解决`本地主机`帐户。但是，如果服务器运行时会失败[`跳过名称解析`](server-system-variables.html#sysvar_skip_name_resolve)启用。如果您打算这样做，请确保存在可以接受连接的帐户。例如，能够连接为`根`使用`--主机=127.0.0.1`要么`--主机=::1`，创建这些帐户：

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

可以将这些语句放在一个文件中以使用[`初始化文件`](server-system-variables.html#sysvar_init_file)系统变量，如在[数据目录初始化期间的服务器操作](data-directory-initialization.html#data-directory-initialization-server-actions).
