2.10.1 初始化数据目录
安装 MySQL 之后,必须初始化数据目录,包括mysql
系统数据库中的 table:
-
对于某些 MySQL 安装方法,数据目录初始化是自动的,如第 2.10 节“安装后的设置和测试”中所述。
-
对于其他安装方法,必须手动初始化数据目录。其中包括在 Unix 和类似 Unix 的系统上从通用二进制发行版和源代码发行版进行安装,以及在 Windows 上从 ZIP Archive 软件包进行安装。
本节介绍如何为不是自动进行数据目录初始化的 MySQL 安装方法手动初始化数据目录。有关建议的一些命令,这些命令可以测试服务器是否可访问并且工作正常,请参阅第 2.10.3 节“测试服务器”。
数据目录初始化概述
在此处显示的示例中,服务器旨在在mysql
登录帐户的用户 ID 下运行。如果该帐户不存在,请创建该帐户(请参阅创建一个 mysql 用户和组),或者替换您打算用于运行服务器的其他现有登录帐户的名称。
- 将位置更改为 MySQL 安装的顶级目录,通常为
/usr/local/mysql
(根据需要调整系统的路径名):
cd /usr/local/mysql
在目录中,您将找到几个文件和子目录,包括包含服务器以及 Client 端和 Util 的bin
子目录。
- secure_file_priv系统变量将导入和导出操作限制到特定目录。创建一个目录,该目录的位置可以指定为该变量的值:
mkdir mysql-files
将目录用户和组所有权授予mysql
用户和mysql
组,并适当设置目录权限:
chown mysql:mysql mysql-files
chmod 750 mysql-files
- 使用服务器初始化数据目录,包括
mysql
数据库,该数据库包含用于确定如何允许用户连接到服务器的初始 MySQL 授权 table。例如:
bin/mysqld --initialize --user=mysql
有关命令的重要信息,尤其是有关您可能使用的命令选项的信息,请参阅数据目录初始化过程。有关服务器如何执行初始化的详细信息,请参见数据目录初始化期间的服务器操作。
通常,仅在首次安装 MySQL 之后才需要进行数据目录初始化。 (要升级到现有安装,请执行升级过程;请参阅第 2.11 节“升级 MySQL”。)但是,初始化数据目录的命令不会覆盖任何现有的mysql
数据库 table,因此在任何情况下都可以安全运行。
Note
如果缺少所需的系统库,则数据目录的初始化可能会失败。例如,您可能会看到如下错误:
bin/mysqld: error while loading shared libraries:
libnuma.so.1: cannot open shared object file:
No such file or directory
如果发生这种情况,您必须手动或使用系统的程序包 Management 器安装缺少的库。然后重试数据目录初始化命令。
- 如果要部署自动支持安全连接的服务器,请使用mysql_ssl_rsa_setupUtil 创建默认的 SSL 和 RSA 文件:
bin/mysql_ssl_rsa_setup
有关更多信息,请参见第 4.4.5 节“ mysql_ssl_rsa_setup-创建 SSL/RSA 文件”。
-
在没有任何选项文件的情况下,服务器以其默认设置启动。 (请参阅第 5.1.2 节“服务器配置默认值”。)要明确指定 MySQL 服务器在启动时应使用的选项,请将它们放在选项文件中,例如
/etc/my.cnf
或/etc/mysql/my.cnf
。 (请参阅第 4.2.2.2 节“使用选项文件”。)例如,您可以使用选项文件来设置secure_file_priv系统变量。 -
要安排 MySQL 在系统引导时无需人工干预的情况下启动,请参见第 2.10.5 节“自动启动和停止 MySQL”。
-
数据目录初始化在
mysql
数据库中创建时区 table,但不填充它们。为此,请按照第 5.1.13 节“ MySQL 服务器时区支持”中的说明进行操作。
数据目录初始化过程
将位置更改为 MySQL 安装的顶级目录,通常为/usr/local/mysql
(根据需要调整系统的路径名):
cd /usr/local/mysql
要初始化数据目录,请使用--initialize或--initialize-insecure选项调用mysqld,具体取决于您是希望服务器为'root'@'localhost'
帐户生成随机初始密码还是创建不带密码的帐户:
-
使用--initialize进行“默认安全”安装(即,包括生成随机的初始
root
密码)。在这种情况下,密码被标记为已过期,您将需要选择一个新密码。 -
使用--initialize-insecure时,不会生成
root
密码。这是不安全的;假定您在将服务器投入生产使用之前会及时为帐户分配密码。
有关分配新的'root'@'localhost'
密码的说明,请参见初始化后的根密码分配。
Note
服务器将任何消息(包括任何初始密码)写入其标准错误输出。这可能会重定向到错误日志,因此,如果您没有在屏幕上看到消息,请查看那里。有关错误日志(包括错误日志的位置)的信息,请参阅第 5.4.2 节“错误日志”。
在 Windows 上,使用--console选项将消息定向到控制台。
在 Unix 和类似 Unix 的系统上,数据库目录和文件由mysql
登录帐户拥有很重要,这样服务器在以后运行时对其具有读写访问权限。为确保这一点,请从系统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
如果mysqld无法识别安装目录或数据目录的正确位置,则可能需要指定其他选项,例如--basedir或--datadir。例如(单行 Importing 命令):
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选项在一行中 Importing 命令):
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 5.7
datadir=D:\\MySQLdata
然后按以下方式调用mysqld(首先使用--defaults-file选项在一行中 Importing 命令):
bin\mysqld --defaults-file=C:\my.ini
--initialize --console
数据目录初始化期间的服务器操作
Note
当使用--initialize或--initialize-insecure选项调用时,mysqld在数据目录初始化序列期间执行以下操作:
-
服务器检查数据目录是否存在,如下所示:
-
如果不存在数据目录,则服务器将创建它。
-
如果数据目录存在但不为空(即它包含文件或子目录),则服务器在生成错误消息后退出:
[ERROR] --initialize specified but the data directory exists. Aborting.
在这种情况下,请删除或重命名数据目录,然后重试。
从 MySQL 5.7.11 开始,如果每个条目的名称都以句点(.
)开头或使用--ignore-db-dir选项命名,则允许现有数据目录为非空目录。
Note
避免使用--ignore-db-dir选项,该选项自 MySQL 5.7.16 起已被弃用。
-
服务器在数据目录中创建
mysql
系统数据库及其 table,包括授权 table,时区 table 和服务器端帮助 table。参见第 5.3 节“ mysql 系统数据库”。 -
服务器初始化system tablespace和 ManagementInnoDBtable 所需的相关数据结构。
Note
在mysqld设置InnoDB
system tablespace之后,对 table 空间 Feature 的某些更改要求设置一个全新的instance。限定的更改包括系统 table 空间中第一个文件的文件名和撤消日志的数量。如果您不想使用默认值,请确保在运行mysqld之前*之前,在configuration file和 MySQL configuration file中已经配置了innodb_data_file_path和innodb_log_file_size配置参数。还要确保根据需要指定其他影响InnoDB
文件创建和位置的参数,例如innodb_data_home_dir和innodb_log_group_home_dir。
如果这些选项在您的配置文件中,但是该文件不在默认情况下 MySQL 读取的位置,请在运行mysqld时使用--defaults-extra-file选项指定文件位置。
- 服务器创建一个
'root'@'localhost'
超级用户帐户和其他保留帐户(请参阅第 6.2.8 节“保留的帐户”)。某些保留的帐户已锁定,不能被 Client 端使用,但是'root'@'localhost'
供 Management 使用,您应为其分配密码。
关于'root'@'localhost'
帐户密码的服务器操作取决于您如何调用它:
- 使用--initialize而不使用--initialize-insecure,服务器将生成一个随机密码,将其标记为已过期,并编写一条显示该密码的消息:
[Warning] A temporary password is generated for root@localhost:
iTag*AfrH5ej
- 使用--initialize-insecure((使用--initialize或不使用--initialize,因为--initialize-insecuretable 示--initialize),服务器不会生成密码或将其标记为已过期,并且会写警告消息:
[Warning] root@localhost is created with an empty password ! Please
consider switching off the --initialize-insecure option.
有关分配新的'root'@'localhost'
密码的说明,请参见初始化后的根密码分配。
-
服务器填充用于HELP语句的服务器端帮助 table(请参阅第 13.8.3 节“ HELP 语句”)。服务器不会填充时区 table。要手动执行此操作,请参见第 5.1.13 节“ MySQL 服务器时区支持”。
-
如果给了init_file系统变量以命名 SQL 语句文件,则服务器将执行该文件中的语句。此选项使您可以执行自定义引导序列。
当服务器以引导方式运行时,某些功能将不可用,从而限制了文件中允许的语句。这些包括与帐户 Management(例如CREATE USER或GRANT),复制和全局事务标识符有关的语句。
- 服务器退出。
初始化后根密码分配
通过使用--initialize或--initialize-insecure启动服务器来初始化数据目录后,请正常启动服务器(即,不使用那些选项之一),然后为'root'@'localhost'
帐户分配新密码:
-
启动服务器。有关说明,请参见第 2.10.2 节“启动服务器”。
-
连接到服务器:
-
如果您使用--initialize而非--initialize-insecure初始化数据目录,请以
root
的身份连接到服务器:
mysql -u root -p
然后,在密码提示下,Importing 服务器在初始化序列期间生成的随机密码:
Enter password: (enter the random root password here)
如果您不知道此密码,请查看服务器错误日志。
- 如果使用--initialize-insecure初始化数据目录,请以
root
的身份连接到服务器而无需 Importing 密码:
mysql -u root --skip-password
- 连接后,使用ALTER USER语句分配新的
root
密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root-password';
另请参见第 2.10.4 节“保护初始 MySQL 帐户”。
Note
尝试连接到主机127.0.0.1
通常会解析为localhost
帐户。但是,如果服务器在启用skip_name_resolve的情况下运行,则此操作将失败。如果您打算这样做,请确保存在一个可以接受连接的帐户。例如,要能够使用--host=127.0.0.1
或--host=::1
作为root
进行连接,请创建以下帐户:
CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY 'root-password';
CREATE USER 'root'@'::1' IDENTIFIED BY 'root-password';
可以将这些语句放在要使用init_file系统变量执行的文件中,如数据目录初始化期间的服务器操作中所述。