外观
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" 等错误
- 数据库性能下降
解决方案
检查存储设备:
bashdf -h /data/ob/redo iostat -x -k 1检查 Redo 日志配置:
sqlSHOW PARAMETERS LIKE 'redo%';检查 Redo 日志状态:
sqlSELECT * FROM oceanbase.GV$OB_REDO_STAT;调整 Redo 日志配置:
sqlALTER 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" 等错误
- 事务无法提交
- 数据库性能下降
解决方案
检查 Undo 表空间使用率:
sqlSELECT * FROM oceanbase.GV$OB_UNDO_TABLESPACE_USAGE;调整 Undo 表空间大小:
sqlALTER SYSTEM SET undo_table_space_size = '20G';调整 Undo 保留时间:
sqlALTER SYSTEM SET undo_retention = 1800;手动触发 Undo 回收:
sqlALTER SYSTEM TRUNCATE UNDO TABLESPACE;
归档日志失败
症状
- 错误日志中出现 "Archive log failed" 或 "Failed to archive log" 等错误
- 归档日志状态为 ERROR
- 数据库性能下降
解决方案
检查归档目录:
bashdf -h /data/ob/archive ls -la /data/ob/archive检查归档配置:
sqlSHOW PARAMETERS LIKE 'archive%';检查归档状态:
sqlSELECT * FROM oceanbase.GV$OB_ARCHIVE_STATUS;手动触发归档:
sqlALTER SYSTEM ARCHIVE LOG CURRENT;调整归档配置:
sqlALTER SYSTEM SET archive_retention_days = 3;
日志系统最佳实践
日志配置优化
- 合理设置日志级别:生产环境建议使用 INFO 级别,开发测试环境可以使用 DEBUG 级别
- 配置适当的日志文件大小:根据业务量调整日志文件大小,避免频繁切换日志文件
- 启用日志压缩:减少日志文件占用空间
- 配置适当的日志保留时间:根据备份策略和审计需求设置日志保留时间
日志性能优化
- 使用高性能存储:Redo 日志和归档日志建议使用 SSD 存储
- 优化日志写入策略:调整 Redo 日志的刷新策略,平衡性能和可靠性
- 启用并行 Undo 回收:提高 Undo 日志回收效率
- 监控日志写入延迟:及时发现并处理日志写入延迟问题
日志可靠性保障
- 启用归档日志:生产环境必须启用归档日志
- 配置多副本归档:将归档日志存储到多个位置,提高可靠性
- 定期备份归档日志:将归档日志备份到远程存储,防止本地存储故障
- 定期验证归档日志完整性:确保归档日志可以用于恢复
日志安全管理
- 配置日志加密:保护敏感数据不被泄露
- 限制日志访问权限:只有授权人员可以访问日志文件
- 定期清理过期日志:避免日志文件占用过多空间
- 监控日志访问:防止未授权访问日志文件
日志系统案例
案例一:Redo 日志写入延迟
场景:OceanBase 数据库的 Redo 日志写入延迟增加,影响事务性能
诊断步骤:
- 查看 Redo 日志写入性能:
SELECT * FROM oceanbase.GV$OB_REDO_WRITE_STAT; - 查看存储设备性能:
iostat -x -k 1 - 查看 Redo 日志配置:
SHOW PARAMETERS LIKE 'redo%'; - 查看错误日志:
grep -i "redo" /home/oceanbase/log/observer.log
解决方案:
- 优化存储设备:将 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 日志写入延迟从 10ms 降低到 1ms,事务性能提高 50%
案例二:Undo 表空间不足
场景:OceanBase 数据库的 Undo 表空间使用率达到 90%,影响事务提交
诊断步骤:
- 查看 Undo 表空间使用率:
SELECT * FROM oceanbase.GV$OB_UNDO_TABLESPACE_USAGE; - 查看 Undo 日志生成速率:
SELECT * FROM oceanbase.GV$OB_UNDO_GENERATE_RATE; - 查看 Undo 日志回收状态:
SELECT * FROM oceanbase.GV$OB_UNDO_RECYCLE_STAT; - 查看慢查询:
SELECT * FROM oceanbase.GV$OB_SLOW_QUERY;
解决方案:
- 调整 Undo 表空间大小:
ALTER SYSTEM SET undo_table_space_size = '20G'; - 调整 Undo 保留时间:
ALTER SYSTEM SET undo_retention = 1800; - 启用并行 Undo 回收:
ALTER SYSTEM SET enable_undo_parallel_recycle = TRUE; - 优化慢查询:优化导致大量 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 表空间不足的方法:
- 调整 Undo 表空间大小:
ALTER SYSTEM SET undo_table_space_size = '20G'; - 调整 Undo 保留时间:
ALTER SYSTEM SET undo_retention = 1800; - 启用并行 Undo 回收:
ALTER SYSTEM SET enable_undo_parallel_recycle = TRUE; - 手动触发 Undo 回收:
ALTER SYSTEM TRUNCATE UNDO TABLESPACE; - 优化导致大量 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_size | 32M | Redo 日志文件大小 |
| redo_log_file_count | 5 | Redo 日志文件数量 |
| enable_archive_log | FALSE | 是否启用归档日志 |
| syslog_level | DEBUG | 系统日志级别 |
| undo_table_space_size | 2G | Undo 表空间大小 |
| undo_retention | 1800 | Undo 日志保留时间(秒) |
生产环境
| 参数 | 配置值 | 说明 |
|---|---|---|
| redo_log_file_size | 64M-128M | Redo 日志文件大小 |
| redo_log_file_count | 10-20 | Redo 日志文件数量 |
| enable_archive_log | TRUE | 是否启用归档日志 |
| archive_dir | /data/ob/archive | 归档目录 |
| archive_retention_days | 7-30 | 归档日志保留时间(天) |
| syslog_level | INFO | 系统日志级别 |
| undo_table_space_size | 10G-50G | Undo 表空间大小 |
| undo_retention | 3600-7200 | Undo 日志保留时间(秒) |
| enable_undo_parallel_recycle | TRUE | 是否启用并行 Undo 回收 |
| undo_recycle_thread_count | 4-8 | Undo 回收线程数 |
