暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

2.10.1初始化数据目录

原创 由迪 2020-10-28
470

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

  • 对于某些MySQL安装方法,如第2.10节“安装后设置和测试”中所述,数据目录初始化是自动的 。
  • 对于其他安装方法,必须手动初始化数据目录。其中包括在Unix和类似Unix的系统上从通用二进制发行版和源代码发行版进行安装,以及在Windows上从ZIP Archive软件包进行安装。

本节介绍如何为不是自动进行数据目录初始化的MySQL安装方法手动初始化数据目录。有关建议的一些命令,这些命令可以测试服务器是否可访问并且是否正常运行,请参见第2.10.3节“测试服务器”

注意

在MySQL 8.0中,默认身份验证插件已从更改 mysql_native_passwordcaching_sha2_password,并且 'root'@'localhost'管理帐户caching_sha2_password默认使用。如果您希望该root帐户使用以前的默认身份验证插件(mysql_native_password),请参阅 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之后才需要进行数据目录初始化。(要升级到现有安装,请执行升级过程;请参见 第2.11节“升级MySQL”。)但是,初始化数据目录的命令不会覆盖任何现有mysql模式表,因此在任何情况下都可以安全运行。

  4. 如果要部署自动支持安全连接的服务器,请使用 mysql_ssl_rsa_setup实用程序创建默认的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,这取决于您是希望服务器为该 帐户生成随机初始密码,还是创建不包含密码的帐户: --initialize--initialize-insecure'root'@'localhost'

  • 使用--initialize了 “默认安全”安装(即包括生成随机初始的 root密码)。在这种情况下,密码被标记为已过期,您必须选择一个新密码。
  • 使用--initialize-insecure,不会root生成密码。这是不安全的;假定您打算在将服务器投入生产使用之前及时为帐户分配密码。

有关分配新 'root'@'localhost'密码的说明,请参阅 初始化后根密码分配

注意

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

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

在Unix和类似Unix的系统上,数据库目录和文件由mysql登录帐户拥有很重要, 以便服务器在以后运行时对其具有读写访问权限。为了确保这一点,请从系统 帐户启动mysqldroot并包括--user如下所示的 选项:

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

或者,以身份登录时执行mysqldmysql,在这种情况下,您可以--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--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.0 datadir=D:\\MySQLdata

然后按以下方式调用mysqld--defaults-file首先在选项中输入一行 ):

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

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

注意

服务器执行的数据目录初始化序列不能代替mysql_secure_installationmysql_ssl_rsa_setup执行的动作 。请参见 第4.4.2节“ **mysql_secure_installation-**提高MySQL安装安全性”第4.4.3节“ **mysql_ssl_rsa_setup-**创建SSL / RSA文件”

当用--initializeor --initialize-insecure选项调用时 , mysqld在数据目录初始化序列期间执行以下动作:

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

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

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

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

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

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

  2. 服务器在数据目录中创建 mysql系统架构及其表,包括数据字典表,授权表,时区表和服务器端帮助表。请参见 第5.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读取的位置,请--defaults-extra-file 在运行mysqld时使用该选项指定文件位置 。

  4. 服务器创建一个'root'@'localhost' 超级用户帐户和其他保留帐户(请参见 第6.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'密码的说明,请参阅 初始化后根密码分配

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

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

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

  7. 服务器退出。

初始化后的根密码分配

通过使用--initialize--initialize-insecure启动服务器来初始化数据目录之后,请正常启动服务器(即,不使用那些选项之一),然后为'root'@'localhost'帐户分配一个新密码:

  1. 启动服务器。有关说明,请参见 第2.10.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.10.4节“保护初始MySQL帐户”

注意

尝试连接到主机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 系统变量执行的文件中,如 数据目录初始化期间的服务器操作中所述

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论