# 2.10.1 初始化数据目录

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

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

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

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

笔记

在 MySQL 8.0 中,默认的身份验证插件已从mysql_native_passwordcache_sha2_password, 和'根'@'本地主机'管理帐户使用cache_sha2_password默认。如果您更喜欢帐户使用以前的默认身份验证插件(mysql_native_password), 看缓存_沙2_密码和根管理帐户.

# 数据目录初始化概述

在此处显示的示例中,服务器旨在在mysql登录帐户。如果帐户不存在,请创建帐户(请参阅创建一个mysql用户和组),或替换您计划用于运行服务器的不同现有登录帐户的名称。

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

    cd /usr/local/mysql
    

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

  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 之后才需要进行数据目录初始化。(对于现有安装的升级,请执行升级过程;请参阅第 2.11 节,“升级 MySQL”.) 但是,初始化数据目录的命令不会覆盖任何现有的mysql模式表,因此在任何情况下运行都是安全的。如果要部署自动支持安全连接的服务器,请使用

  4. mysql_ssl_RSA_设置创建默认 SSL 和 RSA 文件的实用程序:有关详细信息,请参阅

    bin/mysql_ssl_rsa_setup
    

    第 4.4.3 节,“mysql_ssl_RSA_setup — 创建 SSL/RSA 文件”.在没有任何选项文件的情况下,服务器将以其默认设置启动。

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

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

  7. 数据目录初始化在mysql架构但不填充它们。为此,请使用中的说明第 5.1.15 节,“MySQL 服务器时区支持”.

# 数据目录初始化程序

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

cd /usr/local/mysql

要初始化数据目录,请调用mysqld- 初始化要么--初始化不安全选项,取决于您是否希望服务器为'根'@'本地主机'帐户,或创建没有密码的帐户:

  • 采用- 初始化用于“默认安全”安装(即包括生成随机初始密码)。在这种情况下,密码被标记为过期,您必须选择一个新密码。

  • --初始化不安全, 不生成密码。这是不安全的;假设您打算在将服务器投入生产使用之前及时为帐户分配密码。

    有关分配新的说明'根'@'本地主机'密码,见初始化后根密码分配.

笔记

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

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

在 Unix 和类 Unix 系统上,数据库目录和文件由mysql登录帐户,以便服务器在您以后运行它时对它们具有读写访问权限。为了确保这一点,开始mysqld从系统帐户并包括- 用户如下所示的选项:

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

或者,执行mysqld登录为mysql, 在这种情况下你可以省略- 用户命令中的选项。

在 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要么--数据目录如果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 文件选项第一):

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如下(在一行中输入命令--defaults 文件选项第一):

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

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

笔记

服务器执行的数据目录初始化序列不能替代由服务器执行的操作mysql_安全的_安装mysql_ssl_rsa_设置.看第 4.4.2 节,“mysql_安全的_安装——提高 MySQL 安装安全”, 和第 4.4.3 节,“mysql_ssl_rsa_setup — 创建 SSL/RSA 文件”.

当调用- 初始化要么--初始化不安全选项,mysqld在数据目录初始化序列期间执行以下操作:

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

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

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

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

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

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

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

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

    笔记

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

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

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

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

    • - 初始化但不是--初始化不安全,服务器生成一个随机密码,将其标记为过期,并写入一条显示密码的消息:

      [Warning] A temporary password is generated for root@localhost:
      iTag*AfrH5ej
      
    • --初始化不安全, (无论有无- 初始化因为--初始化不安全暗示- 初始化),服务器不会生成密码或将其标记为过期,并写入警告消息:

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

      有关分配新的说明'根'@'本地主机'密码,见初始化后根密码分配.

  5. 服务器填充用于帮助声明(见第 13.8.3 节,“帮助声明”)。服务器不填充时区表。要手动执行此操作,请参阅第 5.1.15 节,“MySQL 服务器时区支持”.

  6. 如果初始化文件系统变量被赋予命名 SQL 语句的文件,服务器执行文件中的语句。此选项使您能够执行自定义引导序列。

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

  7. 服务器退出。

# 初始化后根密码分配

通过启动服务器初始化数据目录后- 初始化要么--初始化不安全,正常启动服务器(即,没有这些选项中的任何一个)并分配'根'@'本地主机'帐户新密码:

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

  2. 连接到服务器:

    • 如果你用过- 初始化但不是--初始化不安全初始化数据目录,连接到服务器为

      mysql -u root -p
      

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

      Enter password: (enter the random root password here)
      

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

    • 如果你用过--初始化不安全初始化数据目录,连接到服务器为没有密码:

      mysql -u root --skip-password
      
  3. 连接后,使用更改用户分配新的声明密码:

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

    也可以看看第 2.10.4 节,“保护初始 MySQL 帐户”.

笔记

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

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

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