OpenGL ES 2.0 for Android教程(七):使用纹理添加细节

Redo 简介

关系型数据库系统中保证数据不丢失,WAL(Write-ahead logging)预写日志是常见的一种手段。其中Redo记录着事务里对数据的修改,通过日志文件保证数据的持久性。MySQL里事务日志或称Redo日志,Redo是InnoDB引擎特有的。

  • 保证crash-safe能力,发生崩溃也能完好的恢复事务中的数据;
  • redo log是记录在数据页上做了什么修改;
  • 循环写,所有redo file写满后覆盖重复使用;
  • 后台有线程自动刷新落盘,顺序写IO;

在MySQL当中Redo log通过

  • innodb_log_file_size和innodb_log_files_in_group参数进行调节,数据则存储在数据目录下ib_logfile0、ib_logfile1 ……ib_logfileN 文件当中。
  • 刷新到这些日志文件的缓存有innodb_log_buffer_size来控制。
  • innodb_flush_log_at_trx_commit变量控制如何将日志缓冲区的内容写入和刷新到磁盘。
  • innodb_flush_log_at_timeout变量控制日志刷新频率。

MySQL8.0版本迭代中,对Redo进行了升华,新的架构,新的功能。

Redo日志加密

MySQL 8.0.16版本 进化第一个就是使用innodb_redo_log_encrypt配置选项启用了Redo日志数据加密。默认情况下,Redo日志加密是禁用的。与表空间数据一样,Redo日志数据加密是在将数据写入磁盘时进行的,而解密是在从磁盘读取重做日志数据时进行的。一旦数据读入内存,它就处于未加密形式。使用表空间加密密钥对重做日志数据进行加密和解密。

启用innodb_redo_log_encrypt时,磁盘上存在的未加密Redo日志页面将保持未加密状态,新的Redo日志页面将以加密形式写入磁盘。同样,禁用innodb_redo_log_encrypt时,磁盘上存在的已加密Redo日志页面将保持加密状态,新的Redo日志页面将以未加密形式写入磁盘。

mysql> SET GLOBAL innodb_redo_log_encrypt=ON;
Query OK, 0 rows affected (0.00 sec)

前版本Redo日志加密元数据(包括表空间加密密钥)存储在第一个Redo日志文件(ib_logfile0)的头中。如果删除此文件,则Redo日志加密将被禁用。
从MySQL 8.0.30开始,Redo日志加密元数据,包括表空间加密密钥,存储在最近的检查点LSN的重做日志文件的头中

Redo Log Archiving

MySQL 8.0.17版本 进化第二个就是 Redo日志归档功能,主要是为了解决备份一致性的问题。当备份操作正在进行时,复制Redo日志记录的备份实用程序有时可能无法跟上Redo日志生成的速度,从而导致Redo日志记录由于被覆盖而丢失。

MySQL Enterprise Backup在备份MySQL服务器时使用Redo归档功能。相应的官方工具还没提供直接分析Redo归档文件的。Percona Xtrabackup目前也没有支持Redo归档的功能。

#innodb_redo_log_archive_dirs='label1:directory_path1[;label2:directory_path2;…]';
mysql> SET GLOBAL innodb_redo_log_archive_dirs='redo_archiving:/opt/data8.0/redo_archive/';
#启动
mysql> SELECT innodb_redo_log_archive_start('redo_archiving', '20220830');
+-------------------------------------------------------------+
| innodb_redo_log_archive_start('redo_archiving', '20220830') |
+-------------------------------------------------------------+
|                                                           0 |
+-------------------------------------------------------------+
#停止
mysql> SELECT innodb_redo_log_archive_stop();
+--------------------------------+
| innodb_redo_log_archive_stop() |
+--------------------------------+
| 0                              |
+--------------------------------+

错误:

  • 无权限,需要INNODB_REDO_LOG_ARCHIVE权限
    ERROR 1227 (42000): Access denied; you need (at least one of) the INNODB_REDO_LOG_ARCHIVE privilege(s) for this operation
mysql> GRANT INNODB_REDO_LOG_ARCHIVE  on  *.* to 'root'@'localhost' ;
Query OK, 0 rows affected (0.01 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
  • 不存在目录,目录必须事先创建好
    ERROR 3844 (HY000): Redo log archive directory ‘directory_path1’ does not exist or is not a directory
  • 设置访问访问,需要设置成 0700 权限模式
    ERROR 3846 (HY000): Redo log archive directory ‘directory_path1’ is accessible to all OS users

Disable redo log

MySQL 8.0.21版本 进化第三个就是,就是禁用Redo log功能。可以通过避免写入Redo和doublewrite缓冲来加快数据加载。一般初期大量灌入数据是采用。平时就不建议使用此功能,意外发生 或 服务停止可能会导致数据丢失和实例损坏。

#启用redo
mysql> ALTER INSTANCE ENABLE  INNODB REDO_LOG;
ERROR 1227 (42000): Access denied; you need (at least one of) the INNODB_REDO_LOG_ENABLE privilege(s) for this operation

#赋予权限
mysql> GRANT INNODB_REDO_LOG_ENABLE ON *.* to 'root'@'localhost';
mysql> ALTER INSTANCE ENABLE  INNODB REDO_LOG;

mysql> ALTER INSTANCE ENABLE  INNODB REDO_LOG;
Query OK, 0 rows affected (0.00 sec)

#查看
mysql> SHOW GLOBAL STATUS LIKE 'Innodb_redo_log_enabled';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Innodb_redo_log_enabled | ON    |
+-------------------------+-------+
1 row in set (0.00 sec)

#禁用
mysql> ALTER INSTANCE DISABLE INNODB REDO_LOG;
Query OK, 0 rows affected (0.00 sec)

Redo分解

MySQL 8.0.30版本 第四个进化就是Redo文件分解,替换了原有的模式。在高版本执行会报如下提示:

2022-08-19T10:12:23.732750+08:00 0 [Warning] [MY-013907]
 [InnoDB] Deprecated configuration parameters innodb_log_file_size and/or innodb_log_files_in_group have been used to compute innodb_redo_log_capacity=134217728. Please use innodb_redo_log_capacity instead.

从MySQL 8.0.30开始,innodb_redo_log_capacity系统变量控制Redo日志文件占用的磁盘空间。取代了innodb_log_files_in_group变量和innodb_log_file_size变量,并已经被弃用

可以在启动或运行时使用set GLOBAL语句在选项文件中设置此变量;例如,下面的语句将Redo日志容量设置为8GB:

#my.cnf
[mysqld]
innodb_redo_log_capacity = 8589934592

#sql命令行
mysql> SET GLOBAL innodb_redo_log_capacity = 8589934592;

设置的Redo空间是,生成文件并且已经占有的。在运行时设置时,配置更改将立即发生,但可能需要一段时间才能完全实现新的限制。负载高的系统,变更还是存在一定的风险:

  • 如Redo日志文件占用的空间小于指定的值:那么从缓冲池中将脏页刷新到表空间数据文件的速度就会降低,最终会增加重做日志文件占用的磁盘空间。
  • 如Redo日志文件占用的空间超过了指定的值:脏页页会更频繁地刷新,最终减少重做日志文件占用的磁盘空间。

innodb_log_group_home_dir定义了InnoDB日志文件的目录路径。可以使用这个选项将InnoDB重做日志文件放置在与InnoDB数据文件不同的物理存储位置,以避免潜在的I/O资源冲突;

#my.cnf
[mysqld]
innodb_log_group_home_dir = /opt/data8.0/redo

除非变量innodb_log_group_home_dir指定了不同的目录,否则Redo会放在data目录下的#innodb_redo目录下。InnoDB尝试总共维护32个重做日志文件,每个文件的大小等于1/32 * innodb_redo_log_capacity;
日志文件使用#ib_redoN命名约定,其中N是Redo日志文件号。备用Redo日志文件由_tmp后缀表示。

每个redo日志文件都与一个特定的LSN值范围相关联,START_LSN和END_LSN值:

mysql> SELECT FILE_ID,FILE_NAME,START_LSN, END_LSN, SIZE_IN_BYTES, IS_FULL, CONSUMER_LEVEL  FROM performance_schema.innodb_redo_log_files;
+---------+------------------------------------------+-------------+-------------+---------------+---------+----------------+
| FILE_ID | FILE_NAME                                | START_LSN   | END_LSN     | SIZE_IN_BYTES | IS_FULL | CONSUMER_LEVEL |
+---------+------------------------------------------+-------------+-------------+---------------+---------+----------------+
|       5 | /opt/data8.0/redo/#innodb_redo/#ib_redo5 | 83626653696 | 83630845952 |       4194304 |       0 |              0 |
+---------+------------------------------------------+-------------+-------------+---------------+---------+----------------+
1 row in set (0.00 sec)

当执行检查点时,InnoDB将检查点LSN存储在包含该LSN的文件头中。在恢复期间,检查所有Redo日志文件,并从最新的检查点LSN开始恢复。
提供了几个状态变量来对Redo日志进行监控和容量调整操作信息;

#大小调整状态(OK:无调整操作, Resizing down:正在进行调整) 
mysql> SHOW STATUS LIKE 'Innodb_redo_log_resize_status';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| Innodb_redo_log_resize_status | OK    |
+-------------------------------+-------+
1 row in set (0.00 sec)
#当前重做日志的容量限制
mysql> SHOW STATUS LIKE 'Innodb_redo_log_capacity_resized';
+----------------------------------+-----------+
| Variable_name                    | Value     |
+----------------------------------+-----------+
| Innodb_redo_log_capacity_resized | 134217728 |
+----------------------------------+-----------+
1 row in set (0.00 sec)

参数

参数方面废弃老的参数,提供了新的一些指标:

参数 版本 类型 说明
innodb_redo_log_encrypt 8.0.16 variable 重做日志数据的加密,与表空间数据一样,当重做日志数据写入磁盘时,重做日志数据进行加密,当重做日志数据从磁盘读取时,进行解密。
innodb_redo_log_archive_dirs 8.0.17 variable redo归档文件目录。
Innodb_redo_log_enabled 8.0.21 status Redo开启禁用。
innodb_redo_log_capacity 8.0.30 variable Redo设置的总大小。
Innodb_redo_log_read_only 8.0.30 status Redo是否只读,目前无设置方式。
Innodb_redo_log_uuid 8.0.30 status Redo UUID。
Innodb_redo_log_checkpoint_lsn 8.0.30 status Redo检查点LSN。
Innodb_redo_log_current_lsn 8.0.30 status Redo当前检查点LSN,当前LSN表示重做日志中最后写入的位置。
Innodb_redo_log_flushed_to_disk_lsn 8.0.30 status Redo刷新到磁盘LSN。
Innodb_redo_log_logical_size 8.0.30 status Redo正在使用的数据的LSN范围。
Innodb_redo_log_physical_size 8.0.30 status Redo磁盘上所有日志文件(不包括备用重做日志文件)当前消耗的磁盘空间。
Innodb_redo_log_capacity_resized 8.0.30 status Redo容量调整操作之后,所有日志文件的总容量。
Innodb_redo_log_resize_status 8.0.30 status Redo大小调整状态【OK,Resizing down】。

总结

Redo的多样化,可以让DBA更直观的理解Redo使用情况,排查Redo相关问题也提供了便利。但整体来说,Redo大小设置完之后尽量不建议变更。

  • 对于使用8.0.30版本新版本,需要先调整好参数。
  • 在线升级 需要谨慎,Redo体系变更,有可能未知的问题,先做好备份。
  • 目前percona的xtrabackup对Redo变化的软件还没放出来。8.0.30新版本需要结合情况使用。
  • Disable redo log功能建议没特殊情况,没必要使用。
  • Redo归档意义不大,因为存在binlog。如提供分析工具,提供了另一种恢复手段。

猜你喜欢

转载自blog.csdn.net/chong_lai/article/details/123781958
今日推荐