企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[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