第十一讲--Oracle日志核心意义:快速提交、写缓存

本文详细解析了一条SQL通过会话进入Oracle数据库的流程,包括修改缓冲区、日志快速提交、文件系统读缓存与日志写缓存的机制,以及LGWR在日志记录过程中的关键作用。解释了数据库系统如何实现高效的数据持久化和一致性,重点突出了日志在数据库事务处理中的重要性和优化策略。

一条SQL通过会话进入oracle,修改一个buffer,修改的日志首先放在会话的PGA中,一定程度之后把PGA里的日志再写到redolog buffer里,LGWR按顺序周期性的把日志写到redo log中,因为是顺序写,不用大量寻道,所以写的速度会很快。会话用commit提交修改,提交时并不把脏buffer写回block上,而是把redo log buffer中那一点点(因为LGWR周期性的工作,已经写了部分日志到redo log了)日志写到redo log中,对于用户来讲,commit速度很快,体验好。

1.      日志实现了快速提交;

2.      文件系统只提供读缓存而日志实现了写缓存;

3.      LGWR绕过OS缓存,即绕过文件系统,把日志从redo log buffer写到存储的写缓存上,然后再写到硬盘上,存储的写缓存通过电池把数据写入磁盘,LGWR只是直接把日志写入存储的缓存,至于存储的缓存是否把日志写入硬盘,LGWR并不知道;


数据库建在存储上,存储有buffer,buffer上有电池,存储的buffer支持写缓存。

硬盘上也有缓存,硬盘的缓存只提供读缓存。

Buffer cache提供写缓存。

文件系统只提供读缓存。

Oracle的实际工作很少建在文件系统上。硬盘、存储、文件系统、buffer cache都支持读缓存,数据从硬盘的buffer到存储的buffer,再到文件系统的buffer,最后到达buffer cache的buffer。

Redo log在文件系统上,写的时候LGWR绕过OS缓存,即绕过文件系统,把日志从redo log buffer写到存储的写缓存上,然后再写到硬盘上,存储的写缓存通过电池把数据写入磁盘,LGWR只是直接把日志写入存储的缓存,至于存储的缓存是否把日志写入硬盘,LGWR并不知道。

2025-11-27 11:45:42:270-----------任务执行开始,任务id 1032,执行id:0a66ef8fb57c4daa936601176f8cf4e8 ------------- 2025-11-27 11:46:10:234-构建输入组件开始 2025-11-27 11:46:10:235-构建databasemeta结束 2025-11-27 11:46:10:236-抽取的sql select TRANSACTION_ID, PRO_NAME, BLAST, MAT_CODE, MAT_NAME, AMOUNT, UNITE, TL_DATE, CREATED_BY_CODE, CREATED_BY_NAME, CREATION_DATE, SG_SIGN from cux_hbis_qmys_touliao_date_v 2025-11-27 11:46:10:237-构建输入组件结束 2025-11-27 11:46:10:241-outputStep:csv output-1032 2025-11-27 11:46:10:241-最后的步骤:table input-1032 2025/11/27 11:46:10 - table input-1032.0 - ERROR (version 7.1.0.0-12, build 1 from 2017-05-16 17.18.02 by buildguy) : Unexpected error 2025/11/27 11:46:10 - table input-1032.0 - ERROR (version 7.1.0.0-12, build 1 from 2017-05-16 17.18.02 by buildguy) : org.pentaho.di.core.exception.KettleDatabaseException: 2025/11/27 11:46:10 - table input-1032.0 - An error occurred executing SQL: 2025/11/27 11:46:10 - table input-1032.0 - select 2025/11/27 11:46:10 - table input-1032.0 - TRANSACTION_ID, 2025/11/27 11:46:10 - table input-1032.0 - PRO_NAME, 2025/11/27 11:46:10 - table input-1032.0 - BLAST, 2025/11/27 11:46:10 - table input-1032.0 - MAT_CODE, 2025/11/27 11:46:10 - table input-1032.0 - MAT_NAME, 2025/11/27 11:46:10 - table input-1032.0 - AMOUNT, 2025/11/27 11:46:10 - table input-1032.0 - UNITE, 2025/11/27 11:46:10 - table input-1032.0 - TL_DATE, 2025/11/27 11:46:10 - table input-1032.0 - CREATED_BY_CODE, 2025/11/27 11:46:10 - table input-1032.0 - CREATED_BY_NAME, 2025/11/27 11:46:10 - table input-1032.0 - CREATION_DATE, 2025/11/27 11:46:10 - table input-1032.0 - SG_SIGN 2025/11/27 11:46:10 - table input-1032.0 - 2025/11/27 11:46:10 - table input-1032.0 - from cux_hbis_qmys_touliao_date_v 2025/11/27 11:46:10 - table input-1032.0 - ORA-00904: "SG_SIGN": invalid identifier 2025/11/27 11:46:10 - table input-1032.0 - 2025/11/27 11:46:10 - table input-1032.0 - 2025/11/27 11:46:10 - table input-1032.0 - at org.pentaho.di.core.database.Database.openQuery(Database.java:1778) 2025/11/27 11:46:10 - table input-1032.0 - at org.pentaho.di.trans.steps.tableinput.TableInput.doQuery(TableInput.java:236) 2025/11/27 11:46:10 - table input-1032.0 - at org.pentaho.di.trans.steps.tableinput.TableInput.processRow(TableInput.java:140) 2025/11/27 11:46:10 - table input-1032.0 - at org.pentaho.di.trans.step.RunThread.run(RunThread.java:62) 2025/11/27 11:46:10 - table input-1032.0 - at java.lang.Thread.run(Thread.java:748) 2025/11/27 11:46:10 - table input-1032.0 - Caused by: java.sql.SQLSyntaxErrorException: ORA-00904: "SG_SIGN": invalid identifier 2025/11/27 11:46:10 - table input-1032.0 - 2025/11/27 11:46:10 - table input-1032.0 - at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445) 2025/11/27 11:46:10 - table input-1032.0 - at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396) 2025/11/27 11:46:10 - table input-1032.0 - at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879) 2025/11/27 11:46:10 - table input-1032.0 - at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450) 2025/11/27 11:46:10 - table input-1032.0 - at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192) 2025/11/27 11:46:10 - table input-1032.0 - at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531) 2025/11/27 11:46:10 - table input-1032.0 - at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:193) 2025/11/27 11:46:10 - table input-1032.0 - at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:873) 2025/11/27 11:46:10 - table input-1032.0 - at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1167) 2025/11/27 11:46:10 - table input-1032.0 - at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1289) 2025/11/27 11:46:10 - table input-1032.0 - at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1491) 2025/11/27 11:46:10 - table input-1032.0 - at oracle.jdbc.driver.OracleStatementWrapper.executeQuery(OracleStatementWrapper.java:406) 2025/11/27 11:46:10 - table input-1032.0 - at org.pentaho.di.core.database.Database.openQuery(Database.java:1767) 2025/11/27 11:46:10 - table input-1032.0 - ... 4 more 2025/11/27 11:46:10 - table input-1032.0 - Finished reading query, closing connection. 2025/11/27 11:46:10 - table input-1032.0 - 完成处理 (I=0, O=0, R=0, W=0, U=0, E=1) 2025/11/27 11:46:10 - ERROR (version 7.1.0.0-12, build 1 from 2017-05-16 17.18.02 by buildguy) : 错误被检测到! 2025/11/27 11:46:10 - 转换被检测 2025/11/27 11:46:10 - 转换正在杀死其他步骤! 2025/11/27 11:46:11 - ERROR (version 7.1.0.0-12, build 1 from 2017-05-16 17.18.02 by buildguy) : 错误被检测到! 2025-11-27 11:46:11:470------------任务底层逻辑执行完毕,任务id:1032 --------- 2025-11-27 11:46:11:470-------任务运行失败,任务id:1032 --------- 2025-11-27 11:46:11:479-task fail id=1032 delete localfile csvPath=task-monitor/template/csvOutput/17821.csv delete result=true 2025-11-27 11:46:11:481-任务:1032 运行结束,结果为:fail
最新发布
11-29
请分析下面代码:server: port: 8088 tomcat: max-http-form-post-size: -1 servlet: context-path: /wo spring: application: name: wo-system cloud: nacos: discovery: server-addr: 10.105.191.35:8848 namespace: PQS_TEST group: DEFAULT_GROUP datasource: type: com.alibaba.druid.pool.DruidDataSource url: jdbc:p6spy:oracle:thin:@(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 10.105.191.39)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = SJWO))) username: SJWOUSER_T password: SJWOUSERT12345678 driver-class-name: com.p6spy.engine.spy.P6SpyDriver connection-test-query: SELECT * from dual druid: test-on-borrow: false test-while-idle: false initial-size: 2 min-idle: 1 max-active: 10 jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 # cache: # type: caffeine #上传附件的大小限制 servlet: multipart: max-file-size: 20MB max-request-size: 20MB enabled: true #邮件 thymeleaf: enabled: true cache: false encoding: UTF-8 prefix: classpath:/mail-template/ suffix: .html servlet: content-type: text/html # p6spy sql打印 decorator: datasource: enabled: true # 是否启用 knife4j: enable: false production: false feign: client: config: default: connect-timeout: 5000 read-timeout: 30000 server-name: jyong-server fmcode-name: fmcode global-config: appName: wo-system jyongSysName: wo-system xxl: sso: server: http://10.100.86.13:8087/sso logout: path: /logout excluded: paths: /doc.html/**,/swagger-resources,/v2/api-docs,/webjars/**,/api/**, redis: address: redis://10.100.86.13:6379 job: admin: addresses: http://10.105.191.35:13001/xxl-job-admin executor: address: appname: wo-job ip: logpath: F:\EpmsFile\applogs\xxl-job\jobHandler logretentiondays: 15 port: 14007 accessToken: default_token mybatis-plus: type-aliases-package: com.sjsemi.app.wo.domain mapper-locations: classpath*:/mappers/*.xml wo: dps-push-date: '2024/03/26 12:00:00' mes-wtc: webservice: wsdl-url: http://10.100.86.13:13002/TuxedoConnectionService/services/CommonMsgService req-timeout: 120 # 120s j2-mes: server-id: FABJ2A mail-box: TPSJOHS msgHeader: srvAddr: //10.100.86.13:13002 #cancel_wo_url: http://10.100.86.13:8401/prms/api/cancelSjWoInfoByWoNo cancel_wo_url: http://10.101.60.14:8081/prms/api/cancelSjWoInfoByWoNo
09-26
这段代码是一个典型的 **Spring Boot 配置文件(application.yml)**,用于配置一个基于 Spring Boot + Spring Cloud 的微服务应用。配置内容涵盖了服务器设置、数据源、日志缓存、Feign、定时任务、MyBatis、第三方服务集成等。下面是对配置的详细分析: --- ## 一、服务器配置(`server`) ```yaml server: port: 8088 tomcat: max-http-form-post-size: -1 servlet: context-path: /wo ``` - **`port: 8088`**:服务运行的端口号为 8088。 - **`max-http-form-post-size: -1`**:设置 Tomcat 的最大表单提交大小为无限制,适用于大文件上传。 - **`context-path: /wo`**:服务的访问路径前缀为 `/wo`,例如访问接口为:`http://localhost:8088/wo/api/xxx`。 --- ## 二、Spring 基础配置 ```yaml spring: application: name: wo-system ``` - **`application.name: wo-system`**:设置当前服务的应用名称,用于注册到服务发现(如 Nacos)中。 --- ## 三、服务注册与发现(Spring Cloud + Nacos) ```yaml cloud: nacos: discovery: server-addr: 10.105.191.35:8848 namespace: PQS_TEST group: DEFAULT_GROUP ``` - **`server-addr`**:Nacos 服务地址,用于服务注册与发现。 - **`namespace`**:命名空间为 `PQS_TEST`,实现多环境隔离。 - **`group`**:组为 `DEFAULT_GROUP`,用于逻辑分组。 --- ## 四、数据源配置(Druid + Oracle + P6Spy) ```yaml datasource: type: com.alibaba.druid.pool.DruidDataSource url: jdbc:p6spy:oracle:thin:@(DESCRIPTION =...) username: SJWOUSER_T password: SJWOUSERT12345678 driver-class-name: com.p6spy.engine.spy.P6SpyDriver connection-test-query: SELECT * from dual druid: test-on-borrow: false test-while-idle: false initial-size: 2 min-idle: 1 max-active: 10 ``` - 使用 **Druid 数据源**,支持连接池管理。 - 使用 **P6Spy 驱动**,用于 SQL 日志打印和监控。 - Oracle 数据库连接信息。 - Druid 配置了连接池参数,如初始连接数、最大连接数等。 --- ## 五、Jackson 日期格式配置 ```yaml jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 ``` - 设置 JSON 序列化/反序列化时的日期格式为 `yyyy-MM-dd HH:mm:ss`。 - 时区为 `GMT+8`,即北京时间。 --- ## 六、文件上传配置 ```yaml servlet: multipart: max-file-size: 20MB max-request-size: 20MB enabled: true ``` - 支持最大上传文件大小为 20MB,整个请求最大为 20MB。 --- ## 七、Thymeleaf 模板引擎配置 ```yaml thymeleaf: enabled: true cache: false encoding: UTF-8 prefix: classpath:/mail-template/ suffix: .html servlet: content-type: text/html ``` - 启用 Thymeleaf 模板引擎,用于邮件模板渲染。 - 模板文件路径为 `classpath:/mail-template/`,后缀为 `.html`。 --- ## 八、SQL 日志打印配置(P6Spy) ```yaml decorator: datasource: enabled: true ``` - 开启 P6Spy 装饰器,用于打印 SQL 语句及执行时间。 --- ## 九、Knife4j(Swagger)配置 ```yaml knife4j: enable: false production: false ``` - Knife4j(Swagger UI)被禁用,不开启文档接口功能。 --- ## 十、Feign 配置 ```yaml feign: client: config: default: connect-timeout: 5000 read-timeout: 30000 server-name: jyong-server fmcode-name: fmcode ``` - Feign 客户端配置,设置默认连接超时与读取超时。 - `server-name` 和 `fmcode-name` 可能用于服务调用标识。 --- ## 十一、全局自定义配置 ```yaml global-config: appName: wo-system jyongSysName: wo-system ``` - 自定义配置项,可能用于业务逻辑中读取系统名称等信息。 --- ## 十二、XXL-JOB 定时任务配置 ```yaml xxl: sso: server: http://10.100.86.13:8087/sso logout: path: /logout excluded: paths: /doc.html/**,... redis: address: redis://10.100.86.13:6379 job: admin: addresses: http://10.105.191.35:13001/xxl-job-admin executor: appname: wo-job logpath: F:\EpmsFile\applogs\xxl-job\jobHandler logretentiondays: 15 port: 14007 accessToken: default_token ``` - 集成 XXL-JOB 分布式任务调度系统。 - 配置了 SSO 登录地址、排除路径、Redis 地址。 - 配置了 XXL-JOB 的执行器信息(应用名、日志路径、端口等)。 --- ## 十三、MyBatis Plus 配置 ```yaml mybatis-plus: type-aliases-package: com.sjsemi.app.wo.domain mapper-locations: classpath*:/mappers/*.xml ``` - 设置 MyBatis 实体类扫描路径。 - 设置 Mapper XML 文件路径。 --- ## 十四、自定义业务配置 ```yaml wo: dps-push-date: '2024/03/26 12:00:00' mes-wtc: webservice: wsdl-url: http://10.100.86.13:13002/TuxedoConnectionService/services/CommonMsgService req-timeout: 120 # 120s j2-mes: server-id: FABJ2A mail-box: TPSJOHS msgHeader: srvAddr: //10.100.86.13:13002 cancel_wo_url: http://10.101.60.14:8081/prms/api/cancelSjWoInfoByWoNo ``` - 自定义业务配置,如: - `dps-push-date`:数据推送时间。 - `mes-wtc`:调用 MES 系统的 WebService 地址。 - `cancel_wo_url`:取消工单的远程接口地址。 --- ## 总结 该配置文件是一个功能完整的 Spring Boot 微服务配置,涵盖了: - **基础服务配置**(端口、上下文路径) - **数据库连接**(Druid + Oracle + P6Spy) - **服务注册与发现**(Nacos) - **接口文档**(可选的 Knife4j) - **定时任务**(XXL-JOB) - **文件上传、日期格式、模板引擎** - **远程调用**(Feign、WebService) - **自定义业务配置** 适合用于企业级后台服务系统,具备良好的可维护性和可扩展性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值