新特性解读 | MySQL 8.0 REDO 归档目录权限问题

作者:杨涛涛

资深数据库专家,专研 MySQL 十余年。擅长 MySQL、PostgreSQL、MongoDB 等开源数据库相关的备份恢复、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相关技术支持、MySQL 相关课程培训等工作。

本文来源:原创投稿

  • 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

    特分享出来最近在整理 MySQL 热备工具的实验题目时遇到的 REDO 日志归档问题!

    MySQL 的 REDO 日志归档功能在 8.0.17 版本后发布,目的是为了解决使用 MySQL 热备工具比如 mysqlbackup 、xtrabackup 等备份 REDO 日志的速度慢于业务生成 REDO 日志的速度而导致的备份数据不一致问题(未及时备份的 RRDO 日志被提前覆盖写入!)。

    MySQL 的 REDO 日志归档功能开启非常简单,只需对参数 innodb_redo_log_archive_dirs 简单设置即可。

    set persist innodb_redo_log_archive_dirs='redo_archive1:/redo_mysql/3306'<br>

    其中 redo_archive1 是一个标签,可以随便起名字;/redo_mysql/3306 用来指定 REDO 日志归档存放的位置。

    我在使用的过程中,遇到几个细节问题:

    1. REDO 日志归档的目录权限、属主等一定要设置正确,要不然可能会有以下几种错误输出 (MySQL 客户端提示错误,热备工具可能提示警告!):
    错误1:ERROR 3844 (HY000): Redo log archive directory '/redo_mysql/3306' does not exist or is not a directory

    前期需要创建的目录与相关权限设定如下:

    # 归档目录得提前建!<br>[root@ytt-pc ~]# mkdir -p /redo_mysql/3306<br>   <br># 设置归档目录访问权限,只允许属主完全访问。<br>[root@ytt-pc ~]# chmod -R 700 /redo_mysql/3306/<br>

    接下来使用 MySQL 管理员用户或者具有 system_variables_admin 权限的用户来在线设置此参数:

    # 设置变量<br><mysql:8.0.32:(none)>set persist innodb_redo_log_archive_dirs='redo_archive1:/redo_mysql/3306';<br>Query OK, 0 rows affected (0.01 sec)<br>   <br># 查看变量<br><mysql:8.0.32:(none)>show variables like 'innodb_redo_log_archive_dirs';<br>+------------------------------+--------------------------------+<br>| Variable_name                | Value                       |<br>+------------------------------+--------------------------------+<br>| innodb_redo_log_archive_dirs | redo_archive1:/redo_mysql/3306 |<br>+------------------------------+--------------------------------+<br>1 row in set (0.00 sec)<br>

    使用 mysqlbackup 来发起一个备份:

    [root@ytt-pc /]# mysqlbackup --defaults-file=/etc/my.cnf --defaults-group-suffix=@3306 --login-path=backup_pass2 --backup-dir=/tmp/full --show-progress backup<br>   <br>#备份完成后,有一个警告:<br>mysqlbackup completed OK! with 1 warnings<br>   <br>#往前翻此警告: 这里是详细内容!<br>230329 13:43:48 MAIN  WARNING: MySQL query 'DO innodb_redo_log_archive_start('redo_archive1','16800686281315958');': 3844, Redo log archive directory '/redo_mysql/3306/16800686281315958' does not exist or is not a directory<br>   <br>

    错误1是由于访问归档目录的属主不具备写权限,修复错误1:确认运行 MySQL 实例的 OS 用户为 ytt 。

    [root@ytt-pc 3306]# ps aux | grep mysqld<br>ytt       4625  1.0  4.5 1800264 373112 ?      Ssl  12:47   0:00 /usr/sbin/mysqld --defaults-group-suffix=@3306<br>   <br>

    给 /redo_mysql/3306 设置属于 OS 用户 ytt 的权限:错误1被修复。

    [root@ytt-pc /]# chown -R ytt.ytt /redo_mysql<br>

    此时使用 mysqlbackup 重新发起一个热备,会产生一个新的错误代码, 我们把它命名为错误2。

    错误2:其实是一个警告!根据错误代码内容,提示为无权限操作此目录(OS errno: 13 - Permission denied)。
    230329 13:48:10 MAIN  WARNING: MySQL query 'DO innodb_redo_log_archive_start('redo_archive1','16800688906187002');': 3847, Cannot create redo log archive file '/redo_mysql/3306/16800688906187002/archive.01132dcf-cde1-11ed-971f-0800272d8a05.000001.log' (OS errno: 13 - Permission denied)<br>   <br>

    问题产生的原因是调用 mysqlbackup 的 OS 用户不具备归档日志目录的写权限,必须使用对应的 OS 用户来调用 mysqlbackup 。

    以下是解决方法和主动验证步骤。

    # 解决方法:需要切换到此目录OS属主用户:<br>   <br>[root@ytt-pc tmp]# su ytt<br>[ytt@ytt-pc tmp]$ mysqlbackup --defaults-file=/etc/my.cnf --defaults-group-suffix=@3306 --login-path=backup_pass2 --backup-dir=/tmp/full  backup<br>   <br># 备份完成,无报错:<br>   <br>mysqlbackup completed OK!<br>   <br># 摘取其中归档日志的信息如下:<br>   <br>230329 14:46:00 MAIN     INFO: Creating monitor for redo archive.<br>230329 14:46:00 MAIN     INFO: Started redo log archiving.<br>   <br>   <br>   <br># 对应的MySQL 日志内容为:mysqlbackup 备份过程中调用系统函数innodb_redo_log_archive_start来激活 REDO 日志归档,调用系统函数innodb_redo_log_archive_stop来关闭 REDO 日志归档。 这里do是MySQL一个特有的语法,只执行不输出,有点类似其他数据库的perform语句。<br>   <br>2023-03-29T06:46:00.553205Z        47 Query     SELECT @@GLOBAL.innodb_redo_log_archive_dirs<br>2023-03-29T06:46:00.553389Z        47 Query     DO innodb_redo_log_archive_start('redo_archive1','16800723605224011')<br>..<br>   <br>2023-03-29T06:46:03.895591Z        47 Query     DO innodb_redo_log_archive_stop()<br>
    2. 用于 REDO 日志归档的 MySQL 用户必须有 innodb_redo_log_archive 权限。
    <mysql:8.0.32:(none)>show grants for backup_user2G<br>...<br>*************************** 2. row ***************************<br>Grants for backup_user2@%: GRANT BACKUP_ADMIN,ENCRYPTION_KEY_ADMIN,INNODB_REDO_LOG_ARCHIVE,SYSTEM_VARIABLES_ADMIN ON *.* TO `backup_user2`@`%`<br>...<br>5 rows in set (0.00 sec)<br>
    3. REDO 日志归档功能除了使用热备工具来调用外,也可以直接在 MySQL 客户端来调用。
    [ytt@ytt-pc ~]$ mysql --login-path=backup_pass2<br>Welcome to the MySQL monitor.  Commands end with ; or g.<br>Your MySQL connection id is 41<br>Server version: 8.0.32 MySQL Community Server - GPL<br>   <br>...<br>   <br>Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.<br>   <br><mysql:8.0.32:(none)>DO innodb_redo_log_archive_start('redo_archive1','20230329');<br>Query OK, 0 rows affected (0.02 sec)<br>

    对应的归档日志:

    [ytt@ytt-pc 20230329]$ pwd<br>/redo_mysql/3306/20230329<br>[ytt@ytt-pc 20230329]$ du -sh archive.01132dcf-cde1-11ed-971f-0800272d8a05.000001.log <br>4.0K archive.01132dcf-cde1-11ed-971f-0800272d8a05.000001.log<br>

    期间造点数据,可以看到归档日志的大小变化:由4K增长到128M

    [ytt@ytt-pc 20230329]$ du -sh archive.01132dcf-cde1-11ed-971f-0800272d8a05.000001.log <br>128M archive.01132dcf-cde1-11ed-971f-0800272d8a05.000001.log<br>
    4. 激活 REDO 日志归档的会话要保持打开,关闭会话则 REDO 日志不再归档!
    5. REDO 日志归档的目录不能属于 MySQL 实例已经确认的目录,比如 datadir,innodb_directories 等等。

    本文关键字: #REDO 日志归档# #MySQL REDO 日志#

          <h5 data-tool="mdnice编辑器"></h5> 
    
          <p>文章推荐:</p> 
          <p>技术分享 | OceanBase 使用全局索引的必要性</p> 
          <p>一款功能全面的 MySQL Shell 插件</p> 
          <p>使用 SQL 语句来简化 show engine innodb status 的结果解读</p> 
    
           关于SQLE 
    
          <p style='margin: 10px 0px 0px;padding: 0px;clear: both;min-height: 1em;font-style: normal;font-weight: 400;text-indent: 0px;text-transform: none;max-width: 100%;letter-spacing: 0.544px;text-align: left;font-size: 16px;font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif'>爱可生开源社区的 SQLE 是一款面向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。</p> 
    
             SQLE 获取 
    
               <table> 
    
                 <tr> 
                  <th>类型</th> 
                  <th>地址</th> 
                 </tr> 
    
                <tbody> 
                 <tr> 
                  <td>版本库</td> 
                  <td>https://github.com/actiontech/sqle</td> 
                 </tr> 
                 <tr> 
                  <td>文档</td> 
                  <td>https://actiontech.github.io/sqle-docs-cn/</td> 
                 </tr> 
                 <tr> 
                  <td>发布信息</td> 
                  <td>https://github.com/actiontech/sqle/releases</td> 
                 </tr> 
                 <tr> 
                  <td>数据审核插件开发文档</td> 
                  <td>https://actiontech.github.io/sqle-docs-cn/3.modules/3.7_auditplugin/auditplugin_development.html</td> 
                 </tr> 
                </tbody> 
               </table> 
    
           <p style='margin: 20px 0px;padding: 0px;clear: both;min-height: 1em;max-width: 100%;font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 15px;letter-spacing: 0.544px;text-align: left'>提交有效pr,高质量issue,将获赠面值200-500元(具体面额依据质量而定)京东卡以及爱可生开源社区精美周边!</p> 
           <p style='margin: 20px 0px;padding: 0px;clear: both;min-height: 1em;max-width: 100%;font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 15px;letter-spacing: 0.544px;text-align: left'>更多关于 SQLE 的信息和交流,请加入官方QQ交流群:637150065...</p> 
    
             <img src="https://img.mryunwei.com/uploads/2023/10/20231013081157724.png"> 

本文分享自微信公众号 - 爱可生开源社区(ActiontechOSS)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。