关于mysql8:新特性解读-MySQL-80-在线调整-REDO

作者:杨涛涛 资深数据库专家,专研 MySQL 十余年。善于 MySQL、PostgreSQL、MongoDB 等开源数据库相干的备份复原、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相干技术支持、MySQL 相干课程培训等工作。 本文起源:原创投稿 *爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。 MySQL 最新版本 8.0.30 的公布带来一个与 REDO 日志文件无关的新性能点: 在线调整 REDO 日志文件的大小!极大的简化了运维的工作量(经验过的同学都懂)! 通常一台 MySQL 实例部署完后,REDO 日志文件大小个别不会放弃默认值,DBA 同学会依据数据的写入量以及频率来调整其为适合的值。与业务匹配的 REDO 日志文件大小能让数据库获得最佳的性能(如何让 REDO 日志文件的大小匹配现有业务不在本篇探讨范畴)。 上面对 MySQL 8.0.30 之前以及之后的版本,比照 REDO 日志文件的更改过程,体验下最新版本的易用性。 8.0.30 之前,如何更改 REDO 日志文件大小?针对这些版本,批改 REDO 日志文件大小的步骤比拟繁琐。假如须要更改其大小为 2G ,步骤如下: 1、 REDO 日志文件的更改波及两个传统参数:其最终大小是这两个参数的值相乘。(1) innodb_log_files_in_group: REDO 日志磁盘上的文件个数,默认为2。 (2) innodb_log_file_size: REDO 日志磁盘上单个文件的大小,默认为48M。 (3)以后的日志大小为单个48M,两个组,也就是一共96M。 root@ytt-large:~/sandboxes/msb_5_7_34/data# ls -sihl ib_logfile*3277012 48M -rw-r----- 1 root root 48M 7月 29 16:18 ib_logfile03277013 48M -rw-r----- 1 root root 48M 7月 29 16:18 ib_logfile12、“敞开”疾速停实例参数:innodb_fast_shutdown = 0 以确保 InnoDB 刷新所有脏页到磁盘(须要理解此参数的其余值请参见官网手册):<mysql:(none):5.7.34-log>set global innodb_fast_shutdown=0;Query OK, 0 rows affected (0.00 sec)3、等步骤二执行完后,停掉MySQL实例。4、删掉数据目录下旧日志文件:root@ytt-large:~/sandboxes/msb_5_7_34/data# rm -rf ib_logfile*5、在配置文件 my.cnf 里批改参数 innodb_log_file_size ,因为有两个组,设置这个参数为 1G 即可。[mysqld]innodb_log_file_size=1G6、启动 MySQL 实例(如果没有报错,代表更改胜利)。7、查看新的日志文件大小:root@ytt-large:~/sandboxes/msb_5_7_34/data# ls -sihl ib_logfile*3277898 1.1G -rw-r----- 1 root root 1.0G 7月 29 16:31 ib_logfile03277923 1.1G -rw-r----- 1 root root 1.0G 7月 29 16:31 ib_logfile18.0.30 之后,如何更改 REDO 日志文件大小?最新版本 MySQL 8.0.30 公布后,应用新参数innodb_redo_log_capacity来代替之前的两个参数(目前设置这两个参数仍然无效)。应用新参数调整大小非常简单,间接设置为要调整的值就行。比方调整其大小为2G: ...

August 3, 2022 · 2 min · jiezi

关于mysql8:新特性解读-MySQL-80-多因素身份认证

作者:金长龙 爱可生测试工程师,负责DMP产品的测试工作 本文起源:原创投稿 *爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。 MySQL 8.0.27 减少了多因素身份认证(MFA)性能,能够为一个用户指定多重的身份校验。为此还引入了新的零碎变量 authentication_policy ,用于治理多因素身份认证性能。 咱们晓得在 MySQL 8.0.27 之前,create user 的时候能够指定一种认证插件,在未明确指定的状况下会取零碎变量 default_authentication_plugin的值。default_authentication_plugin 的有效值有3个,别离是 mysql_native_password ,sha256_password ,caching_sha2_password ,这个3个认证插件是内置的、不须要注册步骤的插件。 一、零碎变量 authentication_policy在 MySQL 8.0.27 中由 authentication_policy 来治理用户的身份认证,先启个 mysql root@ubuntu:~# docker run --name mysql-1 -e MYSQL_ROOT_PASSWORD=123 -d --ip 172.17.0.2 mysql:8.0.27同时查看下 authentication_policy 和 default_authentication_plugin 的值 root@ubuntu:~# docker run -it --rm mysql:8.0.27 mysql -h172.17.0.2 -uroot -p123...... mysql> show global variables like 'authentication_policy';+-----------------------+-------+| Variable_name | Value |+-----------------------+-------+| authentication_policy | *,, |+-----------------------+-------+1 row in set (0.02 sec) mysql> show global variables like 'default_authentication_plugin';+-------------------------------+-----------------------+| Variable_name | Value |+-------------------------------+-----------------------+| default_authentication_plugin | caching_sha2_password |+-------------------------------+-----------------------+1 row in set (0.00 sec)咱们看到 authentication_policy 的默认值是*,, ...

March 16, 2022 · 3 min · jiezi

关于mysql8:新特性解读-MySQL-80-对-UNION-的改进

作者:张伟 爱可生北京分公司 DBA 团队成员,负责 MySQL 日常问题解决和 DMP 产品保护。青睐技术和开源数据库,青睐静止、读书、电影,花草树木。 本文起源:原创投稿 *爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。 一、UNION 的作用:UNION 能够将多个 SELECT 查问语句的后果合并成一个后果集,在MySQL 8.0 中又削减了一些新的性能,咱们一起来看下。 二、UNION 操作符的花色展现:1、温故Union 必须由两条或以上的 SELECT 语句组成,能力应用 Union 连贯。Union 中每个查问必须蕴含雷同数量的列或者聚合函数,列名或者别名须要统一。列数据类型必须兼容,即能够进行隐式类型转换,但可能会呈现 SQL 性能问题,倡议数据类型雷同。举例如下: create table t1 (id int, name varchar(20));insert into t1 values(1,"爱可生"),(2,"开源"),(3,"社区"),(5,"MySQL"),(4,"张");create table t2 (id int, name varchar(20));insert into t2 values(3,"中国"),(11,"技术"),(15,"开源"),(2,"社区"),(1,"平凡"); mysql> select id from t1;+------+| id |+------+| 1 || 2 || 3 || 5 || 4 |+------+5 rows in set (0.00 sec) mysql> select id from t2;+------+| id |+------+| 3 || 11 || 15 || 2 || 1 |+------+5 rows in set (0.00 sec) // DISTINCT: 删除后果集中反复的数据。mysql> select id from t1 union distinct select id from t2;+------+| id |+------+| 1 || 2 || 3 || 5 || 4 || 11 || 15 |+------+7 rows in set (0.00 sec) // 默认状况下 UNION 操作符曾经删除了反复数据,所以 DISTINCT 修饰符对后果没啥影响。mysql> select id from t1 union select id from t2;+------+| id |+------+| 1 || 2 || 3 || 5 || 4 || 11 || 15 |+------+7 rows in set (0.00 sec) // ALL: 返回包含反复数据在内的所有后果集。mysql> select id from t1 union all select id from t2;+------+| id |+------+| 1 || 2 || 3 || 5 || 4 || 3 || 11 || 15 || 2 || 1 |+------+10 rows in set (0.00 sec)应用 Union 组合查问时,只能应用一条 order by 子句对后果集进行排序,而且必须呈现在最初一条呈现的 SELECT 语句之后。因为 Union 不容许对于局部后果集进行排序,只能针对最终检索进去的后果集进行排序。 ...

March 7, 2022 · 3 min · jiezi

关于mysql8:新特性解读-MySQL-80explain-analyze-分析-SQL-执行过程

作者:胡呈清 爱可生 DBA 团队成员,善于故障剖析、性能优化,集体博客:https://www.jianshu.com/u/a95...,欢送探讨。 本文起源:原创投稿 *爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。 介绍MySQL 8.0.16 引入一个试验个性:explain format=tree ,树状的输入执行过程,以及预估老本和预估返回行数。在 MySQL8.0.18 又引入了 EXPLAIN ANALYZE,在 format=tree 根底上,应用时,会执行 SQL ,并输入迭代器(感觉这里用“算子”更容易了解)相干的理论信息,比方执行老本、返回行数、执行工夫,循环次数。 文档链接:https://dev.mysql.com/doc/ref... 示例: mysql> explain format=tree SELECT * FROM t1 WHERE t1.a IN (SELECT t2.b FROM t2 WHERE id < 10);*************************** 1. row *************************** -> Nested loop inner join (cost=4.95 rows=9) -> Filter: (`<subquery2>`.b is not null) (cost=2.83..1.80 rows=9) -> Table scan on <subquery2> (cost=0.29..2.61 rows=9) -> Materialize with deduplication (cost=3.25..5.58 rows=9) -> Filter: (t2.b is not null) (cost=2.06 rows=9) -> Filter: (t2.id < 10) (cost=2.06 rows=9) -> Index range scan on t2 using PRIMARY (cost=2.06 rows=9) -> Index lookup on t1 using a (a=`<subquery2>`.b) (cost=2.35 rows=1)1 row in set (0.01 sec)mysql> explain analyze SELECT * FROM t1 WHERE t1.a IN (SELECT t2.b FROM t2 WHERE id < 10)\G*************************** 1. row *************************** -> Nested loop inner join (cost=4.95 rows=9) (actual time=0.153..0.200 rows=9 loops=1) -> Filter: (`<subquery2>`.b is not null) (cost=2.83..1.80 rows=9) (actual time=0.097..0.100 rows=9 loops=1) -> Table scan on <subquery2> (cost=0.29..2.61 rows=9) (actual time=0.001..0.002 rows=9 loops=1) -> Materialize with deduplication (cost=3.25..5.58 rows=9) (actual time=0.090..0.092 rows=9 loops=1) -> Filter: (t2.b is not null) (cost=2.06 rows=9) (actual time=0.037..0.042 rows=9 loops=1) -> Filter: (t2.id < 10) (cost=2.06 rows=9) (actual time=0.036..0.040 rows=9 loops=1) -> Index range scan on t2 using PRIMARY (cost=2.06 rows=9) (actual time=0.035..0.038 rows=9 loops=1) -> Index lookup on t1 using a (a=`<subquery2>`.b) (cost=2.35 rows=1) (actual time=0.010..0.010 rows=1 loops=9)1 row in set (0.01 sec)能够看出 explain format=tree 与传统的执行打算相比,展现了比拟清晰的执行过程。而 explain analyze 则会在此基础上多输入理论的执行工夫、返回行数和循环次数。 ...

January 13, 2022 · 2 min · jiezi

关于mysql8:Linux环境下MySQL80安装

一、筹备工作下载安装包 下载地址查看零碎⾃带的 MARIADB rpm -qa|grep mariadb卸载零碎⾃带的 MARIADB(如果有),remove前面加 rpm -qa|grep mariadb 查问进去的门路 yum -y remove二、解压将 mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz 安装包上传到 /usr/local/ 目录下安装包解压,并重命名为mysql xz -d mysql-8.0.26-linux-glibc2.12-x86_64.tar.xztar -xvf mysql-8.0.26-linux-glibc2.12-x86_64.tar mv mysql-8.0.26-linux-glibc2.12-x86_64 mysql创立MYSQL⽤户和⽤户组 groupadd mysqluseradd -g mysql mysql批改MYSQL⽬录的归属⽤户 chown -R mysql:mysql ./筹备MYSQL的配置⽂件,编辑 vim /etc/my.conf [mysql]# 设置mysql客户端默认字符集default-character-set=utf8socket=/var/lib/mysql/mysql.sock[mysqld]skip-name-resolve#设置3306端⼝port = 3306socket=/var/lib/mysql/mysql.sock# 设置mysql的装置⽬录basedir=/usr/local/mysql# 设置mysql数据库的数据的寄存⽬录datadir=/usr/local/mysql/data# 容许最⼤连接数max_connections=200# 服务端使⽤的字符集默认为8⽐特编码的latin1字符集character-set-server=utf8# 创立新表时将使⽤的默认存储引擎default-storage-engine=INNODBlower_case_table_names=1max_allowed_packet=16M并且批改权限 mkdir /var/lib/mysql chmod 777 /var/lib/mysql三、 装置MySQL进入cd /usr/local/mysql 目录 进行初始化 ./bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data执行初始化后,控制台会返回长期明码, 记录长期明码 ,前面会用到例如:像我的例子在最初一行 A temporary password is generated for root@localhost:kvct:yIy8_qk我的长期明码就是这个: kvct:yIy8_qk ...

September 14, 2021 · 2 min · jiezi

关于mysql8:技术分享-MySQL-内部临时表是怎么存放的

作者:胡呈清 爱可生 DBA 团队成员,善于故障剖析、性能优化,集体博客:https://www.jianshu.com/u/a95...,欢送探讨。 本文起源:原创投稿 *爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。 如果 SQL 在执行过程中读到的数据无奈间接失去后果,那么就须要额定的内存来保留两头后果,得出最终后果,这个额定的内存就是外部长期表。比方 group by 执行时,就须要构建一个长期表,须要额定的字段保留聚合函数的后果,当然为了避免内存应用过大,个别超出某个限度后就会放到磁盘上。对于哪些操作会产生外部长期表,能够查看官网文档:https://dev.mysql.com/doc/ref...,上面次要介绍 MySQL8.0 外部长期表寄存形式的变动。 MySQL 5.6MySQL 5.6 中,外部长期表大小超过内存限度后是在长期目录中的单个表文件表空间中创立的,如果禁用了 innodb_file_per_table ,则在数据目录中的 InnoDB 共享表空间(ibdata1)中创立,很容易造成 ibdata1 过大,并且无奈开释,只能逻辑导出数据迁徙到新实例解决。 MySQL 5.7MySQL 5.7 在长期表空间上做了改良,曾经实现将长期表空间从 InnoDB 共享表空间或者独立表空间中拆散,当初叫共享长期表空间。益处有二: 能够打消为每个长期表创立和删除的性能老本;是一块独自为外部长期表划分的表空间,重启 mysqld 能够重置其大小,防止 MySQL5.6 时 ibdata1 难以开释的问题。其体现是 MySQL 启动时 datadir 下会创立一个 ibtmp1 文件,默认值下会有限扩大。例如,如果某个 SQL 执行时创立了一个大小为 20MB 的外部磁盘长期表,则创立时默认大小为 12MB 的长期表空间文件会扩大到 20MB 以适应该表。当 SQL 执行完删除长期表时,开释的空间能够从新用于新的长期表,但 ibtmp1 文件放弃扩大大小,只有重启 MySQL 时才会真正回收共享长期表空间变成初始大小 12MB。 相干参数: tmp_table_size&max_heap_table_size,外部长期表是存在内存中的,应用 MEMORY 存储引擎,如果大小超过了这两者较小的值,则会转化为磁盘长期表;internal_tmp_disk_storage_engine:如果外部长期表转化为磁盘长期表,则这个参数指定了磁盘长期表的存储引擎,默认是 INNODB,还能够设置为 MYISAM;innodb_temp_data_file_path:指定了长期表空间的地位和大小,默认值为 ibtmp1:12M:autoextend ,即 datadir/ibtmp1,初始大小12M能够有限扩大,倡议限度一个最大值避免把磁盘撑满。毛病:SQL 执行完产生的外部长期表可能很大,必须要重启能力开释。这点曾一度让我很困惑,为什么不能做的更好一点执行完就开释呢?所幸 MySQL8.0 优化了这个问题。 ...

August 30, 2021 · 1 min · jiezi

关于mysql8:故障分析-MySQL-80-解决连接满问题

作者:杨涛涛 资深数据库专家,专研 MySQL 十余年。善于 MySQL、PostgreSQL、MongoDB 等开源数据库相干的备份复原、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相干技术支持、MySQL 相干课程培训等工作。 本文起源:原创投稿 *爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。 恰好前些日子和一客户探讨 MySQL 连接数满的问题:ERROR 1040 (HY000): Too many connections 从实际意义来讲,连接数满属于老问题, 此问题产生的起因可能有以下几种:1. 利用端不习惯受限制的用户权限,沉迷于应用 ALL 权限用户。2. DBA 为了省事儿,建设多个 ALL 权限用户,调配给开发、运维等。3. MySQL 数据库服务端没有应用连接池(相似 MySQL 企业版连接池插件),越来越多的数据库申请沉积导致连贯满。4. 利用端和 MySQL 端之间也没有部署连接池,用直连 MySQL 的形式解决日常业务,进而数据库申请过多导致连贯满。5. MySQL 参数 max_connections 设置不合理,与以后数据库申请存在较大偏差,导致连贯不够用报错。如果依照业务性能细分为不同权限的用户,只保留一个管理员用户,在这个问题裸露时管理员就能够应用预留连贯进入数据库查看具体问题。MySQL 默认给管理员预留一个额定连贯,用于解决连贯满的场景;然而事实场景并非如此,大部分 MySQL 数据库都是所有业务模块共享一个管理员用户或者应用多个命名不同的具备管理员权限的用户。出问题后只能由 DBA 来调大 max_connections 值(在数据库服务器负载可控前提下)。 MySQL 8.0 自带的连贯治理接口(administrative connection interface)能够帮DBA辅助解决这类问题。连贯治理接口限度放开很多。老版本的连贯预留只有一个,而连贯治理则不限度连接数(硬件级别限度)。具体在 MySQL 8.0 里怎么用呢? 全局设置以 admin 结尾的变量: admin_address:连贯治理接口监听IP地址或者域名,只能够设置单个值。 admin_port:连贯治理接口监听端口,默认为33062,能够本人指定,不要超过65535即可。 admin_ssl结尾、admin_tsl结尾等都是设置平安连贯相干,默认为空,可选配置。 create_admin_listener_thread:是否为连贯治理接口创立一个独自监听线程,默认不创立。 应用连贯治理接口的前提条件是用户必须有 super 动态权限或者是 service_connection_admin 动静权限。 ...

August 11, 2021 · 2 min · jiezi

关于mysql8:新特性解读-MySQL-80-通用表达式WITH深入用法

作者:杨涛涛 资深数据库专家,专研 MySQL 十余年。善于 MySQL、PostgreSQL、MongoDB 等开源数据库相干的备份复原、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相干技术支持、MySQL 相干课程培训等工作。 本文起源:原创投稿 *爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。 MySQL 8.0 公布曾经好几年了,之前介绍过 WITH 语句(通用表达式)的简略用处以及应用场景,相似如下的语句: with tmp(a) as (select 1 union all select 2) select * from tmp; 刚巧之前客户就征询我,WITH 有没有可能和 UPDATE、DELETE 等语句一起来用?或者说有没有能够简化日常 SQL 的其余用法,有点蛊惑,是否写几个例子简略阐明下? 其实 WITH 表达式除了和 SELECT 一起用, 还能够有上面的组合: insert with 、with update、with delete、with with、with recursive(能够模仿数字、日期等序列)、WITH 能够定义多张表 咱们来一个一个看看: 1. 用 WITH 表达式来造数据 用 WITH 表达式来造数据,非常简单,比方上面例子:给表 y1 增加100条记录,日期字段要随机。 localhost:ytt>create table y1 (id serial primary key, r1 int,log_date date);Query OK, 0 rows affected (0.09 sec)localhost:ytt>INSERT y1 (r1,log_date) -> WITH recursive tmp (a, b) AS -> (SELECT -> 1, -> '2021-04-20' -> UNION -> ALL -> SELECT -> ROUND(RAND() * 10), -> b - INTERVAL ROUND(RAND() * 1000) DAY -> FROM -> tmp -> LIMIT 100) TABLE tmp;Query OK, 100 rows affected (0.03 sec)Records: 100 Duplicates: 0 Warnings: 0localhost:ytt>table y1 limit 10;+----+------+------------+| id | r1 | log_date |+----+------+------------+| 1 | 1 | 2021-04-20 || 2 | 8 | 2020-04-02 || 3 | 5 | 2019-05-26 || 4 | 1 | 2018-01-21 || 5 | 2 | 2016-09-08 || 6 | 9 | 2016-06-14 || 7 | 7 | 2016-02-06 || 8 | 6 | 2014-03-18 || 9 | 6 | 2011-08-25 || 10 | 9 | 2010-02-02 |+----+------+------------+10 rows in set (0.00 sec)2. 用 WITH 表达式来更新表数据 ...

May 19, 2021 · 6 min · jiezi

关于mysql8:新特性解读-部分权限回收功能的说明

作者:姚远MySQL ACE,华为云MVP,专一于 Oracle、MySQL 数据库多年,Oracle 10G 和 12C OCM,MySQL 5.6,5.7,8.0 OCP。当初鼎甲科技任技术顾问,为共事和客户提供数据库培训和技术支持服务。 本文起源:原创投稿 * 爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。 背景MySQL 数据库对于对象的操作级别分为:全局、数据库、表、字段等。粒度从粗到细。如果粗的粒度的权限满足了,将不再测验细粒度的级别,这种验证形式有的时候不不便,例如须要把 100 个数据库中除了某一个数据库外的拜访权限赋予某个用户,须要进行 99 次赋权。 从 MySQL 8.0.16 开始,MySQL 推出了一种局部权限回收(Partial Revokes)的性能,能够将粗粒度赋予的权限在细粒度上回收。 试验要应用这个性能须要将零碎参数 partial_revokes 设置成 on,这个参数默认是 off,即默认不容许应用局部权限回收性能,在应用时会遇到上面的谬误: mysql> revoke select on mysql.* from scutech;ERROR 1141 (42000): There is no such grant defined for user 'scutech' on host '%'能够应用上面的命令将这个参数关上: mysql> SET PERSIST partial_revokes = ON;Query OK, 0 rows affected (0.00 sec)上面的命令赋予用户 scutech 对除了 mysql 之外的所有数据库和上面的表的 select 权限: ...

February 7, 2021 · 2 min · jiezi

关于mysql8:新特性解读-MySQL-80-窗口函数框架用法

作者:杨涛涛资深数据库专家,专研 MySQL 十余年。善于 MySQL、PostgreSQL、MongoDB 等开源数据库相干的备份复原、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相干技术支持、MySQL 相干课程培训等工作。 本文起源:原创投稿 * 爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。 之前在 MySQL 8.0 新个性栏目里介绍过 8.0 的窗口函数的用法,没有细化到全副的语法,凑巧明天有客户诘问其中的框架子句用法,写进去大家一起探讨。 窗口函数其实就是一个分组窗口外部解决每条记录的函数,这个窗口也就是之前聚合操作的窗口。不同的是,聚合函数是把窗口敞开,给一个汇总的后果;而窗口函数是把窗口关上,给分组内每行记录求取对应的聚合函数值或者其余表达式的后果。 明天重点看窗口函数内的 frame 子句:frame 子句用来把窗口内的记录依照指定的条件打印进去,跟在 partition 和 order by 子句前面。frame 子句的语法为: frame_clause:frame_units frame_extentframe_units:{ROWS | RANGE}frame_extent:{frame_start | frame_between}frame_between:BETWEEN frame_start AND frame_endframe_start, frame_end: {CURRENT ROW| UNBOUNDED PRECEDING| UNBOUNDED FOLLOWING| expr PRECEDING| expr FOLLOWING}这里分为两块,一块是 frame_units (框架单元),另外一块是 frame_extent (框架内容) frame_units 框架单元有两个,一个是 rows,一个是 range。rows 前面跟的内容为指定的行号,而 range 不同,range 是指的行内容。框架内容看起来挺多分类,其实就一句话来表白: 为了定义分组内对应行记录的边界值来求取对应的计算结果。 基于 t1 举例说明下: mysql: ytt_80 > desc t1;+-------+------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+------+------+-----+---------+-------+| id | int | YES | | NULL | || r1 | int | YES | | NULL | || r2 | int | YES | | NULL | |+-------+------+------+-----+---------+-------+3 rows in set (0.00 sec)mysql: ytt_80 > select * from t1;+------+------+------+| id | r1 | r2 |+------+------+------+| 2 | 1 | 1 || 2 | 2 | 20 || 2 | 3 | 30 || 2 | 4 | 40 || 3 | 3 | 3 || 3 | 2 | 2 || 3 | 10 | 20 || 3 | 30 | 20 || 1 | 1 | 1 || 1 | 2 | 3 || 1 | 3 | 4 || 1 | 10 | 10 || 1 | 15 | 20 || 2 | 15 | 2 || 3 | 15 | 5 || 1 | 9 | 100 |+------+------+------+16 rows in set (0.00 sec)1、CURRENT ROW示意获取以后行记录,也就是边界是以后行,等值关系 ...

January 25, 2021 · 5 min · jiezi

关于mysql8:技术译文-MySQL-8-中检查约束的使用

作者:Walter Garcia翻译:管长龙本文起源:https://www.percona.com/blog/...大家好,在这篇小文章中,咱们将介绍 MySQL 8 的一项新性能。 什么是“查看束缚”?这是一项新性能,用于指定在插入或更新到一行之前查看值的条件。如果表的任何行的搜寻条件的后果为 FALSE,则束缚可能返回谬误(但如果后果为 UNKNOWN 或 TRUE,则束缚不会返回谬误)。此性能开始在 MySQL 8.0.16 上运行,在以前的版本中,咱们能够创立它,但它不起作用,这意味着反对语法,但不起作用。 要牢记的应用规定: AUTO_INCREMENT 自增列不容许应用援用另一个表中的另一列不容许应用存储的函数和用户定义的函数不容许应用存储过程和函数参数不容许应用子查问不容许应用在外键中用于后续操作(ON UPDATE,ON DELETE)的列不容许应用为下一条语句 INSERT,UPDATE,REPLACE,LOAD DATA 和 LOAD XML 评估此次监测。此外,还会为 INSERT IGNORE,UPDATE IGNORE,LOAD DATA…IGNORE 和 LOAD XML…IGNORE 评估此监测束缚。对于这些语句,如果束缚的评估后果为 FALSE,则会产生正告。插入或更新被跳过。看一些例子我创立了下表来测试此性能。如示例所示,这非常简单: CREATE TABLE users (id int not null auto_increment,firstname varchar(50) not null,lastname varchar(50) not null,age TINYINT unsigned not null CONSTRAINT `check_1` CHECK (age > 15),gender ENUM('M', 'F') not null,primary key (id)) engine = innodb;在这个简略的测试中,仅当 age > 15 时,咱们能力写入或更新行。让咱们看一个示例,尝试插入 age < 15 的行: ...

November 17, 2020 · 2 min · jiezi

关于mysql8:新特性解读-MySQL-8022-任意格式数据导入

作者:杨涛涛资深数据库专家,专研 MySQL 十余年。善于 MySQL、PostgreSQL、MongoDB 等开源数据库相干的备份复原、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相干技术支持、MySQL 相干课程培训等工作。本文起源:原创投稿*爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。MySQL 8.0.22 在往年的 10 月 19 日公布,给咱们带来很多十分实用的个性。特地是对 MySQL Shell 8.0.22 来说,UTIL 组件性能更多,更加丰盛,应用更加简略。 比方明天咱们来介绍 import_table(importTable) 的延申性能:可定制化行输出。 import_table(importTable) 咱们之前有介绍过,是一款并行导入各种格局文本的工具,封装了 MySQL 语句 load data local infile。 比如说要导入一个以 TAB 为分隔符的文本数据文件:/tmp/sample_ytt.txt 到表:ytt_new.t1,能够执行上面语句: 下面后果是 load data infile 语句的导入后果。如果改用 import_table 办法来做同样的事件,基于 Python 语法,应用办法如下: 那接下来看另外一个需要:在导入文本文件时对每行做预处理(例如在导入数据之前更改列 r2 的值为 mod(r1,10),列 r5 的值为 abs(r4-46) ),这样能够缩小导入后再次解决的工夫开销。 这个需要用 load data infile 语句非常容易实现:(导入时更改列 r2 和 r5 的数据,相似 UPDATE 语法) 那如果要用 util.import_table(importTable) 来实现下面的需要,在 MySQL 8.0.22 之前是没方法的。 ...

November 10, 2020 · 1 min · jiezi

关于mysql8:新特性解读-MySQL-8022-新特性-Async-Replication-Auto-failover

作者:洪斌爱可生南区负责人兼技术服务总监,MySQL  ACE,善于数据库架构布局、故障诊断、性能优化剖析,实践经验丰盛,帮忙各行业客户解决 MySQL 技术问题,为金融、运营商、互联网等行业客户提供 MySQL 整体解决方案。本文起源:转载自公众号-玩转MySQL*爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。MGR 具备了 RPO=0 的高可用容灾能力,但并不适宜跨 WAN 场景下应用,像有两地三核心容灾需要的场景,单纯靠 MGR 是无奈满足的,必须要拉上异步复制。 同城双核心间隔在百十公里内,网络提早可承受,要求 RPO=0,那么部署一组 MGR;异地容灾核心间隔在上百公里,网络提早较大,承受 RPO>0,通过异步复制,部署单节点或对称部署一组 MGR。在两地三核心架构下,如果同城双核心的集群主节点产生切换,异地容灾的节点并不能主动的追随新的主节点持续同步。 Asynchronous Replication Automatic failover 其原理是在一条异步复制通道上配置多个可用复制源,当某个复制源不可用时(宕机、复制链路中断),且 slave 的 IO 线程尝试重连有效,主动依据权重抉择新的源持续同步。 1.筹备一个 MGR 集群和单实例,模仿复制链路切换,当 primary 故障,slave 主动切换到其余节点。 dbdeployer deploy replication --topology=group 8.0.22 --single-primarydbdeployer deploy single 8.0.222.在从机上建设指向 MGR 主节点的复制通道, change master to master_user='msandbox',master_password='msandbox', master_host='127.0.0.1',master_auto_position=1,source_connection_auto_failover=1,master_port=23223,master_retry_count=6,master_connect_retry=10 for channel 'mgr-single';在 master_retry_count 和 master_connect_retry 的设置上要思考尝试重连多久才切换复制源。 3.在从机上配置 asynchronous connection auto failover 配置 asynchronous connection auto failover 的两个函数: asynchronous_connection_failover_add_source(channel-name,host,port,network-namespace,weight)asynchronous_connection_failover_delete_source(channel-name,host,port,network-namespace)权重值大的被优先级抉择,能够配合MGR的选举权重配置 asynchronous_connection_failover 的权重。当 MGR 节点切换,异步复制也能切换到新的主节点。 ...

November 2, 2020 · 1 min · jiezi

关于mysql8:新特性解读-窗口函数的适用场景

作者:赵佳慧爱可生售后团队成员,次要负责公司运维平台故障诊断。青睐技术,致力在 IT 行业中磨难本人。本文起源:原创投稿*爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。一、窗口函数“窗口”可了解为记录汇合。“窗口函数”可了解为在满足某种条件的记录汇合上执行的非凡函数,对于每条记录都要在此窗口内执行。 二、疾速了解窗口函数通过举例,疾速了解窗口函数。 2.1 举例1)创立表 user,表 user 的数据如下: mysql> select * from user;+‐‐‐‐+‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+| id | name | address | createtime |+‐‐‐‐+‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+| 1 | aa | cun | 2020‐06‐01 00:00:00 || 2 | bb | cun | 2020‐06‐01 00:00:00 || 3 | bb | shi | 2020‐06‐01 01:00:00 || 4 | bb | shi | 2020‐06‐01 01:00:00 || 5 | cc | cun | 2020‐06‐01 01:00:00 || 6 | tt | cun | 2020‐06‐03 01:00:00 || 7 | eee | cun | 2020‐06‐04 01:00:00 || 8 | eee | cun | 2020‐06‐04 01:00:00 || 9 | xx | shen | 2020‐06‐02 01:00:00 |+‐‐‐‐+‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+9 rows in set (0.00 sec)2)窗口函数的应用 ...

October 10, 2020 · 5 min · jiezi

关于mysql8:新特性解读-数组范围遍历功能

作者:杨涛涛资深数据库专家,专研 MySQL 十余年。善于 MySQL、PostgreSQL、MongoDB 等开源数据库相干的备份复原、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相干技术支持、MySQL 相干课程培训等工作。本文起源:原创投稿*爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。大家都晓得,MySQL 从 5.7 开始,减少了新的数据类型:JSON。 JSON 类型的呈现,补救了 MySQL 长期以来相比其余关系型数据库的非标准化个性略势,比方能够用 JSON 来实现相似字典、数组等类型。以及之后大量针对 JSON 类型字串的相干遍历办法与函数。 比方对数组来说,简略的遍历门路为 "$[数组小标]" 或者 "$[*]" 来一次性遍历所有元素。MySQL 8.0 又新增了对于数组元素的范畴遍历,比方 "$[m to n]",示意遍历下标为 m 到 n 的元素。 举个例子,以下 JSON 字串(轻易找张表 explain format=json 的后果): # javascriptset @json_str1 = '{ "query_block": { "table": { "filtered": "100.00", "cost_info": { "eval_cost": "898504.10", "read_cost": "17457.25", "prefix_cost": "915961.35", "data_read_per_join": "137M" }, "table_name": "t1", "access_type": "ALL", "used_columns": [ "id", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8" ], "rows_examined_per_scan": 8985041, "rows_produced_per_join": 8985041 }, "cost_info": { "query_cost": "915961.35" }, "select_id": 1 }}';其中 key 为 used_columns 对应的值就是一个数组,当初我把这个数据遍历进去,并且生成以下后果: ...

September 30, 2020 · 3 min · jiezi

关于mysql8:新特性解读-MySQL-80-语句摘要功能介绍

作者:杨涛涛资深数据库专家,专研 MySQL 十余年。善于 MySQL、PostgreSQL、MongoDB 等开源数据库相干的备份复原、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相干技术支持、MySQL 相干课程培训等工作。本文起源:原创投稿*爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。一、背景介绍在介绍 MySQL 8.0 的语句摘要函数之前,先来看看经典的慢日志过滤后果: # mysqldumpslow -s c -t 10 -g 'order by' debian-ytt1-slow.logReading mysql slow query log from debian-ytt1-slow.logCount: 8 Time=10.41s (83s) Lock=0.00s (0s) Rows=2.0 (16), root[root]@localhost select * from p1 where id > N order by rand() limit NCount: 2 Time=15.06s (30s) Lock=0.00s (0s) Rows=2.0 (4), root[root]@localhost select * from p1 where N order by rand() limit NCount: 1 Time=6.35s (6s) Lock=0.00s (0s) Rows=2.0 (2), root[root]@localhost select * from p1 where id >N-N order by rand() limit N对慢日志进行过滤剖析,依照执行次数排序,拿出前 10 条语句,比方第 1 条语句: ...

September 15, 2020 · 4 min · jiezi

关于mysql8:新特性解读-备份锁

作者:姚远专一于 Oracle、MySQL 数据库多年,Oracle 10G 和 12C OCM,MySQL 5.6 ,5.7,8.0 OCP。当初鼎甲科技任参谋,为共事和客户进步数据库培训和技术支持服务。本文起源:原创投稿*爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。MySQL8.x 中新增了一个轻量级的备份锁,它容许在 online 备份的时候进行 DML 操作,同时可避免快照不统一。这个锁禁止的操作很少,它禁止的操作包含: 文件的创立、删除、改名账户的治理REPAIR TABLETRUNCATE TABLEOPTIMIZE TABLE备份锁由 lock instance for backup 和 unlock instance 语法组成。应用这些语句须要 BACKUP_ADMIN 权限。 从图外面看长查问对 FTWRL(flush tables with read lock) 是有影响的,整个零碎会 hung 住,此时其它的数据库查问也不能用,包含 use database。 能够看到大家都在等这个锁开释。而 lock instance for backup 则没有这个问题。Oracle 本人的备份产品(MySQL Enterprise Backup 8)就用这个锁,Percona 的 Xtrabackup 在 8 的版本也是用这个锁。 顺便提一下,Percona 本人的 MySQL 也有一种轻量级的备份锁“LOCK TABLES FOR BACKUP”也是一种比 FTWRL 要轻量级的锁。它不会刷新表,即存储引擎不会强制敞开表,并且表不会从表缓存中排出。因而,LOCK TABLES FOR BACKUP 仅期待抵触的语句实现,它不会期待 SELECT 或更新 InnoDB 表来实现。 ...

August 28, 2020 · 1 min · jiezi

PHP与Mysql8不兼容问题汇总

在安装Mysql8.0之后,需要跟我们原有的PHP进行协同工作,然而原先与Mysql5.1能够很好协同的代码,突然报错,看来需要做一些额外的工作。报错:PDO::__construct(): Server sent charset (255) unknown to the client. Please, report to the developers根据网上资料显示,是由于Mysql8.0将默认的字符集改为了utfmb4,因此和客户端(不仅仅是PHP)的通信无法识别,我们需要更改my.cnf来指定字符集。[client]default-character-set=utf8[mysql]default-character-set=utf8[mysqld]collation-server = utf8_unicode_cicharacter-set-server = utf8报错:PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password]根据网上资料显示,是由于用户身份认证的加密方式不兼容导致的,mysql8.0中默认方式为caching_sha2_password,引起老版本兼容性问题,老版本加密方式为mysql_native_password。新建用老版加密方式初始化密码的用户即可:CREATE USER username@localhost identified with mysql_native_password by ‘password’;报错:Access denied for user ‘root’@’localhost’ (using password: YES)mysql> GRANT ALL PRIVILEGES ON . TO ‘oss’@’%’;ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: YES)在我给其他用户加权限的时候,报错无权限,原因是我一不小心删掉了root身份的用户,虽然网上有很多的文档解决这个问题,但是我重建后的root用户虽然拥有Grant_priv: Y但依然无法成功分配权限,我很头疼。解决方法:重装,参考文章安装Mysql8.0。总结mysql8.0有什么新的特性我没有详细查看文档,但是兼容性先让我吃了一顿苦头,还好在解决完这3个问题后,我的PHP程序成功跑了起来,下面我要去升级PHP5.1到PHP7了。参考资料PDO::__construct(): Server sent charset (255) unknown to the client. Please, report to the developers:https://stackoverflow.com/que…PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password]:https://stackoverflow.com/que…安装Mysql8.0:https://segmentfault.com/a/11… ...

December 13, 2018 · 1 min · jiezi

Linux安装mysql 8.0

经过一番努力下载mysql文件,我们可以开始Mysql8.0的安装了。 解压文件 // 解压文件生成两个xz格式的压缩文件$ tar -xvf mysql-8.0.13-linux-glibc2.12-x86_64.tarmysql-router-8.0.13-linux-glibc2.12-x86_64.tar.xzmysql-test-8.0.13-linux-glibc2.12-x86_64.tar.xz// 我们需要先删掉/移除原有文件,才可以继续解压,因为解压出来的.tar文件和.tar.xz文件重名mv mysql-8.0.13-linux-glibc2.12-x86_64.tar ../xz -d mysql-router-8.0.13-linux-glibc2.12-x86_64.tar.xztar -xvf mysql-8.0.13-linux-glibc2.12-x86_64.tar// 为了方便查找,改个名字mv mysql-8.0.13-linux-glibc2.12-x86_64.tar mysql8 环境配置 我们需要专门的mysql进程启动用户和权限管理: // 创建mysql系统用户和用户组useradd -r mysql// 给予安装目录mysql权限chown mysql:mysql -R mysql8 配置自己的mysql配置文件,因为我有多个Mysql库,我手动指定很多参数: [client]socket=/home/work/lnmp/mysql8/tmp/mysql.sockdefault-character-set=utf8 [mysql] basedir=/home/work/lnmp/mysql8/datadir=/home/work/lnmp/mysql8/data/socket=/home/work/lnmp/mysql8/tmp/mysql.sockport=3306user=mysql# 指定日志时间为系统时间log_timestamps=SYSTEMlog-error=/home/work/lnmp/mysql8/log/mysql.err# 指定字符集为utf8,因为mysql8.0中的默认字符集为utfmb4,会和其他程序引起兼容性问题default-character-set=utf8 ...

December 13, 2018 · 2 min · jiezi