mysql服务器之初始化数据目录(data)——手动创建data目录报错处理


msql服务器—data目录简介

mysql服务器的data目录是我们保存数据库对象数据的目录。

data目录在什么时候初始化?

MySQL安装完成后,数据目录必须初始化,包括MySQL系统架构(system schema)中的表。

  • 对于一些MySQL安装方法,数据目录初始化是自动的
  • 对于其他安装方式,需要手动初始化数据目录。这包括在Unix和Unix-like系统上从通用的二进制和源发行版安装,以及在Windows上从ZIP压缩包安装。

注意:对于手动初始化数据目录的安装方式,最好不要通过新建文件夹的方式,而是通过mysqld命令手动初始化。因为初始化正常data目录包含很多MySql系统的表比如mysql表。而通过新建文件夹方式创建的data目录是空的,就算后续通过mysqld命令重新初始化,data目录也可能还是空的。下图为正确初始化的data目录:

针对非自动初始化数据目录的MySQL安装方式,介绍如何手动初始化数据目录。

数据目录初始化概述

如果没有任何选项文件,服务器将使用默认设置启动。为了明确指定MySQL服务器在启动时应该使用的选项,将它们放在一个选项文件中,如/etc/my.cnf或/etc/mysql/my.cnf。例如,您可以使用一个选项文件来设置secure_file_priv系统变量。

数据目录初始化过程

1、命令行或dos窗口从location更改到MySQL安装的顶级目录,通常是/usr/local/mysql(根据需要调整系统的路径名):
cd /usr/local/mysql

2、要初始化数据目录(data directory),请使用--initialize--initialize-insecure选项调用mysqld,这取决于是希望服务器为'root'@'localhost'帐户生成随机初始密码,还是创建没有密码的帐户:

  • 使用--initialize进行“默认安全”安装(即,包括生成随机初始root密码)。在这种情况下,密码被标记为过期,您必须更改一个新的密码。
  • 使用--initialize-insecure,不会生成root密码。这是不安全的;假定您打算在将服务器投入生产使用之前及时为该帐户分配密码。
    注意:
  • --initialize--initialize-insecure选项官网描述:该选项用于通过创建数据目录和填充MySQL系统模式中的表来初始化MySQL安装。
  • 服务器将任何消息(包括任何初始密码)写入其标准错误输出。这可能会被重定向到错误日志,所以如果在屏幕上没有看到消息,请查看那里。

UnixUnix-like系统上,数据库目录和文件由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。例如(单行输入命令):

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

然后调用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

数据目录初始化过程中的服务器操作

1、当使用--initialize或--initialize-insecure选项调用mysqld时,在数据目录初始化顺序中执行以下操作:

  • 如果不存在数据目录,则由服务器创建。
  • 如果数据目录存在,但不是空的(即,它包含文件或子目录),服务器在生成一个错误消息后退出:
[ERROR] --initialize specified but the data directory exists. Aborting.

在这种情况下,请删除或重命名数据目录,然后重试。如果每个条目的名称都以句点(.)开头,则允许现有数据目录非空。

2、在数据目录中,服务器创建mysql system schema及其表,包括数据字典表、授权表、时区表和服务器端帮助表。

3、服务器初始化系统表空间和管理InnoDB表所需的相关数据结构。
注意:在mysqld设置InnoDB system表空间后,某些对表空间特征的更改需要设置一个全新的实例。合格的更改包括系统表空间中第一个文件的文件名和撤消日志的数量。如果不希望使用默认值,请在运行mysqld之前确保MySQL配置文件中已经设置了innodb_data_file_pathinnodb_log_file_size配置参数。还要确保在必要时指定其他影响InnoDB文件创建和位置的参数,例如innodb_data_home_dirinnodb_log_group_home_dir
如果这些选项在您的配置文件中,但是该文件不在MySQL默认读取的位置,那么在运行mysqld时使用--default -extra-file选项指定文件位置。

4、服务器会创建一个“root”@“localhost”超级用户帐户和其他保留帐户。有些保留帐户是锁定的,不能被客户端使用,但是'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.

5、服务器填充用于帮助语句的服务器端帮助表。服务器不填充时区表。

6、如果给定init_file系统变量来命名一个SQL语句文件,服务器将执行该文件中的语句。该选项允许您执行自定义引导序列。

7、系统退出。

初始化后的root密码分配

在使用--initialize或--initialize-insecure启动服务器来初始化数据目录后,正常启动服务器(也就是说,不使用上述任何一种选项),并为“root”@“localhost”帐户分配一个新密码:

1、启动服务器。
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';

或者

update mysql.user set authentication_string=password('root') where user='root' and Host = 'localhost';

注意:
尝试连接到主机127.0.0.1通常会解析到本地主机帐户。但是,如果服务器在运行时启用了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系统变量将这些语句放在一个文件中,如数据目录初始化期间的服务器操作中如果给定init_file系统变量来命名一个SQL语句文件,服务器将执行该文件中的语句。该选项允许您执行自定义引导序列。。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM