• Gauss数据库redo日志


    首先理解几个基本概念?

    1、脏页

    数据库中的脏页是指与磁盘不一致的内存页面。如果一个页面已经被修改但是还没有被写入磁盘,那么它就是脏页。当数据库需要将这些脏页写入磁盘时,会占用磁盘IO,脏页的存在时为了确保数据库的一致性和恢复能力。如果脏页已经持久化到磁盘上,那么系统可以安全的丢弃该页面并释放内存。

    2、归档和落盘

    将在线日志转换为归档日志的过程称之为归档,归档日志是在线日志的一个副本。redo日志根据自己的ASN归档序列号归档到归档日志,active和inactive的日志都会归档。落盘是指将数据保存到存储介质上,比如磁盘。可是理解为归档是将一份redo日志存在到一个大的文件夹中,归档是逻辑的,落盘是物理的。

    3、redo日志

    数据库的redo日志是一种用于回复数据的机制。当数据库执行事务时,它会将事务的操作记录到redo日志中,这些操作包括插入、更新和删除等。redo日志记录了这些操作的顺序和细节,一边在数据库崩溃或意外关闭时,可以使用redo日志来恢复数据。当数据库重新启动时,它会检查redo日志并将其中未完成的事务重新执行,以确保数据的一致性。如果redo中的事务嘟已经完成,则数据库可以跳过这个步骤。redo通常是在内存中维护的,因为它需要快速记录事务操作,然儿,为了保证数据的持久性,redo日志也会被写入磁盘。通常redo日志会被分成多个文件,以便在写入的时候可以轮转使用它们,从而提高性能。

    4、archive log

    归档日志是数据库管理系统中的一个重要概念,它是指将数据库中的事务日志文件(Transaction log)备份并存储到另一个位置,以便数据库在发生故障时可以使用这些归档日志来恢复数据库。归档日志的作用是保证数据库的完整性和可恢复性。当数据库发生故障时,可以使用归档日志恢复数据库到故障前的状态。归档日志还可用于数据备份和恢复,以及数据库性能分析和故障排除。

    redo日志的4中状态

    current: 当前正在从log buffer写入的redo日志文件

    active: 日志对应脏页未落盘的redo日志文件

    inactive: 志对应脏页已经落盘的redo日志文件

    unused:刚添加的redo日志文件

    可以通过DV_LOG_FILES视图查看

    SQL> select * from dv_log_files;

    SQL> des DV_LOG_FILES;

    redo日志各字段含义
    序号字段名字段定义字段说明
    3FILE_NAMEVARCHAR(256BYTE)日志文件名称
    4BYTESBINARY_BEGINT日志文件的大小
    5WRITE_POSBINARY_BEGINT日志写位置
    6FREE_SIZEBINARY_BEGINT日志剩余空间大小
    7RESET_IDBINARY_INTEGER日志的resetid号
    8ASNBINARY_INTEGER日志的归档序列号
    9BLOCK_SIZEBINARY_INTEGER日志每个block大小
    10CURRENT_POINTVARCHAR(128BYTE)当前日志落盘点
    11ARCH_POSBINARY_BEGINT日志的归档点

    redo日志的状态切换

    curent状态的redo日志写满后,就需要切换redo

    curent -> active: curent中的write_pos不断推移,current写满之后状态变为active, 下一个序号的redo变为current。

    active -> inactive: 处于active的日志文件需要等待脏页落盘后才会变成inactive;手动执行alter system checkpoint落盘后,可以看到active的redo变成inactive了。

    inactive -> current: 如果存在inactive的redo, 则current -> active之后,下一个redo inactive -> current。

    redo日志追尾

    redo日志切换时,会自动找到当前需要的下一个, 如果下一个redo处于active状态,无法立即切换,则称为redo日志追尾。

    一般原因:

    1. 业务量大/IO慢,脏页刷新不过来;
    2. 归档日志无法写入,导致active的redo无法归档落盘变成inactive, 阻塞current切换。

    增加和删除redo日志

    一般redo日志的个数在数据库安装的时候就创建好了。如果出现频繁的redo追尾,可以考虑增加redo日志。

    a、增加redo日志

    SQL> alter database add logfile('redologxxx' size 512M);

    b、删除redo日志。脏页还未落盘的redo日志(active的)删除不了

    SQL> alter database drop logfile('redologxxx');

    redo日志重演

    a、备机回访日志

    根据redo日志,把主机的所有操作,在备机上重新做一遍,保证主备机数据的一致性(build)。

    b、非一致性关机重启时,数据库做恢复,重演日志

    数据库非一致性关机时,脏页队列中可能存在未落盘的页面。再次重启时,通过重演日志,将发生的修改再重新做一遍,保证了数据库数据的一致性。

    c、备份集恢复数据库时,重演备份集的归档日志。

    归档日志清理

  • 相关阅读:
    举例解释大数定律、中心极限定理及其在机器学习中的应用
    uniPush实战操作详细教程步骤
    虚拟机安装openEuler系统
    网络 IO 演变过程
    每日五道java面试题之java基础篇(九)
    animate动画库的使用步骤
    FinalReference 如何使 GC 过程变得拖拖拉拉
    第五章 Docker 自定义镜像
    linux非root用户配置SSH免密登录
    Mysql两道英文上机练习
  • 原文地址:https://blog.csdn.net/wangchao2679/article/details/138872129