Skip to content

OceanBase 日志系统

日志系统是 OceanBase 数据库的核心组件之一,负责记录数据库的所有修改操作,确保数据的一致性和可靠性。OceanBase 日志系统包括 Redo 日志、Undo 日志和归档日志三个主要部分。

Redo 日志

Redo 日志是 OceanBase 数据库的事务日志,用于记录数据库的所有修改操作,确保事务的持久性和一致性。Redo 日志采用预写式日志(WAL, Write-Ahead Logging)机制,即在修改数据之前先写入 Redo 日志。

Redo 日志特性

  • 预写式日志:修改数据之前先写入 Redo 日志
  • 循环写入:Redo 日志文件满后循环覆盖写入
  • 多副本同步:Redo 日志通过 Paxos 协议在多个副本之间同步
  • 支持增量备份:Redo 日志支持增量备份和 PITR(Point-In-Time Recovery)

Redo 日志配置

日志文件配置

sql
-- 查看 Redo 日志配置
SHOW PARAMETERS LIKE 'redo%';

-- 配置 Redo 日志文件大小
ALTER SYSTEM SET redo_log_file_size = '64M';

-- 配置 Redo 日志文件数量
ALTER SYSTEM SET redo_log_file_count = 10;

-- 配置 Redo 日志刷新策略
ALTER SYSTEM SET redo_buffer_flush_trigger_when_redo_log_file_used_percentage = 80;
ALTER SYSTEM SET redo_buffer_flush_trigger_timeout = 1000;

日志级别配置

sql
-- 配置 Redo 日志级别
ALTER SYSTEM SET syslog_level = 'INFO';
ALTER SYSTEM SET enable_syslog_wf = TRUE;

Redo 日志管理

查看 Redo 日志状态

sql
-- 查看 Redo 日志状态
SELECT * FROM oceanbase.GV$OB_REDO_STAT;

-- 查看 Redo 日志文件信息
SELECT * FROM oceanbase.GV$OB_REDO_FILES;

-- 查看 Redo 日志同步状态
SELECT * FROM oceanbase.GV$OB_PAXOS_STAT;

监控 Redo 日志性能

sql
-- 查看 Redo 日志写入性能
SELECT * FROM oceanbase.GV$OB_REDO_WRITE_STAT;

-- 查看 Redo 日志同步延迟
SELECT * FROM oceanbase.GV$OB_LOG_SYNC_STAT;

Redo 日志最佳实践

  • 合理设置 Redo 日志大小:建议 Redo 日志文件大小为 64M-256M
  • 配置适当的日志文件数量:建议每个日志流配置 10-20 个日志文件
  • 优化 Redo 日志刷新策略:根据业务需求调整刷新触发条件
  • 监控 Redo 日志同步延迟:确保 Redo 日志在多个副本之间及时同步
  • 定期备份 Redo 日志:确保能够进行 PITR 恢复

Undo 日志

Undo 日志是 OceanBase 数据库的回滚日志,用于记录数据修改前的旧值,支持事务回滚和 MVCC(Multi-Version Concurrency Control)。

Undo 日志特性

  • 支持事务回滚:当事务失败或回滚时,使用 Undo 日志恢复数据
  • 支持 MVCC:通过 Undo 日志实现多版本并发控制
  • 自动回收:Undo 日志在事务提交后自动回收
  • 分区存储:Undo 日志与数据分区存储在一起,提高访问性能

Undo 日志配置

存储空间配置

sql
-- 查看 Undo 日志配置
SHOW PARAMETERS LIKE 'undo%';

-- 配置 Undo 表空间大小
ALTER SYSTEM SET undo_table_space_size = '10G';

-- 配置 Undo 日志保留时间
ALTER SYSTEM SET undo_retention = 3600;

-- 配置 Undo 日志回收阈值
ALTER SYSTEM SET undo_table_space_recycle_watermark = 80;
ALTER SYSTEM SET undo_table_space_truncate_watermark = 50;

性能配置

sql
-- 配置 Undo 日志并行回收
ALTER SYSTEM SET enable_undo_parallel_recycle = TRUE;
ALTER SYSTEM SET undo_recycle_thread_count = 8;

-- 配置 Undo 日志回收间隔
ALTER SYSTEM SET undo_recycle_interval = 60;

Undo 日志管理

查看 Undo 日志状态

sql
-- 查看 Undo 表空间使用情况
SELECT * FROM oceanbase.GV$OB_UNDO_STAT;

-- 查看 Undo 日志回收状态
SELECT * FROM oceanbase.GV$OB_UNDO_RECYCLE_STAT;

-- 查看 Undo 日志使用明细
SELECT * FROM oceanbase.GV$OB_UNDO_USAGE_DETAIL;

监控 Undo 日志性能

sql
-- 查看 Undo 日志读写性能
SELECT * FROM oceanbase.GV$OB_UNDO_IO_STAT;

-- 查看 Undo 日志回收性能
SELECT * FROM oceanbase.GV$OB_UNDO_RECYCLE_PERF_STAT;

Undo 日志最佳实践

  • 合理设置 Undo 表空间大小:根据业务量调整 Undo 表空间大小
  • 配置适当的 Undo 保留时间:根据 MVCC 需求设置 Undo 保留时间
  • 启用并行回收:提高 Undo 日志回收效率
  • 监控 Undo 表空间使用率:避免 Undo 表空间不足
  • 定期检查 Undo 日志回收状态:确保 Undo 日志能够及时回收

归档日志

归档日志是 Redo 日志的持久化存储,用于数据备份和恢复。归档日志采用异步归档方式,将 Redo 日志复制到归档目录或远程存储。

归档日志特性

  • 异步归档:Redo 日志写入后异步归档,不影响事务性能
  • 多副本归档:支持将归档日志存储到多个位置,提高可靠性
  • 支持远程归档:支持将归档日志存储到远程服务器或对象存储
  • 支持压缩加密:支持归档日志的压缩和加密

归档日志配置

本地归档配置

sql
-- 查看归档配置
SHOW PARAMETERS LIKE 'archive%';

-- 启用归档日志
ALTER SYSTEM SET enable_archive_log = TRUE;

-- 配置归档目录
ALTER SYSTEM SET archive_dir = '/data/ob/archive';

-- 配置归档日志保留时间
ALTER SYSTEM SET archive_retention_days = 7;

远程归档配置

sql
-- 配置远程归档
ALTER SYSTEM SET archive_dest = 'remote://backup_server:/backup/ob/archive';
ALTER SYSTEM SET archive_dest_2 = 'oss://backup-bucket/ob/archive';

-- 配置远程归档参数
ALTER SYSTEM SET archive_oss_endpoint = 'oss-cn-hangzhou.aliyuncs.com';
ALTER SYSTEM SET archive_oss_access_key_id = 'your_access_key_id';
ALTER SYSTEM SET archive_oss_access_key_secret = 'your_access_key_secret';
ALTER SYSTEM SET archive_oss_bucket = 'backup-bucket';

归档策略配置

sql
-- 配置归档日志压缩
ALTER SYSTEM SET archive_compress = TRUE;

-- 配置归档日志加密
ALTER SYSTEM SET archive_encrypt = TRUE;
ALTER SYSTEM SET archive_encrypt_key = 'your_encrypt_key';

-- 配置归档日志格式
ALTER SYSTEM SET archive_format = '%Y%m%d_%H%i%s_%t_%f';

归档日志管理

查看归档状态

sql
-- 查看归档状态
SELECT * FROM oceanbase.GV$OB_ARCHIVE_STATUS;

-- 查看归档日志列表
SELECT * FROM oceanbase.GV$OB_ARCHIVE_LOG;

-- 查看归档统计信息
SELECT * FROM oceanbase.GV$OB_ARCHIVE_STAT;

监控归档性能

sql
-- 查看归档写入性能
SELECT * FROM oceanbase.GV$OB_ARCHIVE_WRITE_STAT;

-- 查看归档延迟
SELECT * FROM oceanbase.GV$OB_ARCHIVE_DELAY_STAT;

手动归档

sql
-- 手动触发归档
ALTER SYSTEM ARCHIVE LOG CURRENT;

-- 手动归档指定日志
ALTER SYSTEM ARCHIVE LOG FROM sequence_no;

归档日志最佳实践

  • 启用归档日志:生产环境必须启用归档日志
  • 配置多副本归档:将归档日志存储到多个位置,提高可靠性
  • 配置适当的保留时间:根据备份策略设置归档日志保留时间
  • 启用压缩和加密:减少归档日志占用空间,提高安全性
  • 监控归档延迟:确保归档日志及时归档,避免影响数据库性能
  • 定期验证归档日志完整性:确保归档日志可以用于恢复

日志监控与管理

日志监控与管理是确保 OceanBase 数据库日志系统正常运行的重要手段,通过监控日志状态和性能,可以及时发现并处理日志系统的问题。

日志监控

监控 Redo 日志

sql
-- 监控 Redo 日志写入速率
SELECT * FROM oceanbase.GV$OB_REDO_WRITE_RATE;

-- 监控 Redo 日志同步状态
SELECT * FROM oceanbase.GV$OB_PAXOS_SYNC_STATUS;

-- 监控 Redo 日志缓冲区使用率
SELECT * FROM oceanbase.GV$OB_REDO_BUFFER_STAT;

监控 Undo 日志

sql
-- 监控 Undo 表空间使用率
SELECT * FROM oceanbase.GV$OB_UNDO_TABLESPACE_USAGE;

-- 监控 Undo 日志回收效率
SELECT * FROM oceanbase.GV$OB_UNDO_RECYCLE_EFFICIENCY;

-- 监控 Undo 日志生成速率
SELECT * FROM oceanbase.GV$OB_UNDO_GENERATE_RATE;

监控归档日志

sql
-- 监控归档日志生成速率
SELECT * FROM oceanbase.GV$OB_ARCHIVE_GENERATE_RATE;

-- 监控归档日志传输速率
SELECT * FROM oceanbase.GV$OB_ARCHIVE_TRANSFER_RATE;

-- 监控归档日志应用速率
SELECT * FROM oceanbase.GV$OB_ARCHIVE_APPLY_RATE;

日志管理工具

OCP 日志管理

  • 日志查看:通过 OCP 控制台查看 OceanBase 数据库的各种日志
  • 日志下载:通过 OCP 控制台下载 OceanBase 数据库的日志文件
  • 日志搜索:通过 OCP 控制台搜索 OceanBase 数据库的日志内容
  • 日志清理:通过 OCP 控制台清理过期的日志文件

命令行日志管理

bash
# 查看 OceanBase 日志目录
ls -la /home/oceanbase/log/

# 查看 Redo 日志文件
ls -la /data/ob/redo/

# 查看归档日志文件
ls -la /data/ob/archive/

# 查看日志内容
tail -f /home/oceanbase/log/observer.log
grep -i "error" /home/oceanbase/log/observer.log
grep -i "warning" /home/oceanbase/log/observer.log

日志分析

错误日志分析

bash
# 分析错误日志
cd /home/oceanbase/log
# 统计错误类型
grep -i "error" observer.log | awk '{print $5}' | sort | uniq -c | sort -nr

# 查看最近的错误
grep -i "error" observer.log | tail -n 100

# 查看特定时间范围内的错误
grep -i "2023-10-01 14:00:00" observer.log | grep -i "error"

慢查询日志分析

sql
-- 查看慢查询日志
SELECT * FROM oceanbase.GV$OB_SLOW_QUERY;

-- 分析慢查询
SELECT query_sql, count(*) as cnt, avg(execute_time) as avg_time
FROM oceanbase.GV$OB_SLOW_QUERY
GROUP BY query_sql
ORDER BY avg_time DESC
LIMIT 10;

日志系统故障处理

日志系统故障会影响 OceanBase 数据库的性能和可靠性,需要及时处理。常见的日志系统故障包括 Redo 日志写入失败、Undo 表空间不足和归档日志失败等。

Redo 日志写入失败

症状

  • 事务提交延迟增加
  • 错误日志中出现 "Redo write failed" 或 "Failed to write redo" 等错误
  • 数据库性能下降

解决方案

  1. 检查存储设备

    bash
    df -h /data/ob/redo
    iostat -x -k 1
  2. 检查 Redo 日志配置

    sql
    SHOW PARAMETERS LIKE 'redo%';
  3. 检查 Redo 日志状态

    sql
    SELECT * FROM oceanbase.GV$OB_REDO_STAT;
  4. 调整 Redo 日志配置

    sql
    ALTER SYSTEM SET redo_log_file_size = '128M';
    ALTER SYSTEM SET redo_log_file_count = 20;

Undo 表空间不足

症状

  • 错误日志中出现 "Undo table space is full" 或 "Failed to allocate undo" 等错误
  • 事务无法提交
  • 数据库性能下降

解决方案

  1. 检查 Undo 表空间使用率

    sql
    SELECT * FROM oceanbase.GV$OB_UNDO_TABLESPACE_USAGE;
  2. 调整 Undo 表空间大小

    sql
    ALTER SYSTEM SET undo_table_space_size = '20G';
  3. 调整 Undo 保留时间

    sql
    ALTER SYSTEM SET undo_retention = 1800;
  4. 手动触发 Undo 回收

    sql
    ALTER SYSTEM TRUNCATE UNDO TABLESPACE;

归档日志失败

症状

  • 错误日志中出现 "Archive log failed" 或 "Failed to archive log" 等错误
  • 归档日志状态为 ERROR
  • 数据库性能下降

解决方案

  1. 检查归档目录

    bash
    df -h /data/ob/archive
    ls -la /data/ob/archive
  2. 检查归档配置

    sql
    SHOW PARAMETERS LIKE 'archive%';
  3. 检查归档状态

    sql
    SELECT * FROM oceanbase.GV$OB_ARCHIVE_STATUS;
  4. 手动触发归档

    sql
    ALTER SYSTEM ARCHIVE LOG CURRENT;
  5. 调整归档配置

    sql
    ALTER SYSTEM SET archive_retention_days = 3;

日志系统最佳实践

日志配置优化

  • 合理设置日志级别:生产环境建议使用 INFO 级别,开发测试环境可以使用 DEBUG 级别
  • 配置适当的日志文件大小:根据业务量调整日志文件大小,避免频繁切换日志文件
  • 启用日志压缩:减少日志文件占用空间
  • 配置适当的日志保留时间:根据备份策略和审计需求设置日志保留时间

日志性能优化

  • 使用高性能存储:Redo 日志和归档日志建议使用 SSD 存储
  • 优化日志写入策略:调整 Redo 日志的刷新策略,平衡性能和可靠性
  • 启用并行 Undo 回收:提高 Undo 日志回收效率
  • 监控日志写入延迟:及时发现并处理日志写入延迟问题

日志可靠性保障

  • 启用归档日志:生产环境必须启用归档日志
  • 配置多副本归档:将归档日志存储到多个位置,提高可靠性
  • 定期备份归档日志:将归档日志备份到远程存储,防止本地存储故障
  • 定期验证归档日志完整性:确保归档日志可以用于恢复

日志安全管理

  • 配置日志加密:保护敏感数据不被泄露
  • 限制日志访问权限:只有授权人员可以访问日志文件
  • 定期清理过期日志:避免日志文件占用过多空间
  • 监控日志访问:防止未授权访问日志文件

日志系统案例

案例一:Redo 日志写入延迟

场景:OceanBase 数据库的 Redo 日志写入延迟增加,影响事务性能

诊断步骤

  1. 查看 Redo 日志写入性能:SELECT * FROM oceanbase.GV$OB_REDO_WRITE_STAT;
  2. 查看存储设备性能:iostat -x -k 1
  3. 查看 Redo 日志配置:SHOW PARAMETERS LIKE 'redo%';
  4. 查看错误日志:grep -i "redo" /home/oceanbase/log/observer.log

解决方案

  1. 优化存储设备:将 Redo 日志迁移到 NVMe SSD
  2. 调整 Redo 日志配置:ALTER SYSTEM SET redo_log_file_size = '128M'; ALTER SYSTEM SET redo_log_file_count = 20;
  3. 优化 Redo 日志刷新策略:ALTER SYSTEM SET redo_buffer_flush_trigger_when_redo_log_file_used_percentage = 70;

结果:Redo 日志写入延迟从 10ms 降低到 1ms,事务性能提高 50%

案例二:Undo 表空间不足

场景:OceanBase 数据库的 Undo 表空间使用率达到 90%,影响事务提交

诊断步骤

  1. 查看 Undo 表空间使用率:SELECT * FROM oceanbase.GV$OB_UNDO_TABLESPACE_USAGE;
  2. 查看 Undo 日志生成速率:SELECT * FROM oceanbase.GV$OB_UNDO_GENERATE_RATE;
  3. 查看 Undo 日志回收状态:SELECT * FROM oceanbase.GV$OB_UNDO_RECYCLE_STAT;
  4. 查看慢查询:SELECT * FROM oceanbase.GV$OB_SLOW_QUERY;

解决方案

  1. 调整 Undo 表空间大小:ALTER SYSTEM SET undo_table_space_size = '20G';
  2. 调整 Undo 保留时间:ALTER SYSTEM SET undo_retention = 1800;
  3. 启用并行 Undo 回收:ALTER SYSTEM SET enable_undo_parallel_recycle = TRUE;
  4. 优化慢查询:优化导致大量 Undo 生成的慢查询

结果:Undo 表空间使用率降低到 50%,事务可以正常提交

常见问题(FAQ)

Q1: Redo 日志和 Undo 日志有什么区别?

A1: Redo 日志和 Undo 日志的主要区别:

  • 用途:Redo 日志用于确保事务的持久性和一致性,Undo 日志用于事务回滚和 MVCC
  • 写入时机:Redo 日志在修改数据之前写入,Undo 日志在修改数据的同时写入
  • 管理方式:Redo 日志采用循环写入方式,Undo 日志采用自动回收方式
  • 存储位置:Redo 日志存储在独立的日志文件中,Undo 日志与数据分区存储在一起

Q2: 如何启用归档日志?

A2: 启用归档日志的方法:

sql
-- 启用归档日志
ALTER SYSTEM SET enable_archive_log = TRUE;

-- 配置归档目录
ALTER SYSTEM SET archive_dir = '/data/ob/archive';

-- 配置归档日志保留时间
ALTER SYSTEM SET archive_retention_days = 7;

Q3: 如何监控 Redo 日志同步延迟?

A3: 监控 Redo 日志同步延迟的方法:

sql
-- 查看 Redo 日志同步延迟
SELECT * FROM oceanbase.GV$OB_LOG_SYNC_STAT;

-- 查看 Paxos 同步状态
SELECT * FROM oceanbase.GV$OB_PAXOS_SYNC_STATUS;

Q4: 如何处理 Undo 表空间不足问题?

A4: 处理 Undo 表空间不足的方法:

  1. 调整 Undo 表空间大小:ALTER SYSTEM SET undo_table_space_size = '20G';
  2. 调整 Undo 保留时间:ALTER SYSTEM SET undo_retention = 1800;
  3. 启用并行 Undo 回收:ALTER SYSTEM SET enable_undo_parallel_recycle = TRUE;
  4. 手动触发 Undo 回收:ALTER SYSTEM TRUNCATE UNDO TABLESPACE;
  5. 优化导致大量 Undo 生成的慢查询

Q5: 如何优化 Redo 日志写入性能?

A5: 优化 Redo 日志写入性能的方法:

  • 使用高性能存储:将 Redo 日志存储到 NVMe SSD
  • 调整 Redo 日志文件大小和数量:ALTER SYSTEM SET redo_log_file_size = '128M'; ALTER SYSTEM SET redo_log_file_count = 20;
  • 优化 Redo 日志刷新策略:ALTER SYSTEM SET redo_buffer_flush_trigger_when_redo_log_file_used_percentage = 70;
  • 调整 Redo 日志的并行写入线程数:ALTER SYSTEM SET redo_writer_thread_count = 8;

Q6: 如何配置远程归档?

A6: 配置远程归档的方法:

sql
-- 配置 OSS 归档
ALTER SYSTEM SET archive_dest = 'oss://backup-bucket/ob/archive';
ALTER SYSTEM SET archive_oss_endpoint = 'oss-cn-hangzhou.aliyuncs.com';
ALTER SYSTEM SET archive_oss_access_key_id = 'your_access_key_id';
ALTER SYSTEM SET archive_oss_access_key_secret = 'your_access_key_secret';
ALTER SYSTEM SET archive_oss_bucket = 'backup-bucket';

-- 配置远程服务器归档
ALTER SYSTEM SET archive_dest_2 = 'remote://backup_server:/backup/ob/archive';

Q7: 如何查看归档日志状态?

A7: 查看归档日志状态的方法:

sql
-- 查看归档状态
SELECT * FROM oceanbase.GV$OB_ARCHIVE_STATUS;

-- 查看归档日志列表
SELECT * FROM oceanbase.GV$OB_ARCHIVE_LOG;

-- 查看归档统计信息
SELECT * FROM oceanbase.GV$OB_ARCHIVE_STAT;

Q8: 如何清理过期日志?

A8: 清理过期日志的方法:

  • 通过 OCP 控制台清理过期日志
  • 配置日志保留时间,自动清理过期日志
  • 手动清理过期日志文件

Q9: 如何分析日志文件?

A9: 分析日志文件的方法:

  • 使用 grep 命令搜索关键字:grep -i "error" /home/oceanbase/log/observer.log
  • 使用 awk 命令统计日志:grep -i "error" observer.log | awk '{print $5}' | sort | uniq -c | sort -nr
  • 使用日志分析工具:如 ELK Stack、Splunk 等

Q10: 如何保障日志系统的可靠性?

A10: 保障日志系统可靠性的方法:

  • 启用归档日志
  • 配置多副本归档
  • 使用高性能存储
  • 定期备份归档日志
  • 定期验证归档日志完整性
  • 监控日志系统状态

日志系统配置推荐

开发测试环境

参数配置值说明
redo_log_file_size32MRedo 日志文件大小
redo_log_file_count5Redo 日志文件数量
enable_archive_logFALSE是否启用归档日志
syslog_levelDEBUG系统日志级别
undo_table_space_size2GUndo 表空间大小
undo_retention1800Undo 日志保留时间(秒)

生产环境

参数配置值说明
redo_log_file_size64M-128MRedo 日志文件大小
redo_log_file_count10-20Redo 日志文件数量
enable_archive_logTRUE是否启用归档日志
archive_dir/data/ob/archive归档目录
archive_retention_days7-30归档日志保留时间(天)
syslog_levelINFO系统日志级别
undo_table_space_size10G-50GUndo 表空间大小
undo_retention3600-7200Undo 日志保留时间(秒)
enable_undo_parallel_recycleTRUE是否启用并行 Undo 回收
undo_recycle_thread_count4-8Undo 回收线程数