首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
182 阅读
2
php接口优化 使用curl_multi_init批量请求
144 阅读
3
《从菜鸟到大师之路 ElasticSearch 篇》
107 阅读
4
2024年备考系统架构设计师
104 阅读
5
PHP 文件I/O
92 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
786
篇文章
累计收到
28
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
786
篇与
的结果
2024-02-06
【收藏】19张最全的架构师技术栈图谱
【收藏】19张最全的架构师技术栈图谱今天收集了19张关于软件架构师应该了解和掌握的技能图谱,希望这份技术知识图谱能够帮助到每一位奋斗在架构师技术路上的小伙伴。1、架构师图谱2、微服务架构秘籍3、互联网大流量的方法4、安全秘籍5、阿里巴巴常用小框架6、架构方法论图谱7、设计模式秘籍图谱8、大数据技能图谱9、云计算图谱10、 云计算技能图谱11、OpenResty技能图谱12、容器技能图谱13、开发语言宝典14、运维技能图谱15、 软件工程图谱16、DevOps图谱17、前端开发图谱18、后端开发图谱19、软件发布流程大家可以根据上面技术谱图,查漏补缺,找准自己的位置。希望这19张知识图谱能帮助你建立自己的知识体系。
2024年02月06日
54 阅读
0 评论
0 点赞
2024-02-06
2024年史上最全考证时间表 不收藏比错过初恋还难过
2024年史上最全考证时间表 不收藏比错过初恋还难过http://flt-pan.58heshihu.com/blog/typecho/2024年史上最全考证时间表 不收藏比错过初恋还难过 - 知乎.md
2024年02月06日
12 阅读
0 评论
0 点赞
2024-02-05
掌握 SQL 这些核心知识点,出去吹牛逼再也不担心了
掌握 SQL 这些核心知识点,出去吹牛逼再也不担心了第一章 SQL的介绍1.1什么是sqlSQL:Structure Query Language。(结构化查询语言),通过sql操作数据库(操作数据库,操作表,操作数据)SQL被美国国家标准局(ANSI)确定为关系型数据库语言的美国标准,后来被国际化标准组织(ISO)采纳为关系数据库语言的国际标准各数据库厂商(MySql,oracle,sql server)都支持ISO的SQL标准。各数据库厂商在标准的基础上做了自己的扩展。 各个数据库自己特定的语法1.2 sql的分类Data Definition Language (DDL数据定义语言) 如:操作数据库,操作表Data Manipulation Language(DML数据操纵语言),如:对表中的记录操作增删改Data Query Language(DQL 数据查询语言),如:对表中数据的查询操作Data Control Language(DCL 数据控制语言),如:对用户权限的设置1.3 MySQL的语法规范和要求(1)mysql的sql语法不区分大小写MySQL的关键字和函数名等不区分大小写,但是对于数据值是否区分大小写,和字符集与校对规则有关。ci(大小写不敏感),cs(大小写敏感),_bin(二元,即比较是基于字符编码的值而与language无关,区分大小写)(2)命名时:尽量使用26个英文字母大小写,数字0-9,下划线,不要使用其他符号user_id(3)建议不要使用mysql的关键字等来作为表名、字段名等,如果不小心使用,请在SQL语句中使用`(飘号)引起来(4)数据库和表名、字段名等对象名中间不要包含空格(5)同一个mysql软件中,数据库不能同名,同一个库中,表不能重名,同一个表中,字段不能重名(6)标点符号:必须成对必须英文状态下半角输入方式字符串和日期类型可以使用单引号’’列的别名可以使用双引号"",给表名取别名不要使用双引号。取别名时as可以省略如果列的别名没有包含空格,可以省略双引号,如果有空格双引号不能省略。(7)SQL脚本中如何加注释单行注释:#注释内容单行注释:--空格注释内容 其中--后面的空格必须有多行注释:/* 注释内容 */#以下两句是一样的,不区分大小写 show databases; SHOW DATABASES; #创建表格 #create table student info(...); #表名错误,因为表名有空格 create table student_info(...); #其中name使用``飘号,因为name和系统关键字或系统函数名等预定义标识符重名了。 CREATE TABLE t_stu( id INT, `name` VARCHAR(20) ); select id as "编号", `name` as "姓名" from t_stu; #起别名时,as都可以省略 select id as 编号, `name` as 姓名 from t_stu; #如果字段别名中没有空格,那么可以省略"" select id as 编 号, `name` as 姓 名 from t_stu; #错误,如果字段别名中有空格,那么不能省略""第二章-DDL操作数据库2.1创建数据库(掌握)语法create database 数据库名 [character set 字符集][collate 校对规则] 注: []意思是可选的意思字符集(charset):是一套符号和编码。练习创建一个day01的数据库(默认字符集)create database day01;创建一个day01_2的数据库,指定字符集为gbk(了解)create database day01_2 character set gbk;2.2查看所有的数据库2.2.1查看所有的数据库语法show databases; 2.2.2查看数据库的定义结构【了解】语法show create database 数据库名;查看day01这个数据库的定义show create database day01; 2.3删除数据库语法drop database 数据库名;删除day01_2数据库drop database day01_2;2.4修改数据库【了解】语法alter database 数据库名 character set 字符集修改day01这个数据库的字符集(gbk)alter database day01 character set gbk;注意:是utf8,不是utf-8不是修改数据库名2.5其他操作切换数据库, 选定哪一个数据库use 数据库名; //注意: 在创建表之前一定要指定数据库. use 数据库名练习: 使用day01use day01;查看正在使用的数据库select database();第三章-DDL操作表3.1 创建表3.1.1 语法create table 表名( 列名 类型 [约束], 列名 类型 [约束] ... );3.1.2 类型3.1.2.1 数值类型整型系列:xxxIntint(M),必须和unsigned zerofill一起使用才有意义浮点型系列:float,double(或real)double(M,D):表示最长为M位,其中小数点后D位例如:double(5,2)表示的数据范围[-999.99,999.99],如果超过这个范围会报错。定点型系列:decimal(底层实际上是使用字符串进行存储)decimal(M,D):表示最长为M位,其中小数点后D位位类型:bit字节范围是:1-8,值范围是:bit(1)~bit(64),默认bit(1)用来存储二进制数。对于位字段,直接使用select命令将不会看到结果。可以使用bit()或hex()函数进行读取。插入bit类型字段时,使用bit()函数转为二进制值再插入,因为二进制码是“01”。3.1.2.2 日期时间类型日期时间类型:year, date, datetime, timestamp注意一下每一种日期时间的表示范围timestamp和datetime的区别:timestamp范围比较小timestamp和时区有关show variables like ‘time_zone’;set time_zone = ‘+8:00’;timestamp受MySQL版本和服务器的SQLMode影响很大表中的第一个非空的timestamp字段如果插入和更新为NULL则会自动设置为系统时间3.1.2.3 字符串类型MySQL中提供了多种对字符数据的存储类型,不同的版本可能有所差异。常见的有:char,varchar,xxtext,binary,varbinary,xxblob,enum,set等等字符串类型char,varchar(M)char如果没有指定宽度,默认为1个字符varchar(M),必须指定宽度binary和varbinary类似于char和varchar,不同的是它们包含二进制字符串,不支持模糊查询之类的。一般在保存少量字符串的时候,我们会选择char和varchar;而在保存较大文本时,通常会选择使用text或blob系列。blob和text值会引起一些性能问题,特别是在执行了大量的删除操作时,会在数据表中留下很大的“空洞”,为了提高性能,建议定期时候用optimize table功能对这类表进行碎片整理。可以使用合成的(Synthetic)索引来提高大文本字段的查询性能,如果需要对大文本字段进行模糊查询,MySql提供了前缀索引。但是仍然要在不必要的时候避免检索大型的blob或text值。enum枚举类型,它的值范围需要在创建表时通过枚举方式显式指定,对于1~255个成员的枚举需要1个字节存储;对于255`65535个成员需要2个字节存储。例如:gender enum(‘男’,‘女’)。如果插入枚举值以外的值,会按第一个值处理。一次只能从枚举值中选择一个。set集合类型,可以包含0~64个成员。一次可以从集合中选择多个成员。如果选择了1-8个成员的集合,占1个字节,依次占2个,3个。。8个字节。例如:hoppy set(‘吃饭’,‘睡觉’,‘玩游戏’,‘旅游’),选择时’吃饭,睡觉’或’睡觉,玩游戏,旅游’3.1.2.4 示例+----------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------------+--------------+------+-----+---------+----------------+ | eid | int(11) | NO | PRI | NULL | auto_increment | | ename | varchar(20) | NO | | NULL | | | tel | char(11) | NO | | NULL | | | gender | char(1) | YES | | 男 | | | salary | double | YES | | NULL | | | commission_pct | double(3,2) | YES | | NULL | | | birthday | date | YES | | NULL | | | hiredate | date | YES | | NULL | | | job_id | int(11) | YES | | NULL | | | email | varchar(32) | YES | | NULL | | | mid | int(11) | YES | | NULL | | | address | varchar(150) | YES | | NULL | | | native_place | varchar(10) | YES | | NULL | | | did | int(11) | YES | | NULL | | +----------------+--------------+------+-----+---------+----------------+ 3.1.3 约束即规则,规矩 限制;作用:保证用户插入的数据保存到数据库中是符合规范的约束 约束关键字 主键 primary key 非空且唯一,并且一张表只能有一个主键唯一 unique 唯一,当前列不能出现相同的数据非空 not null 非空,当前列不能为null默认 default 如果当前列没有数据,则指定默认数据约束种类:not null: 非空 ; eg: username varchar(40) not null username这个列不能有null值unique:唯一约束, 后面的数据不能和前面重复; eg: cardNo char(18) unique; cardNo 列里面不可以有重复数据primary key;主键约束(非空+唯一); 一般用在表的id列上面. 一张表基本上都有id列的, id列作为唯一标识的auto_increment: 自动增长,必须是设置了primary key之后,才可以使用auto_incrementid int primary key auto_increment; id不需要我们自己维护了, 插入数据的时候直接插入null, 自动的增长进行填充进去, 避免重复了.注意:先设置了primary key 再能设置auto_increment只有当设置了auto_increment 才可以插入null , 否则插入null会报错id列:给id设置为int类型, 添加主键约束, 自动增长或者给id设置为字符串类型,添加主键约束, 不能设置自动增长3.1.4练习创建一张学生表(含有id字段,姓名字段不能重复,性别字段不能为空默认值为男. id为主键自动增长)CREATE TABLE student( id INT PRIMARY KEY AUTO_INCREMENT, -- 主键自增长 NAME VARCHAR(30) UNIQUE, -- 唯一约束 gender CHAR(1) NOT NULL DEFAULT '男' );3.2 查看表【了解】3.2.1查看所有的表show tables;3.2.2查看表的定义结构语法desc 表名;练习: 查看student表的定义结构desc student;3.3 修改表【掌握,但是不要记忆】3.3.1语法增加一列alter table 【数据库名.]表名称 add 【column】 字段名 数据类型; alter table 【数据库名.]表名称 add 【column】 字段名 数据类型 first; alter table 【数据库名.]表名称 add 【column】 字段名 数据类型 after 另一个字段;修改列的类型约束:alter table 表名 modify 字段 类型 约束 ;修改列的名称,类型,约束: alter table 表名 change 旧列 新列 类型 约束;删除一列: alter table 表名 drop 列名;修改表名 : rename table 旧表名 to 新表名;3.3.2练习给学生表增加一个grade字段,类型为varchar(20),不能为空ALTER TABLE student ADD grade VARCHAR(20) NOT NULL;给学生表的gender字段改成int类型,不能为空,默认值为1alter table student modify gender varchar(20); 给学生表的grade字段修改成class字段ALTER TABLE student CHANGE grade class VARCHAR(20) NOT NULL;把class字段删除ALTER TABLE student DROP class;把学生表修改成老师表(了解)RENAME TABLE student TO teacher;3.4 删除表【掌握】语法drop table 表名;把teacher表删除drop table teacher;第四章-DML操作表记录-增删改【重点】准备工作: 创建一张商品表(商品id,商品名称,商品价格,商品数量.)create table product( pid int primary key auto_increment, pname varchar(40), price double, num int );4.1 插入记录4.1.1 语法方式一: 插入指定列, 如果没有把这个列进行列出来, 以null进行自动赋值了.eg: 只想插入pname, price , insert into t_product(pname, price) values(‘mac’,18000); insert into 表名(列,列..) values(值,值..);注意: 如果没有插入了列设置了非空约束, 会报错的方式二: 插入所有的列,如果哪列不想插入值,则需要赋值为nullinsert into 表名 values(值,值....); eg: insert into product values(null,'苹果电脑',18000.0,10); insert into product values(null,'华为5G手机',30000,20); insert into product values(null,'小米手机',1800,30); insert into product values(null,'iPhonex',8000,10); insert into product values(null,'iPhone7',6000,200); insert into product values(null,'iPhone6s',4000,1000); insert into product values(null,'iPhone6',3500,100); insert into product values(null,'iPhone5s',3000,100); insert into product values(null,'方便面',4.5,1000); insert into product values(null,'咖啡',11,200); insert into product values(null,'矿泉水',3,500);4.2 更新记录4.2.1语法update 表名 set 列 =值, 列 =值 [where 条件]4.2.2练习将所有商品的价格修改为5000元update product set price = 5000;UPDATE product set price = 18000 WHERE pname = '苹果电脑';将商品名是苹果电脑的价格修改为17000,数量修改为5UPDATE product set price = 17000,num = 5 WHERE pname = '苹果电脑';将商品名是方便面的商品的价格在原有基础上增加2元UPDATE product set price = price+2 WHERE pname = '方便面';4.3 删除记录4.3.1 delete根据条件,一条一条数据进行删除语法delete from 表名 [where 条件] 注意: 删除数据用delete,不用truncate类型删除表中名称为’苹果电脑’的记录delete from product where pname = '苹果电脑';删除价格小于5001的商品记录delete from product where price < 5001;删除表中的所有记录(要删除一般不建议使用delete语句,delete语句是一行一行执行,速度过慢)delete from product;4.3.2truncate把表直接DROP掉,然后再创建一个同样的新表。删除的数据不能找回。执行速度比DELETE快truncate table 表;4.3.3 工作中删除数据物理删除: 真正的删除了, 数据不在, 使用delete就属于物理删除逻辑删除: 没有真正的删除, 数据还在. 搞一个标记, 其实逻辑删除是更新 eg: state 1 启用 0禁用第五章-DQL操作表记录-查询【重点】5.1 基本查询语法select 要查询的字段名 from 表名 [where 条件] 5.2 简单查询5.2.1 查询所有行和所有列的记录语法select * form 表查询商品表里面的所有的列select * from product;5.2.2 查询某张表特定列的记录语法select 列名,列名,列名... from 表查询商品名字和价格select pname, price from product;5.2.3 去重查询 distinct语法SELECT DISTINCT 字段名 FROM 表名; //要数据一模一样才能去重去重查询商品的名字SELECT DISTINCT pname,price FROM product注意点: 去重针对某列, distinct前面不能先出现列名5.2.4 别名查询语法select 列名 as 别名 ,列名 from 表 //列别名 as可以不写 select 别名.* from 表 as 别名 //表别名(多表查询, 明天会具体讲)查询商品信息,使用别名SELECT pid ,pname AS '商品名',price AS '商品价格',num AS '商品库存' FROM product5.2.5 运算查询(+,-,*,/,%等)把商品名,和商品价格+10查询出来:我们既可以将某个字段加上一个固定值,又可以对多个字段进行运算查询select pname ,price+10 as 'price' from product; select name,chinese+math+english as total from student注意运算查询字段,字段之间是可以的字符串等类型可以做运算查询,但结果没有意义5.3 条件查询(很重要)5.3.1语法select ... from 表 where 条件 //取出表中的每条数据,满足条件的记录就返回,不满足条件的记录不返回5.3.2 运算符1、比较运算符大于:>小于:<大于等于:>=小于等于:<=等于:= 不能用于null判断不等于:!= 或 <>安全等于: <=> 可以用于null值判断2、逻辑运算符(建议用单词,可读性来说)逻辑与:&& 或 and逻辑或:|| 或 or逻辑非:! 或 not逻辑异或:^ 或 xor3、范围区间范围:between x and y not between x and y集合范围:in (x,x,x) not in (x,x,x)4、模糊查询和正则匹配(只针对字符串类型,日期类型)like 'xxx' 模糊查询是处理字符串的时候进行部分匹配如果想要表示0~n个字符,用%如果想要表示确定的1个字符,用_regexp '正则'5、特殊的null值处理#(1)判断时 xx is null xx is not null xx <=> null #(2)计算时 ifnull(xx,代替值) 当xx是null时,用代替值计算5.3.3 练习查询商品价格>3000的商品select * from product where price > 3000;查询pid=1的商品select * from product where pid = 1;查询pid<>1的商品(!=)select * from product where pid <> 1;查询价格在3000到6000之间的商品select * from product where price between 3000 and 6000;查询pid在1,5,7,15范围内的商品select * from product where id = 1; select * from product where id = 5; select * from product where id = 7; select * from product where id = 15; select * from product where id in (1,5,7,15);查询商品名以iPho开头的商品(iPhone系列)select * from product where pname like 'iPho%';查询商品价格大于3000并且数量大于20的商品 (条件 and 条件 and…)select * from product where price > 3000 and num > 20;查询id=1或者价格小于3000的商品select * from product where pid = 1 or price < 3000;5.4 排序查询排序是写在查询的后面,代表把数据查询出来之后再排序5.4.1 环境的准备# 创建学生表(有sid,学生姓名,学生性别,学生年龄,分数列,其中sid为主键自动增长) CREATE TABLE student( sid INT PRIMARY KEY auto_increment, sname VARCHAR(40), sex VARCHAR(10), age INT, score DOUBLE ); INSERT INTO student VALUES(null,'zs','男',18,98.5); INSERT INTO student VALUES(null,'ls','女',18,96.5); INSERT INTO student VALUES(null,'ww','男',15,50.5); INSERT INTO student VALUES(null,'zl','女',20,98.5); INSERT INTO student VALUES(null,'tq','男',18,60.5); INSERT INTO student VALUES(null,'wb','男',38,98.5); INSERT INTO student VALUES(null,'小丽','男',18,100); INSERT INTO student VALUES(null,'小红','女',28,28); INSERT INTO student VALUES(null,'小强','男',21,95);5.4.2 单列排序语法: 只按某一个字段进行排序,单列排序SELECT 字段名 FROM 表名 [WHERE 条件] ORDER BY 字段名 [ASC|DESC]; //ASC: 升序,默认值; DESC: 降序案例: 以分数降序查询所有的学生SELECT * FROM student ORDER BY score DESC5.4.3 组合排序语法: 同时对多个字段进行排序,如果第1个字段相等,则按第2个字段排序,依次类推SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名1 [ASC|DESC], 字段名2 [ASC|DESC];练习: 以分数降序查询所有的学生, 如果分数一致,再以age降序SELECT * FROM student ORDER BY score DESC, age DESC5.5 聚合函数聚合函数用于统计,通常会和分组查询一起使用,用于统计每组的数据5.5.1 聚合函数列表聚合函数 作用max(列名) 求这一列的最大值min(列名) 求这一列的最小值avg(列名) 求这一列的平均值count(列名) 统计这一列有多少条记录sum(列名) 对这一列求总和语法SELECT 聚合函数(列名) FROM 表名 [where 条件];案例-- 求出学生表里面的最高分数 SELECT MAX(score) FROM student -- 求出学生表里面的最低分数 SELECT MIN(score) FROM student -- 求出学生表里面的分数的总和(忽略null值) SELECT SUM(score) FROM student -- 求出学生表里面的平均分 SELECT AVG(score) FROM student -- 求出学生表里面的平均分(缺考了当成0分处理) SELECT AVG(IFNULL(score,0)) FROM student -- 统计学生的总人数 (忽略null) SELECT COUNT(sid) FROM student SELECT COUNT(*) FROM student注意: 聚合函数会忽略空值NULL我们发现对于NULL的记录不会统计,建议如果统计个数则不要使用有可能为null的列,但如果需要把NULL也统计进去呢?我们可以通过 IFNULL(列名,默认值) 函数来解决这个问题. 如果列不为空,返回这列的值。如果为NULL,则返回默认值。-- 求出学生表里面的平均分(缺考了当成0分处理) SELECT AVG(IFNULL(score,0)) FROM student5.6 分组查询GROUP BY将分组字段结果中相同内容作为一组,并且返回每组的第一条数据,所以单独分组没什么用处。分组的目的就是为了统计,一般分组会跟聚合函数一起使用5.6.1分组语法SELECT 字段1,字段2... FROM 表名 [where 条件] GROUP BY 列 [HAVING 条件];案例-- 根据性别分组, 统计每一组学生的总人数 SELECT sex '性别',COUNT(sid) '总人数' FROM student GROUP BY sex -- 根据性别分组,统计每组学生的平均分 SELECT sex '性别',AVG(score) '平均分' FROM student GROUP BY sex -- 根据性别分组,统计每组学生的总分 SELECT sex '性别',SUM(score) '总分' FROM student GROUP BY sex5.6.2 分组后筛选 having分组后的条件,不能写在where之后,where关键字要写在group by之前根据性别分组, 统计每一组学生的总人数> 5的(分组后筛选)SELECT sex, count(*) FROM student GROUP BY sex HAVING count(sid) > 5根据性别分组,只统计年龄大于等于18的,并且要求组里的人数大于4SELECT sex '性别',COUNT(sid) '总人数' FROM student WHERE age >= 18 GROUP BY sex HAVING COUNT(sid) > 45.6.3 where和having的区别【面试】子名 作用where 子句 1) 对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,即先过滤再分组。2) where后面不可以使用聚合函数having字句 1) having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,即先分组再过滤。2) having后面可以使用聚合函数5.7 分页查询5.7.1 语法select ... from .... limit a ,bLIMIT a,b;a 表示的是跳过的数据条数b 表示的是要查询的数据条数5.7.2 案例-- 分页查询 -- limit 关键字是使用在查询的后边,如果有排序的话则使用在排序的后边 -- limit的语法: limit offset,length 其中offset表示跳过多少条数据,length表示查询多少条数据 SELECT * FROM product LIMIT 0,3 -- 查询product表中的前三条数据(0表示跳过0条,3表示查询3条) SELECT * FROM product LIMIT 3,3 -- 查询product表的第四到六条数据(3表示跳过3条,3表示查询3条) -- 分页的时候,只会告诉你我需要第几页的数据,并且每页有多少条数据 -- 假如,每页需要3条数据,我想要第一页数据: limit 0,3 -- 假如,每页需要3条数据,我想要第二页数据: limit 3,3 -- 假如,每页需要3条数据,我想要第三页数据: limit 6,3 -- 结论: length = 每页的数据条数,offset = (当前页数 - 1)*每页数据条数 -- limit (当前页数 - 1)*每页数据条数, 每页数据条数5.8 查询的语法小结select...from...where...group by...order by...limit select...from...where... select...from...where...order by... select...from...where...limit... select...from...where...order by...imit第六章 数据库三范式好的数据库设计对数据的存储性能和后期的程序开发,都会产生重要的影响。建立科学的,规范的数据库就需要满足一些规则来优化数据的设计和存储,这些规则就称为范式。6.1 第一范式: 确保每列保持原子性第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。第一范式的合理遵循需要根据系统的实际需求来定。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经常会访问“地址”属性中的“城市”部分,那么就非要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分操作的时候将非常方便。这样设计才算满足了数据库的第一范式,如下表所示。如果不遵守第一范式,查询出数据还需要进一步处理(查询不方便)。遵守第一范式,需要什么字段的数据就查询什么数据(方便查询)6.2 第二范式: 确保表中的每列都和主键相关第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。比如要设计一个订单信息表,因为订单中可能会有多种商品,所以要将订单编号和商品编号作为数据库表的联合主键,如下表所示这样就产生一个问题:这个表中是以订单编号和商品编号作为联合主键。这样在该表中商品名称、单位、商品价格等信息不与该表的主键相关,而仅仅是与商品编号相关。所以在这里违反了第二范式的设计原则。而如果把这个订单信息表进行拆分,把商品信息分离到另一个表中,把订单项目表也分离到另一个表中,就非常完美了。如下所示<img src="imgs/tu_13.png" style="zoom: 67%;" />这样设计,在很大程度上减小了数据库的冗余。如果要获取订单的商品信息,使用商品编号到商品信息表中查询即可6.3 第三范式: 确保每列都和主键列直接相关,而不是间接相关第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系。而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段。如下面这两个表所示的设计就是一个满足第三范式的数据库表。<img src="imgs/tu_14.png" style="zoom:67%;" />这样在查询订单信息的时候,就可以使用客户编号来引用客户信息表中的记录,也不必在订单信息表中多次输入客户信息的内容,减小了数据冗余第七章 外键约束7.1 外键约束的概念在遵循三范式的前提下,很多时候我们必须要进行拆表,将数据分别存放在多张表中,以减少冗余数据。但是拆分出来的表与表之间是有着关联关系的,我们必须得通过一种约束来约定表与表之间的关系,这种约束就是外键约束7.2 外键约束的作用外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。7.3 创建外键约束的语法7.3.1 在建表时指定外键约束create table [数据名.]从表名( 字段名1 数据类型 primary key , 字段名2 数据类型 , ...., [constraint 外键约束名] foreign key (从表字段) references 主表名(主表字段) [on update 外键约束等级][on delete 外键约束等级] #外键只能在所有字段列表后面单独指定 #如果要自己命名外键约束名,建议 主表名_从表名_关联字段名_fk );7.3.2 在建表后指定外键约束alter table 从表名称 add [constraint 外键约束名] foreign key (从表字段名) references 主表名(主表被参照字段名) [on update xx][on delete xx];7.4 删除外键约束的语法ALTER TABLE 表名称 DROP FOREIGN KEY 外键约束名; #查看约束名 SELECT * FROM information_schema.table_constraints WHERE table_name = '表名称'; #删除外键约束不会删除对应的索引,如果需要删除索引,需要用ALTER TABLE 表名称 DROP INDEX 索引名; #查看索引名 show index from 表名称;7.5 外键约束的要求在从表上建立外键,而且主表要先存在。一个表可以建立多个外键约束通常情况下,从表的外键列一定要指向主表的主键列从表的外键列与主表被参照的列名字可以不相同,但是数据类型必须一样7.6 外键约束等级Cascade方式:在主表上update/delete记录时,同步update/delete掉从表的匹配记录Set null方式:在主表上update/delete记录时,将从表上匹配记录的列设为null,但是要注意子表的外键列不能为not nullNo action方式:如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作Restrict方式:同no action, 都是立即检查外键约束Set default方式(在可视化工具SQLyog中可能显示空白):父表有变更时,子表将外键列设置成一个默认的值,但Innodb不能识别如果没有指定等级,就相当于Restrict方式7.7 外键约束练习-- 部门表 create table dept( id int primary key, dept_name varchar(50), dept_location varchar(50) ); -- 员工表 CREATE TABLE emp( eid int primary key, name varchar(50) not null, sex varchar(10), dept_id int ); -- 给员工表表的dept_id添加外键指向部门表的主键 alter table emp add foreign key(dept_id) references dept(id)第八章 多表间关系8.1 一对多关系8.1.1 概念一对多的关系是指: 主表的一行数据可以同时对应从表的多行数据,反过来就是从表的多行数据指向主表的同一行数据。8.1.2 应用场景分类表和商品表、班级表和学生表、用户表和订单表等等8.1.2 建表原则将一的一方作为主表,多的一方作为从表,在从表中指定一个字段作为外键,指向主表的主键8.1.3 建表语句练习-- 创建分类表 CREATE TABLE category( cid INT PRIMARY KEY AUTO_INCREMENT, cname VARCHAR(50) ); -- 创建商品表 CREATE TABLE product( pid INT PRIMARY KEY AUTO_INCREMENT, pname VARCHAR(50), price DOUBLE, cid INT ) -- 给商品表添加一个外键 alter table product add foreign key(cid) references category(cid)8.2 多对多关系8.2.1 概念两张表都是多的一方,A表的一行数据可以同时对应B表的多行数据,反之B表的一行数据也可以同时对应A表的多行数据8.2.2 应用场景订单表和商品表、学生表和课程表等等8.2.3 建表原则因为两张表都是多的一方,所以在两张表中都无法创建外键,所以需要新创建一张中间表,在中间表中定义两个字段,这俩字段分别作为外键指向两张表各自的主键8.2.4 建表语句练习-- 创建学生表 CREATE TABLE student( sid INT PRIMARY KEY AUTO_INCREMENT, sname VARCHAR(50) ); -- 创建课程表 CREATE TABLE course( cid INT PRIMARY KEY AUTO_INCREMENT, cname VARCHAR(20) ); -- 创建中间表 CREATE TABLE s_c_table( sno INT, cno INT ); -- 给sno字段添加外键指向student表的sid主键 ALTER TABLE s_c_table ADD CONSTRAINT fkey01 FOREIGN KEY(sno) REFERENCES student(sid); -- 给cno字段添加外键指向course表的cid主键 ALTER TABLE s_c_table ADD CONSTRAINT fkey03 FOREIGN KEY(cno) REFERENCES course(cid);8.3 一对一关系(了解)8.3.1 第一种一对一关系我们之前学习过一对多关系,在一对多关系中主表的一行数据可以对应从表的多行数据,反之从表的一行数据则只能对应主表的一行数据。这种一行数据对应一行数据的关系,我们可以将其看作一对一关系3.3.2 第二种一对一关系A表中的一行数据对应B表中的一行数据,反之B表中的一行数据也对应A表中的一行数据,此时我们可以将A表当做主表B表当做从表,或者是将B表当做主表A表当做从表建表原则在从表中指定一个字段创建外键并指向主表的主键,然后给从表的外键字段添加唯一约束第九章 多表关联查询多表关联查询是使用一条SQL语句,将关联的多张表的数据查询出来9.1 环境准备-- 创建一张分类表(类别id,类别名称.备注:类别id为主键并且自动增长)CREATE TABLE t_category( cid INT PRIMARY KEY auto_increment, cname VARCHAR(40) ); INSERT INTO t_category values(null,'手机数码'); INSERT INTO t_category values(null,'食物'); INSERT INTO t_category values(null,'鞋靴箱包'); -- 创建一张商品表(商品id,商品名称,商品价格,商品数量,类别.备注:商品id为主键并且自动增长) CREATE TABLE t_product( pid INT PRIMARY KEY auto_increment, pname VARCHAR(40), price DOUBLE, num INT, cno INT ); insert into t_product values(null,'苹果电脑',18000,10,1); insert into t_product values(null,'iPhone8s',5500,100,1); insert into t_product values(null,'iPhone7',5000,100,1); insert into t_product values(null,'iPhone6s',4500,1000,1); insert into t_product values(null,'iPhone6',3800,200,1); insert into t_product values(null,'iPhone5s',2000,10,1); insert into t_product values(null,'iPhone4s',18000,1,1); insert into t_product values(null,'方便面',4.5,1000,2); insert into t_product values(null,'咖啡',10,100,2); insert into t_product values(null,'矿泉水',2.5,100,2); insert into t_product values(null,'法拉利',3000000,50,null); -- 给 商品表添加外键 ALTER TABLE t_product ADD FOREIGN KEY(cno) REFERENCES t_category(cid); 9.2 交叉查询【了解】交叉查询其实就是将多张表的数据没有条件地连接在一起进行展示9.2.1 语法select a.列,a.列,b.列,b.列 from a,b ; select a.*,b.* from a,b ; --或者 select * from a,b;9.2.2 练习使用交叉查询类别和商品select * from t_category,t_product;通过查询结果我们可以看到,交叉查询其实是一种错误的做法,在查询到的结果集中有大量的错误数据,我们称交叉查询到的结果集是笛卡尔积9.2.3 笛卡尔积假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。可以扩展到多个集合的情况。9.3 内连接查询交叉查询产生这样的结果并不是我们想要的,那么怎么去除错误的、不想要的记录呢,当然是通过条件过滤。通常要查询的多个表之间都存在关联关系,那么就通过关联关系(主外键关系)去除笛卡尔积。这种通过条件过滤去除笛卡尔积的查询,我们称之为连接查询。连接查询又可以分为内连接查询和外连接查询,我们先学习内连接查询9.3.1 隐式内连接查询隐式内连接查询里面是没有inner join关键字select [字段,字段,字段] from a,b where 连接条件 (b表里面的外键 = a表里面的主键 ) 9.3.2 显式内连接查询显式内连接查询里面是有inner join关键字select [字段,字段,字段] from a [inner] join b on 连接条件 [ where 其它条件]9.3.3 内连接查询练习查询所有类别下的商品信息,如果该类别下没有商品则不展示-- 1 隐式内连接方式 select *from t_category c, t_product p WHERE c.cid = p.cno; -- 2 显示内连接方式 -- 查询手机数码这个分类下的所有商品的信息以及分类信息 SELECT * FROM t_product tp INNER JOIN t_category tc ON tp.cno = tc.cid WHERE tc.cname = '手机数码'; SELECT * from t_category c INNER JOIN t_product p ON c.cid = p.cno9.3.4 内连接查询的特点主表和从表中的数据都是满足连接条件则能够查询出来,不满足连接条件则不会查询出来9.4 外连接查询我们发现内连接查询出来的是满足连接条件的公共部分, 如果要保证查询出某张表的全部数据情况下进行连接查询. 那么就要使用外连接查询了. 外连接分为左外连接和右外连接9.4.1 左外连接查询9.4.1.1 概念以join左边的表为主表,展示主表的所有数据,根据条件查询连接右边表的数据,若满足条件则展示,若不满足则以null显示。可以理解为:在内连接的基础上保证左边表的数据全部显示9.4.1.2 语法select 字段 from a left [outer] join b on 条件9.4.1.3 练习查询所有类别下的商品信息,就算该类别下没有商品也需要将该类别的信息展示出来SELECT * FROM t_category c LEFT OUTER JOIN t_product p ON c.cid = p.cno9.4.2 右外连接查询9.4.2.1 概念以join右边的表为主表,展示右边表的所有数据,根据条件查询join左边表的数据,若满足则展示,若不满足则以null显示。可以理解为:在内连接的基础上保证右边表的数据全部显示9.4.2.2 语法select 字段 from a right [outer] join b on 条件9.4.2.3 练习查询所有商品所对应的类别信息SELECT * FROM t_category c RIGHT OUTER JOIN t_product p ON c.cid = p.cno9.5 union联合查询实现全外连接查询首先要明确,联合查询不是多表连接查询的一种方式。联合查询是将多条查询语句的查询结果合并成一个结果并去掉重复数据。全外连接查询的意思就是将左表和右表的数据都查询出来,然后按照连接条件连接9.5.1 union的语法查询语句1 union 查询语句2 union 查询语句3 ...9.5.2 练习# 用左外的A union 右外的B SELECT * FROM t_category c LEFT OUTER JOIN t_product p ON c.cid = p.cno union SELECT * FROM t_category c RIGHT OUTER JOIN t_product p ON c.cid = p.cno9.6 自连接查询自连接查询是一种特殊的多表连接查询,因为两个关联查询的表是同一张表,通过取别名的方式来虚拟成两张表,然后进行两张表的连接查询9.6.1 准备工作-- 员工表 CREATE TABLE emp ( id INT PRIMARY KEY, -- 员工id ename VARCHAR(50), -- 员工姓名 mgr INT , -- 上级领导 joindate DATE, -- 入职日期 salary DECIMAL(7,2) -- 工资 ); -- 添加员工 INSERT INTO emp(id,ename,mgr,joindate,salary) VALUES (1001,'孙悟空',1004,'2000-12-17','8000.00'), (1002,'卢俊义',1006,'2001-02-20','16000.00'), (1003,'林冲',1006,'2001-02-22','12500.00'), (1004,'唐僧',1009,'2001-04-02','29750.00'), (1005,'李逵',1006,'2001-09-28','12500.00'), (1006,'宋江',1009,'2001-05-01','28500.00'), (1007,'刘备',1009,'2001-09-01','24500.00'), (1008,'猪八戒',1004,'2007-04-19','30000.00'), (1009,'罗贯中',NULL,'2001-11-17','50000.00'), (1010,'吴用',1006,'2001-09-08','15000.00'), (1011,'沙僧',1004,'2007-05-23','11000.00'), (1012,'李逵',1006,'2001-12-03','9500.00'), (1013,'小白龙',1004,'2001-12-03','30000.00'), (1014,'关羽',1007,'2002-01-23','13000.00'); #查询孙悟空的上级 SELECT employee.*,manager.ename mgrname FROM emp employee,emp manager where employee.mgr=manager.id AND employee.ename='孙悟空'9.6.2 自连接查询练习查询员工的编号,姓名,薪资和他领导的编号,姓名,薪资#这些数据全部在员工表中 #把t_employee表,即当做员工表,又当做领导表 #领导表是虚拟的概念,我们可以通过取别名的方式虚拟 SELECT employee.id "员工的编号",emp.ename "员工的姓名" ,emp.salary "员工的薪资", manager.id "领导的编号" ,manager.ename "领导的姓名",manager.salary "领导的薪资" FROM emp employee INNER JOIN emp manager #emp employee:employee.,表示的是员工表的 #emp manager:如果用manager.,表示的是领导表的 ON employee.mgr = manager.id # 员工的mgr指向上级的id #表的别名不要加"",给列取别名,可以用"",列的别名不使用""也可以,但是要避免包含空格等特殊符号。第十章 子查询如果一个查询语句嵌套在另一个查询语句里面,那么这个查询语句就称之为子查询,根据位置不同,分为:where型,from型,exists型。注意:不管子查询在哪里,子查询必须使用()括起来。10.1 where型①子查询是单值结果(单行单列),那么可以对其使用(=,>等比较运算符)# 查询价格最高的商品信息 select * from t_product where price = (select max(price) from t_product)②子查询是多值结果,那么可对其使用(【not】in(子查询结果),或 >all(子查询结果),或>=all(子查询结果),<all(子查询结果),<=all(子查询结果),或 >any(子查询结果),或>=any(子查询结果),<any(子查询结果),<=any(子查询结果))# 查询价格最高的商品信息 SELECT * FROM t_product WHERE price >=ALL(SELECT price FROM t_product) select * from t_product order by price desc limit 0,110.2 from型子查询的结果是多行多列的结果,类似于一张表格。必须给子查询取别名,即临时表名,表的别名不要加“”和空格。-- 思路一: 使用连接查询 -- 使用外连接,查询出分类表的所有数据 SELECT tc.cname,COUNT(tp.pid) FROM t_category tc LEFT JOIN t_product tp ON tp.cno = tc.cid GROUP BY tc.cname -- 思路二: 使用子查询 -- 第一步:对t_product根据cno进行分组查询,统计每个分类的商品数量 SELECT cno,COUNT(pid) FROM t_product GROUP BY cno -- 第二步: 用t_category表去连接第一步查询出来的结果,进行连接查询,此时要求查询出所有的分类 SELECT tc.cname,IFNULL(tn.total,0) '总数量' FROM t_category tc LEFT JOIN (SELECT cno,COUNT(pid) total FROM t_product GROUP BY cno) tn ON tn.cno=tc.cid10.3 exists型# 查询那些有商品的分类 SELECT cid,cname FROM t_category tc WHERE EXISTS (SELECT * FROM t_product tp WHERE tp.cno = tc.cid);
2024年02月05日
17 阅读
0 评论
0 点赞
2024-02-05
安装MySQL 8保姆级教程
MySQL 8.0安装部署MySQL 8 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能!一. Mysql8.0版本相比之前版本的一些特性1) 默认编码utf8默认编码使用utf8mb4, utf8mb4编码是utf8编码的超集,兼容utf8,并且能存储4字节的表情字符历史,MySQL数据库的 "utf8"并不是真正概念里的 UTF-8。MySQL中的"utf8"编码只支持最大3字节每字符。真正的大家正在使用的UTF-8编码是应该能支持4字节每个字符。MySQL的开发者没有修复这个bug。他们在2010年增加了一个变通的方法:一个新的字符集"utf8mb4"另外,utf-32编码固定使用4字节,32bit存储相比utf8浪费空间。2) 降序索引在之前的版本中可以创建,但是实际创建的还是升序索引mysql> create table t1(id1 int,id2 int,key(id1,id2 desc)); Query OK, 0 rows affected (0.10 sec) mysql> show create table t1 \G; *************************** 1. row *************************** Table: t1 Create Table: CREATE TABLE `t1` ( `id1` int(11) DEFAULT NULL, `id2` int(11) DEFAULT NULL, KEY `id1` (`id1`,`id2` DESC) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 1 row in set (0.00 sec) ERROR: No query specified另外,由于降序索引的引入,MySQL 8.0再也不会对group by操作进行隐式排序3) 隐藏索引隐藏索引的特性对于性能调试非常有用。当一个索引隐藏时,它不会被查询优化器所使用。也就是说,我们可以隐藏一个索引,然后观察对数据库的影响。如果数据库性能有所下降,就说明这个索引是有用的,于是将其“恢复显示”即可;如果数据库性能看不出变化,说明这个索引是多余的,可以删掉了.mysql> create index idx2 on t1(id1); Query OK, 0 rows affected (0.35 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> alter table t1 alter index idx2 invisible; Query OK, 0 rows affected (0.09 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show index from t1 where key_name='idx2' \G; *************************** 1. row *************************** Table: t1 Non_unique: 1 Key_name: idx2 Seq_in_index: 1 Column_name: id1 Collation: A Cardinality: 0 Sub_part: NULL Packed: NULL Null: YES Index_type: BTREE Comment: Index_comment: Visible: NO 1 row in set (0.01 sec) ERROR: No query specified当索引被隐藏时,它的内容仍然是和正常索引一样实时更新的,此特性是专门为优化调试使用。如果长期隐藏一个索引,那还不如干脆删掉,因为毕竟索引存在会影响插入、更新和删除的性能.4) 设置持久化在oracle中可以使用scope设置参数确定是否到spfile, 现在mysql8.0也可以放在文件中了,使用方法:mysql> show variables like 'max_connects'; Empty set (0.07 sec) mysql> show variables like 'max_connections'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_connections | 500 | +-----------------+-------+ 1 row in set (0.01 sec) mysql> set persist max_connections=1000; Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'max_connections'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_connections | 1000 | +-----------------+-------+ 1 row in set (0.01 sec)可以查看在数据目录datadir中的一个mysqld-auto.cnf文件中保存了设置,下次启动时候将用此配置覆盖默认配置参数{ "Version" : 1 , "mysql_server" : { "max_connections" : { "Value" : "1000" , "Metadata" : { "Timestamp" : 1540437420567571 , "User" : "root" , "Host" : "" } } } }5) 通用表表达式(Common Table Expressions)也可以称为虚拟视图,大大简化复杂查询mysql> WITH -> t1 AS (SELECT * FROM t1), -> t2 AS (SELECT * FROM t1) -> SELECT t1.*, t2.* -> FROM t1, t2; +------+------+------+------+ | id1 | id2 | id1 | id2 | +------+------+------+------+ | 1 | 2 | 1 | 2 | +------+------+------+------+ 1 row in set (0.00 sec) 6) 窗口函数(Window Functions)MySQL 被吐槽最多的特性之一就是缺少 rank() 函数,当需要在查询当中实现排名时,必须手写 @ 变量。但是从 8.0 开始,MySQL 新增了一个叫窗口函数的概念,它可以用来实现若干新的查询方式说明,窗口可以单独创建。mysql> create table tbl2(name varchar(10),amount int); Query OK, 0 rows affected (0.16 sec) mysql> insert into tbl2 values('usa',100),('china',101),('japan',103),('russian',99); Query OK, 4 rows affected (0.13 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> select t1.*,rank() over w as 'rank' from tbl2 as t1 window w as (order by amount); +---------+--------+------+ | name | amount | rank | +---------+--------+------+ | russian | 99 | 1 | | usa | 100 | 2 | | china | 101 | 3 | | japan | 103 | 4 | +---------+--------+------+ 4 rows in set (0.00 sec) mysql> select t1.*,rank() over() as 'rank' from tbl2 as t1; +---------+--------+------+ | name | amount | rank | +---------+--------+------+ | usa | 100 | 1 | | china | 101 | 1 | | japan | 103 | 1 | | russian | 99 | 1 | +---------+--------+------+ 4 rows in set (0.00 sec) mysql> select t1.*,rank() over(order by amount) as 'rank' from tbl2 as t1; +---------+--------+------+ | name | amount | rank | +---------+--------+------+ | russian | 99 | 1 | | usa | 100 | 2 | | china | 101 | 3 | | japan | 103 | 4 | +---------+--------+------+ 4 rows in set (0.00 sec) mysql> select t1.*,sum() over() as 'rank' from tbl2 as t1; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') over() as 'rank' from tbl2 as t1' at line 1 mysql> select t1.*,sum(amount) over() as 'sum' from tbl2 as t1; +---------+--------+------+ | name | amount | sum | +---------+--------+------+ | usa | 100 | 403 | | china | 101 | 403 | | japan | 103 | 403 | | russian | 99 | 403 | +---------+--------+------+ 4 rows in set (0.00 sec)7) 安全性对 OpenSSL 的改进、新的默认身份验证、SQL 角色、密码强度、授权。MySQL现在维护关于密码历史的信息,允许对以前密码的重用进行限制比如常见的一个连接错误,参考:https://blog.csdn.net/jc_benben/article/details/806528978) 增加JSON (json enhancements)AND OpenGIS spatial typesmysql提供了很多json相关的函数和API接口,添加了基于路径查询参数从 JSON 字段中抽取数据的 JSON_EXTRACT() 函数,以及用于将数据分别组合到 JSON 数组和对象中的 JSON_ARRAYAGG() 和 JSON_OBJECTAGG() 聚合函数9) 原子数据定义语句(原子DDL)(Atomic Data Definition Statements (Atomic DDL))10) 资源管理(Resource management)MySQL现在支持资源组的创建和管理,并允许将服务器内运行的线程分配给特定组,以便线程根据组可用的资源执行。组属性可以控制其资源,以启用或限制组中线程的资源消耗11) Data dictionaryMySQL现在包含一个事务数据字典,用于存储有关数据库对象的信息,In previous MySQL releases, dictionary data was stored in metadata files and nontransactional tables比如myisam和innodb表定义frm文件等.12) innodb的增强每次值更改时,当前最大自动增量计数器值将写入重做日志,并保存到每个检查点上的引擎专用系统表中。这些更改使当前最大自动增量计数器值在服务器重新启动时保持不变。遇到索引树损坏时, InnoDB将损坏标志写入重做日志,这会使损坏标志崩溃安全。InnoDB还将内存中损坏标志数据写入每个检查点上的引擎专用系统表。在恢复期间, InnoDB从两个位置读取损坏标志并在将内存表和索引对象标记为损坏之前合并结果。InnoDB 分布式缓存插件支持多个get操作(读取在一个单一的多键/值对分布式缓存查询)和范围查询;新的动态配置选项 innodb_deadlock_detect可用于禁用死锁检测。在高并发系统上,当许多线程等待同一个锁时,死锁检测会导致速度减慢。有时,禁用死锁检测可能更有效,并且在innodb_lock_wait_timeout发生死锁时依赖于事务回滚的设置。INFORMATION_SCHEMA.INNODB_CACHED_INDEXES 表报告InnoDB每个索引缓冲池中缓存的索引页数 。InnoDB现在,在共享临时表空间中创建临时表ibtmp1。InnoDB 表空间加密功能支持重做日志的加密和撤消日志数据;InnoDB支持 NOWAIT和SKIP LOCKED选项SELECT ... FOR SHARE以及SELECT ... FOR UPDATE锁定读取语句。 NOWAIT如果请求的行被另一个事务锁定,则会立即返回该语句。SKIP LOCKED从结果集中删除锁定的行SELECT ... FOR SHARE替换 SELECT ... LOCK IN SHARE MODE,但LOCK IN SHARE MODE仍可用于向后兼容;支持ADD PARTITION,DROP PARTITION,COALESCE PARTITION,REORGANIZE PARTITION,和REBUILD PARTITION ALTER TABLE选项;InnoDB存储引擎现在使用MySQL的数据字典,而不是它自己的存储引擎特定的数据字典;mysql系统表和数据字典表现在在MySQL数据目录中InnoDB命名的单个表空间文件创建mysql. ibd。以前,这些表是InnoDB在mysql数据库目录中的各个表空间文件中创建的;二. Mysql8.0安装 (YUM方式)1) 首先删除系统默认或之前可能安装的其他版本的mysql[root@DB-node01 ~]# for i in $(rpm -qa|grep mysql);do rpm -e $i --nodeps;done [root@DB-node01 ~]# rm -rf /var/lib/mysql && rm -rf /etc/my.cnf2) 安装Mysql8.0 的yum资源库mysql80-community-release-el7-1.noarch.rpm 下载地址: https://pan.baidu.com/s/1QzYaSnzAQeTqAmk8FE9doA提取密码: 2maw[root@DB-node01 ~]# yum localinstall https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm3) 安装Mysql8.0[root@DB-node01 ~]# yum install mysql-community-server #启动MySQL服务器和MySQL的自动启动 [root@DB-node01 ~]# systemctl start mysqld [root@DB-node01 ~]# systemctl enable mysqld4) 使用默认密码初次登录后, 必须要重置密码查看默认密码, 如下默认密码为"e53xDalx.*dE"[root@DB-node01 ~]# grep 'temporary password' /var/log/mysqld.log 2019-03-06T01:53:19.897262Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: e53xDalx.*dE [root@DB-node01 ~]# mysql -pe53xDalx.*dE ............ mysql> select version(); ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.报错提示必须要重置初始密码, 下面开始重置mysql登录密码(注意要切换到mysql数据库,使用use mysql)mysql> use mysql; ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement. mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; ERROR 1819 (HY000): Your password does not satisfy the current policy requirements这个其实与validate_password_policy的值有关, mysql8.0更改了validate_password_policy相关的配置名称, 这跟Mysql5.7有点不一样了.mysql> set global validate_password.policy=0; Query OK, 0 rows affected (0.00 sec) mysql> set global validate_password.length=1; Query OK, 0 rows affected (0.00 sec)接着再修改密码mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; Query OK, 0 rows affected (0.05 sec) mysql> flush privileges; Query OK, 0 rows affected (0.03 sec)退出, 重新使用新密码登录mysql[root@DB-node01 ~]# mysql -p123456 ........... mysql> select version(); +-----------+ | version() | +-----------+ | 8.0.15 | +-----------+ 1 row in set (0.00 sec)查看服务端口mysql> show global variables like 'port'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | port | 3306 | +---------------+-------+ 1 row in set (0.01 sec)查看mysql连接的授权信息mysql> select host,user,password from mysql.user; ERROR 1054 (42S22): Unknown column 'password' in 'field list'上面这是mysql5.6及以下版本的查看命令,mysql5.7之后的数据库里mysql.user表里已经没有password这个字段了,password字段改成了authentication_string。mysql> select host,user,authentication_string from mysql.user; +-----------+------------------+------------------------------------------------------------------------+ | host | user | authentication_string | +-----------+------------------+------------------------------------------------------------------------+ | localhost | mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | mysql.session | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | mysql.sys | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | root | $A$005${7J0=4Dc7Jym8eI/FU4jimKWFvkD9XmoAkF1ca5.Un0bc6zgmPtU.0 | +-----------+------------------+------------------------------------------------------------------------+ 4 rows in set (0.00 sec)=============================mysql8.0修改用户密码命令================================mysql> use mysql; mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; mysql> flush privileges;三. Mysql8.0安装 (二进制方式)1) 首先删除系统默认或之前可能安装的其他版本的mysql[root@mysql8-node ~]# for i in $(rpm -qa|grep mysql);do rpm -e $i --nodeps;done [root@mysql8-node ~]# rm -rf /var/lib/mysql && rm -rf /etc/my.cnf2) 安装需要的软件包[root@mysql8-node ~]# yum -y install libaio [root@mysql8-node ~]# yum -y install net-tools3) 下载并安装Mysql8.0.12下载地址: https://pan.baidu.com/s/1LyXrkrCPP7QKLrWYbLRBlw提取密码: emmf[root@mysql8-node ~]# groupadd mysql [root@mysql8-node ~]# useradd -g mysql mysql [root@mysql8-node ~]# cd /usr/local/src/ [root@mysql-node src]# ll -rw-r--r-- 1 root root 620389228 Aug 22 2018 mysql8.0.12_bin_centos7.tar.gz [root@mysql-node src]# tar -zvxf mysql8.0.12_bin_centos7.tar.gz [root@mysql-node src]# mv mysql /usr/local/ [root@mysql-node src]# chown -R mysql.mysql /usr/local/mysql [root@mysql-node src]# vim /home/mysql/.bash_profile export PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH [root@mysql-node src]# source /home/mysql/.bash_profile [root@mysql-node src]# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile [root@mysql-node src]# source /etc/profile4) 创建数据目录[root@mysql-node src]# mkdir -p /data/mysql/{data,log,binlog,conf,tmp} [root@mysql-node src]# chown -R mysql.mysql /data/mysql5) 配置mysql[root@mysql-node src]# su - mysql [mysql@mysql-node ~]$ vim /data/mysql/conf/my.cnf [mysqld] lower_case_table_names = 1 user = mysql server_id = 1 port = 3306 default-time-zone = '+08:00' enforce_gtid_consistency = ON gtid_mode = ON binlog_checksum = none default_authentication_plugin = mysql_native_password datadir = /data/mysql/data pid-file = /data/mysql/tmp/mysqld.pid socket = /data/mysql/tmp/mysqld.sock tmpdir = /data/mysql/tmp/ skip-name-resolve = ON open_files_limit = 65535 table_open_cache = 2000 #################innodb######################## innodb_data_home_dir = /data/mysql/data innodb_data_file_path = ibdata1:512M;ibdata2:512M:autoextend innodb_buffer_pool_size = 12000M innodb_flush_log_at_trx_commit = 1 innodb_io_capacity = 600 innodb_lock_wait_timeout = 120 innodb_log_buffer_size = 8M innodb_log_file_size = 200M innodb_log_files_in_group = 3 innodb_max_dirty_pages_pct = 85 innodb_read_io_threads = 8 innodb_write_io_threads = 8 innodb_thread_concurrency = 32 innodb_file_per_table innodb_rollback_on_timeout innodb_undo_directory = /data/mysql/data innodb_log_group_home_dir = /data/mysql/data ###################session########################### join_buffer_size = 8M key_buffer_size = 256M bulk_insert_buffer_size = 8M max_heap_table_size = 96M tmp_table_size = 96M read_buffer_size = 8M sort_buffer_size = 2M max_allowed_packet = 64M read_rnd_buffer_size = 32M ############log set################### log-error = /data/mysql/log/mysqld.err log-bin = /data/mysql/binlog/binlog log_bin_index = /data/mysql/binlog/binlog.index max_binlog_size = 500M slow_query_log_file = /data/mysql/log/slow.log slow_query_log = 1 long_query_time = 10 log_queries_not_using_indexes = ON log_throttle_queries_not_using_indexes = 10 log_slow_admin_statements = ON log_output = FILE,TABLE master_info_file = /data/mysql/binlog/master.6) 初始化 (稍等一会儿, 可以到/data/mysql/log/mysqld.err日子里查看初始化过程, 看看有没有error信息)[mysql@mysql-node ~]$ mysqld --defaults-file=/data/mysql/conf/my.cnf --initialize-insecure --user=mysql 7) 启动mysqld[mysql@mysql-node ~]$ mysqld_safe --defaults-file=/data/mysql/conf/my.cnf & [mysql@mysql-node ~]$ lsof -i:3306 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 24743 mysql 23u IPv6 23132988 0t0 TCP *:mysql (LISTEN)8) 登录mysql, 重置密码本地首次使用sock文件登录mysql是不需要密码的[mysql@mysql-node ~]# mysql -S /data/mysql/tmp/mysqld.sock ............. mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; Query OK, 0 rows affected (0.07 sec) mysql> flush privileges; Query OK, 0 rows affected (0.03 sec) mysql> select host,user,authentication_string from mysql.user; +-----------+------------------+------------------------------------------------------------------------+ | host | user | authentication_string | +-----------+------------------+------------------------------------------------------------------------+ | localhost | mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | mysql.session | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | mysql.sys | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | +-----------+------------------+------------------------------------------------------------------------+ 4 rows in set (0.00 sec)退出, 此时密码重置后, 就不能使用sock文件无密码登录了[root@mysql-node ~]# mysql -S /data/mysql/tmp/mysqld.sock ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) [root@mysql-node ~]# mysql -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)做sock文件的软链接[root@mysql-node ~]# ln -s /data/mysql/tmp/mysqld.sock /tmp/mysql.sock [root@mysql-node ~]# mysql -p123456 或者 [root@mysql-node ~]# mysql -uroot -S /data/mysql/tmp/mysqld.sock -p123456 ............. mysql> select version(); +-----------+ | version() | +-----------+ | 8.0.12 | +-----------+ 1 row in set (0.00 sec) #授予用户权限. 必须先要创建用户, 才能授权!! (创建用户时要带@并指定地址, 则grant授权时的地址就是这个@后面指定的!, 否则grant授权就会报错!) mysql> create user 'kevin'@'%' identified by '123456'; Query OK, 0 rows affected (0.11 sec) mysql> grant all privileges on *.* to 'kevin'@'%' with grant option; Query OK, 0 rows affected (0.21 sec) mysql> select host,user,authentication_string from mysql.user; +-----------+------------------+------------------------------------------------------------------------+ | host | user | authentication_string | +-----------+------------------+------------------------------------------------------------------------+ | % | kevin | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | | localhost | mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | mysql.session | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | mysql.sys | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | +-----------+------------------+------------------------------------------------------------------------+ 5 rows in set (0.00 sec) mysql> update mysql.user set host='172.16.60.%' where user="kevin"; Query OK, 1 row affected (0.16 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> flush privileges; Query OK, 0 rows affected (0.05 sec) mysql> select host,user,authentication_string from mysql.user; +-------------+------------------+------------------------------------------------------------------------+ | host | user | authentication_string | +-------------+------------------+------------------------------------------------------------------------+ | 172.16.60.% | kevin | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | | localhost | mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | mysql.session | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | mysql.sys | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | +-------------+------------------+------------------------------------------------------------------------+ 5 rows in set (0.00 sec) mysql> create user 'bobo'@'172.16.60.%' identified by '123456'; Query OK, 0 rows affected (0.09 sec) mysql> grant all privileges on *.* to 'bobo'@'172.16.60.%'; Query OK, 0 rows affected (0.17 sec) mysql> flush privileges; Query OK, 0 rows affected (0.04 sec) mysql> select host,user,authentication_string from mysql.user; +-------------+------------------+------------------------------------------------------------------------+ | host | user | authentication_string | +-------------+------------------+------------------------------------------------------------------------+ | 172.16.60.% | bobo | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | | 172.16.60.% | kevin | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | | localhost | mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | mysql.session | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | mysql.sys | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | +-------------+------------------+------------------------------------------------------------------------+ 6 rows in set (0.00 sec) mysql> show grants for kevin@'172.16.60.%'; +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Grants for kevin@172.16.60.% | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `kevin`@`172.16.60.%` WITH GRANT OPTION | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)MySQL单机多实例安装配置通过上面二进制部署可知, 已经起来一个3306端口的MySQL实例, 现在需要再起来两个实例, 分别为3307, 3308. 操作如下:创建实例的数据目录[root@mysql-node ~]# mkdir -p /data/mysql3307/{data,log,binlog,conf,tmp} [root@mysql-node ~]# mkdir -p /data/mysql3308/{data,log,binlog,conf,tmp} [root@mysql-node ~]# chown -R mysql.mysql /data/mysql3307 [root@mysql-node ~]# chown -R mysql.mysql /data/mysql3308配置mysql[root@mysql-node ~]# cp -r /data/mysql/conf/my.cnf /data/mysql3307/conf/ [root@mysql-node ~]# cp -r /data/mysql/conf/my.cnf /data/mysql3308/conf/ [root@mysql-node ~]# sed -i 's#/data/mysql/#/data/mysql3307/#g' /data/mysql3307/conf/my.cnf [root@mysql-node ~]# sed -i 's#/data/mysql/#/data/mysql3308/#g' /data/mysql3308/conf/my.cnf [root@mysql-node ~]# sed -i 's/3306/3307/g' /data/mysql3307/conf/my.cnf [root@mysql-node ~]# sed -i 's/3306/3308/g' /data/mysql3308/conf/my.cnf [root@mysql-node ~]# chown -R mysql.mysql /data/mysql*进行初始化两个实例[root@mysql-node ~]# mysqld --defaults-file=/data/mysql3307/conf/my.cnf --initialize-insecure --user=mysql [root@mysql-node ~]# mysqld --defaults-file=/data/mysql3308/conf/my.cnf --initialize-insecure --user=mysql接着启动mysqld[root@mysql-node ~]# mysqld_safe --defaults-file=/data/mysql3307/conf/my.cnf & [root@mysql-node ~]# mysqld_safe --defaults-file=/data/mysql3308/conf/my.cnf & [root@mysql-node ~]# ps -ef|grep mysql mysql 23996 1 0 14:37 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql/conf/my.cnf mysql 24743 23996 0 14:38 ? 00:00:17 /usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/conf/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --log-error=/data/mysql/log/mysqld.err --open-files-limit=65535 --pid-file=/data/mysql/tmp/mysqld.pid --socket=/data/mysql/tmp/mysqld.sock --port=3306 root 30473 23727 0 15:33 pts/0 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql3307/conf/my.cnf mysql 31191 30473 17 15:33 pts/0 00:00:02 /usr/local/mysql/bin/mysqld --defaults-file=/data/mysql3307/conf/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysql3307/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysql3307/log/mysqld.err --open-files-limit=65535 --pid-file=/data/mysql3307/tmp/mysqld.pid --socket=/data/mysql3307/tmp/mysqld.sock --port=3307 root 31254 23727 0 15:33 pts/0 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql3308/conf/my.cnf mysql 31977 31254 39 15:33 pts/0 00:00:02 /usr/local/mysql/bin/mysqld --defaults-file=/data/mysql3308/conf/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysql3308/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysql3308/log/mysqld.err --open-files-limit=65535 --pid-file=/data/mysql3308/tmp/mysqld.pid --socket=/data/mysql3308/tmp/mysqld.sock --port=3308 root 32044 23727 0 15:34 pts/0 00:00:00 grep --color=auto mysql [root@mysql-node ~]# lsof -i:3307 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 31191 mysql 22u IPv6 23144844 0t0 TCP *:opsession-prxy (LISTEN) [root@mysql-node ~]# lsof -i:3308 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 31977 mysql 22u IPv6 23145727 0t0 TCP *:tns-server (LISTEN) [root@mysql-node ~]# lsof -i:3306 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 24743 mysql 23u IPv6 23132988 0t0 TCP *:mysql (LISTEN)登录3307端口实例, 并设置密码[root@mysql-node ~]# mysql -S /data/mysql3307/tmp/mysqld.sock ............ mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; Query OK, 0 rows affected (0.11 sec) mysql> flush privileges; Query OK, 0 rows affected (0.11 sec)退出, 使用新密码登录[root@mysql-node ~]# mysql -uroot -S /data/mysql3307/tmp/mysqld.sock -p123456 ............. mysql>同理, 登录3308端口实例, 并设置密码[root@mysql-node ~]# mysql -S /data/mysql3308/tmp/mysqld.sock ........... mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; Query OK, 0 rows affected (0.13 sec) mysql> flush privileges; Query OK, 0 rows affected (0.03 sec)退出, 使用新密码登录[root@mysql-node ~]# mysql -uroot -S /data/mysql3308/tmp/mysqld.sock -p123456 .................... mysql>==========================================3306, 3307, 3308三个端口实例的启动命令分别为:mysqld_safe --defaults-file=/data/mysql/conf/my.cnf &mysqld_safe --defaults-file=/data/mysql3307/conf/my.cnf &mysqld_safe --defaults-file=/data/mysql3308/conf/my.cnf &登录命令分别为:mysql -uroot -S /data/mysql/tmp/mysqld.sock -p123456mysql -uroot -S /data/mysql3307/tmp/mysqld.sock -p123456mysql -uroot -S /data/mysql3308/tmp/mysqld.sock -p123456编写mysql多端口实例的登录脚本#上面的多端口实例配置之后, 查看一个登录脚本:myin (注意将脚本中的密码改为自己的密码) [root@mysql-node ~]# ll /usr/local/mysql/bin/myin -rwxrwxr-x 1 mysql mysql 161 Aug 22 2018 /usr/local/mysql/bin/myin [root@mysql-node ~]# cat /usr/local/mysql/bin/myin #!/bin/bash p=$1 shift mysql -h"127.0.0.1" -P"$p" --default-character-set=utf8mb4 --show-warnings -uroot -p'123456' -A --prompt="(\u@\p)[\d]> " "$@" #尝试登录 [mysql@mysql-node ~]# myin 3306 mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 1130 (HY000): Host '127.0.0.1' is not allowed to connect to this MySQL server #这是因为各个端口实例中的root用户授权的是localhost, 而不是127.0.0.1, 则可以再次添加一个针对127.0.0.1的root用户授权 #或者将myin脚本中的127.0.0.1 修改为 localhost [root@mysql-node ~]# sed -i 's/127.0.0.1/localhost/g' /usr/local/mysql/bin/myin [root@mysql-node ~]# cat /usr/local/mysql/bin/myin #!/bin/bash p=$1 shift mysql -h"localhost" -P"$p" --default-character-set=utf8mb4 --show-warnings -uroot -p'123456' -A --prompt="(\u@\p)[\d]> " "$@"则现在可以登录各个实例了, 登录命令为"myin port"登录3306端口实例[root@mysql-node ~]# myin 3306 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 27 Server version: 8.0.12 MySQL Community Server - GPL Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. (root@mysql.sock)[(none)]>登录3307端口实例[root@mysql-node ~]# myin 3307 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 28 Server version: 8.0.12 MySQL Community Server - GPL Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. (root@mysql.sock)[(none)]>登录3308端口实例[root@mysql-node ~]# myin 3308 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 29 Server version: 8.0.12 MySQL Community Server - GPL Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. (root@mysql.sock)[(none)]>生产环境下的思路:同一个业务库单独放在一个实例下, 不要混用数据库. 单机多实例间可以做主从或主主同步, 也可以在多机多实例之间坐主从或主主同步.比如:A机器有三个实例: 3310, 3311, 3312B机器有三个实例: 3310, 3311, 3312C机器有三个实例: 3310, 3311, 3312 则三台机器的每个对应的端口实例之间做主从或主主同步(GTID, MGR), 一主两从, 或三主模式. (多实例环境最好不要用3306端口, 否则经常会出现一些误操作)四. Mysql8.0使用过程中踩过的一些坑1) 创建用户和授权在mysql8.0创建用户和授权和之前不太一样了,其实严格上来讲,也不能说是不一样, 只能说是更严格, mysql8.0需要先创建用户(创建用户时要带@并指定地址, 则grant授权时的地址就是这个@后面指定的!, 否则grant授权就会报错!)和设置密码,然后才能授权。mysql> create user 'kevin'@'%' identified by '123456'; Query OK, 0 rows affected (0.04 sec) mysql> grant all privileges on *.* to 'kevin'@'%' with grant option; Query OK, 0 rows affected (0.04 sec) mysql> create user 'bobo'@'%' identified by '123456'; Query OK, 0 rows affected (0.06 sec) mysql> grant all privileges on *.* to 'bobo'@'%' with grant option; Query OK, 0 rows affected (0.03 sec) mysql> flush privileges; Query OK, 0 rows affected (0.04 sec) mysql> select host,user,authentication_string from mysql.user; +-----------+------------------+------------------------------------------------------------------------+ | host | user | authentication_string | +-----------+------------------+------------------------------------------------------------------------+ | % | bobo | $A$005$1VY")q?G6<^X@-6LsXrPt5C0TwlTuvHbaOa3sYF0DKViIGoRPuCF8AzwiFcim1 | | % | kevin | $A$005$hy`U}ZB#R::rA8W0y2rmwgySqzv0rmR1eTeNDSaXfQPWIsrh7ytbVdi85 | | localhost | mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | mysql.session | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | mysql.sys | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | root | $A$005$/VO_y^7,]6;2qxggBLmJzhA0Qylu5/AHuRScZ/ykKedgZKh/6krOIzPs2 | +-----------+------------------+------------------------------------------------------------------------+如果还是用Mysql5.7及之前版本的直接授权的方法, 会有报错:mysql> grant all privileges on *.* to 'shibo'@'%' identified by '123456'; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'identified by '123456'' at line 12) Mysql8.0默认是不能使用root账号进行远程登录的! root账号只能本地登录!mysql> select host,user,authentication_string from mysql.user; +-----------+------------------+------------------------------------------------------------------------+ | host | user | authentication_string | +-----------+------------------+------------------------------------------------------------------------+ | % | bobo | $A$005$1VY")q?G6<^X@-6LsXrPt5C0TwlTuvHbaOa3sYF0DKViIGoRPuCF8AzwiFcim1 | | % | kevin | $A$005$hy`U}ZB#R::rA8W0y2rmwgySqzv0rmR1eTeNDSaXfQPWIsrh7ytbVdi85 | | localhost | mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | mysql.session | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | mysql.sys | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | root | $A$005$/VO_y^7,]6;2qxggBLmJzhA0Qylu5/AHuRScZ/ykKedgZKh/6krOIzPs2 | +-----------+------------------+------------------------------------------------------------------------+ 6 rows in set (0.00 sec)如果想要远程登录, 则需要进行update更新下root账号的权限mysql> update mysql.user set host='%' where user="root"; Query OK, 1 row affected (0.10 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> flush privileges; Query OK, 0 rows affected (0.14 sec) mysql> select host,user,authentication_string from mysql.user; +-----------+------------------+------------------------------------------------------------------------+ | host | user | authentication_string | +-----------+------------------+------------------------------------------------------------------------+ | % | bobo | $A$005$1VY")q?G6<^X@-6LsXrPt5C0TwlTuvHbaOa3sYF0DKViIGoRPuCF8AzwiFcim1 | | % | kevin | $A$005$hy`U}ZB#R::rA8W0y2rmwgySqzv0rmR1eTeNDSaXfQPWIsrh7ytbVdi85 | | % | root | $A$005$/VO_y^7,]6;2qxggBLmJzhA0Qylu5/AHuRScZ/ykKedgZKh/6krOIzPs2 | | localhost | mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | mysql.session | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | mysql.sys | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | +-----------+------------------+------------------------------------------------------------------------+ 6 rows in set (0.00 sec)这样就能在远程使用root账号登录该mysql8.0的数据库了3) 修改root账号权限, 允许root账号远程登录后, 用navicat进行mysql的远程连接时,出现了弹窗报错:出现这个原因是mysql8 之前的版本中加密规则是mysql_native_password, 而在mysql8之后,加密规则是caching_sha2_password, 解决问题方法有两种:1) 一种是升级navicat驱动;2) 一种是把mysql用户登录密码加密规则还原成mysql_native_password;这里选择第二种方法来解决:#修改加密规则 mysql> ALTER USER 'root'@'%' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER; Query OK, 0 rows affected (0.16 sec) #更新一下用户的密码 mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; Query OK, 0 rows affected (0.08 sec) #刷新权限 mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.03 sec)这样问题就解决了。4) sqlyog链接时出现2058异常1) 使用sqlyog链接时会出现2058的异常,此时我们需要修改mysql,命令行登录mysql(与修改密码中登录相同,使用修改后的密码),然后执行下面的命令: mysql > ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';其中password为自己修改的密码。然后SQLyog中重新连接,则可连接成功,OK。2) 如果报错:ERROR 1396 (HY000): Operation ALTER USER failed for 'root'@'localhost'则使用下面命令: mysql > ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password';5) 修改默认编码方式mysql8.0默认编码方式为utf8mb4,因此使用时不需要修改,可使用如下命令查看:mysql > SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';如果需要修改其他编码方式,比如需要修改为utf8mb4,可以使用如下方式:修改mysql配置文件my.cnf, 找到后请在以下三部分里添加如下内容:[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-client-handshake = FALSE character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect='SET NAMES utf8mb4'然后重启mysqld服务即可, 其中:character_set_client (客户端来源数据使用的字符集)character_set_connection (连接层字符集)character_set_database (当前选中数据库的默认字符集)character_set_results (查询结果字符集)character_set_server (默认的内部操作字符集)========================================数据库连接参数中:characterEncoding=utf8 会被自动识别为utf8mb4,也可以不加这个参数,会自动检测。而autoReconnect=true 是必须加上的。6) 部分参数配置查询命令#查询mysql最大连接数设置 mysql> show global variables like 'max_conn%'; mysql> SELECT @@MAX_CONNECTIONS AS 'Max Connections'; # 查看最大链接数 mysql> show global status like 'Max_used_connections'; # 查看慢查询日志是否开启以及日志位置 mysql> show variables like 'slow_query%'; # 查看慢查询日志超时记录时间 mysql> show variables like 'long_query_time'; # 查看链接创建以及现在正在链接数 mysql> show status like 'Threads%'; # 查看数据库当前链接 mysql> show processlist; # 查看数据库配置 mysql> show variables like '%quer%';
2024年02月05日
22 阅读
0 评论
0 点赞
2024-02-05
本站文章大纲
Linux一、带你快速了解Linux命令的几篇文章1. 10个Linux文件管理命令2. 7个Linux搜索和过滤命令3. 5个Linux重定向命令4. 5个Linux归档命令5. 5个Linux文件传输命令6. 3个Linux文件权限命令7. 6个Linux进程管理命令8. 5个Linux性能监控命令9. 5个Linux用户管理命令10. 9个Linux网络命令11. 8个Linux软件包管理命令12. 9个Linux系统信息命令13. 6个Linux系统管理命令14. 32个其他Linux命令Nginx一、如何使用LNMP让网站顺利工作?1. Nginx的安装和部署2. nginx+php+mysql3. nginx php-fpm安装配置4. Nginx配置性能优化的方法5. 如何使用Nginx实现限制各种恶意访问MySQL一、如何让MySQL从部署到稳定运行?1. 安装MySQL 8保姆级教程2. 《从菜鸟到大师之路 MySQL 篇》3. 关于MySQL的66个问题4. MySQL 的学习资源史上最全5. 掌握 SQL 这些核心知识点,出去吹牛逼再也不担心了
2024年02月05日
13 阅读
0 评论
0 点赞
1
...
4
5
6
...
158