MySQL 8.0.30全新的动态redo log玩法探秘。
MySQL从5.7版本开始支持在线动态修改 innodb_buffer_pool_size,8.0开始支持在线添加undo表空间,以及临时表空间的自动回收,真的是越来越方便了。
从8.0.30开始,又新增支持动态调整redo log的大杀器,对DBA来说又是一大福音。
在8.0.30里,新增选项 innodb_redo_log_capacity,用于定义redo log总大小。如果设置了该选项,则原来定义redo log的几个选项 innodb_log_file_size、innodb_log_files_in_group 就都失效了
在8.0.30里,如果innodb_log_group_home_dir 没有设置,redo log存储在 datadir/#innodb_redo下,由32个文件组成。文件命名为 #ib_redoN**,每个文件大小是 innodb_redo_log_capacity/32(在resize redo log时可能会短时间不一样)。
-rw-r-----. 1 mysql mysql 110M Sep 28 13:54 #ib_redo2923
-rw-r-----. 1 mysql mysql 256K Sep 28 13:54 #ib_redo2924
-rw-r-----. 1 mysql mysql 256K Sep 28 13:54 #ib_redo2925
-rw-r-----. 1 mysql mysql 256K Sep 28 13:54 #ib_redo2926
有两种类型的redo log文件,一种是当前正在使用的(ordinary),文件名是正常的 #ib_redoN;另一种是空闲的(spare),文件名为 #ib_redoN_tmp,多加了个 _tmp 后缀。
-rw-r-----. 1 mysql mysql 192M Sep 28 13:53 #ib_redo2922
-rw-r-----. 1 mysql mysql 192M Sep 28 13:53 #ib_redo2923
-rw-r-----. 1 mysql mysql 192M Sep 28 12:42 #ib_redo2924_tmp
-rw-r-----. 1 mysql mysql 192M Sep 28 12:44 #ib_redo2925_tmp
-rw-r-----. 1 mysql mysql 192M Sep 28 12:47 #ib_redo2926_tmp
可以直接查看当前所有活跃redo log的状态:
mysql> SELECT FILE_NAME, START_LSN, END_LSN FROM performance_schema.innodb_redo_log_files;
mysql> SELECT * FROM performance_schema.innodb_redo_log_files;
+---------+-----------------------------+-------------+-------------+---------------+---------+----------------+
| FILE_ID | FILE_NAME | START_LSN | END_LSN | SIZE_IN_BYTES | IS_FULL | CONSUMER_LEVEL |
+---------+-----------------------------+-------------+-------------+---------------+---------+----------------+
| 9692 | ./#innodb_redo/#ib_redo9692 | 19417284608 | 19419379712 | 2097152 | 1 | 0 |
| 9693 | ./#innodb_redo/#ib_redo9693 | 19419379712 | 19421474816 | 2097152 | 1 | 0 |
| 9694 | ./#innodb_redo/#ib_redo9694 | 19421474816 | 19423569920 | 2097152 | 1 | 0 |
| 9695 | ./#innodb_redo/#ib_redo9695 | 19423569920 | 19425665024 | 2097152 | 1 | 0 |
| 9696 | ./#innodb_redo/#ib_redo9696 | 19425665024 | 19427760128 | 2097152 | 1 | 0 |
| 9697 | ./#innodb_redo/#ib_redo9697 | 19427760128 | 19429855232 | 2097152 | 1 | 0 |
| 9698 | ./#innodb_redo/#ib_redo9698 | 19429855232 | 19431950336 | 2097152 | 1 | 0 |
| 9699 | ./#innodb_redo/#ib_redo9699 | 19431950336 | 19434045440 | 2097152 | 1 | 0 |
| 9700 | ./#innodb_redo/#ib_redo9700 | 19434045440 | 19436140544 | 2097152 | 1 | 0 |
| 9701 | ./#innodb_redo/#ib_redo9701 | 19436140544 | 19438235648 | 2097152 | 1 | 0 |
| 9702 | ./#innodb_redo/#ib_redo9702 | 19438235648 | 19440330752 | 2097152 | 1 | 0 |
| 9703 | ./#innodb_redo/#ib_redo9703 | 19440330752 | 19442425856 | 2097152 | 1 | 0 |
| 9704 | ./#innodb_redo/#ib_redo9704 | 19442425856 | 19444520960 | 2097152 | 0 | 0 |
+---------+-----------------------------+-------------+-------------+---------------+---------+----------------+
相应的,增加了几个status用来观察redo log的状态:
mysql> show global status like '%innodb%redo%';
+-------------------------------------+-------------+
| Variable_name | Value |
+-------------------------------------+-------------+
| Innodb_redo_log_read_only | OFF | #当前redo不是处于RO状态
| Innodb_redo_log_uuid | 1075899837 | #redo log uuid,归档用
| Innodb_redo_log_checkpoint_lsn | 16900081552 | #最新的checkpoint
| Innodb_redo_log_current_lsn | 16905440582 | #当前LSN
| Innodb_redo_log_flushed_to_disk_lsn | 16905433909 | #已刷盘的LSN
| Innodb_redo_log_logical_size | 5358080 | #当前活跃事务正在使用中的redo log大小
| Innodb_redo_log_physical_size | 24117248 | #当前正在使用中的redo log大小(不含空闲的那部分)
| Innodb_redo_log_capacity_resized | 33554432 | #redo log resized后的大小
| Innodb_redo_log_resize_status | OK | #resize状态,OK|Resizing down两种
| Innodb_redo_log_enabled | ON |
+-------------------------------------+-------------+
从上面的结果中能看到当前redo log总大小是32MB,ordinary空间是 24117248字节,spare空间 9437184字节(33554432 - 24117248),当前活跃事务占用的空间是 5358080字节。
我们还可以利用下面的方法来预估合理的 innodb_redo_log_capacity 值应该是多少。
mysql> SHOW GLOBAL STATUS LIKE 'Innodb_redo_log_current_lsn'; SELECT SLEEP(60); SHOW GLOBAL STATUS LIKE 'Innodb_redo_log_current_lsn';
+-----------------------------+------------+
| Variable_name | Value |
+-----------------------------+------------+
| Innodb_redo_log_current_lsn | 1895933494 |
+-----------------------------+------------+
1 row in set (0.01 sec)
+-----------+
| SLEEP(60) |
+-----------+
| 0 |
+-----------+
1 row in set (1 min 0.00 sec)
+-----------------------------+------------+
| Variable_name | Value |
+-----------------------------+------------+
| Innodb_redo_log_current_lsn | 1986911858 |
+-----------------------------+------------+
1 row in set (0.01 sec)
先观察1分钟内,共产生多少redo log为 86.76MB(1986911858-1895933494),通常我们要预留10-30分钟的redo log空间,因此合理的 innodb_redo_log_capacity 建议值约为 1GB ~ 3GB左右。
当我们把redo log调小(压测期间,从32MB调低到8MB):
mysql> SET GLOBAL innodb_redo_log_capacity = 8*1024*1024;
日志中可能会有类似下面的提示,警告redo log可能不够用,建议加大:
2022-09-28T14:04:15.046016+08:00 8 [Note] [MY-013884] [InnoDB] User has set innodb_redo_log_capacity to 8M.
2022-09-28T14:04:15.046322+08:00 0 [Note] [MY-013885] [InnoDB] Redo log has been requested to resize from 64M to 8M.
2022-09-28T14:04:15.918901+08:00 0 [Warning] [MY-013867] [InnoDB] Redo log is running out of free space, pausing user threads... Consider increasing innodb_redo_log_capacity.
2022-09-28T14:04:16.012707+08:00 0 [Note] [MY-013868] [InnoDB] Redo log reclaimed some free space, resuming user threads.
2022-09-28T14:04:18.630082+08:00 0 [Note] [MY-013887] [InnoDB] Redo log has been resized to 8M.
注意:调小redo log的话,需要等当前事务提交后,相应的活跃redo log文件才能释放。
当启用 innodb_redo_log_capacity 后,如果还继续设置 innodb_log_files_in_group 和 innodb_log_file_size,则日志中会有类似下面的提示,忽略即可:
2022-09-28T14:49:20.248216+08:00 0 [Warning] [MY-013869] [InnoDB] Ignored deprecated configuration parameter innodb_log_file_size. Use
d innodb_redo_log_capacity instead.
2022-09-28T14:49:20.248271+08:00 0 [Warning] [MY-013870] [InnoDB] Ignored deprecated configuration parameter innodb_log_files_in_group
. Used innodb_redo_log_capacity instead.
有了动态redo log功能,又少了一个需要重启MySQL的理由,对DBA来说真的是很方便。
顺便一起来猜猜MySQL下一个能动态实现的功能是啥呢?比如可以在线动态回收空闲的表空间?哈哈。。。
Enjoy GreatSQL ?
GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。
相关链接: GreatSQL社区 Gitee GitHub Bilibili
捉虫活动详情:https://greatsql.cn/thread-97-1-1.html
社区博客有奖征稿详情:https://greatsql.cn/thread-100-1-1.html

微信:扫码添加
GreatSQL社区助手微信好友,发送验证信息加群。
)
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
1.在Python3中,下列关于数学运算结果正确的是:(B)a=10b=3print(a//b)print(a%b)print(a/b)A.3,3,3.3333...B.3,1,3.3333...C.3.3333...,3.3333...,3D.3.3333...,1,3.3333...解析: 在Python中,//表示地板除(向下取整),%表示取余,/表示除(Python2向下取整返回3)2.如下程序Python2会打印多少个数:(D)k=1000whilek>1: print(k)k=k/2A.1000 B.10C.11D.9解析: 按照题意每次循环K/2,直到K值小于等
有没有办法在Ruby中动态创建数组?例如,假设我想遍历用户输入的书籍数组:books=gets.chomp用户输入:"TheGreatGatsby,CrimeandPunishment,Dracula,Fahrenheit451,PrideandPrejudice,SenseandSensibility,Slaughterhouse-Five,TheAdventuresofHuckleberryFinn"我把它变成一个数组:books_array=books.split(",")现在,对于用户输入的每一本书,我想用Ruby创建一个数组。伪代码来做到这一点:x=0books_array.
我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO
我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin
首先,我使用的是rails3.1.3和来自master的carrierwavegithub仓库的分支。我使用after_init钩子(Hook)来确定基于属性的字段页面模型实例并为这些字段定义属性访问器将值存储在序列化哈希中(希望它清楚我是什么谈论)。这是我正在做的事情的精简版:classPage省略mount_uploader命令让我可以访问我想要的属性。但是当我安装uploader时出现错误消息说“nil类的未定义新方法”我在源代码中读到有方法read_uploader和扩展模块中的write_uploader。我如何必须覆盖这些来制作mount_uploader命令使用我的“虚拟
我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi
我正在尝试动态构建一个多维数组。我想要的基本上是这样的(为简单起见写出来):b=0test=[[]]test[b]这给了我错误:NoMethodError:undefinedmethod`test=[[],[],[]]而且它工作正常,但在我的实际使用中,我不会事先知道需要多少个数组。有一个更好的方法吗?谢谢 最佳答案 不需要像您正在使用的索引变量。只需将每个数组附加到您的test数组:irb>test=[]=>[]irb>test[["a","b","c"]]irb>test[["a","b","c"],["d","e","f"]]
如何只加载map边界内的标记gmaps4rails?当然,在平移和/或缩放后加载新的。与此直接相关的是,如何获取map的当前边界和缩放级别? 最佳答案 我是这样做的,我只在用户完成平移或缩放后替换标记,如果您需要不同的行为,请使用不同的事件监听器:在你看来(index.html.erb):{"zoom"=>15,"auto_adjust"=>false,"detect_location"=>true,"center_on_user"=>true}},false,true)%>在View的底部添加:functiongmaps4rail
如何在对象上调用方法名称的嵌套哈希?例如,给定以下哈希:hash={:a=>{:b=>{:c=>:d}}}我想创建一个方法,给定上面的散列,执行以下操作:object.send(:a).send(:b).send(:c).send(:d)我的想法是我需要从一个未知的关联中获取一个特定的属性(这个方法不知道,但程序员知道)。我希望能够指定一个方法链来以嵌套哈希的形式检索该属性。例如:hash={:manufacturer=>{:addresses=>{:first=>:postal_code}}}car.execute_method_hash(hash)=>90210