news 2025/12/30 21:49:12

ORACLE学习笔记总结(数据库维护联机重做日志)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ORACLE学习笔记总结(数据库维护联机重做日志)

Oracle数据库联机重做日志详解

一、什么是联机重做日志?

1.1 基本概念

联机重做日志(Online Redo Log)是Oracle数据库中用于记录所有数据变化的物理文件。它记录了数据库的所有修改操作,确保数据的一致性和可恢复性。

1.2 核心作用

  • 数据恢复:在实例故障或介质故障时恢复数据

  • 数据一致性:确保事务的ACID特性

  • 归档备份:为数据库备份提供基础

二、重做日志的结构组成

2.1 日志组(Redo Log Groups)

  • 基本要求:每个数据库至少需要2个重做日志组,以支持循环写入

  • 默认配置:创建数据库时默认创建3个日志组,编号分别为1、2、3

  • 循环写入:当当前组写满后,LGWR进程自动切换到下一组,形成循环覆盖机制

-- 查看日志组信息 SELECT group#, sequence#, bytes, members, status, archived FROM v$log; -- 示例输出: -- GROUP# | SEQUENCE# | BYTES | MEMBERS | STATUS | ARCHIVED -- -------|-----------|---------|---------|---------|--------- -- 1 | 125 | 524288000 | 2 | CURRENT | NO -- 2 | 123 | 524288000 | 2 | INACTIVE| YES -- 3 | 124 | 524288000 | 2 | ACTIVE | NO 日志组操作:(下面也会讲,放在一起方便查找) -- 添加新日志组(每组2个成员,各500MB) ALTER DATABASE ADD LOGFILE GROUP 4 ('/u01/oradata/redo04a.log', '/u02/oradata/redo04b.log') SIZE 500M; -- 删除日志组 ALTER DATABASE DROP LOGFILE GROUP 4; -- 手动触发日志切换 ALTER SYSTEM SWITCH LOGFILE; -- 查看日志切换历史 SELECT sequence#, first_time, next_time, blocks FROM v$log_history ORDER BY sequence# DESC;

2.2 日志成员(Redo Log Members)

每个日志组包含一个或多个日志成员(镜像),提供冗余保护:

  • 多路复用:每组建议包含至少2个成员(多路复用),存储在不同磁盘上提高可靠性

  • 并行写入:LGWR进程同时将相同内容写入组内所有成员,确保成员间内容完全一致

  • 默认限制:maxlogfiles默认16组,maxlogmembers默认每组成员数不超过3个

-- 查看日志成员信息 SELECT group#, member, status FROM v$logfile; -- 示例路径: -- /u01/app/oracle/oradata/ORCL/redo01.log -- /u02/app/oracle/oradata/ORCL/redo01_mirror.log 日志成员操作:(下面也会讲,放在一起方便查找) -- 为组1添加新成员 ALTER DATABASE ADD LOGFILE MEMBER '/u03/oradata/redo01c.log' TO GROUP 1; -- 删除日志成员(文件未删除) ALTER DATABASE DROP LOGFILE MEMBER '/u03/oradata/redo01c.log'; rm -f redo01c.log(删除文件)

三、重做日志的工作流程

3.1 循环写入机制

日志组1 (CURRENT) → 日志组2 (NEXT) → 日志组3 → 回到日志组1 ↓ ↓ ↓ 写满 写满 写满 ↓ ↓ ↓ 归档(如启用) 归档(如启用) 归档(如启用)

3.2 日志切换(Log Switch)

-- 手动触发日志切换 ALTER SYSTEM SWITCH LOGFILE; -- 查看日志切换历史 SELECT sequence#, first_time, next_time, blocks FROM v$log_history ORDER BY sequence# DESC;

四、重做日志的内容解析

4.1 重做记录(Redo Record)组成

┌─────────────────────────────────────────┐ │ 重做记录头 (Header) │ │ - 事务ID (XID) │ │ - SCN (系统变更号) │ │ - 时间戳 │ ├─────────────────────────────────────────┤ │ 变化向量1 (Change Vector 1) │ │ - 数据块地址 (DBA) │ │ - 修改前值 (Before Image) │ │ - 修改后值 (After Image) │ ├─────────────────────────────────────────┤ │ 变化向量2 (Change Vector 2) │ │ - 数据块地址 (DBA) │ │ - 修改前值 (Before Image) │ │ - 修改后值 (After Image) │ ├─────────────────────────────────────────┤ │ ... │ └─────────────────────────────────────────┘

4.2 重做日志记录的内容类型

  1. 数据变更:INSERT、UPDATE、DELETE操作

  2. DDL操作:CREATE、ALTER、DROP等

  3. 数据字典变更:表结构修改

  4. 回滚段变更:事务回滚信息

  5. 检查点信息:数据库一致性标记

五、关键视图和诊断工具

5.1 重要数据字典视图

-- 1. V$LOG - 日志组状态 desc v$log; v$logfile SELECT group#, sequence#, bytes/1024/1024 MB, members, status, archived, first_change# FROM v$log; -- 2. V$LOGFILE - 日志文件信息 SELECT group#, member, type, status FROM v$logfile ORDER BY group#; -- 3. V$LOG_HISTORY - 日志历史 SELECT sequence#, first_time, first_change#, next_time, next_change#, blocks FROM v$log_history WHERE sequence# > (SELECT max(sequence#)-10 FROM v$log_history); -- 4. V$ARCHIVED_LOG - 归档日志信息(归档模式下) SELECT sequence#, name, first_time, completion_time FROM v$archived_log ORDER BY sequence# DESC;

5.2 日志挖掘工具(LogMiner)

-- 配置LogMiner EXECUTE DBMS_LOGMNR.ADD_LOGFILE( - LOGFILENAME => '/u01/oradata/redo01.log', - OPTIONS => DBMS_LOGMNR.NEW); -- 开始分析 EXECUTE DBMS_LOGMNR.START_LOGMNR( - OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG); -- 查询分析结果 SELECT scn, timestamp, sql_redo, sql_undo FROM v$logmnr_contents WHERE seg_owner = 'HR' AND seg_name = 'EMPLOYEES'; -- 结束分析 EXECUTE DBMS_LOGMNR.END_LOGMNR();

六、管理操作指南

6.1 添加/删除日志组

-- 添加新日志组(每组2个成员,各500MB) ALTER DATABASE ADD LOGFILE GROUP 4 ('/u01/oradata/redo04a.log', '/u02/oradata/redo04b.log') SIZE 500M; -- 删除日志组 ALTER DATABASE DROP LOGFILE GROUP 4;

6.2 添加/删除日志成员

-- 为组1添加新成员 ALTER DATABASE ADD LOGFILE MEMBER '/u03/oradata/redo01c.log' TO GROUP 1; -- 删除日志成员 ALTER DATABASE DROP LOGFILE MEMBER '/u03/oradata/redo01c.log';

6.3 重设日志大小

-- 步骤1: 添加新大小的日志组 ALTER DATABASE ADD LOGFILE GROUP 4 ('/u01/oradata/redo04a.log', '/u02/oradata/redo04b.log') SIZE 1G; -- 步骤2: 切换日志直到旧组变为INACTIVE ALTER SYSTEM SWITCH LOGFILE; -- 重复多次,直到要删除的组状态为INACTIVE -- 步骤3: 删除旧日志组 ALTER DATABASE DROP LOGFILE GROUP 1;

七、监控和维护脚本

7.1 监控日志切换频率

-- 检查频繁日志切换 SELECT to_char(first_time, 'YYYY-MM-DD HH24') hour, count(*) switches_per_hour FROM v$log_history WHERE first_time > sysdate - 1 GROUP BY to_char(first_time, 'YYYY-MM-DD HH24') ORDER BY hour;

7.2 检查日志状态和空间

-- 综合监控脚本 SELECT l.group#, l.thread#, l.sequence#, l.bytes/1024/1024 MB, l.members, l.status, l.archived, round((sysdate - f.first_time)*24,2) hours_ago, f.switches FROM v$log l JOIN ( SELECT group#, min(first_time) first_time, count(*) switches FROM v$log_history GROUP BY group# ) f ON l.group# = f.group#;

八、最佳实践建议

8.1 配置建议

  1. 日志组数量:至少3组,建议4-5组

  2. 日志大小:每20-30分钟切换一次为宜

  3. 成员数量:每组至少2个成员,分布在不同的物理磁盘

  4. 归档模式:生产环境必须启用归档模式

-- 1. 检查日志文件损坏 ALTER SYSTEM CHECK LOGICAL DATAFILE '/path/to/redo.log'; -- 2. 清除损坏的日志组 ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 2; -- 3. 强制日志切换和检查点 ALTER SYSTEM CHECKPOINT GLOBAL; ALTER SYSTEM ARCHIVE LOG ALL;

九、性能优化

9.1 减少日志生成

-- 1. 使用NOLOGGING操作(谨慎使用) ALTER TABLE big_table NOLOGGING; INSERT /*+ APPEND */ INTO big_table SELECT * FROM source_table; ALTER TABLE big_table LOGGING; -- 2. 批量提交减少日志开销 BEGIN FOR i IN 1..10000 LOOP INSERT INTO test_table VALUES (i, 'data'); IF MOD(i, 1000) = 0 THEN COMMIT; END IF; END LOOP; COMMIT; END;

十、常见问题排查

10.1 日志相关等待事件

-- 检查日志相关等待 SELECT event, total_waits, time_waited FROM v$system_event WHERE event LIKE '%log%' ORDER BY time_waited DESC;

10.2 空间不足处理

-- 1. 检查归档目标空间 SELECT destination, status, error FROM v$archive_dest WHERE status != 'INACTIVE'; -- 2. 清理旧归档日志 RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';

十一、日志序列号(Log Sequence Number)

11.1 概念与作用

日志序列号是唯一标识每个重做日志文件的递增数字,是数据库恢复的关键线索。

-- 查看当前日志序列号 SELECT group#, sequence#, first_change#, next_change# FROM v$log; -- 示例输出: -- GROUP# SEQUENCE# FIRST_CHANGE# NEXT_CHANGE# -- 1 125 12345678 12346789 -- 2 124 12344567 12345678 -- 3 123 12343456 12344567

11.2 序列号的工作机制

时间线: 序列号121 → 122 → 123 → 124 → 125 → ... 对应日志: 组3(CURRENT) → 组1 → 组2 → 组3 → 组1 → ...

重要特性

  • 每个日志切换都会产生新的序列号

  • 序列号在数据库生命周期内持续递增

  • RAC环境中每个实例有独立的序列号范围

  • 归档日志文件名通常包含序列号:redo_125_1_987654321.arc

十二、Thread(线程)机制

12.1 线程的概念

线程在Oracle中代表一个数据库实例的写入路径,主要用于RAC环境。

-- 查看线程信息 SELECT thread#, instance_name, status, enabled FROM v$thread; -- RAC环境示例: -- THREAD# INSTANCE_NAME STATUS ENABLED -- 1 ORCL1 OPEN PUBLIC -- 2 ORCL2 OPEN PUBLIC

12.2 单实例 vs RAC

单实例数据库: ┌─────────────┐ │ Thread 1 │ ← 只有一个线程 │ 日志组1,2,3 │ └─────────────┘ RAC数据库: ┌─────────────┐ ┌─────────────┐ │ Thread 1 │ │ Thread 2 │ │ Instance 1 │ │ Instance 2 │ │ 日志组1,3,5 │ │ 日志组2,4,6 │ └─────────────┘ └─────────────┘ ↓ ↓ ┌─────────────────────────────┐ │ 共享重做日志文件 │ └─────────────────────────────┘

十三、LGWR进程详解

13.1 LGWR的角色与职责

LGWR(Log Writer)是负责将重做日志缓冲区内容写入磁盘的关键后台进程。按组编号1→2→3→1的顺序循环写入,已写满的组可被覆盖(非归档模式下)或归档后覆盖(归档模式下)

-- 查看LGWR进程状态 SELECT pid, program, background, pga_used_mem FROM v$process WHERE program LIKE '%LGWR%';

13.2 LGWR写入触发条件

13.2.1 主要触发条件
触发条件描述频率/阈值
事务提交用户执行COMMIT时每次提交
3秒超时后台定时写入每3秒一次
缓冲区1/3满重做日志缓冲区使用量达到1/3容量
1MB阈值缓冲区累积数据量超过1MB
DBWn需要数据块写入前确保重做日志持久化按需
13.2.2 事务提交的详细流程
-- 用户执行: UPDATE employees SET salary = 10000 WHERE employee_id = 100; COMMIT; -- ← 触发LGWR写入 -- 内部流程: 1. 用户提交事务 2. LGWR获取提交SCN 3. 将重做日志缓冲区中该事务的所有重做记录写入磁盘 4. 在重做日志文件中写入提交记录 5. 向用户返回提交成功

13.3 LGWR的I/O特性

-- 监控LGWR性能 SELECT event, total_waits, time_waited_micro, average_wait_micro FROM v$system_event WHERE event LIKE '%log file%'; -- 关键等待事件: -- log file parallel write: LGWR写入等待 -- log file sync: 用户提交等待LGWR完成

LGWR特点

  • 并行写入:同时写入同一组的所有成员

  • 顺序写入:按事务发生顺序写入

  • 异步I/O:尽可能使用异步I/O提高性能

  • 零散收集,批量写入:收集多个事务后批量写入

十四、日志切换(Log Switch)

14.1 触发条件

-- 手动触发日志切换 ALTER SYSTEM SWITCH LOGFILE; -- 查看切换频率 SELECT to_char(first_time, 'YYYY-MM-DD HH24') hour, count(*) switches, round(count(*)/60, 2) per_minute FROM v$log_history WHERE first_time > sysdate - 1/24 -- 最近1小时 GROUP BY to_char(first_time, 'YYYY-MM-DD HH24') ORDER BY hour;

自动触发条件

  1. 当前日志组写满

  2. ALTER SYSTEM SWITCH LOGFILE命令

  3. 日志组状态异常

  4. 某些维护操作(如开启归档)

14.2 日志切换的详细过程

切换前状态: ┌─────────────────┐ │ GROUP 1: CURRENT│ ← LGWR正在写入 │ GROUP 2: ACTIVE │ │ GROUP 3: INACTIVE│ └─────────────────┘ 触发切换: 1. LGWR停止写入GROUP 1 2. 分配新的序列号给GROUP 2 3. 更新控制文件 4. LGWR开始写入GROUP 2 切换后状态: ┌─────────────────┐ │ GROUP 1: ACTIVE │ ← 可能还有未写入数据文件的重做记录 │ GROUP 2: CURRENT│ ← LGWR正在写入 │ GROUP 3: INACTIVE│ └─────────────────┘

14.3 切换问题诊断

-- 检查日志切换阻塞 SELECT event, state, seconds_in_wait, block FROM v$session WHERE event LIKE '%log%switch%' OR event LIKE '%archive%'; -- 查看归档延迟 SELECT dest_id, destination, status, error FROM v$archive_dest WHERE status != 'INACTIVE';

十五、检查点(Checkpoint)

15.1 检查点的作用与类型

15.1.1 检查点类型
类型触发条件作用
完全检查点SHUTDOWN, ALTER SYSTEM CHECKPOINT所有脏块写入磁盘
增量检查点每3秒(由CKPT进程)定期推进检查点位置
线程检查点日志切换时确保切换前的脏块写入磁盘
表空间检查点表空间离线/只读/备份开始表空间级脏块写入
15.1.2 检查点相关参数
-- 查看检查点参数 SELECT name, value, description FROM v$parameter WHERE name LIKE '%checkpoint%' OR name LIKE '%fast_start%'; -- 关键参数: -- fast_start_mttr_target: 实例恢复时间目标(秒) -- log_checkpoint_timeout: 检查点超时时间(秒) -- log_checkpoint_interval: 检查点触发间隔(OS块数)

15.2 检查点触发条件详解

15.2.1 常规触发
-- 手动触发完全检查点 ALTER SYSTEM CHECKPOINT GLOBAL; -- 查看检查点进度 SELECT target_rba, -- 目标恢复字节地址 on_disk_rba, -- 已写入磁盘的RBA recovery_estimated_ios, -- 估计恢复需要的I/O数 estimated_mttr -- 估计平均恢复时间(秒) FROM v$instance_recovery;
15.2.2 触发条件汇总
  1. 日志切换时(自动)

  2. 达到fast_start_mttr_target阈值

  3. 表空间操作:BEGIN BACKUP, OFFLINE, READ ONLY

  4. 实例关闭:SHUTDOWN [NORMAL|IMMEDIATE|TRANSACTIONAL]

  5. 手动命令:ALTER SYSTEM CHECKPOINT

15.3 检查点与日志的协同工作

15.3.1 增量检查点机制
重做日志文件 ┌─────────────────────────────────────────┐ │ 已写入磁盘 ← CKPT位置(增量检查点) │ │ ............│............................│ │ 已生成重做 ← RBA(恢复字节地址) │ └─────────────────────────────────────────┘ ↑ ↑ │ │ 检查点队列 重做记录队列 (脏块列表) (待写入)
15.3.2 监控检查点队列
-- 检查点队列统计 SELECT cpdrt, -- 检查点队列中的脏块数量 cpnxt, -- 下一个检查点RBA cpba, -- 当前检查点RBA cprls -- 检查点释放的块数 FROM x$kcccp WHERE indx = 0;

15.4 实例恢复与检查点关系

15.4.1 恢复过程
-- 查看恢复需要的日志 SELECT thread#, sequence#, first_change#, next_change# FROM v$log WHERE status IN ('ACTIVE', 'CURRENT'); -- 实例恢复步骤: -- 1. 前滚(Roll Forward): 从检查点开始应用重做日志 -- 2. 回滚(Roll Back): 回滚未提交事务
15.4.2 快速启动故障恢复(FSFR)
-- 启用快速启动故障恢复 ALTER SYSTEM SET fast_start_mttr_target = 300; -- 5分钟恢复目标 -- 监控FSFR状态 SELECT mttr_target, -- 目标恢复时间 estimated_mttr, -- 估计恢复时间 writes_mttr, -- 为满足MTTR需要写入的块数 ckpt_block_writes -- 检查点写入的块数 FROM v$instance_recovery;

十六、综合监控脚本

16.1 完整状态监控

SELECT -- 日志组信息 l.group#, l.thread#, l.sequence#, l.bytes/1024/1024 as size_mb, l.members, l.status, l.archived, -- 检查点信息 to_char(l.first_change#, '999999999999999') as first_change, to_char(l.next_change#, '999999999999999') as next_change, -- 时间信息 to_char(h.first_time, 'HH24:MI:SS') as first_time, round((sysdate - h.first_time)*24*60, 2) as minutes_old, -- 恢复信息 ir.estimated_mttr, ir.target_mttr, ir.writes_mttr FROM v$log l LEFT JOIN ( SELECT group#, max(first_time) first_time FROM v$log_history GROUP BY group# ) h ON l.group# = h.group# CROSS JOIN v$instance_recovery ir ORDER BY l.thread#, l.group#;

16.2 性能与问题诊断

-- 检查日志相关等待 SELECT event, total_waits, time_waited_micro/1000000 as time_waited_sec, average_wait_micro/1000 as avg_wait_ms, total_timeouts FROM v$system_event WHERE event IN ( 'log file sync', -- 提交等待 'log file parallel write', -- LGWR写入等待 'log file sequential read', -- 读取归档日志 'log file single write', -- 日志头写入 'switch logfile command' -- 日志切换命令 ) ORDER BY time_waited_micro DESC;

十七、最佳实践配置

17.1 关键参数设置

-- 日志相关参数优化 ALTER SYSTEM SET log_buffer = 67108864 SCOPE=SPFILE; -- 64MB 日志缓冲区 ALTER SYSTEM SET fast_start_mttr_target = 300 SCOPE=SPFILE; -- 5分钟恢复目标 ALTER SYSTEM SET log_checkpoint_timeout = 1800 SCOPE=SPFILE; -- 30分钟检查点超时

17.2 高可用配置

-- RAC环境日志配置 -- 每个实例至少3个日志组,每组2个成员 -- 确保成员分布在不同的存储路径 -- 添加线程(RAC实例2) ALTER DATABASE ADD LOGFILE THREAD 2 GROUP 4 ('+DATA/redo04a.log', '+FRA/redo04b.log') SIZE 2G, GROUP 5 ('+DATA/redo05a.log', '+FRA/redo05b.log') SIZE 2G, GROUP 6 ('+DATA/redo06a.log', '+FRA/redo06b.log') SIZE 2G;

17.3 日常维护脚本

-- 检查日志系统健康状态 SET LINESIZE 200 COLUMN "Status Summary" FORMAT A50 SELECT CASE WHEN EXISTS ( SELECT 1 FROM v$log WHERE status = 'CURRENT' AND (next_change# - first_change#) / bytes > 0.9 ) THEN 'WARNING: Current log almost full' WHEN EXISTS ( SELECT 1 FROM v$log l, v$logfile lf WHERE l.group# = lf.group# AND lf.status != 'VALID' ) THEN 'ERROR: Invalid log file member' WHEN (SELECT count(*) FROM v$archive_dest WHERE error IS NOT NULL) > 0 THEN 'ERROR: Archive destination error' ELSE 'OK: Log system healthy' END AS "Status Summary", (SELECT count(*) FROM v$log WHERE status = 'ACTIVE') as active_logs, (SELECT round(avg((next_change# - first_change#) / bytes * 100), 2) FROM v$log WHERE status = 'CURRENT') as current_log_usage_percent FROM dual;

十八、故障处理场景

18.1 日志切换频繁

-- 原因:日志文件太小或事务量过大 -- 解决方案:增大日志文件 ALTER DATABASE ADD LOGFILE GROUP 4 ('/u01/oradata/redo04a.log', '/u02/oradata/redo04b.log') SIZE 2G REUSE; ALTER SYSTEM SWITCH LOGFILE; -- 多次切换,直到可以删除旧组 ALTER DATABASE DROP LOGFILE GROUP 1;

18.2 检查点未推进

-- 现象:实例恢复时间过长 -- 诊断: SELECT * FROM v$instance_recovery; SELECT event, p1, p2, p3 FROM v$session_wait WHERE event LIKE '%checkpoint%'; -- 解决:触发检查点并调整参数 ALTER SYSTEM CHECKPOINT; ALTER SYSTEM SET fast_start_mttr_target = 600;

十九、总结要点

概念关键点监控指标
序列号唯一标识,持续递增v$log.sequence#
线程RAC实例写入路径v$thread.thread#
LGWR重做日志写入进程log file sync等待时间
日志切换组间轮换写入v$log_history切换频率
检查点脏块写入,减少恢复时间v$instance_recovery.estimated_mttr

还有一个参数FAST_START_MTTR_TARGET=600是Oracle 数据库中控制实例恢复时间的关键参数,它间接影响检查点行为。

1. 查看当前设置

show parameter fast_start_mttr

2. 监控实际恢复时间估算

SELECT target_mttr, estimated_mttr FROM v$instance_recovery;

3.调整命令

ALTER SYSTEM SET FAST_START_MTTR_TARGET=180 SCOPE=BOTH;

相关参数对比

参数作用使用建议
FAST_START_MTTR_TARGET设置恢复时间目标(秒)推荐(10g+),自动调优
LOG_CHECKPOINT_INTERVAL按日志块数触发检查点已废弃,不建议使用
LOG_CHECKPOINT_TIMEOUT按时间间隔触发检查点已废弃,不建议使用

移动和换名redo log :alter database rename file '路径1' to'路径2'(具体操作就是mount状态文件移动指令位置在v$logfile中查找)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/28 16:35:53

基于COMSOL模拟的水力压裂技术研究:固体力学与达西定理的应用

comsol模拟水力压裂,固体力学达西定理。在工程领域,水力压裂技术是一种常用的增强油气开采效率的方法。通过模拟这一过程,我们可以更好地理解裂缝的扩展和流体的流动。今天,我们就来聊聊如何使用COMSOL Multiphysics来模拟水力压裂…

作者头像 李华
网站建设 2025/12/28 2:38:45

Redis 性能调优(二)

Redis 性能调优是一个系统工程,涉及多个层面。以下是全面的调优指南,分为关键方向、具体措施和实战建议:🔧 核心配置优化1. 内存优化# 配置建议 maxmemory 16gb # 根据物理内存的70-80%设置 maxmemory-policy allkeys-lru # 根据…

作者头像 李华
网站建设 2025/12/27 12:04:58

Doris 性能调优实践指南(可直接落地)

Doris 作为 MPP 架构的 OLAP 引擎,性能调优需覆盖 集群部署、表设计、查询优化、导入优化、参数配置 五大核心维度。以下是结合生产环境实践的具体可执行方案,附配置示例和问题定位方法:一、集群部署调优(基础前提)1. …

作者头像 李华
网站建设 2025/12/28 7:33:10

presum|二分try+滑窗cnt

lc1198hash统计二维矩阵中所有数字的出现次数,找出出现次数等于矩阵行数的最小数字,无则返回 -1class Solution { /* 输入:mat [[1,2,3,4,5],[2,4,5,8,10],[3,5,7,9,11],[1,3,5,7,9]] 输出:5 */ public:int smallestCommonElemen…

作者头像 李华
网站建设 2025/12/28 19:36:49

Web自动化测试:Unittest单元测试框架

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 一、unitest基础写法格式1.1引用导入import unittest并且需要新建一个类,继承unittestclass Demo(unittest.TestCase):1.2格式代码示例备注&#xf…

作者头像 李华
网站建设 2025/12/28 14:13:38

Apache2最佳实践

Apache2最佳实践:从性能优化到安全加固的全维度指南Apache2(httpd)作为开源Web服务器的标杆,其默认配置仅能满足基础运行需求,在高并发、高安全等级的生产环境中往往力不从心。本文基于资深运维经验,从性能…

作者头像 李华