Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

MySQL 8.0 - InnoDB Dynamic Redo Log

lefred
February 05, 2023

MySQL 8.0 - InnoDB Dynamic Redo Log

MySQL 8.0 allows to change the InnoDB Redo Log Capacity online

lefred

February 05, 2023
Tweet

More Decks by lefred

Other Decks in Technology

Transcript

  1. Frédéric Descamps Community Manager Oracle MySQL preFOSDEM MySQL Days -

    February 2023 MySQL 8.0 : InnoDB Dynamic Redo Logs Online Redo Log Capacity
  2. @lefred MySQL Evangelist using MySQL since version 3.20 devops believer

    living in h ps://lefred.be Frédéric Descamps Copyright @ 2023 Oracle and/or its affiliates. 3
  3. InnoDB Redo Logs What is it ? Copyright @ 2023

    Oracle and/or its affiliates. 4
  4. InnoDB Redo Logs During data modi cation, InnoDB caches the

    changes in memory (inside InnoDB Bu er Pool) to achieve be er read and write performance. The modi cations are also writen to disk in a sequential way (remember the old disks?) on speci c les called Redo Logs (you can also encounter the name Transaction Logs). Those logs are used only in case of a crash and InnoDB needs to perform a recovery of all transactions that have been commi ed. This process guarantees the durability, the D in ACID. Copyright @ 2023 Oracle and/or its affiliates. 5
  5. InnoDB Checkpointing However at some point, InnoDB will also write

    the changed pages to disk in the tablespaces (data les). The process of writing the dirty pages (pages that have been modi ed) to the tablespaces is known as ushing or checkpointing. The checkpoint represent the LSN value of the latest changes wri en to the data les. InnoDB ushes small batches of those dirty pages from the bu er pool, this is why it's called fuzzy checkpointing. MySQL does not ush them all at once to avoid heavy process that could disrupt the normal usage of MySQL. Copyright @ 2023 Oracle and/or its affiliates. 7
  6. InnoDB Redo Logs before MySQL 8.0.30 Before MySQL 8.0.30, the

    InnoDB Redo Logs were con gured using these variables: innodb_log_ le_size: the size of the les, the default was 48MB and the maximum could not be bigger than 512GB / innodb_log_ les_in_group innodb_log_ les_in_group: the number of log les, default and minimum of 2 with a maximum of 100. Those variables were not dynamic and required a restart of MySQL Server to modify them. Copyright @ 2023 Oracle and/or its affiliates. 9
  7. InnoDB Redo Logs before MySQL 8.0.30 Before MySQL 8.0.30, the

    InnoDB Redo Logs were con gured using these variables: innodb_log_ le_size: the size of the les, the default was 48MB and the maximum could not be bigger than 512GB / innodb_log_ les_in_group innodb_log_ les_in_group: the number of log les, default and minimum of 2 with a maximum of 100. Those variables were not dynamic and required a restart of MySQL Server to modify them. [ [fred@dell ~/sandboxes/msb_8_0_28/data fred@dell ~/sandboxes/msb_8_0_28/data] ] $ $ ls ls -lh -lh ib_log* ib_log* -rw-r-----. -rw-r-----. 1 1 fred fred 48M Jun fred fred 48M Jun 17 17 2022 2022 ib_log le0 ib_log le0 -rw-r-----. -rw-r-----. 1 1 fred fred 48M Jun fred fred 48M Jun 17 17 2022 2022 ib_log le1 ib_log le1 Copyright @ 2023 Oracle and/or its affiliates. 9
  8. New InnoDB Redo Log Architecture Since MySQL 8.0.30, we don't

    talk about Redo Log Size anymore, but we talk about capacity ! The capacity is de ned in a unique variable: innodb_redo_log_capacity (in bytes). The default is 100MB. The variable is dynamic, it can be changed at runtime, to set it to 200MB: SQL SQL > > set set global global innodb_redo_log_capacity innodb_redo_log_capacity= =200 200* *1024 1024* *1024 1024; ; Copyright @ 2023 Oracle and/or its affiliates. 12
  9. InnoDB Redo Log Home Dir InnoDB will create 32 redo

    log les in MySQL's datadir inside the new dedicated folder #innodb_redo by default. You can also specify another destination by mo ying (not dynamic) the variable innodb_log_group_home_dir. Inside that directory, you will be able to nd two types of les: #ib_redoXXX (where XXX is the le_id, a sequence number): those are the active redo log les #ib_redoXXX_tmp: those are spare redo log les Copyright @ 2023 Oracle and/or its affiliates. 13
  10. InnoDB Redo Log Home Dir (2) InnoDB tries to maintain

    approximately 32 les here, so that it doesn't need to wait long before one of them becomes no longer needed as it would if you had just 2 big les. This way it can reclaim them one by one when you want to resize them. Copyright @ 2023 Oracle and/or its affiliates. 14
  11. InnoDB Redo Log Capacity The InnoDB Redo Log Capacity can

    be represented like this: checkpoint_lsn (Innodb_redo_log_checkpoint_lsn): an LSN point up to which all changes to the pages are guaranteed to have already been wri en and fsynced back to the tablespace les - basically, the sill needed portion of redo log starts here. ushed_to_disk_lsn (Innodb_redo_log_ ushed_to_disk_lsn): the last position in the redo log that InnoDB has been ushed to disk. Copyright @ 2023 Oracle and/or its affiliates. 15
  12. InnoDB Redo Log Capacity (2) The InnoDB Redo Log Capacity

    can be represented like this: current_lsn (Innodb_redo_log_current_lsn): the last wri en position in the redo log. That write could still be bu ered inside MySQL processes bu er. Copyright @ 2023 Oracle and/or its affiliates. 16
  13. InnoDB Redo Log Capacity (3) When InnoDB reaches the end

    of the 31st le (90%), the log les governor will perform some cleanup and some active les that are not needed anymore will become the new spare ones: When the background thread is not able to remove a log le from the left to put it to the right, the user transaction will get stuck waiting for REDO bu ers to be wri en to disk. DBAs get warning in the error log notifying them to increase the InnoDB Redo Log Capacity Copyright @ 2023 Oracle and/or its affiliates. 17
  14. InnoDB Redo Log Capacity (3) When InnoDB reaches the end

    of the 31st le (90%), the log les governor will perform some cleanup and some active les that are not needed anymore will become the new spare ones: When the background thread is not able to remove a log le from the left to put it to the right, the user transaction will get stuck waiting for REDO bu ers to be wri en to disk. DBAs get warning in the error log notifying them to increase the InnoDB Redo Log Capacity Copyright @ 2023 Oracle and/or its affiliates. [Warning] [MY-013865] [InnoDB] Redo log writer is waiting for a new redo log le. Consider increasing innodb_redo_log_capacity. 17
  15. InnoDB Checkpointing So we know that each time data is

    changed in InnoDB, the page(s) containing the data is modi ed in memory (in the InnoDB Bu er Pool). The page(s) is (are) noted as dirty. In case of a sudden crash, we cannot loose all those changes… but the data in memory is gone ! This is the reason why di data of the pages are also wri en (and by default ushed to disk) on the redo logs. The data in those logs will be only read in case of InnoDB Recovery. During that process the modi ed pages will be reconstructed with the modi ed data. Copyright @ 2023 Oracle and/or its affiliates. 19
  16. InnoDB Fuzzy Checkpointing InnoDB ushes those dirty pages from the

    Bu er Pool (memory) to the table spaces (disk) in small batches, step by step. This operation is called Fuzzy Checkpointing. Once the pages are wri en to the data les on disk (InnoDB tablespaces), the corresponding entries in the Redo Log are not required anymore. The position up to which InnoDB has wri en the data to the disk is the value of Innodb_redo_log_checkpoint_lsn. InnoDB Checkpointing is adaptive. This means that considering the checkpoint age (log_lsn_checkpoint_age) InnoDB will decide to ush less or more aggressively. Copyright @ 2023 Oracle and/or its affiliates. 20
  17. InnoDB Fuzzy Checkpointing (2) For info, log_lsn_checkpoint_age and inndob_redo_log_logical_size are

    almost equivalent: Copyright @ 2023 Oracle and/or its affiliates. 21
  18. LSN Checkpoint Age and Redo Log Capacity MySQL performs this

    adaptive ushing considering these thresholds: soft limit for logical capacity: to avoid deadlocks InnoDB doesn't let the user transactions to use up the whole innodb_redo_log_capacity. Instead it keeps them below soft logical capacity which is roughly 30/32 of it. When this limitation is exceeded, all user threads are paused and a message is sent to the error_log. hard limit for logical capacity: this limitation is never exceeded. If space isn't reclaimed after 1 second wait when the limit is reached, logs are wri en as much as possible or crash InnoDB ! Copyright @ 2023 Oracle and/or its affiliates. 22
  19. LSN Checkpoint Age and Redo Log Capacity (2) async ush

    point (log_max_modi ed_age_async): writes are allowed but page ushing will be gradually increased to reach the next threshold. This will lead to a drop of performance. In the code, async ush point can be called adaptive_ ush_min_age. This is 7/8 of the soft logical capacity. However, in practice, it seems that the adaptive ushing already starts at innodb_adaptive_ ushing_lwm (by default 10% of soft logical capacity), and reaches maximum allowed IO capacity already at 82% of the async ush point. sync ush point (log_max_modi ed_age_sync): at this point the checkpointer will request page cleaners to ush as much of dirty pages to get the checkpoint age below this threshold and will wait for it synchronously. Terrible performance. This is also called adaptive_ ush_max_age. This is 15/16 of the soft logical capacity. Copyright @ 2023 Oracle and/or its affiliates. 23
  20. LSN Checkpoint Age and Redo Log Capacity (3) aggressive_checkpoint_min_age: this

    represents 31/32 of soft logical capacity. When this point is reached, MySQL already asked to InnoDB to ush dirty pages from the Bu er Pool at full speed. The checkpointer will not sleep for 1 second between a empting updating checkpoint lsn. Instead it will request a sync checkpoint as often as possible and will also update checkpoint_lsn value to the redo log header as soon as possible afterwards. This is performed to be able to reclaim the space faster. As we are already at the top speed, this doesn't add any more pressure to the page cleaners. Copyright @ 2023 Oracle and/or its affiliates. 24
  21. LSN Checkpoint Age and Redo Log Capacity (4) Copyright @

    2023 Oracle and/or its affiliates. 25
  22. LSN Checkpoint Age and Redo Log Capacity (4) Copyright @

    2023 Oracle and/or its affiliates. 26
  23. LSN Checkpoint Age and Redo Log Capacity (4) Copyright @

    2023 Oracle and/or its affiliates. 27
  24. LSN Checkpoint Age and Redo Log Capacity (4) Copyright @

    2023 Oracle and/or its affiliates. 28
  25. LSN Checkpoint Age and Redo Log Capacity (4) Copyright @

    2023 Oracle and/or its affiliates. 29
  26. Instrumentation - Performance_Schema The new Redo Log is instrumented in

    Performance_Schema in the table innodb_redo_log_ les: This means there are 5 active redo log les and 27 (32-5) spare ones (_tmp) Each active redo log le is associated with a particular range of LSN values. Copyright @ 2023 Oracle and/or its affiliates. 31
  27. Instrumentation - Performance_Schema The new Redo Log is instrumented in

    Performance_Schema in the table innodb_redo_log_ les: This means there are 5 active redo log les and 27 (32-5) spare ones (_tmp) Each active redo log le is associated with a particular range of LSN values. Copyright @ 2023 Oracle and/or its affiliates. 31
  28. Instrumentation - Performance_Schema (2) All the les are also instrumented

    in Performance_Schema's le instance tables ( le_instances and le_summary_by_instance): Copyright @ 2023 Oracle and/or its affiliates. 32
  29. Instrumentation - Status There are status variables providing information about

    the " ushpointing" operations: Copyright @ 2023 Oracle and/or its affiliates. 33
  30. Instrumentation - InnoDB Metrics Information is also available in InnoDB

    Metrics: Copyright @ 2023 Oracle and/or its affiliates. 34
  31. When the appropriate InnoDB Metrics are enabled, it's also possible

    to get an overview of the Redo Log's usage and see where we are in relation to the soft and hard redo log logical capacity: select select concat concat( (variable_value variable_value, , " (" " (", , format_bytes format_bytes( (variable_value variable_value) ), ,")" ")") ) innodb_redo_log_logical_size innodb_redo_log_logical_size, , concat concat( (round round( (count count* *8 8/ /7 7) ), , " (" " (", , format_bytes format_bytes( (round round( (count count* *8 8/ /7 7) )) ), , ")" ")") ) soft_logical_capacity soft_logical_capacity, , concat concat( (round round( (@ @@innodb_redo_log_capacity @innodb_redo_log_capacity* *29.8 29.8/ /32 32) ), , " (" " (", , format_bytes format_bytes( (round round( (@ @@innodb_redo_log_capacity @innodb_redo_log_capacity* *29.8 29.8/ /32 32) )) ) , ,")" ")") ) hard_logical_capacity hard_logical_capacity, , concat concat( (@ @@innodb_redo_log_capacity @innodb_redo_log_capacity, , " (" " (", , format_bytes format_bytes( (@ @@innodb_redo_log_capacity @innodb_redo_log_capacity) ) , ,")" ")") ) redo_log_capacity redo_log_capacity, , concat concat( (round round( (variable_value variable_value / / ( (count count* *8 8/ /7 7) )* *100 100, ,2 2) ), , "%" "%") ) logical_used logical_used, , concat concat( (round round( (variable_value variable_value / / ( (@ @@innodb_redo_log_capacity @innodb_redo_log_capacity* *29.8 29.8/ /32 32) )* *100 100, ,2 2) ), , "%" "%") ) hard_used hard_used from from performance_schema performance_schema. .global_status global_status join join information_schema information_schema. .innodb_metrics innodb_metrics where where variable_name variable_name like like 'innodb_redo_log_logical_size' 'innodb_redo_log_logical_size' and and name name like like 'log_max_modi ed_age_async' 'log_max_modi ed_age_async'; ; Copyright @ 2023 Oracle and/or its affiliates. 35
  32. When the appropriate InnoDB Metrics are enabled, it's also possible

    to get an overview of the Redo Log's usage and see where we are in relation to the soft and hard redo log logical capacity: select select concat concat( (variable_value variable_value, , " (" " (", , format_bytes format_bytes( (variable_value variable_value) ), ,")" ")") ) innodb_redo_log_logical_size innodb_redo_log_logical_size, , concat concat( (round round( (count count* *8 8/ /7 7) ), , " (" " (", , format_bytes format_bytes( (round round( (count count* *8 8/ /7 7) )) ), , ")" ")") ) soft_logical_capacity soft_logical_capacity, , concat concat( (round round( (@ @@innodb_redo_log_capacity @innodb_redo_log_capacity* *29.8 29.8/ /32 32) ), , " (" " (", , format_bytes format_bytes( (round round( (@ @@innodb_redo_log_capacity @innodb_redo_log_capacity* *29.8 29.8/ /32 32) )) ) , ,")" ")") ) hard_logical_capacity hard_logical_capacity, , concat concat( (@ @@innodb_redo_log_capacity @innodb_redo_log_capacity, , " (" " (", , format_bytes format_bytes( (@ @@innodb_redo_log_capacity @innodb_redo_log_capacity) ) , ,")" ")") ) redo_log_capacity redo_log_capacity, , concat concat( (round round( (variable_value variable_value / / ( (count count* *8 8/ /7 7) )* *100 100, ,2 2) ), , "%" "%") ) logical_used logical_used, , concat concat( (round round( (variable_value variable_value / / ( (@ @@innodb_redo_log_capacity @innodb_redo_log_capacity* *29.8 29.8/ /32 32) )* *100 100, ,2 2) ), , "%" "%") ) hard_used hard_used from from performance_schema performance_schema. .global_status global_status join join information_schema information_schema. .innodb_metrics innodb_metrics where where variable_name variable_name like like 'innodb_redo_log_logical_size' 'innodb_redo_log_logical_size' and and name name like like 'log_max_modi ed_age_async' 'log_max_modi ed_age_async'; ; Copyright @ 2023 Oracle and/or its affiliates. 35
  33. Recommendations It's not recommended to oversize the Redo Log Capacity.

    Redo Log les consume disk space and increases the recovery time in case of a restart (innodb_fast_shutdown=1) or a sudden crash. And it also slows down shutdown when innodb_fast_shutdown=0. Copyright @ 2023 Oracle and/or its affiliates. 37
  34. Recommendations (2) During peak tra c time, you can get

    an estimation of the required amount for the Redo Log Capacity by running the query below (all in one single line): select select VARIABLE_VALUE VARIABLE_VALUE from from performance_schema performance_schema. .global_status global_status where where VARIABLE_NAME VARIABLE_NAME= ='Innodb_redo_log_current_lsn' 'Innodb_redo_log_current_lsn' into into @a @a; ;select select sleep sleep( (60 60) ) into into @garb @garb ; ;select select VARIABLE_VALUE VARIABLE_VALUE from from performance_schema performance_schema. .global_status global_status where where VARIABLE_NAME VARIABLE_NAME= ='Innodb_redo_log_current_lsn' 'Innodb_redo_log_current_lsn' into into @b @b; ;select select format_bytes format_bytes( (abs abs( (@a @a - - @b @b) )) ) per_min per_min, , format_bytes format_bytes( (abs abs( (@a @a - - @b @b) )* *60 60) ) per_hour per_hour; ; Copyright @ 2023 Oracle and/or its affiliates. 38
  35. Recommendations (2) During peak tra c time, you can get

    an estimation of the required amount for the Redo Log Capacity by running the query below (all in one single line): select select VARIABLE_VALUE VARIABLE_VALUE from from performance_schema performance_schema. .global_status global_status where where VARIABLE_NAME VARIABLE_NAME= ='Innodb_redo_log_current_lsn' 'Innodb_redo_log_current_lsn' into into @a @a; ;select select sleep sleep( (60 60) ) into into @garb @garb ; ;select select VARIABLE_VALUE VARIABLE_VALUE from from performance_schema performance_schema. .global_status global_status where where VARIABLE_NAME VARIABLE_NAME= ='Innodb_redo_log_current_lsn' 'Innodb_redo_log_current_lsn' into into @b @b; ;select select format_bytes format_bytes( (abs abs( (@a @a - - @b @b) )) ) per_min per_min, , format_bytes format_bytes( (abs abs( (@a @a - - @b @b) )* *60 60) ) per_hour per_hour; ; + +-----------+----------+ -----------+----------+ | | per_min per_min | | per_hour per_hour | | + +-----------+----------+ -----------+----------+ | | 21.18 21.18 MiB MiB | | 1.24 1.24 GiB GiB | | + +-----------+----------+ -----------+----------+ Copyright @ 2023 Oracle and/or its affiliates. 38
  36. Share your ❤ to MySQL #mysql Join our slack channel!

    bit.ly/mysql-slack Copyright @ 2023 Oracle and/or its affiliates. 39