[TOC]
# 服务功能增强
* 数据库初始化方式变更
* 支持为表增加计算列
* 引入json列类型及相关函数
## 初始化方式的变更
注意各人路径有些不同
mysql5.7之前
~~~
scripts/mysql_install_db \
--datadir=/data/sql_data \
--user=mysql --basedir=/home/mysql
~~~
---
mysql5.7之后
~~~
bin/mysqld --initialize --user=mysql \
--basedir=/home/mysql \
--datadir=/home/mysql/data
~~~
初始化后会提供个root用户的默认密码,我们要记录下来
我们要改变密码后才可对数据库操作,这也是mysql对安全方面加强
## 支持为表增加计算列
当一个表的某个列是其他列计算而来的列叫计算列
mysql5.7之前要靠触发器来实现
**而且要写更新触发器和插入触发器,因为他的数据要随着其他列改变而改变**
视图也可以达到相同效果
---
mysql5.7之后
在create table及alter tablel语句中支持增加计算列的方式
~~~
col_name data_type [GENERATED ALWAYS] AS (expression)
[VIRTUAL | STORED] [UNIQUE [KEY]] [COMMENT comment]
[[NOT] NULL] [[PRIMARY] KEY]
~~~
比如创建
~~~
create table t (
id int(11) not null auto_increment,
c1 int(11) default null,
c2 int(11) default null,
c3 int(11) GENERATED ALWAYS AS (c1+c2) VIRTUAL,
primary key (id)
)engine=innodb default charset=utf8
~~~
## 引入json列类型及相关函数
mysql5.7之前
只能在varchar或text等字符类型的列中存储json类型的字符串,并通过程序解析使用json字符串
mysql5.7之后
增加了json列类型及json_开头的相关处理函数,如json_type(), json_object(), json_merge()等
比如我们要创建个数组转为json
~~~
select json_array('a','b',now());
~~~
比如json对象
~~~
select json_object('key1',1,'key2',2);
~~~
比如建表
~~~
create table t1(jdoc json);
insert into t (jdoc) values (json_array('a','b',now()));
~~~
# Replication相关增强
* 支持多源复制
* 基于库或是逻辑锁的多线程复制
* 在线变更复制方式
## 支持多源复制
mysql5.7之前的一主多从
![](https://box.kancloud.cn/afea98bfe13373f85b884bdbcc8bc59f_1662x722.jpg)
可以分担主服务器的负载,可以在远距离分发数据,如果我们想要多个主或是在主上进行数据库的合并,在mysql5.7之前是无法完成的,除非是有一些第三方的插件
mysql5.7支持多源复制
![](https://box.kancloud.cn/7154ec77a8d3559cbeaad1096e02af91_2543x963.jpg)
比如把订单表分布上不同的主服务器上
这样可以在从服务器上进行数据的汇总
他是走channel实现的,不同的channel走不同的复制链路
## 基于表的多线程复制
mysql5.7之前
从mysql5.6开始支持多线程复制,只不过是对于每一个库一个复制线程,对于一些库的读写非常频繁,这样多线程的复制是没有什么用的,有时反而比单线程慢
mysql5.7之后
mysql5.7后对多线程复制功能进行了加强,增加了slave_parallel_type参数可以控制并发同步是基于database还是logical_clock(逻辑锁)
基于逻辑锁,比如在主上执行事务的时候,给这个事务加上时间戳,从上根据时间戳并行的执行事务,这样就大大的降低延迟复制
## 在线变更复制方式
mysql5.7之前
要把基于日志点的复制方式变为基于gtid的复制方式或是把基于日志点的复制方式必须要重启master服务器
gtid复制方式无论在安全方式还是数据一致性方面上都是优于基于日志点的复制方式
mysql5.7之后
允许在线变更复制方式,而不用重启master服务器
---
在线变更复制方式有7步
![](https://box.kancloud.cn/5e9092f1ede23b8ba7a06917a20d676b_2314x904.jpg)
第一步有警告就处理警告
# Innodb引擎增强
* 支持缓冲池大小在线变更
* 增加innodb_buffer_pool导入导出功能
* 支持为innodb建立表空间
## 支持缓冲池大小在线变更
mysql5.7之前
要变更innodb_buffer_pool大小必须更改my.cnf文件后重启数据库服务器
mysql5.7之后
innodb_buffer_poll_size 参数变为动态参数,可以在线调整innodb缓存池大小
我们查看innodb_buffer的相关参数
~~~
mysql> show variables like 'innodb_buffer%';
+-------------------------------------+----------------+
| Variable_name | Value |
+-------------------------------------+----------------+
| innodb_buffer_pool_chunk_size | 134217728 |
| innodb_buffer_pool_dump_at_shutdown | ON |
| innodb_buffer_pool_dump_now | OFF |
| innodb_buffer_pool_dump_pct | 25 |
| innodb_buffer_pool_filename | ib_buffer_pool |
| innodb_buffer_pool_instances | 1 |
| innodb_buffer_pool_load_abort | OFF |
| innodb_buffer_pool_load_at_startup | ON |
| innodb_buffer_pool_load_now | OFF |
| innodb_buffer_pool_size | 134217728 |
+-------------------------------------+----------------+
~~~
他大小调整是以chunk为单位的,每次调整都是一个chunk大小
~~~
mysql> select 134217728/(1024*1024);
+-----------------------+
| 134217728/(1024*1024) |
+-----------------------+
| 128.0000 |
+-----------------------+
1 row in set (0.00 sec)
~~~
如果我们定义这个 innodb_buffer_pool_instances ,我们就要用chunk的大小乘以这个倍数来调整
所以大小调整的范围是
~~~
mysql> select 128*1;
+-------+
| 128*1 |
+-------+
| 128 |
+-------+
1 row in set (0.00 sec)
~~~
如果设置的不是这个倍数,他也会自动调整为这个倍数
## 增加innodb_buffer_pool导入导出功能
![](https://box.kancloud.cn/91e52ae6350b5eb00c4787570d140a37_1450x496.jpg)
~~~
mysql> show variables like 'innodb_buffer_pool%';
+-------------------------------------+----------------+
| Variable_name | Value |
+-------------------------------------+----------------+
| innodb_buffer_pool_chunk_size | 134217728 |
| innodb_buffer_pool_dump_at_shutdown | ON |
| innodb_buffer_pool_dump_now | OFF |
| innodb_buffer_pool_dump_pct | 25 |
| innodb_buffer_pool_filename | ib_buffer_pool |
| innodb_buffer_pool_instances | 1 |
| innodb_buffer_pool_load_abort | OFF |
| innodb_buffer_pool_load_at_startup | ON |
| innodb_buffer_pool_load_now | OFF |
| innodb_buffer_pool_size | 134217728 |
+-------------------------------------+----------------+
~~~
innodb_buffer_pool_dump_at_shutdown
innodb_buffer_pool_load_at_startup
这2个参数决定了宕机的时候需要导入和导出参数
innodb_buffer_pool_dump_pct 决定了导出导入缓冲池的百分比,默认25%导入到磁盘
innodb_buffer_pool_filename 决定了导出的文件名
innodb_buffer_pool_dump_now把这个设为on就开始导出了
## 支持为innodb建立表空间
mysql5.7之前
具有系统表空间以及可以为每个表建立一个独立表空间
mysql5.7之后
支持create tablespace 语法为一个表或多个表建立共用的表空间
~~~
create tablespace ts1 add datafile 'ts1.ibd' engine=innodb;
~~~
这样就建立好了一个ts1的表空间
~~~
create table t2(c1 int primary key) tablespace ts1;
~~~
这样就创建了一个公共表空间
使用公共表空间
优点:
和系统表类似,能被一个表和多个表
比独立使用的表更节约内存
文件可以不放在数据目录下
缺点:
不能使用drop table对表空间进行回收
空间不容易回收
# 安全管理方面的增强
* 不再支持old_password认证
* 增加账号默认过期时间
* 加强了对账号的管理
* 增加sys对数据库管理
删除了匿名账户
~~~
mysql> show variables like 'default_password_lifetime';
+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| default_password_lifetime | 0 |
+---------------------------+-------+
~~~
查看账号默认过期时间,0是关闭,有些账号默认是360就是默认360天过期,在这天数里面不改密码,过了这天数就不能连接了
---
创建用户的时候可以增加用户过期时间和密码加密方式
![](https://box.kancloud.cn/3353552a16fea39a1d5fc6e5180d4c60_2212x376.jpg)
我们也可以对用户进行锁定
~~~
select * from mysql.user \G;
~~~
会在最下面看到account_locked这个表示账号是否被锁定,修改这个值可以让账号锁定
有时候一些账号测试sql注入,我们可以对这个账号进行锁定
---
mysql5.7之后建议不要关闭performance_shcmea这个库,mysql5.7之前有些场景我们会关闭,5.7之后就不要这样了
一些全局变量以前是在informatiion_schema这个里面,5.7是在performance_shcmea
- SQL
- 名词
- mysql
- 初识mysql
- 备份和恢复
- 存储引擎
- 数据表损坏和修复
- mysql工具
- 数据库操作
- 增
- 删
- 改
- 查
- 数据类型
- 整数类型
- 小数类型
- 日期时间类型
- 字符和文本型
- enum类型
- set类型
- 时间类型
- null与not null和null与空值''的区别
- 数据表操作
- 创建
- 索引
- 约束
- 表选项列表
- 表的其他语句
- 视图
- sql增删改查
- sql增
- sql删
- sql改
- sql查
- sql语句练习
- 连接查询和更新
- 常用sql语句集锦
- 函数
- 字符函数
- 数值运算符
- 比较运算符与函数
- 日期时间函数
- 信息函数
- 聚合函数
- 加密函数
- null函数
- 用户权限管理
- 用户管理
- 权限管理
- pdo
- 与pdo相关的几个类
- 连接数据库
- 使用
- pdo的错误处理
- pdo结果集对象
- pdo结果集对象常用方法
- pdo预处理
- 常用属性
- mysql编程
- 事务
- 语句块
- mysql中的变量
- 存储函数
- 存储过程
- 触发器
- mysql优化
- 存储引擎
- 字段类型
- 三范式和逆范式
- 索引
- 查询缓存
- limit分页优化
- 分区
- 介绍
- 分区算法
- list分区
- range范围
- Hash哈希
- key键值
- 分区管理
- 特别注意
- 分表
- 数据碎片与维护
- innodb表压缩
- 慢查询
- explain执行计划
- count和max,groupby优化
- 子查询优化
- mysql锁机制
- 介绍
- 演示
- 总结
- 乐观锁和悲观锁
- 扛得住的mysql
- 实例和故事
- 系统参数优化
- mysql体系结构
- mysql基准测试
- 索引
- mysql的复制
- win配置MySQL主从
- mysql5.7新特性
- 常见问题
- general log
- 忘记密码
- uodo log与redo log
- 事务隔离级别
- mysql8密码登录
- explain
- 高效的Tree表
- on delete cascade 总结
- mongod
- 简介
- 集合文档操作语句
- 增删改查
- 索引
- 数据导入和导出
- 主从复制
- php7操作mongod
- 权限管理
- redis
- redis简介
- 3.2版本配置文件
- 3.0版本配置文件
- 2.8版本配置文件
- 配置文件总结
- 外网连接
- 持久化
- RDB备份方式保存数据
- AOF备份方式保存数据
- 总结
- win安装redis和sentinel部署
- 事务
- Sentinel模式配置
- 分布式锁
- 管道
- php中redis代码
- 发布订阅
- slowlog
- Redis4.0
- scan和keys
- elasticsearch
- 配置说明
- 启动
- kibana
- kibana下载
- kibana配置文件
- kibana常用功能
- 常用术语
- Beats
- Beats简介
- Filebeat
- Packetbeat
- Logstash
- 配置
- elasticsearch架构
- es1.7
- head和bigdesk插件
- 插件大全
- 倒排索引
- 单模式下API增删改查
- mget获取多个文档
- 批量操作bulk
- 版本控制
- Mapping映射
- 基本查询
- Filter过滤
- 组合查询
- es配置文件
- es集群优化和管理
- logstash
- kibana
- es5.2
- 安装
- 冲突处理
- 数据备份
- 缺陷不足
- 集群管理api
- 分布式事务
- CAP理论
- BASE模型
- 两阶段提交(2PC)
- TCC (Try-Confirm-Cancle)
- 异步确保型
- 最大努力通知型
- 总结