Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

2.9.1 初始化数据目录

安装 MySQL 后,必须初始化数据目录,包括mysql 系统架构中的表:

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

  • 其他安装方法中,必须手动初始化数据目录。这些包括 Unix 和 Unix 类系统上的通用二进制和源代码分布式安装,以及 Windows 上的 ZIP归档包安装。

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

Note

默认身份验证插件是caching_sha2_password,‘root’@‘localhost’ 管理员账户默认使用caching_sha2_password

mysql_native_password(MySQL 8.0 之前默认身份验证插件)仍然支持,但已弃用。

在这里的示例中,服务器计划运行在mysql登录账户下。如果该账户不存在(见创建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 时执行。 (对于升级现有安装,请执行升级过程;见。)然而,初始化数据目录的命令不会覆盖任何现有的 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

初始化数据目录,使用mysqld命令,带有--initialize--initialize-insecure选项,根据是否需要服务器生成随机的初始密码给'root'@'localhost'账户,或者创建该账户无密码:

  • 使用--initialize进行“默认安全安装”(即生成随机的初始root密码)。在这种情况下,密码将被标记为过期,您需要选择新的密码。

  • 使用--initialize-insecure,不生成root密码。这是非安全的;假设您计划在将服务器投入生产使用前尽快为账户分配密码。

关于为'root'@'localhost'账户分配新密码的说明,请参阅Post-Initialization root Password Assignment

Note

服务器将任何消息(包括初始密码)写入到标准错误输出中。这可能被重定向到错误日志,所以如果您在屏幕上看不到这些消息,可以查看错误日志。关于错误日志的信息,包括它的位置,请参见第7.4.2节,“错误日志”

在 Windows 上,用--console选项将消息直接输出到控制台。

在 Unix 和 Unix 类似系统上,数据库目录和文件必须由 mysql 登录账户所有,以便服务器在您后续运行时拥有读取和写入权限。为了确保这点,请从系统 root 账户启动mysqld,并包含以下所示的 --user 选项:

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

或者,您可以以 mysql 账户登录,然后在这种情况下,可以省略--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

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

如果mysqld无法识别安装目录或数据目录,可能需要指定其他选项,如--basedir--datadir。例如(在一行命令):

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

或者将相关选项设置到选项文件中,然后将该文件的名称传递给mysqld。对于Unix和Unix-like系统,假设选项文件名为/opt/mysql/mysql/etc/my.cnf。将这些行写入到文件中:

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

然后.invokemysqld如下(在一行命令,首先使用--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

然后.invokemysqld如下(再次在一行命令,首先使用--defaults-file选项):

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

在初始化数据目录时,不能指定除了设置目录位置选项,如--basedir--datadir,以及如果需要的--user选项。正常使用中由 MySQL 服务器执行的选项可以在重启后设置。见--initialize选项的描述以获取更多信息。

Note

服务器在初始化数据目录时执行的操作序列,不是mysql_secure_installation执行的操作。

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

  1. 服务器检查数据目录的存在情况如下:

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

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

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

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

      已经存在的数据目录允许非空,如果每个条目名称都以点号 (.) 开头。

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

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

    Note

    mysqld设置了 InnoDB 系统表空间后,某些表空间特征的更改需要设置一个新的实例。需要 qualifying 的更改包括系统表空间中的第一个文件名和undo日志数量。如果不想使用默认值,确保在运行mysqld之前,在 MySQL 配置文件中设置了innodb_data_file_pathinnodb_log_file_size配置参数。另外,需要根据需要指定影响 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. 服务器退出。

初始化数据目录后,使用--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系统变量,如数据目录初始化服务器操作中讨论过的那样。