ORACLE后台进程DBWR/DBWn 数据库块写入器 Database Block Writer
在Oracle的英文书中有些将“数据库写进程”用DBWR表示,有些将它用DBWn表示。这是因为在一个Oracle实例中可以启动多个数据库写进程,特别是在要进行大规模输入/输出并且运行在多个CPU计算机上的Oracle数据库系统。Oracle在一个实例上最多启动10个数据库写进程,他们分别是DBW0~DBW9。(
《Oracle 9i&10g编程艺术:深入数据库体系结构》书中说可以多达20个数据库写进程???需实验验证一下。)验证可以最多20
数据库写进程负责将数据库高速缓冲区的脏缓冲区中的数据写到数据文件上。为了提高效率,数据库写进程并不是数据库高速缓冲区中的数据一有变化就写数据文件,而是积累了足够多的数据一次写一大批内在数据到数据文件上。
数据库写进程将在下列事件之一发生时把数据库高速缓冲区中的数据写到数据文件上:
  1. 当脏缓冲区的数量超过了所设定的限额。
  2. 当所设定的时间间隔已到。
  3. 当有进程需要数据库高速缓冲区却找不到空闲的缓冲区时。
  4. 当校验点发生时。
  5. 当某个表被删除(drop)或被截断(truncate)时。
  6. 当某个表空间被设置为只读状态(read only)时。
  7. 当使用类似于ALTER TABLESPACE users BEGIN BACKUP的命令对某个表空间进行联机备份时。
  8. 当某个临时表空间被设置为只脱机状态(offline)或正常状态(normal)时等。
某些比较繁忙的应用系统中,可以修改服务器参数文件spfile的DB_WRITER_PROCESSES参数,以允许使用多个DBWR进程。DBWn的性能可能很重要。如果它写出块的速度不够快,不能很快地释放缓冲区(可以重用来缓存其它块),就会看到Free Buffer Waits和Write Complete Waits的等待数和等待时间开始增长。
上机操作练习:
查看db_writer_processes参数设置的值是多少?
SQL> show parameter db_writer_processes
NAME                                 TYPE        VALUE
----------------------------------- ----------- -------
db_writer_processes                  integer     1
SQL> 
查看当前有多少个dbw进程
[root@HOSTNAME:/]#ps -ef |grep oracle|grep dbw
  oracle 168372      1   0   Nov 03      - 100:20 ora_dbw0_SZQX
[root@HOSTNAME:/]#
调整步聚:(需重启数据库生效)
  1. show parameter db_writer_processes
  2. alter system set db_writer_processes=2 scope=spfile;
  3. shutdown immediate
  4. startup
  5. show parameter db_writer_processes
  6. ps -ef | grep oracle |grep dbw