暂无图片
暂无图片
8
暂无图片
暂无图片
暂无图片

MySQL InnoDB Redo Log Archiving 归档功能

原创 CuiHulong 2024-11-14
1224

数据库处理机制中,Redo日志用于确保数据持久性与一致性,并且提高数据库恢复能力。在MySQL中Redo文件是循环使用的,当Redo日志填满时,会采取覆盖写入。当发生故障,需要用到Redo进行恢复时,因为缺失覆盖掉的Redo日志,无法恢复。如存在归档Redo日志,就可以通过归档Redo日志进行恢复。按照官方说明,归档Redo目前配合mysqlbackup(企业版备份工具)结合使用。备份操作期间,Redo写入时间比备份时间大时,Redo日志归档功能将启动后台线将Redo日志记录顺序写入归档文件中,来解决此备份失败问题。

Redo归档设置

启用Redo日志归档需要为innodb_redo_log_archive_dirs参数设置值。

1.设置和查看方式

#my.cnf配置: innodb_redo_log_archive_dirs=arch1:/redo_archive/arch1;arch2:/redo_archive/arch2 #命令行设置: SET GLOBAL innodb_redo_log_archive_dirs=arch1:/redo_archive/arch1;arch2:/redo_archive/arch2 #查看设置: mysql > show variables like '%redo%'; +------------------------------+--------------------------------------------+ | Variable_name | Value | +------------------------------+--------------------------------------------+ | innodb_redo_log_archive_dirs | arch1:/redo_archive/arch1; arch2:/redo_archive/arch2 | | innodb_redo_log_capacity | 104857600 | | innodb_redo_log_encrypt | OFF | +------------------------------+--------------------------------------------+ 3 rows in set (0.0047 sec)

2.Redo归档设置和使用当中注意事项.

  • 目录必须存在:
ERROR 3846 (HY000): Redo log archive directory 'redo_archive' is accessible to all OS users
  • 目录不能所有访问:
ERROR 3846 (HY000): Redo log archive directory '/redo_archive/arch1' is accessible to all OS users

- 文件目录权限必须需要700,权限设置如下:
```language
chmod 700 /redo_archiv/arch1  /redo_archiv/arch2
  • 目录不能是由datadir,innodb_data_home_dir等,也不能是这些目录的父目录或子目录:
ERROR 3845 (HY000): Redo log archive directory 'directory_path1' is in, under, or over server directory 'datadir' - '/path/to/data_directory'
  • mysqlbackup备份时,无法使用root账号:
 WARNING: MySQL query 'DO innodb_redo_log_archive_start('arch1','20241113');': 3847, Cannot create redo log archive file '/redo_archive/arch1/17313911639993745/archive.442f4c85-9825-11ef-8da0-00163e23e2cc.000001.log' (OS errno: 13 - Permission denied)

3.对于归档Redo日志监控。

可以通过采集器配置项进行查看。默认是打开的。

  • 归档Redo配置项如下所示:
mysql> SELECT NAME,ENABLED,TIMED,PROPERTIES FROM performance_schema.setup_instruments where name like '%redo%'; +------------------------------------------------+---------+-------+------------+ | NAME | ENABLED | TIMED | PROPERTIES | +------------------------------------------------+---------+-------+------------+ | wait/io/file/innodb/meb::redo_log_archive_file | YES | YES | | | stage/innodb/clone (redo copy) | YES | YES | progress | +------------------------------------------------+---------+-------+------------+
  • 是否运行Redo归档,可通过系统threads表进行查看:
mysql> SELECT thread_id, name, type FROM performance_schema.threads WHERE name like '%redo_log_archive%'; +-----------+-----------------------------------------------------+------------+ | thread_id | name | type | +-----------+-----------------------------------------------------+------------+ | 59 | thread/innodb/meb::redo_log_archive_consumer_thread | BACKGROUND | +-----------+-----------------------------------------------------+------------+ 1 row in set (0.00 sec)
  • Redo归档日志内容file_instances表进行查看:
mysql> SELECT * FROM performance_schema.file_instances WHERE event_name like '%::redo_log_archive_file'\G *************************** 1. row *************************** FILE_NAME: /redo_archive/arch1/17313914361335647/archive.442f4c85-9825-11ef-8da0-00163e23e2cc.000001.log EVENT_NAME: wait/io/file/innodb/meb::redo_log_archive_file OPEN_COUNT: 1 *************************** 2. row *************************** FILE_NAME: /redo_archive/arch1/17313915135239748/archive.442f4c85-9825-11ef-8da0-00163e23e2cc.000001.log EVENT_NAME: wait/io/file/innodb/meb::redo_log_archive_file OPEN_COUNT: 1 2 rows in set (0.00 sec)

按照mysqlbackup 验证Redo功能验证

通过mysqlbakcup和general日志查看具体执行的命令:

shell> mysqlbackup --defaults-file=/etc/my9.0.cnf  -uroot -p******
 --backup-dir=/opt/backup1/backup-tmp backup  --number-of-buffers=100M

mysqlbackup默认检查Redo情况,是否开始,大小,创建归档日志:
image.png

general日志启动归档Redo日志:
image.png

手动归档

1.手动创建Redo归档根目录:

[mysql@arch1]$ mkdir -p 20241113
drwxrwxr-x 2 mysql mysql 6 Nov 13 14:07 20241113

2.手动赋予权限720

[mysql@arch1]$ chmod 720 20241113/
[mysql@arch1]$ ll
total 0
drwx-w---- 2 mysql mysql 6 Nov 13 14:07 20241113

3.启动归档Redo

通过调用innodb_redo_log_archive_start()函数激活重做日志归档。传递’label’名和子目录名需要跟上面【20241113】对齐:

mysql> SELECT innodb_redo_log_archive_start('arch1','20241113'); +---------------------------------------------------+ | innodb_redo_log_archive_start('arch1','20241113') | +---------------------------------------------------+ | 0 | +---------------------------------------------------+ 1 row in set (0.05 sec)

验证Redo归档是否生效:
执行操作目前设置redo大小的大事务。查看归档Redo生成的文件。大小在变化。

shell$ ll
total 4
-r--r----- 1 mysql mysql 4096 Nov 13 14:12 archive.442f4c85-9825-11ef-8da0-00163e23e2cc.000001.log
shell$ ll
total 20
-r--r----- 1 mysql mysql 20480 Nov 13 14:17 archive.442f4c85-9825-11ef-8da0-00163e23e2cc.000001.log
shell$ ll
total 16384
-r--r----- 1 mysql mysql 11014144 Nov 13 14:17 archive.442f4c85-9825-11ef-8da0-00163e23e2cc.000001.log
shell$ ll
total 16384
-r--r----- 1 mysql mysql 11018240 Nov 13 14:18 archive.442f4c85-9825-11ef-8da0-00163e23e2cc.000001.log
。。。

通过Linux ps线程显示,归档Redo采取后台使用ib_meb_rl线程

[root@schouse bin]# ps -Lp 1875075 -o tid,cmd,comm
    TID CMD                         COMMAND

。。。
1899304 /opt/idc/mysql9.0/bin/mysql ib_meb_rl

3.停止归档Redo
通过调用InnoDB_redo_log_archive_stop()函数来停用重做日志归档。

mysql> SELECT innodb_redo_log_archive_stop(); +--------------------------------+ | innodb_redo_log_archive_stop() | +--------------------------------+ | 0 | +--------------------------------+

之后就可以利用归档Redo做数据恢复之用。不过,相应的官方接口或工具还没开放出来。只能拭目以待。

总结

归档Redo功能是MySQL 8.0.17版本发布的,最新版本目前已经到8.0.40,9.1版本, 因为没有对外开放归档文件使用功能,无法在实际环境中使用。
归档Redo功能是创建新文件顺序写入,因此整体影响很小。目前只有MySQL企业版备份工具具备归档Redo的支持。希望官方开放出使用归档Redo的接口,也希望Percona Xtrabackup支持,这样MySQL又多了一个数据恢复的手段。

最后修改时间:2024-11-15 10:15:10
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论