- GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯系小編并注明來源,
- GreatSQL是MySQL的國產分支版本,使用上與MySQL一致,
- 本文來源:原創投稿;作者:YeJinrong/葉金榮
MySQL 8.0.30動態redo log初探
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
GreatSQL是由萬里資料庫維護的MySQL分支,專注于提升MGR可靠性及性能,支持InnoDB并行查詢特性,是適用于金融級應用的MySQL分支版本,
相關鏈接: GreatSQL社區 Gitee GitHub Bilibili
GreatSQL社區:
捉蟲活動詳情:https://greatsql.cn/thread-97-1-1.html
社區博客有獎征稿詳情:https://greatsql.cn/thread-100-1-1.html

技術交流群:
微信:掃碼添加
GreatSQL社區助手微信好友,發送驗證資訊加群,
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/531933.html
標籤:MySQL
