我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何理解MySQL中的截断

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何理解MySQL中的截断

这期内容当中小编将会给大家带来有关如何理解MySQL中的截断,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

MySQL中的undo截断还是一个很不错的特性。这让我想起了很久以前看到一个诺大的ibdata,但是却拿它无能为力,想把它收缩唯一的办法就是重建或者重构数据。

   Oracle用得久了,总会有一些想法,看起来很平常的技术怎么在MySQL中却无能为力。当然这个念头也有些日子了。

   MySQL 5.6中把undo做了剥离,可以指定单独的undo表空间,但是要收缩阶段还是无能为力,这个也算是一个过渡的特性吧,到了MySQL 5.7中,这个功能就可以说是上了正道了,我们可以截断,化被动为主动,这种方式就很好。

    而如果要展望这个特性,我觉得还可以持续改进,就是可以在线修改,切换undo等。

    要实现这个阶段功能,其实还需要花点功夫,那就是在初始化的时候就完成这些基础配置,否则会收到下面这样有些模糊的提示信息。

2017-02-28 22:39:48 7fedca8127e0 InnoDB: Expected to open 1 undo tablespaces but was able
2017-02-28 22:39:48 7fedca8127e0 InnoDB: to find only 0 undo tablespaces.
2017-02-28 22:39:48 7fedca8127e0 InnoDB: Set the innodb_undo_tablespaces parameter to the
2017-02-28 22:39:48 7fedca8127e0 InnoDB: correct value and retry. Suggested value is 0所以我们打算初始化一个全新的库来做一个简单的测试。

my.cnf的内容如下,你可以自己根据需要指定也可以。

my.cnf
[client]
socket = /home/mysql/mysql.sock

[mysql]
socket = /home/mysql/mysql.sock
default-character-set = utf8

[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /home/mysql
port = 3306
socket = /home/mysql/mysql.sock
pid-file = /home/mysql/mysql.pid
max_allowed_packet = 32M
ft_min_word_len = 4
event_scheduler = 1
explicit_defaults_for_timestamp=true
tmpdir = /dev/shm
character-set-server = utf8

#innodb_undo_directory=/data/undolog
innodb_undo_tablespaces=4
innodb_undo_logs=128
innodb_max_undo_log_size=200M
innodb_purge_rseg_truncate_frequency
innodb_undo_log_truncate=1
重点就是最后的几个参数了。

先初始化一下数据字典,

mysqld  --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/home/mysql然后配置使得MySQL服务启动

service mysql start打开文件目录,就会赫然看到下面的几个undo文件,因为参数

innodb_undo_tablespaces为4,所以会有4个文件。innodb_undo_logs默认是128个,至少是35个,官网也有详细的解释。而innodb_undo_directory的目录则默认按照数据目录来取得,所以我索性去掉了。4个Undo文件都是10M,也就是初始大小。

drwxr-x--- 2 mysql mysql     8192 Feb 28 23:09 performance_schema
drwxr-x--- 2 mysql mysql     8192 Feb 28 23:09 sys
-rw-r----- 1 mysql mysql 10485760 Feb 28 23:09 undo001
-rw-r----- 1 mysql mysql 10485760 Feb 28 23:09 undo002
-rw-r----- 1 mysql mysql 10485760 Feb 28 23:09 undo003
-rw-r----- 1 mysql mysql 10485760 Feb 28 23:09 undo004我们初始化数据,然后插入一些数据。

mysql> create table test_undo(id int,name varchar(30));
mysql> insert into test_undo values(1,'a');
mysql> insert into test_undo values(2,'b');
insert可以反复执行,数据就是指数级的增长,事务也会逐渐变大,大概在200万数据量的时候,undo的分布如下:

-rw-r----- 1 mysql mysql 13631488 Feb 28 23:16 undo001
-rw-r----- 1 mysql mysql 22020096 Feb 28 23:16 undo002
-rw-r----- 1 mysql mysql 10485760 Feb 28 23:16 undo003
-rw-r----- 1 mysql mysql 10485760 Feb 28 23:16 undo004数据在1600万左右的时候,undo文件的大小如下:

-rw-r----- 1 mysql mysql  13631488 Feb 28 23:20 undo001
-rw-r----- 1 mysql mysql  22020096 Feb 28 23:20 undo002
-rw-r----- 1 mysql mysql 150994944 Feb 28 23:20 undo003
-rw-r----- 1 mysql mysql  75497472 Feb 28 23:20 undo004这个时候我们开始测试一下截断的部分,和一个参数密切相关,那就是innodb_purge_rseg_truncate_frequency,我们可以为了测试,适当设置小一些,能够马上看到效果,比如我设置为20

mysql> set global innodb_purge_rseg_truncate_frequency=20;然后我继续开启一个很大的事务,插入千万数据,undo的文件就会暴增,当然因为最大的事务占用了一个undo文件,那个文件还是会持续增大,尽管超过了设定的阈值。

-rw-r----- 1 mysql mysql  13631488 Feb 28 23:33 undo001
-rw-r----- 1 mysql mysql  22020096 Feb 28 23:33 undo002
-rw-r----- 1 mysql mysql 150994944 Feb 28 23:33 undo003
-rw-r----- 1 mysql mysql 293601280 Feb 28 23:33 undo004然后我们使点小技巧,delete几条数据,触发截断的临界点。

mysql> delete from test_undo limit 10;再次查看,undo的文件就会收缩,当然你可以清晰的看到,不是所有的,因为和事务大小也有关系。

-rw-r----- 1 mysql mysql  13631488 Feb 28 23:34 undo001
-rw-r----- 1 mysql mysql  22020096 Feb 28 23:34 undo002
-rw-r----- 1 mysql mysql 150994944 Feb 28 23:34 undo003
-rw-r----- 1 mysql mysql  10485760 Feb 28 23:34 undo004

上述就是小编为大家分享的如何理解MySQL中的截断了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何理解MySQL中的截断

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何在 MySQL 中正确截断表?

这意味着您需要首先将foreign_key_check设置为禁用,然后需要截断表。语法如下 -set FOREIGN_KEY_CHECKS = 0;TRUNCATE TABLE yourTableName1;TRUNCATE TABLE
2023-10-22

如何解决MySQL报错:数据被截断

MySQL报错"数据被截断"通常是由于插入或更新操作时数据长度超过了表字段的最大长度限制引起的。解决此问题的方法如下:1. 检查表字段的最大长度限制:使用DESCRIBE命令或查看表结构来确定字段的最大长度限制。2. 检查插入或更新的数据长
2023-10-12

MySQL长字符截断如何实现

本篇内容主要讲解“MySQL长字符截断如何实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL长字符截断如何实现”吧!MySQL超长字符截断又名"SQL-Column-Truncatio
2023-07-05

MYSQL清空表和截断表问题如何解决

这篇文章主要介绍“MYSQL清空表和截断表问题如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MYSQL清空表和截断表问题如何解决”文章能帮助大家解决问题。MYSQL清空表和截断表清空表和截断
2023-07-05

Data truncated for column 'column_name' - 如何解决MySQL报错:数据被截断

首先,让我们明确一下什么是数据被截断错误。当我们在MySQL中定义表时,会为每个字段指定一个最大长度。这个最大长度限制了我们可以存储在该字段中的数据的大小。如果我们尝试插入的数据长度大于字段的最大长度,MySQL会报错并将数据截断到最大长度
2023-10-21

如何解决MySQL报错:无法截断被外键约束引用的表

当你试图删除一个被外键约束引用的表时,MySQL会抛出"Cannot truncate a table referenced in a foreign key constraint"错误。这是因为MySQL保护数据完整性,防止删除一个被其他
2023-10-10

mysql中如何截取函数substring_index

小编给大家分享一下mysql中如何截取函数substring_index,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!python的五大特点是什么python的五
2023-06-14

如何理解linux内核的软中断的情况

这篇文章主要讲解了“如何理解linux内核的软中断的情况”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解linux内核的软中断的情况”吧!软中断介绍把可以延迟的处理从硬中断处理程序独立
2023-06-13

MySQL 中的字段截取与字符串截取方法详解

系列文章目录 文章目录 系列文章目录前言一、字段截取:二、字符串截取:总结 前言 在 MySQL 数据库中,有时我们需要截取字段或字符串的一部分进行查询、展示或处理。本文将介绍 MySQL 中常用的字段截取和字符串截取方法,
2023-08-17

编程热搜

目录