msql服务器—data目录简介
mysql服务器的 data 目录是我们保存 数据库数据和表数据 的目录。
data目录在什么时候初始化?
MySQL安装完成后,数据目录必须初始化,包括MySQL系统(system schema)中的表。
- 对于MySQL一键安装方法,数据目录初始化是自动的
- 对于其他安装方式,需要手动初始化数据目录。比如Unix和Unix-like系统通过二进制文件安装,或者Windows通过zip压缩包安装。
注意:对于手动初始化数据目录的安装方式,最好不要通过新建文件夹的方式,而是通过mysqld命令手动初始化。因为初始化正常data目录包含很多MySql系统的表比如mysql表。而通过新建文件夹方式创建的data目录是空的,就算后续通过mysqld命令重新初始化,data目录也可能还是空的。下图为正确初始化的data目录:
数据目录初始化概述
如果没有任何配置文件,服务器将使用默认设置启动。不过通常为了明确指定MySQL服务器在启动时应该使用的参数,都会将它们放在一个配置文件中,如/etc/my.cnf或/etc/mysql/my.cnf。例如,可以使用一个配置文件来设置 datadir 变量。
数据目录初始化过程
1、命令行 或 dos窗口 进入到MySQL安装目录,通常是/usr/local/mysql(根据需要调整系统的路径名):
cd /usr/local/mysql
注意:最好通过管理员身份启动 命令行 或 dos窗口
2、要初始化数据目录(data directory),请使用--initialize或--initialize-insecure选项调用mysqld,这取决于是希望服务器为'root'@'localhost'帐户生成随机初始密码,还是创建没有密码的帐户:
- 使用--initialize进行“默认安全”安装(即,包括生成随机初始root密码)。在这种情况下,密码被标记为过期,您必须更改一个新的密码。
- 使用--initialize-insecure,不会生成root密码,不过这是不安全的。
注意: - --initialize和--initialize-insecure选项官网描述:该选项用于通过创建数据目录和填充MySQL系统模式中的表。
- 服务器将任何消息(包括任何初始密码)写入其标准错误输出。这可能会被重定向到错误日志,所以如果在屏幕上没有看到消息,请查看那里。
在Unix和Unix-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、服务器会创建一个“root”@“localhost”超级用户帐户和其他保留帐户。有些保留帐户是锁定的,不能被客户端使用,但是'root'@'localhost'是用于管理使用的,应该给它分配一个密码。
关于'root'@'localhost'帐户密码的服务器操作取决于你如何调用它:
- 使用--initialize不使用--initialize-insecure,服务器生成一个随机密码,将其标记为过期,并写入一条显示密码的消息:
[Warning] A temporary password is generated for root@localhost:
iTag*AfrH5ej
- 使用--initialize-insecure,服务器不会生成密码或将其标记为过期,并写入警告消息:
[Warning] root@localhost is created with an empty password ! Please
consider switching off the --initialize-insecure option.
5、如果给定init_file系统变量来命名一个SQL语句文件,服务器将执行该文件中的语句。该选项允许您执行自定义引导序列。
6、系统退出。
初始化后的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语句文件,服务器将执行该文件中的语句。该选项允许您执行自定义引导序列。。