揭开 mysql 神秘的面纱(一)
引言
为什么我们需要学习 mysql ?计算机专业的同学学习的第一个数据库管理系统就是 mysql ,大中小型互联网公司及部分传统行业公司普遍也是采用 mysql 作为关系型数据库管理系统;当然现在国内大厂也有研发适合于自身业务的关系型数据库,但是都是站在巨人的肩膀上去做的。所以,学习 mysql 的必要性不需要过多的探讨。
对于 mysql 的学习不光要学会怎么用,还要了解为什么要这么用,还有老生常谈的优化,以及适应于生产环境的高可用实践方式。那么,让我们一起来揭开 mysql 神秘的面纱。
简介
mysql 是一个开源的、相应快速的、可靠的、可扩展的、易于使用的关系型数据库管理系统,由 Oracle Corporation 开发和支持。
什么是数据库? 数据库就是存储数据的地方,他可以以不同的形式存储;实际上就是一个文件系统,将数据以特定的格式存储起来。用户可以通过SQL对数据库进行新增、删除、修改、查询等操作。
什么是数据库管理系统? 数据库管理系统就是操纵和管理数据库的大型软件,用于建立、使用和维护数据库;对数据库进行统一的管控,保证数据库的安全性和完整性。
什么是关系型数据库? 关系型数据库指以行与列来存储数据的数据库。
历史
- MySQL的历史可以追溯到1979年,一个名为Monty Widenius的程序员在为TcX的小公司打工,并且用 BASIC设计了一个报表工具,使其可以在4MHz主频和16KB内存的计算机上运行。当时,这只是一个很底层的 且仅面向报表的存储引擎,名叫Unireg。
- 1990年,TcX公司的客户中开始有人要求为他的API提供SQL支持。Monty直接借助于mSQL的代码,将 它集成到自己的存储引擎中。令人失望的是,效果并不太令人满意,决心自己重写一个SQL支持。
- 1996年,MySQL 1.0发布,它只面向一小拨人,相当于内部发布。到了1996年10月,MySQL 3.11.1发布(MySQL没有2.x版本),最开始只提供Solaris下的二进制版 本。一个月后,Linux版本出现了。在接下来的两年里,MySQL被依次移植到各个平台。
- 1999~2000年,【MySQL AB】公司在瑞典成立。Monty雇了几个人与Sleepycat合作,开发出 了【Berkeley DB引擎】, 由于BDB支持事务处理,因此MySQL从此开始支持事务处理了。
- 2000,MySQL不仅公布自己的源代码,并采用GPL(GNU General Public License)许可协议,正式进入开源世界。同年4月,MySQL对旧的存储引擎ISAM进行了整理,将其命名为MyISAM。
- 2001年,集成Heikki Tuuri的存储引擎【InnoDB】,这个引擎不仅能【支持事务处理,并且支持行 级锁】。后来该引擎被证明是最为成功的MySQL事务存储引擎。【MySQL与InnoDB的正式结合版本是4.0】
- 2003年12月,【MySQL 5.0】版本发布,提供了视图、存储过程等功能。
- 2008年1月,【MySQL AB公司被Sun公司以10亿美金收购】,MySQL数据库进入Sun时代。在Sun 时代,Sun公司对其进行了大量的推广、优化、Bug修复等工作。
- 2008年11月,MySQL 5.1发布,它提供了分区、事件管理,以及基于行的复制和基于磁盘的NDB集群系统,同时修复了大量的Bug。
- 2009年4月,Oracle公司以74亿美元收购Sun公司,自此MySQL数据库进入Oracle时代,而其第三方的存储引擎InnoDB早在2005年就被Oracle公司收购。
- 2010年12月,【MySQL 5.5发布】,其主要新特性包括半同步的复制及对SIGNAL/RESIGNAL的异常 处理功能的支持,【最重要的是InnoDB存储引擎终于变为当前MySQL的默认存储引擎】。MySQL 5.5不是时 隔两年后的一次简单的版本更新,而是加强了MySQL各个方面在企业级的特性。Oracle公司同时也承诺 MySQL 5.5和未来版本仍是采用GPL授权的开源产品。
SQL
SQL是Structured Query Language的缩写,是指结构化查询语言,是一种数据库查询的程序设计编程语言,由于查询、更新和管理关系型数据库系统。它的前身是著名的关系数据库原型系统System R所采 用的SEQUEL语言。作为一种访问【关系型数据库的标准语言】,SQL自问世以来得到了广泛的应用,不仅是著 名的大型商用数据库产品Oracle、DB2、Sybase、SQL Server支持它,很多开源的数据库产品如 PostgreSQL、MySQL也支持它,甚至一些小型的产品如Access也支持SQL。近些年蓬勃发展的NoSQL系统 最初是宣称不再需要SQL的,后来也不得不修正为Not Only SQL,来拥抱SQL。
SQL发展的简要历史:
1986年,ANSI X3.135-1986,ISO/IEC 9075:1986,SQL-86
1989年,ANSI X3.135-1989,ISO/IEC 9075:1989,SQL-89
1992年,ANSI X3.135-1992,ISO/IEC 9075:1992,SQL-92(SQL2)
1999年,ISO/IEC 9075:1999,SQL:1999(SQL3)
2003年,ISO/IEC 9075:2003,SQL:2003
2008年,ISO/IEC 9075:2008,SQL:2008
2011年,ISO/IEC 9075:2011,SQL:2011
SQL92 标准需要我们掌握,因为它涉及了SQL最基础和最核心的一些内容;不只是mysql还有其他数据库,在SQL92或者SQL99这些国际SQL标准基础上,它们还扩展了自己的一些 SQL语句,比如MySQL中的limit关键字。
SQL语言分类
数据定义语言(DDL):用来定义数据库的对象:库、表、列等等。关键字:create、alter、drop、truncate等
常见的DDL:
创建数据库:CREATE DATABASE
创建数据库表格:CREATE TABLE
修改数据库表格:ALTER TABLE
删除数据库表格:DROP TABLE
创建查询命令:CREATE VIEW
删除数据表内容:TRUNCATE TABLE
数据操作语言(DML):用来处理数据库的数据内容。关键字:insert、delete、update等
常见的DML:
插入数据:INSERT INTO TABLE
删除数据:DELETE FROM TABLE
修改数据:UPDATE TABLE SET
数据查询语言(DQL):用来查询数据库的数据内容。关键字:select、from、where等
数据控制语言(DCL):用来定义数据库的访问权限和安全级别及用户创建。关键字:grant等
常见的DCL:
远程授权:GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
DDL
数据库操作
-
创建数据库
create database database_name; create database database_name character set 字符集; # 示例 create database samir character set UTF8; -
查看数据库
show databases; show create database database_name; # 示例 show create database samir; -
删除数据库
drop database database_name; #示例 drop database samir; -
其他数据库操作
use database_name; select database(); # 示例 use samir;
表操作
-
创建表
create table table_name( field_name type 约束, field_name type 约束, field_name type 约束 ); # 约束分为 主键约束(primary key)、唯一约束(unique)、非空约束(not null) # 注意:主键约束和唯一约束唯一的区别在于唯一约束可以为 null # 示例 CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id' , `name` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '名称' , `dept` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '部门' , `age` int(3) NOT NULL DEFAULT 0 COMMENT '年龄' , `nick` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '昵称' , PRIMARY KEY (`id`), UNIQUE INDEX `index_test` (`name`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci ; -
查看表
show tables; desc test; -
删除表
drop table table_name; # 示例 drop table test; -
修改表
# 增加列 alter table table_name add field_name type 约束; # 删除列 alter table table_name drop field_name; # 修改列类型和约束 alter table table_name modify field_name type 约束; # 修改列名 alter table table_name change old_field_name new_field_name type 约束; # 修改表名 rename table old_table_name to new_table_name; # 修改表字符集 alter table table_name character set 字符集;
DML
-
插入记录
insert into table_name (field_name1, field_name2, ...) values (value1, value1, ...); insert into table_name values (value1, value1, ...); insert into table_name (field_name1, field_name2, ...) select field_name1, field_name2, ... from table_name; insert into table_name select * from table_name; # 示例 insert into test (`name`, dept, age, nick) values ('张三', '电商项目部', 28, '张三丰'); -
删除记录
delete from table_name; delete from table_name where ...; # 示例 delete from test where id = 1; -
修改记录
update table_name set field_name1 = vaule1, field_name2 = vaule2, ... ; update table_name set field_name1 = vaule1, field_name2 = vaule2, ... where ...; # 示例 update test set `name` = '李四', nick = '李四娃' where id = 2;
DQL
-
查询记录
select * from table_name; # 示例 select * from test; -
常用聚合函数
# count——返回查询的记录总数 select count(0) from test; # sum——求和 select sum(age) from test; # length——计算字符串长度 select length(nick) from test where `name` = '张三'; # concat——合并多个字符串 select concat(`name`, ': ', dept) from test;更多的集合函数使用可以查看——菜鸟教程:www.runoob.com/mysql/mysql…
-
分组
select dept from test group by dept;select group_concat(name), dept from test group by dept; -
排序
# 默认是 asc 正序 select * from test order by id; select * from test order by id desc; -
分页
# limit 不属于sql92标准,其常与 order by一起使用 select * from test order by id limit 0, 1;# offset 偏移量 select * from test limit 1 offset 2; -
子查询
# 子查询允许把一个查询嵌套在另一个查询当中,一般放在 select中、from 后、where 中。 -
like
select * from test where `name` like '李%'; -
having
select group_concat(`name`) name, length(group_concat(`name`)) namelen, dept from test group by dept having length(`name`) > 7; -
union
select * from test where `name` = '张三' union select * from test where age = 36;
DCL
-
见 mysql安装 - 常用命令
数据类型
数值类型
| 类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 | Java数据类型 |
|---|---|---|---|---|---|
| TINYINT | 1 byte | (-128,127) | (0,255) | 小整数值 | java.lang.Integer |
| SMALLINT | 2 bytes | (-32 768,32 767) | (0,65 535) | 大整数值 | java.lang.Integer |
| MEDIUMINT | 3 bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 | java.lang.Integer |
| INT或INTEGER | 4 bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 | java.lang.Long |
| BIGINT | 8 bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 | java.math.BigInteger |
| FLOAT | 4 bytes | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 | java.lang.Float |
| DOUBLE | 8 bytes | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 浮点数值 | java.lang.Double |
| DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 | java.math.BigDecimal |
日期类型
| 类型 | 大小( bytes) | 范围 | 格式 | 用途 | Java数据类型 |
|---|---|---|---|---|---|
| DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 | java.sql.Date |
| TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 时间值或持续时间 | java.sql.Time |
| YEAR | 1 | 1901/2155 | YYYY | 年份值 | java.sql.Date |
| DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 | java.sql.Timestamp |
| TIMESTAMP | 4 | 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 | java.sql.Timestamp |
字符类型
| 类型 | 大小 | 用途 | Java数据类型 |
|---|---|---|---|
| CHAR | 0-255 bytes | 定长字符串 | java.lang.String |
| VARCHAR | 0-65535 bytes | 变长字符串 | java.lang.String |
| TINYBLOB | 0-255 bytes | 不超过 255 个字符的二进制字符串 | java.lang.byte[] |
| TINYTEXT | 0-255 bytes | 短文本字符串 | java.lang.String |
| BLOB | 0-65 535 bytes | 二进制形式的长文本数据 | java.lang.byte[] |
| TEXT | 0-65 535 bytes | 长文本数据 | java.lang.String |
| MEDIUMBLOB | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 | java.lang.byte[] |
| MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 | java.lang.String |
| LONGBLOB | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 | java.lang.byte[] |
| LONGTEXT | 0-4 294 967 295 bytes | 极大文本数据 | java.lang.String |
架构
逻辑结构解析
-
连接者
这个没什么说的,不管什么语言都有 mysql-connector 去连接 mysql 服务端的客户端程序。
-
管理服务和工具
这个是提供给数据库运维工程师或者DBA来操作数据库的入口。例:MySQL Utilities,提供一组命令行工具用于维护和管理 MySQL 服务器;其包括了
- 管理工具 (克隆、复制、比较、差异、导出、导入)
- 复制工具 (安装、配置)
- 一般工具 (磁盘使用情况、冗余索引、搜索元数据)
-
连接池
对客户发起的连接请求鉴权,和连接池的维护,以及内存的管理。
-
sql接口
接收 数据定义语言、数据操作语言、存储过程和触发器等 sql 语言。
-
sql解析器
sql解析器其内部包含了两个模块,其一:词法分析(作用是将整个查询分解为多个元素);其二:语法规则(寻找sql语法规则组合,产生一个序列,执行这些规则相关的代码)。当写的sql错误而报错就是这个模块抛出的异常。
词法分析将sql语句拆成一个一个的元素,语法规则通过mysql定义的语法规则生成对应的数据结构,存储在 thd->lex 对象中。
select `name`, dept from test where age > 18; -
sql优化器
sql优化器根据 thd->lex 对象的数据结构,优化后生成执行计划。例:使用最优的一个索引,小表关联大表,where条件从左到右找过滤力度最大的优先执行。
-
sql缓存
以map的形式将sql查询的结果存储起来,key为将sql哈希后的值。
-
存储引擎
mysql的存储引擎是对表使用的,我们常用的mysql存储引擎就是innodb和myisam。
-
各种存储引擎介绍
存储引擎名称 介绍 myisam 不支持事务,不支持行锁;插入和查询速度快 innodb 从mysql5.6开始默认的存储引擎,支持事务,支持行锁,支持外键,速度略逊于myisam memory 内存储存引擎,插入、查询、更新速度超级快,但是数据存储在内存中;一是不安全,二是内存占用率与数据量大小成线性增长 isam myiasm的前身 merge 将多个表联合成一个表使用,适用于超大规模数据的存储 archive 将数据压缩后存储,适合于存储数据量大的历史数据,仅支持插入和查询 cvs 基于svc数据格式进行存储 falcon 新的存储引擎,支持事务处理,据说是innodb的替换者 -
innodb和myisam的对比
区别 innodb myisam 存储文件 .frm 表定义文件;.ibd 数据文件和索引文件 .frm 表定义文件;.myd 数据文件;.myi 索引文件 锁 表锁、行锁 表锁 事务 支持 不支持 CRDU 读、写 读多 count 扫表 专门存储的地方 (加where也扫表) 索引结构 B+ Tree B+ Tree 外键 支持 不支持
-
物理结构解析
日志文件与数据文件的作用不一样;日志文件采用顺序IO方式存储(记录速度快,只能追加,浪费空间),而数据文件采用随机IO方式存储(记录相对慢,省空间);数据文件是对数据和索引的存储;两者都存放在 /var/lib/mysql 目录下
-
日志文件
# 查看日志开启情况 show variables like 'log_%';-
错误日志
记录mysql server的启动和关闭的日志信息,以及错误和警告信息
-
二进制日志
binlog
-
通用日志
-
慢查询日志
这个需要我们手动设置开启
-
重做日志
redo.log
-
回滚日志
undo.log
-
中继日志
relay.log
-
-
数据文件
# 查看数据文件 show variables like '%datadir%';-
.frm文件
主要存放与表相关的信息,表的定义
-
.ibd文件
使用独享表空间来存储表数据和索引信息,一张表对应一个ibd文件
-
ibdata文件
使用共享表空间存储表数据和索引信息,所有的表共同使用或者多个ibd文件
-
SQL执行顺序
select distinct <select_list> from <left_table> <join_type> join <right_table> on <join_condition> where <where_condition> group by <group_by_list> having <having_condition> order by <order_by_condition> limit <limit_number>;
-- 行过滤
1 from <left_table>
2 on <join_condition>
3 <join_type> join <right_table> # 第二步和第三步会循环执行
4 where <where_condition> # 第四步会循环执行,多个条件的执行顺序是从左往右的。
5 group by <group_by_list>
6 having <having_condition>
-- 列过滤
7 select # 分组之后才会执行select
8 distinct <select_list>
-- 排序
9 order by <order_by_condition>
-- MySQL附加
10 limit <limit_number> # 前9步都是SQL92标准语法。limit是MySQL的独有语法。
案例
# 商品和商品类别
CREATE TABLE `item` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id' ,
`name` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '商品名称' ,
`itemclsid` int(11) NOT NULL COMMENT '商品类别' ,
`price` int(3) NOT NULL DEFAULT 0 COMMENT '商品价格' ,
`description` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '商品描述' ,
PRIMARY KEY (`id`),
UNIQUE INDEX `index_test` (`name`) USING BTREE
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
;
CREATE TABLE `itemcls` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id' ,
`name` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '商品类别名称',
PRIMARY KEY (`id`),
UNIQUE INDEX `index_test` (`name`) USING BTREE
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
;
insert into item (`name`, itemclsid, price, description)values ("iphone 4", 1, 6499, "苹果划时代产品");
insert into item (`name`, itemclsid, price, description)values ("iphone 12", 1, 6899, "苹果首部5G手机");
insert into item (`name`, itemclsid, price, description)values ("华为mate20", 1, 4399, "华为商务机");
insert into item (`name`, itemclsid, price, description)values ("华为p20", 1, 4899, "华为拍照手机");
insert into item (`name`, itemclsid, price, description)values ("万象保温杯", 2, 199, "不锈钢保温杯");
insert into item (`name`, itemclsid, price, description)values ("万象玻璃杯", 2, 230, "高硅玻璃杯");
insert into itemcls(`name`) values ("手机");
insert into itemcls(`name`) values ("杯子");
-
from(产生虚拟表-virtual_table_1)
select * from item, itemcls; # 产生笛卡尔积 -
on(处理virtual_table_1笛卡尔积,产生virtual_table_2)
select * from item a, itemcls b where a.itemclsid = b.id;# 消除笛卡尔积 # 等价于 select * from item a inner join itemcls b on a.itemclsid = b.id; -
join(处理virtual_table_2,将外部列添加入virtual_table_2,产生virtual_table_3)
# 首先得再插入两条数据,才可看出区别 insert into item (`name`, itemclsid, price, description)values ("晨光马克笔", 4, 3, "最好用得马克笔"); insert into itemcls(`name`) values ("日用品");# left join(左外连接,添加外部列) select * from item a left join itemcls b on a.itemclsid = b.id;# right join (右外连接,添加外部列) select * from item a right join itemcls b on a.itemclsid = b.id;# inner join(内连接,不存在外部列) select * from item a inner join itemcls b on a.itemclsid = b.id;# out join select * from item a left outer join itemcls b on a.itemclsid = b.id; select * from item a right outer join itemcls b on a.itemclsid = b.id; -
where(处理virtual_table_3不匹配条件得行,产生virtual_table_4)
# 条件过滤 select * from item a left join itemcls b on a.itemclsid = b.id where price > 1; -
group by(对virtual_table_4得数据分组,产生virtual_table_5)
select * from item a left join itemcls b on a.itemclsid = b.id where a.price > 1 group by a.price; # MySQL 5.7.5及以上功能依赖检测功能。如果启用了 ONLY_FULL_GROUP_BY SQL模式(默认情况下),MySQL将拒绝选择列表,HAVING条件或ORDER BY列表的查询引用在GROUP BY子句中既未命名的非集合列,也不在功能上依赖于它们select * from item a left join itemcls b on a.itemclsid = b.id where a.price > 1 group by a.`name`; -
having(对virtual_table_5过滤,产生virtual_table_6)
select * from item a left join itemcls b on a.itemclsid = b.id where a.price > 1 group by a.`name` having a.`name` like 'iphone%'; -
select(对virtual_table_6进行一些函数处理,生成virtual_table_6.1)
select a.`name`, a.price * 0.75, a.description, b.`name` from item a left join itemcls b on a.itemclsid = b.id where a.price > 1 group by a.`name` having a.`name` like 'iphone%'; -
distinct(对virtual_table_6.1进行重复过滤,生成virtual_table_6.2)
select distinct a.`name`, a.price * 0.75, a.description, b.`name` from item a left join itemcls b on a.itemclsid = b.id where a.price > 1 group by a.`name` having a.`name` like 'iphone%'; -
order by(对virtual_table_6.2进行排序,生成virtual_table_7)
select distinct a.`name`, a.price * 0.75 newprice, a.description, b.`name` from item a left join itemcls b on a.itemclsid = b.id where a.price > 1 group by a.`name` having a.`name` like 'iphone%' order by newprice; -
limit(从virtual_table_7中选出指定得行)
select distinct a.`name`, a.price * 0.75 newprice, a.description, b.`name` from item a left join itemcls b on a.itemclsid = b.id where a.price > 1 group by a.`name` having a.`name` like 'iphone%' order by newprice limit 1;
mysql 安装
卸载
#### yum安装方式卸载
#1.查看已安装的mysql
rpm -qa | grep -i mysql
yum repolist all | grep mysql
#2.卸载mysql
yum remove -y mysql mysql-libs mysql-common
#3.删除mysql下的数据文件
rm -rf /var/lib/mysql
#4.删除mysql配置文件
rm /etc/my.cnf
#5.删除组件
yum remove -y mysql-community-release-el6-5.noarch
安装
#下载rpm文件
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
#执行rpm源文件
rpm -ivh mysql57-community-release-el7-8.noarch.rpm
#执行安装文件
yum install mysql-community-server
#在执行yum命令时可能出现以下错误
/var/run/yum.pid 已被锁定,PID 为 3489 的另一个程序正在运行
执行 rm -f /var/run/yum.pid 即可解决
启动
systemctl start mysqld
#启动的时候报错
SELinux is preventing /usr/sbin/mysqld from associate access on the shared memory Unknown.
vim /etc/selinux/config
#将SELINUX=enforcing改为SELINUX=disabled
reboot
常用命令
# 需要在linux中先查询出初始化密码才能登陆进mysql操作
grep password /var/log/mysqld.log
mysql -uroot -p
# 修改密码策略
set global validate_password_policy=0;
# 修改密码长度
set global validate_password_length=1;
# 修改root用户密码
set password for 'root'@'localhost' = password('123456');
# MySQL远程连接授权
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
# 刷新权限
FLUSH PRIVILEGES;
# 查看用户
select user from mysql.user;
后续
索引、innodb、锁、事务、优化、集群、分库分表 将在后续该系列文章中展示