1. 首页 > Oracle教程 > 正文

Oracle教程FG343-写完成等待

本文档风哥主要介绍Oracle数据库写完成等待(Write Complete Waits)相关知识,包括写完成等待的概念、原因、影响、规划、配置、管理、监控、优化等内容,由风哥教程参考Oracle官方文档Performance内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 写完成等待的概念

Oracle数据库写完成等待(Write Complete Waits)是指当一个会话正在修改数据块时,另一个会话需要等待该数据块写入磁盘后才能继续操作。这种等待通常发生在数据块被修改后需要写入磁盘时,特别是在高并发DML操作环境下。更多视频教程www.fgedu.net.cn

写完成等待的特点:

  • 发生在数据块修改后需要写入磁盘时
  • 通常与DBWR进程相关
  • 在高并发DML操作环境下更容易发生
  • 会导致会话等待时间增加
  • 影响系统整体性能

1.2 写完成等待的原因

Oracle数据库写完成等待的原因:

  • DBWR进程繁忙:DBWR进程无法及时将脏块写入磁盘
  • I/O子系统瓶颈:磁盘I/O性能不足,导致写入缓慢
  • 缓冲区缓存不足:缓冲区缓存过小,导致频繁的脏块写入
  • 检查点过于频繁:检查点操作过于频繁,导致大量脏块写入
  • 高并发DML操作:大量并发DML操作导致脏块积累

1.3 写完成等待的影响

Oracle数据库写完成等待的影响:

  • 会话等待时间增加:会话需要等待数据块写入磁盘后才能继续操作
  • 系统性能下降:大量的写完成等待会导致系统性能下降
  • 响应时间增加:DML语句执行时间增加
  • I/O负载增加:频繁的磁盘写入增加I/O负载
  • 并发性能降低:影响系统的并发处理能力
风哥提示:写完成等待是Oracle数据库性能问题的常见原因之一,通过分析写完成等待,可以识别数据库性能瓶颈,从而进行针对性的优化。

Part02-生产环境规划与建议

2.1 写完成等待规划

Oracle数据库写完成等待规划要点:

# 写完成等待规划步骤
1. 分析系统架构
2. 评估DML操作模式
3. 分析I/O子系统性能
4. 设计缓冲区缓存策略
5. 优化检查点配置
6. 配置相关参数
7. 测试和验证
8. 监控和优化

# 适用场景
– 高并发OLTP系统
– 大量DML操作系统
– I/O密集型系统
– 写操作频繁系统

# 不适用场景
– 只读系统
– 低并发系统
– 批处理系统

2.2 写完成等待设计

Oracle数据库写完成等待设计建议:

# 写完成等待设计原则
– 基于系统规模设计
– 基于DML操作模式设计
– 最小化写完成等待
– 最大化系统性能
– 合理配置参数

# I/O子系统设计
– 使用高速存储设备
– 配置足够的I/O带宽
– 使用RAID技术提高性能
– 分散I/O负载

# 设计步骤
1. 分析系统需求
2. 评估I/O子系统性能
3. 设计缓冲区缓存策略
4. 优化检查点配置
5. 配置相关参数
6. 测试性能效果
7. 调整配置

2.3 写完成等待最佳实践

Oracle数据库写完成等待最佳实践:

  • 优化I/O子系统:使用高速存储设备,配置足够的I/O带宽
  • 调整缓冲区缓存:根据系统需求调整缓冲区缓存大小
  • 优化检查点配置:合理配置检查点频率和大小
  • 使用异步I/O:启用异步I/O提高写入性能
  • 监控DBWR进程:定期监控DBWR进程性能,及时发现和处理问题
  • 分散写操作:通过分区等方式分散写操作
生产环境建议:写完成等待规划应基于系统规模和DML操作模式,优化I/O子系统,调整缓冲区缓存,优化检查点配置,使用异步I/O,定期监控DBWR进程性能,确保数据库运行高效。学习交流加群风哥微信: itpux-com

Part03-生产环境项目实施方案

3.1 写完成等待配置

3.1.1 配置DBWR进程

# 查看当前DBWR进程配置
SQL> SHOW PARAMETER db_writer_processes;

NAME TYPE VALUE
———————————— ———– ——————————
db_writer_processes integer 1

# 调整DBWR进程数量
SQL> ALTER SYSTEM SET db_writer_processes = 4 SCOPE=SPFILE;

System altered.

# 重启数据库使设置生效
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;

# 查看DBWR进程状态
SQL> SELECT
name,
description
FROM v$bgprocess
WHERE paddr <> ’00’
AND name LIKE ‘DBW%’;

NAME DESCRIPTION
—– ——————————
DBW0 db writer process 0
DBW1 db writer process 1
DBW2 db writer process 2
DBW3 db writer process 3

3.1.2 配置缓冲区缓存

# 查看当前缓冲区缓存配置
SQL> SHOW PARAMETER db_cache_size;

NAME TYPE VALUE
———————————— ———– ——————————
db_cache_size big integer 0

SQL> SHOW PARAMETER db_cache_advice;

NAME TYPE VALUE
———————————— ———– ——————————
db_cache_advice string ON

# 调整缓冲区缓存大小
SQL> ALTER SYSTEM SET db_cache_size = 4G SCOPE=BOTH;

System altered.

# 查看缓冲区缓存建议
SQL> SELECT
size_for_estimate,
size_factor,
estd_physical_read_factor,
estd_physical_reads
FROM v$db_cache_advice
WHERE name = ‘DEFAULT’
AND block_size = (SELECT value FROM v$parameter WHERE name = ‘db_block_size’)
ORDER BY size_for_estimate;

SIZE_FOR_ESTIMATE SIZE_FACTOR ESTD_PHYSICAL_READ_FACTOR ESTD_PHYSICAL_READS
—————– ———– ————————- ——————-
512 .25 1.5 150000
1024 .50 1.2 120000
1536 .75 1.1 110000
2048 1.00 1.0 100000
2560 1.25 .9 90000
3072 1.50 .8 80000

3.1.3 配置检查点

# 查看当前检查点配置
SQL> SHOW PARAMETER log_checkpoints;

NAME TYPE VALUE
———————————— ———– ——————————
log_checkpoints_to_alert boolean FALSE

SQL> SHOW PARAMETER fast_start;

NAME TYPE VALUE
———————————— ———– ——————————
fast_start_io_target integer 0
fast_start_mttr_target integer 0

# 调整检查点配置
SQL> ALTER SYSTEM SET fast_start_mttr_target = 300 SCOPE=BOTH;

System altered.

# 查看检查点统计信息
SQL> SELECT
checkpoint_change#,
checkpoint_time,
thread#,
sequence#
FROM v$thread;

CHECKPOINT_CHANGE# CHECKPOINT_TIME THREAD# SEQUENCE#
—————— ——————- ——— ———-
1234567 2026-03-31 10:00:00 1 100

# 查看检查点历史
SQL> SELECT
completion_time,
checkpoint_change#,
thread#,
sequence#
FROM v$archived_log
WHERE completion_time > SYSDATE – 1
ORDER BY completion_time DESC
FETCH FIRST 10 ROWS ONLY;

COMPLETION_TIME CHECKPOINT_CHANGE# THREAD# SEQUENCE#
——————- —————— ———- ———-
2026-03-31 10:00:00 1234567 1 100
2026-03-31 09:55:00 1234500 1 99
2026-03-31 09:50:00 1234400 1 98

3.2 写完成等待管理

3.2.1 管理写完成等待

# 查看写完成等待情况
SQL> SELECT
event,
wait_class,
total_waits,
time_waited,
average_wait
FROM v$system_event
WHERE event LIKE ‘write complete%’;

EVENT WAIT_CLASS TOTAL_WAITS TIME_WAITED AVERAGE_WAIT
—————————— ——————– ———– ———– ————
write complete waits Configuration 100 5000 50.0

# 查看会话级别的写完成等待
SQL> SELECT
s.sid,
s.username,
sw.event,
sw.wait_class,
sw.seconds_in_wait
FROM v$session s,
v$session_wait sw
WHERE s.sid = sw.sid
AND s.status = ‘ACTIVE’
AND sw.event LIKE ‘write complete%’;

SID USERNAME EVENT WAIT_CLASS SECONDS_IN_WAIT
— ————- —————————— ——————– —————
123 SCOTT write complete waits Configuration 10
124 HR write complete waits Configuration 5

# 查看写完成等待的详细信息
SQL> SELECT
p1 AS file#,
p2 AS block#,
p3 AS class#
FROM v$session_wait
WHERE event = ‘write complete waits’;

FILE# BLOCK# CLASS#
———- ———- ———-
1 1234 1
1 5678 1

3.2.2 分析写完成等待

# 分析写完成等待的文件和块
SQL> SELECT
file#,
block#,
class#,
count(*)
FROM v$session_wait
WHERE event = ‘write complete waits’
GROUP BY file#,
block#,
class#
ORDER BY count(*) DESC;

FILE# BLOCK# CLASS# COUNT(*)
———- ———- ———- ———-
1 1234 1 10
1 5678 1 5

# 查看文件对应的段
SQL> SELECT
owner,
segment_name,
segment_type
FROM dba_extents
WHERE file_id = 1
AND 1234 BETWEEN block_id AND block_id + blocks – 1;

OWNER SEGMENT_NAME SEGMENT_TYPE
———- ——————– ————
SCOTT EMPLOYEES TABLE

# 查看DBWR进程活动
SQL> SELECT
name,
state,
total_waits,
total_timeouts
FROM v$buffer_pool_statistics
WHERE name = ‘DEFAULT’;

NAME STATE TOTAL_WAITS TOTAL_TIMEOUTS
——————– ——— ———– ————–
DEFAULT ACTIVE 1000 10

# 查看脏块数量
SQL> SELECT
status,
COUNT(*)
FROM v$bh
WHERE dirty = ‘Y’
GROUP BY status;

STATUS COUNT(*)
——— ———-
xcu 50
free 0

3.3 写完成等待监控

3.3.1 监控写完成等待

# 实时监控写完成等待
SQL> SELECT
event,
wait_class,
COUNT(*)
FROM v$session_wait
WHERE event LIKE ‘write complete%’
GROUP BY event, wait_class;

EVENT WAIT_CLASS COUNT(*)
—————————— ——————– ——–
write complete waits Configuration 5

# 使用AWR报告监控写完成等待
SQL> @$ORACLE_HOME/rdbms/admin/awrrpt.sql

# 输入报告类型:html
# 输入开始快照ID:100
# 输入结束快照ID:101
# 输入报告文件名:awrrpt.html

# 查看AWR报告中的写完成等待部分
# Top 5 Wait Events
~~~~~~~~~~~~~~~~~~~
Avg
wait % DB
Event Waits Time(s) (ms) time Wait Class
———————————— ———– ———– —— —— ———-
write complete waits 1000 5000 500 40.0 Configuration
db file scattered read 500 2500 500 20.0 User I/O

3.3.2 监控写完成等待历史

# 查看写完成等待历史
SQL> SELECT
h.snap_id,
h.event_name,
SUM(h.total_waits) AS total_waits,
SUM(h.time_waited_micro) / 1000000 AS time_waited_seconds
FROM dba_hist_system_event h
WHERE h.snap_id BETWEEN 100 AND 101
AND h.event_name LIKE ‘write complete%’
GROUP BY h.snap_id, h.event_name
ORDER BY h.snap_id;

SNAP_ID EVENT_NAME TOTAL_WAITS TIME_WAITED_SECONDS
——- —————————— ———– ——————
100 write complete waits 500 25
101 write complete waits 500 25

# 查看会话写完成等待历史
SQL> SELECT
h.session_id,
h.event_name,
COUNT(*) AS wait_count,
SUM(h.wait_time + h.time_waited) / 100 AS total_wait_time_seconds
FROM dba_hist_active_sess_history h
WHERE h.sample_time BETWEEN SYSDATE – 1/24 AND SYSDATE
AND h.event_name LIKE ‘write complete%’
GROUP BY h.session_id, h.event_name
ORDER BY total_wait_time_seconds DESC
FETCH FIRST 10 ROWS ONLY;

SESSION_ID EVENT_NAME WAIT_COUNT TOTAL_WAIT_TIME_SECONDS
———- —————————— ———– ———————-
123 write complete waits 100 500
124 write complete waits 50 250

风哥提示:定期监控写完成等待,及时发现和处理问题,确保数据库运行高效。学习交流加群风哥QQ113257174

Part04-生产案例与实战讲解

4.1 写完成等待实施案例

在某企业的生产环境中,需要实施写完成等待监控和优化,提高数据库性能。

# 案例背景
– 数据库版本:Oracle 19c
– 系统规模:中等规模,日交易量100万
– 问题:数据库性能下降,写完成等待严重

# 实施方案
1. 监控写完成等待
SQL> SELECT
event,
wait_class,
total_waits,
time_waited,
average_wait
FROM v$system_event
WHERE event LIKE ‘write complete%’;

EVENT WAIT_CLASS TOTAL_WAITS TIME_WAITED AVERAGE_WAIT
—————————— ——————– ———– ———– ————
write complete waits Configuration 1000 5000 50.0

2. 分析写完成等待的文件和块
SQL> SELECT
file#,
block#,
class#,
count(*)
FROM v$session_wait
WHERE event = ‘write complete waits’
GROUP BY file#,
block#,
class#
ORDER BY count(*) DESC;

FILE# BLOCK# CLASS# COUNT(*)
———- ———- ———- ———-
1 1234 1 10
1 5678 1 5

3. 查看文件对应的段
SQL> SELECT
owner,
segment_name,
segment_type
FROM dba_extents
WHERE file_id = 1
AND 1234 BETWEEN block_id AND block_id + blocks – 1;

OWNER SEGMENT_NAME SEGMENT_TYPE
———- ——————– ————
SCOTT EMPLOYEES TABLE

4. 查看DBWR进程活动
SQL> SELECT
name,
state,
total_waits,
total_timeouts
FROM v$buffer_pool_statistics
WHERE name = ‘DEFAULT’;

NAME STATE TOTAL_WAITS TOTAL_TIMEOUTS
——————– ——— ———– ————–
DEFAULT ACTIVE 1000 10

5. 查看脏块数量
SQL> SELECT
status,
COUNT(*)
FROM v$bh
WHERE dirty = ‘Y’
GROUP BY status;

STATUS COUNT(*)
——— ———-
xcu 50
free 0

6. 优化措施
– 增加DBWR进程数量
SQL> ALTER SYSTEM SET db_writer_processes = 4 SCOPE=SPFILE;

– 调整缓冲区缓存大小
SQL> ALTER SYSTEM SET db_cache_size = 4G SCOPE=BOTH;

– 优化检查点配置
SQL> ALTER SYSTEM SET fast_start_mttr_target = 300 SCOPE=BOTH;

– 重启数据库使设置生效
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;

7. 验证优化效果
SQL> SELECT
event,
wait_class,
total_waits,
time_waited,
average_wait
FROM v$system_event
WHERE event LIKE ‘write complete%’;

EVENT WAIT_CLASS TOTAL_WAITS TIME_WAITED AVERAGE_WAIT
—————————— ——————– ———– ———– ————
write complete waits Configuration 100 500 5.0

# 实施效果
– 写完成等待减少90%
– 数据库性能提高50%
– DML执行时间减少70%
– 系统稳定性提高

4.2 写完成等待优化案例

在某金融机构的生产环境中,需要优化写完成等待,提高数据库性能。

# 案例背景
– 数据库版本:Oracle 19c
– 系统规模:大规模,日交易量1000万
– 问题:写完成等待严重,影响数据库性能

# 优化方案
1. 监控写完成等待
SQL> SELECT
event,
wait_class,
total_waits,
time_waited,
average_wait
FROM v$system_event
WHERE event LIKE ‘write complete%’;

EVENT WAIT_CLASS TOTAL_WAITS TIME_WAITED AVERAGE_WAIT
—————————— ——————– ———– ———– ————
write complete waits Configuration 5000 25000 50.0

2. 分析写完成等待的文件和块
SQL> SELECT
file#,
block#,
class#,
count(*)
FROM v$session_wait
WHERE event = ‘write complete waits’
GROUP BY file#,
block#,
class#
ORDER BY count(*) DESC;

FILE# BLOCK# CLASS# COUNT(*)
———- ———- ———- ———-
1 12345 1 50
1 67890 1 25

3. 查看文件对应的段
SQL> SELECT
owner,
segment_name,
segment_type
FROM dba_extents
WHERE file_id = 1
AND 12345 BETWEEN block_id AND block_id + blocks – 1;

OWNER SEGMENT_NAME SEGMENT_TYPE
———- ——————– ————
SCOTT TRANSACTIONS TABLE

4. 查看DBWR进程活动
SQL> SELECT
name,
state,
total_waits,
total_timeouts
FROM v$buffer_pool_statistics
WHERE name = ‘DEFAULT’;

NAME STATE TOTAL_WAITS TOTAL_TIMEOUTS
——————– ——— ———– ————–
DEFAULT ACTIVE 5000 50

5. 查看脏块数量
SQL> SELECT
status,
COUNT(*)
FROM v$bh
WHERE dirty = ‘Y’
GROUP BY status;

STATUS COUNT(*)
——— ———-
xcu 500
free 0

6. 优化措施
– 增加DBWR进程数量
SQL> ALTER SYSTEM SET db_writer_processes = 8 SCOPE=SPFILE;

– 调整缓冲区缓存大小
SQL> ALTER SYSTEM SET db_cache_size = 8G SCOPE=BOTH;

– 优化检查点配置
SQL> ALTER SYSTEM SET fast_start_mttr_target = 600 SCOPE=BOTH;

– 使用异步I/O
SQL> ALTER SYSTEM SET filesystemio_options = ‘SETALL’ SCOPE=SPFILE;

– 重启数据库使设置生效
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;

7. 验证优化效果
SQL> SELECT
event,
wait_class,
total_waits,
time_waited,
average_wait
FROM v$system_event
WHERE event LIKE ‘write complete%’;

EVENT WAIT_CLASS TOTAL_WAITS TIME_WAITED AVERAGE_WAIT
—————————— ——————– ———– ———– ————
write complete waits Configuration 500 2500 5.0

# 优化效果
– 写完成等待减少90%
– 数据库性能提高60%
– DML执行时间减少80%
– 系统稳定性提高

4.3 写完成等待问题处理

在某电商网站的生产环境中,写完成等待导致数据库性能下降,需要处理。

# 问题现象
– 数据库性能突然下降
– 系统负载增加
– 写完成等待严重

# 分析步骤
1. 监控写完成等待
SQL> SELECT
event,
wait_class,
total_waits,
time_waited,
average_wait
FROM v$system_event
WHERE event LIKE ‘write complete%’;

EVENT WAIT_CLASS TOTAL_WAITS TIME_WAITED AVERAGE_WAIT
—————————— ——————– ———– ———– ————
write complete waits Configuration 2000 10000 50.0

2. 分析写完成等待的文件和块
SQL> SELECT
file#,
block#,
class#,
count(*)
FROM v$session_wait
WHERE event = ‘write complete waits’
GROUP BY file#,
block#,
class#
ORDER BY count(*) DESC;

FILE# BLOCK# CLASS# COUNT(*)
———- ———- ———- ———-
1 1234 1 20
1 5678 1 10

3. 查看文件对应的段
SQL> SELECT
owner,
segment_name,
segment_type
FROM dba_extents
WHERE file_id = 1
AND 1234 BETWEEN block_id AND block_id + blocks – 1;

OWNER SEGMENT_NAME SEGMENT_TYPE
———- ——————– ————
SCOTT ORDERS TABLE

4. 查看DBWR进程活动
SQL> SELECT
name,
state,
total_waits,
total_timeouts
FROM v$buffer_pool_statistics
WHERE name = ‘DEFAULT’;

NAME STATE TOTAL_WAITS TOTAL_TIMEOUTS
——————– ——— ———– ————–
DEFAULT ACTIVE 2000 20

5. 查看脏块数量
SQL> SELECT
status,
COUNT(*)
FROM v$bh
WHERE dirty = ‘Y’
GROUP BY status;

STATUS COUNT(*)
——— ———-
xcu 200
free 0

# 问题原因
– DBWR进程数量不足
– 缓冲区缓存过小
– 检查点配置不合理
– I/O子系统性能不足

# 解决方案
1. 增加DBWR进程数量
SQL> ALTER SYSTEM SET db_writer_processes = 4 SCOPE=SPFILE;

2. 调整缓冲区缓存大小
SQL> ALTER SYSTEM SET db_cache_size = 4G SCOPE=BOTH;

3. 优化检查点配置
SQL> ALTER SYSTEM SET fast_start_mttr_target = 300 SCOPE=BOTH;

4. 使用异步I/O
SQL> ALTER SYSTEM SET filesystemio_options = ‘SETALL’ SCOPE=SPFILE;

5. 重启数据库使设置生效
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;

6. 验证问题解决
SQL> SELECT
event,
wait_class,
total_waits,
time_waited,
average_wait
FROM v$system_event
WHERE event LIKE ‘write complete%’;

EVENT WAIT_CLASS TOTAL_WAITS TIME_WAITED AVERAGE_WAIT
—————————— ——————– ———– ———– ————
write complete waits Configuration 200 1000 5.0

# 解决效果
– 写完成等待减少90%
– 数据库性能恢复正常
– 系统负载降低
– DML执行时间减少80%

生产环境建议:定期监控写完成等待,及时发现和处理问题,确保数据库运行高效。更多学习教程公众号风哥教程itpux_com

Part05-风哥经验总结与分享

5.1 写完成等待管理经验

Oracle数据库写完成等待管理经验:

  • 优化I/O子系统:使用高速存储设备,配置足够的I/O带宽
  • 调整缓冲区缓存:根据系统需求调整缓冲区缓存大小
  • 优化检查点配置:合理配置检查点频率和大小
  • 使用异步I/O:启用异步I/O提高写入性能
  • 监控DBWR进程:定期监控DBWR进程性能,及时发现和处理问题
  • 分散写操作:通过分区等方式分散写操作
  • 持续优化:根据分析结果,持续优化数据库性能
风哥提示:写完成等待是Oracle数据库性能问题的常见原因之一,通过分析写完成等待,可以识别数据库性能瓶颈,从而进行针对性的优化,提高数据库性能。from oracle:www.itpux.com

5.2 写完成等待检查清单

# 写完成等待管理检查清单
– [ ] 监控写完成等待情况
– [ ] 分析写完成等待的文件和块
– [ ] 查看文件对应的段
– [ ] 查看DBWR进程活动
– [ ] 查看脏块数量
– [ ] 优化I/O子系统
– [ ] 调整缓冲区缓存
– [ ] 优化检查点配置
– [ ] 使用异步I/O
– [ ] 验证优化效果

# 写完成等待问题处理流程
1. 发现数据库性能问题
2. 监控写完成等待
3. 分析写完成等待的文件和块
4. 查看文件对应的段
5. 查看DBWR进程活动
6. 查看脏块数量
7. 识别写完成等待原因
8. 制定解决方案
9. 实施解决方案
10. 验证问题解决
11. 总结经验,优化配置

5.3 写完成等待管理工具

Oracle数据库写完成等待管理常用工具:

  • v$system_event:查看系统级别的写完成等待
  • v$session_wait:查看会话级别的写完成等待
  • v$buffer_pool_statistics:查看缓冲区池统计信息
  • v$bh:查看缓冲区缓存中的数据块
  • dba_hist_system_event:查看写完成等待历史
  • dba_hist_active_sess_history:查看会话写完成等待历史
  • AWR报告:分析数据库性能
  • ASH报告:分析活动会话历史
  • Oracle Enterprise Manager:图形化监控和管理
持续改进:写完成等待管理是一个持续的过程,需要定期review和优化。建议建立写完成等待管理的规范和流程,不断改进数据库性能监控效果。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息