mysql-8.0.18免安装版安装过程
解压到指定目录,我是D:\Program Files\mysql-8.0.18-winx64
安装会用到的重要命令:后边会有更详细说明
初始化安装:
bin\mysqld --initialize --console //root会有密码,注意执行后的第四行,会显示密码,要记住. bin\mysqld --initialize-insecure --console //root无密码
bin\mysqld --console //启动服务器 启动后不要关掉cmd,否则启动会终止
mysqladmin"-u root shutdown //关闭服务器
mysqld --install-manual //安装成windows 服务,手动启动方式
mysqld --remove //删除服务
sc delete mysql //另一种删除服务方法
net start mysql net stop mysql //启动或停止服务
mysql -u root --skip-password //无密码登录
mysql -u root -p //输入密码登录
使用默认分配的密码(即diK3i1dH=k8b)进行登录
mysql -uroot -pdiK3i1dH=k8b
登录成功后,修改密码为password
alter user root@localhost identified by '新密码';
刷新一下即可
flush privileges;
my.ini配置示例
[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=D:\Program Files\mysql-8.0.18-winx64
# 设置mysql数据库的数据的存放目录
datadir=D:\Program Files\mysql-8.0.18-winx64\Database
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8
6.2.8添加帐户,分配特权和删除帐户
CREATE USER并 DROP USER创建和删除帐户。
- GRANT并向 REVOKE帐户分配特权和从帐户撤消特权。
- SHOW GRANTS 显示帐户权限分配。
//创建用户
CREATE USER 'admin'@'%'
IDENTIFIED BY 'admin';
//分配所有权限
GRANT ALL
ON *.*
TO 'admin'@'%'
WITH GRANT OPTION;
//显示权限
SHOW GRANTS FOR 'admin'@'%';
6.2.8添加帐户,分配特权和删除帐户
要管理MySQL帐户,请使用用于此目的的SQL语句:
- CREATE USER并 DROP USER创建和删除帐户。
- GRANT并向 REVOKE帐户分配特权和从帐户撤消特权。
- SHOW GRANTS 显示帐户权限分配。
帐户管理语句使服务器对基础授权表进行适当的修改,这在第6.2.3节“授权表”中进行了讨论。
注意
不建议 使用,,或 等语句直接修改授权表 INSERT, 风险自负。服务器可以随意忽略由于此类修改而导致格式错误的行。 UPDATEDELETE
对于修改授权表的任何操作,服务器都会检查该表是否具有预期的结构,如果没有,则会产生错误。要将表更新为预期的结构,请执行MySQL升级过程。请参见 第2.11节“升级MySQL”。
创建帐户的另一种方法是使用GUI工具MySQL Workbench。另外,一些第三方程序提供了MySQL帐户管理功能。phpMyAdmin是这样的程序之一。
本节讨论以下主题:
有关此处讨论的对帐单的其他信息,请参见第13.7.1节“帐户管理对帐单”。
创建帐户和授予特权
以下示例显示了如何使用 mysql客户端程序来设置新帐户。这些示例假定MySQL root 帐户具有该CREATE USER 特权以及它授予其他帐户的所有特权。
在命令行上,以MySQL root用户身份连接到服务器 ,并在密码提示符下提供适当的密码:
shell> mysql -u root -p Enter password: (enter root password here)
连接到服务器后,您可以添加新帐户。以下示例使用CREATE USER and GRANT语句设置四个帐户(在此处看到 ,用适当的密码替换): 'password'
CREATE USER 'finley'@'localhost' IDENTIFIED BY 'password'; GRANT ALL ON *.* TO 'finley'@'localhost' WITH GRANT OPTION; CREATE USER 'finley'@'%.example.com' IDENTIFIED BY 'password'; GRANT ALL ON *.* TO 'finley'@'%.example.com' WITH GRANT OPTION; CREATE USER 'admin'@'localhost' IDENTIFIED BY 'password'; GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost'; CREATE USER 'dummy'@'localhost';
这些语句创建的帐户具有以下属性:
- 两个帐户的用户名为finley。两者都是具有执行任何操作的完整全局特权的超级用户帐户。'finley'@'localhost' 仅当从本地主机连接时才能使用该帐户。该'finley'@'%.example.com' 帐户'%'在主机部分使用通配符,因此可用于从example.com域中的任何主机进行连接 。
'finley'@'localhost'如果存在的匿名用户帐户,则 该帐户是必需的 localhost。如果没有该 'finley'@'localhost'帐户,finley则从本地主机进行连接时,该匿名用户帐户将具有优先权 , finley并被视为匿名用户。原因是匿名用户帐户的Host列值比该 'finley'@'%'帐户更具体,因此在user表排序顺序中排在较早的位置。(有关user表排序的信息,请参见第6.2.6节“访问控制,阶段1:连接验证”。)
- 该'admin'@'localhost'帐户只能用于通过admin本地主机连接。它被授予全局 RELOAD和 PROCESS管理特权。这些特权使 admin用户能够执行 mysqladmin reload,mysqladmin refresh和mysqladmin flush-xxx命令以及mysqladmin processlist。不授予访问任何数据库的特权。您可以使用GRANT语句添加此类特权 。
- 该'dummy'@'localhost'帐户没有密码(不安全,不建议使用)。该帐户只能用于从本地主机连接。不授予特权。假定您将使用GRANT语句向该帐户授予特定特权 。
前面的示例在全局级别授予特权。下一个示例创建三个帐户,并授予他们较低级别的访问权限;即针对特定数据库或数据库中的对象。每个帐户的用户名均为 custom,但主机名部分有所不同:
CREATE USER 'custom'@'localhost' IDENTIFIED BY 'password'; GRANT ALL ON bankaccount.* TO 'custom'@'localhost'; CREATE USER 'custom'@'host47.example.com' IDENTIFIED BY 'password'; GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON expenses.* TO 'custom'@'host47.example.com'; CREATE USER 'custom'@'%.example.com' IDENTIFIED BY 'password'; GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON customer.addresses TO 'custom'@'%.example.com';
这三个帐户可以如下使用:
- 该'custom'@'localhost'帐户具有访问bankaccount数据库的所有数据库级特权 。该帐户只能用于从本地主机连接到服务器。
- 该'custom'@'host47.example.com'帐户具有访问expenses数据库的特定数据库级别特权 。该帐户只能用于从主机连接到服务器 host47.example.com。
- 该'custom'@'%.example.com'帐户具有特定的表级特权,可以从域中的任何主机访问数据库中 的 addresses表 。该帐户可用于连接到从域中所有计算机上的服务器,由于使用的帐户名的主机部分通配符。 customerexample.com%
检查帐户特权和属性
要查看帐户的特权,请使用 SHOW GRANTS:
mysql> SHOW GRANTS FOR 'admin'@'localhost'; +-----------------------------------------------------+ | Grants for admin@localhost | +-----------------------------------------------------+ | GRANT RELOAD, PROCESS ON *.* TO 'admin'@'localhost' | +-----------------------------------------------------+
要查看帐户的非特权属性,请使用 SHOW CREATE USER:
mysql> SET print_identified_with_as_hex = ON; mysql> SHOW CREATE USER 'admin'@'localhost'\G *************************** 1. row *************************** CREATE USER for admin@localhost: CREATE USER 'admin'@'localhost' IDENTIFIED WITH 'caching_sha2_password' AS 0x24412430303524301D0E17054E2241362B1419313C3E44326F294133734B30792F436E77764270373039612E32445250786D43594F45354532324B6169794F47457852796E32 REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT
启用 print_identified_with_as_hex 系统变量(自MySQL 8.0.17起可用)会导致 SHOW CREATE USER将包含不可打印字符的哈希值显示为十六进制字符串而不是常规字符串文字。
撤销帐户特权
要撤消帐户特权,请使用以下 REVOKE语句。可以在不同级别撤销特权,就像可以在不同级别授予特权一样。
撤销全局特权:
REVOKE ALL ON *.* FROM 'finley'@'%.example.com'; REVOKE RELOAD ON *.* FROM 'admin'@'localhost';
撤消数据库级特权:
REVOKE CREATE,DROP ON expenses.* FROM 'custom'@'host47.example.com';
撤消表级特权:
REVOKE INSERT,UPDATE,DELETE ON customer.addresses FROM 'custom'@'%.example.com';
要检查特权撤销的效果,请使用 SHOW GRANTS:
mysql> SHOW GRANTS FOR 'admin'@'localhost'; +---------------------------------------------+ | Grants for admin@localhost | +---------------------------------------------+ | GRANT PROCESS ON *.* TO 'admin'@'localhost' | +---------------------------------------------+
删除帐户
要删除帐户,请使用以下DROP USER语句。例如,删除一些先前创建的帐户:
DROP USER 'finley'@'localhost'; DROP USER 'finley'@'%.example.com'; DROP USER 'admin'@'localhost'; DROP USER 'dummy'@'localhost';
6.2.14分配帐户密码
连接到MySQL服务器的客户端所需的凭据可以包括密码。本节介绍如何为MySQL帐户分配密码。
MySQL将凭据存储在系统数据库的user表中mysql。分配或修改密码的操作仅允许具有以下CREATE USER特权的用户使用 ,或者具有mysql 数据库INSERT特权(创建新帐户的UPDATE 特权,修改现有帐户的特权)的用户。如果read_only启用了 系统变量,则使用帐户修改语句,例如 CREATE USER或, ALTER USER另外需要CONNECTION_ADMIN或 SUPER特权。
此处的讨论仅汇总了最常见的密码分配语句的语法。有关其他可能性的完整详细信息,请参见第13.7.1.3节“创建用户语法”, 第13.7.1.1节“ ALTER USER语法”和第13.7.1.10节“ SET PASSWORD语法”。
MySQL使用插件执行客户端身份验证;请参见 第6.2.17节“可插入身份验证”。在密码分配语句中,与帐户关联的身份验证插件执行指定的明文密码所需的任何散列。这样,MySQL可以先对密码进行混淆处理,然后再将其存储在mysql.user系统表中。对于此处描述的语句,MySQL自动对指定的密码进行哈希处理。还有用于的语法CREATE USER,ALTER USER它允许按字面值指定散列值。有关详细信息,请参见这些语句的描述。
要在创建新帐户时分配密码,请使用 CREATE USER并包含一个 IDENTIFIED BY子句:
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';
CREATE USER还支持用于指定帐户身份验证插件的语法。请参见 第13.7.1.3节“创建用户语法”。
要为现有帐户分配或更改密码,请将该 ALTER USER语句与以下IDENTIFIED BY子句一起使用 :
ALTER USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';
如果您不是以匿名用户身份连接的,则可以更改自己的密码,而无需直接命名自己的帐户:
ALTER USER USER() IDENTIFIED BY 'password';
要从命令行更改帐户密码,请使用 mysqladmin命令:
mysqladmin -u user_name -h host_name password "password"
针对该命令设置密码的帐户是一个用在一排mysql.user匹配系统表user_name中的 User列和客户端主机从中连接在Host 列。
警告
使用mysqladmin设置密码应该被认为是不安全的。在某些系统上,密码对系统状态程序(例如ps)可见,其他用户可能会调用该密码 来显示命令行。MySQL客户端通常在初始化序列期间用零覆盖命令行密码参数。但是,仍然有一个短暂的时间间隔,在此间隔内该值是可见的。同样,在某些系统上,这种覆盖策略无效,并且ps仍然可以看到密码。(SystemV Unix系统以及其他系统可能会遇到此问题。)
如果您使用的是MySQL复制,请注意,当前,复制从设备用作CHANGE MASTER TO语句一部分的密码 长度实际上限制为32个字符;如果密码较长,则多余的字符将被截断。这并不是由于MySQL Server通常施加的任何限制,而是MySQL复制所特有的问题。(有关更多信息,请参见Bug#43439。)
官方帮助文档:关键时候很有用
https://dev.mysql.com/doc/refman/8.0/en/user-names.html
2.10.1初始化数据目录
安装MySQL之后,必须初始化数据目录,包括mysql系统模式中的表:
- 对于某些MySQL安装方法,如第2.10节“安装后设置和测试”中所述,数据目录初始化是自动的 。
- 对于其他安装方法,必须手动初始化数据目录。其中包括在Unix和类似Unix的系统上从通用二进制发行版和源发行版进行安装,以及在Windows上从ZIP Archive软件包进行安装。
本节介绍如何为不是自动进行数据目录初始化的MySQL安装方法手动初始化数据目录。有关建议的一些命令,这些命令可以测试服务器是否可访问并且是否正常运行,请参见第2.10.3节“测试服务器”。
注意
在MySQL 8.0中,默认的身份验证插件已从更改 mysql_native_password为 caching_sha2_password,并且 'root'@'localhost'管理帐户caching_sha2_password默认使用。如果您希望该root帐户使用以前的默认身份验证插件(mysql_native_password),请参阅 caching_sha2_password和根管理帐户。
数据目录初始化概述
在此处显示的示例中,服务器旨在在mysql登录帐户的用户ID下运行。如果不存在该帐户,请创建该帐户(请参阅 创建mysql用户和组),或替换您计划用于运行服务器的其他现有登录帐户的名称。
- 将位置更改为MySQL安装的顶级目录,通常是 /usr/local/mysql(根据需要调整系统的路径名):
cd /usr/local/mysql
在目录中,您将找到几个文件和子目录,包括bin 包含服务器以及客户端和实用程序的子目录。
- 该secure_file_priv系统变量限制进口和出口业务到指定目录。创建一个目录,其位置可以指定为该变量的值:
mkdir mysql-files
授予目录用户和组所有权给 mysql用户和mysql 组,并设置适当的目录权限:
chown mysql:mysql mysql-files chmod 750 mysql-files
- 使用服务器初始化数据目录,包括mysql包含包含初始MySQL授权表的架构,该表确定如何允许用户连接到服务器。例如:
bin/mysqld --initialize --user=mysql
有关命令的重要信息,尤其是有关您可能使用的命令选项的信息,请参阅《 数据目录初始化过程》。有关服务器如何执行初始化的详细信息,请参阅《 数据目录初始化期间的服务器操作》。
通常,仅在首次安装MySQL之后才需要进行数据目录初始化。(要升级到现有安装,请执行升级过程;请参见 第2.11节“升级MySQL”。)但是,初始化数据目录的命令不会覆盖任何现有mysql模式表,因此在任何情况下都可以安全运行。
- 如果要部署自动支持安全连接的服务器,请使用 mysql_ssl_rsa_setup实用程序创建默认的SSL和RSA文件:
bin/mysql_ssl_rsa_setup
有关更多信息,请参见 第4.4.3节“ 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架构中创建时区表,但不会填充它们。为此,请使用 第5.1.13节“ 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_installation和 mysql_ssl_rsa_setup执行的动作 。请参见 第4.4.2节“ mysql_secure_installation-提高MySQL安装安全性”和 第4.4.3节“ mysql_ssl_rsa_setup-创建SSL / RSA文件”。
当用--initializeor --initialize-insecure选项调用时 , mysqld在数据目录初始化序列期间执行以下动作:
- 服务器检查数据目录是否存在,如下所示:
-
- 如果不存在数据目录,则服务器将创建它。
- 如果数据目录存在但不为空(即它包含文件或子目录),则服务器在生成错误消息后退出:
[ERROR] --initialize specified but the data directory exists. Aborting.
在这种情况下,请删除或重命名数据目录,然后重试。
如果每个条目的名称都以句点(.)开头,则允许现有数据目录为非空。
- 服务器在数据目录中创建 mysql系统架构及其表,包括数据字典表,授权表,时区表和服务器端帮助表。请参见 第5.3节“ mysql系统模式”。
- 服务器初始化 系统表空间和管理InnoDB表所需的相关数据结构。
注意
之后的mysqld树立 InnoDB 系统表空间,表空间特性的某些变化需要建立一个全新的 实例。符合条件的更改包括系统表空间中第一个文件的文件名以及撤消日志的数量。如果不想使用默认值,请在运行 mysqld之前 确保MySQL 配置文件中的innodb_data_file_path和 innodb_log_file_size配置参数 设置正确。 。还要确保根据需要指定其他影响InnoDB文件创建和位置的参数,例如 innodb_data_home_dir和 innodb_log_group_home_dir。
如果这些选项在您的配置文件中,但该文件不在默认情况下MySQL读取的位置,则--defaults-extra-file 在运行mysqld时使用该选项指定文件位置 。
- 服务器创建一个'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'密码的说明,请参阅 初始化后根密码分配。
- 服务器填充用于该HELP语句的服务器端帮助表(请参见 第13.8.3节“ HELP语法”)。服务器不会填充时区表。要手动执行此操作,请参见 第5.1.13节“ MySQL服务器时区支持”。
- 如果使用init_file系统变量命名SQL语句文件,则服务器将执行该文件中的语句。此选项使您可以执行自定义引导序列。
当服务器以引导方式运行时,某些功能将不可用,从而限制了文件中允许的语句。这些语句包括与帐户管理(例如CREATE USER或GRANT),复制和全局事务标识符有关的语句。
- 服务器退出。
初始化后的根密码分配
通过使用--initialize或 --initialize-insecure启动服务器来初始化数据目录之后,请正常启动服务器(即,不使用那些选项之一),然后为'root'@'localhost'帐户分配一个新密码:
- 启动服务器。有关说明,请参见 第2.10.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
- 连接后,使用ALTER USER语句分配新 root密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root-password';
注意
尝试连接到主机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 系统变量执行的文件中,如 数据目录初始化期间的服务器操作中所述。