且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

[20151221]11g设置db_flash_cache_file.txt

更新时间:2022-09-10 16:19:59

[20151221]11g设置db_flash_cache_file.txt

--11GR2下可以设置db_flash_cache_file与db_flash_cache_size参数,提高数据库的性能。
--我曾经通过例子,快速建立测试数据库,在里面使用ram盘,今天测试使用该参数看看。

http://blog.itpub.net/267265/viewspace-1845062/

1.环境:

SYS@book> @ &r/ver1

PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

# mkdir -p /mnt/ramdisk
# mount -t tmpfs -o size=8G tmpfs /mnt/ramdisk

2.设置参数:
SYS@book> show parameter db_flash_cache
NAME                 TYPE         VALUE
-------------------- ------------ -----------------
db_flash_cache_file  string
db_flash_cache_size  big integer  0

SYS@book> alter system set db_flash_cache_file='/mnt/ramdisk/ram.dbf' scope=spfile;
System altered.

SYS@book> alter system set db_flash_cache_size=200M scope=spfile;
System altered.

SYS@book> show spparameter db_flash_cache
SID      NAME                          TYPE          VALUE
-------- ----------------------------- ------------- ----------------------------
*        db_flash_cache_file           string        /mnt/ramdisk/ram.dbf
*        db_flash_cache_size           big integer   200M

3.重启数据库看看:
SYS@book> startup
ORACLE instance started.
Total System Global Area  626327552 bytes
Fixed Size                  2255832 bytes
Variable Size             243270696 bytes
Database Buffers          373293056 bytes
Redo Buffers                7507968 bytes
Database mounted.
Database opened.

$ ll -l /mnt/ramdisk/ram.dbf
-rw-r--r-- 1 oracle oinstall 209715200 2015-12-21 15:50:03 /mnt/ramdisk/ram.dbf

--注意一定要有写权限,我第一次没有权限报错。

4.如何测试呢?
--理论讲找一个大表,执行全表扫描。
--参考链接:http://dbaora.com/db-smart-flash-cache-in-oracle-11g/

Statistics

All I/O operations from DB smart flash cache are counted as physical I/O however Oracle also collects such informations
in new columns.

V$SQL - OPTIMIZED_PHY_READ_REQUESTS
V$SQLAREA - OPTIMIZED_PHY_READ_REQUESTS
V$FILESTAT - OPTIMIZED_PHYBLKRD

select name from v$statname where name like 'physical%optimized%';

NAME                                                          
------------------------------------
physical read requests optimized
physical read total bytes optimized

You can see such stats in V$SESSTAT and V$SYSSTAT

--在11g的AWR报告中出现了新的段落来描述数据库对象和SQL分别体现的高和低的Smart flash cache命中率。这些段落是:

Segment by unoptimized reads
Segment by Optimized reads
SQL ordered by Physical Reads (Unoptimized)

--在 AWR报告中I/O读取请求收益于Smart flash cache的被称作"Optimized reads", 仅仅是从普通SAS DISK读取的称作"Unoptimized Reads"
--参照链接测试我修改1点点:

create table test_tbl1 (id number, name varchar2(20)) storage(flash_cache keep);

$ strings /mnt/ramdisk/ram.dbf | grep -i aaaaaa

begin
  for i in 1..1000000
  loop
    insert into test_tbl1 values(i, 'aaaaaa');
  end loop;
  commit;
end;
/

SYS@book> select status, count(*) from v$bh group by status;
STATUS       COUNT(*)
---------- ----------
xcur            25765
free            12136
cr                 16

--我并没有看到作者的status='flashcur'.
$ strings /mnt/ramdisk/ram.dbf | grep -i aaaaaa
--也没有显示。

--插入多次, 记录数达到16000000。

--避开direct path read。
SCOTT@test> alter session set events '10949 trace name context forever, level 1';
Session altered.

SCOTT@book> select count(*) from  test_tbl1;
  COUNT(*)
----------
  16000000
 
STATUS       COUNT(*)
---------- ----------
xcur            42781
flashcur         4972
free             7252
cr                 51
--这次看到了status='flashcur'.不知道是否是这个原因。

$ strings /mnt/ramdisk/ram.dbf | grep -i aaaaaa |wc
2090338 2090338 16717810

--很明显这次存在信息,不知道什么条件触发使用。我分析表,当前占用:

SCOTT@book> select BLOCKS from dba_tables where owner='SCOTT' and table_name='TEST_TBL1';
    BLOCKS
----------
     38401

SCOTT@book> select 38401*8192/1024/1024 from dual ;
38401*8192/1024/1024
--------------------
          300.007813

SCOTT@book> select * from V$SEGMENT_STATISTICS where owner=user and object_name='TEST_TBL1' and statistic_name like 'optimized%' order by value desc;
OWNER  OBJECT_NAME  SUBOBJECT_ TABLESPACE_NAME TS#       OBJ#   DATAOBJ# OBJECT_TYPE        STATISTIC_NAME             STATISTIC#      VALUE
------ ------------ ---------- --------------- --- ---------- ---------- ------------------ -------------------------- ---------- ----------
SCOTT  TEST_TBL1               USERS             4      88927      88927 TABLE              optimized physical reads           11       4610
SCOTT  TEST_TBL1               USERS             4      88927      88927 TABLE              optimized physical writes          12          0

SCOTT@book> select count(*) from  test_tbl1;
  COUNT(*)
----------
  16000000

SCOTT@book> select * from V$SEGMENT_STATISTICS where owner=user and object_name='TEST_TBL1' and statistic_name like 'optimized%' order by value desc;
OWNER  OBJECT_NAME  SUBOBJECT_ TABLESPACE_NAME  TS#       OBJ#   DATAOBJ# OBJECT_TYPE        STATISTIC_NAME              STATISTIC#      VALUE
------ ------------ ---------- ---------------- --- ---------- ---------- ------------------ --------------------------- ---------- ----------
SCOTT  TEST_TBL1               USERS              4      88927      88927 TABLE              optimized physical reads            11       9454
SCOTT  TEST_TBL1               USERS              4      88927      88927 TABLE              optimized physical writes           12          0

--可以发现统计信息optimized physical reads发生变化。
--建立awr报表 exec dbms_workload_repository.create_snapshot();

Segments by Optimized Reads                 DB/Inst: BOOK/book  Snaps: 264-265
-> Total Optimized Read Requests:          12,131
-> Captured Segments account for   92.9% of Total

           Tablespace                      Subobject  Obj.     Optimized       
Owner         Name    Object Name            Name     Type         Reads  %Total
---------- ---------- -------------------- ---------- ----- ------------ -------
SCOTT      USERS      TEST_TBL1                       TABLE        9,454   77.93
SYS        SYSTEM     ICOL$                           TABLE        1,183    9.75
SYS        SYSTEM     OBJ$                            TABLE          585    4.82
SYS        SYSTEM     I_COL_USAGE$                    INDEX            9     .07
SYS        SYSTEM     I_OBJ2                          INDEX            6     .05
                          ------------------------------------------------------
--如果没有打开,Segments by Optimized Reads基本没有信息。

5.做一次10046跟踪看看:

SCOTT@book> @ &r/10046on 12
old   1: alter session set events '10046 trace name context forever, level &1'
new   1: alter session set events '10046 trace name context forever, level 12'
Session altered.

SCOTT@book> select count(*) from  test_tbl1;
  COUNT(*)
----------
  16000000

SCOTT@book> @ &r/10046off
Session altered.

********************************************************************************

SQL ID: 50gz4qp0t60yt Plan Hash: 1237300194

select count(*)
from
  test_tbl1


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0         25          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        2      0.99       1.00       4883      37672          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        4      1.00       1.00       4883      37697          0           1

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 83
Number of plan statistics captured: 1

Rows (1st) Rows (avg) Rows (max)  Row Source Operation
---------- ---------- ----------  ---------------------------------------------------
         1          1          1  SORT AGGREGATE (cr=37672 pr=4883 pw=0 time=1000780 us)
  16000000   16000000   16000000   TABLE ACCESS FULL TEST_TBL1 (cr=37672 pr=4883 pw=0 time=1262409 us cost=10474 size=0 card=16000000)

Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                       2        0.00          0.00
  Disk file operations I/O                        2        0.00          0.00
  db flash cache single block physical read
                                                525        0.00          0.00
  db flash cache multiblock physical read       426        0.00          0.01
  db file scattered read                        124        0.00          0.00
  db file sequential read                        55        0.00          0.00
  SQL*Net message from client                     2        2.93          2.93
********************************************************************************

--注意看db flash cache single block physical read,db flash cache multiblock physical read应该是相关的等待事件。

$ strings /mnt/ramdisk/ram.dbf | grep -i aaaaaa |wc
5778202 5778202 46212379
--缓存的记录也增加许多。

SCOTT@book> select sql_text,child_number,OPTIMIZED_PHY_READ_REQUESTS from V$SQL where sql_id='50gz4qp0t60yt';
SQL_TEXT                         CHILD_NUMBER OPTIMIZED_PHY_READ_REQUESTS
-------------------------------- ------------ ---------------------------
select count(*) from  test_tbl1             0                        4338
select count(*) from  test_tbl1             1                       38882

SCOTT@book> select * from V$FILESTAT;
     FILE#     PHYRDS    PHYWRTS   PHYBLKRD OPTIMIZED_PHYBLKRD  PHYBLKWRT SINGLEBLKRDS    READTIM   WRITETIM SINGLEBLKRDTIM   AVGIOTIM   LSTIOTIM   MINIOTIM   MAXIORTM   MAXIOWTM
---------- ---------- ---------- ---------- ------------------ ---------- ------------ ---------- ---------- -------------- ---------- ---------- ---------- ---------- ----------
         1      16082        144      29027               2056        188        15456         15          0             11          0          0          0          0          0
         2       2090        659       3772                  0        801         1834          2          1              1          0          0          0          0          0
         3         77       6062         77                  0      22326           77          0         19              0          0          0          0          0          0
         4      53729      21555      56788              53136      55749        53408         33         63             32          0          0          0          0          0
         5        297          0      22779                  0          0           56          1          0              0          0          0          0          0          0
         6          4          0          4                  0          0            4          0          0              0          0          0          0          0          0

6 rows selected.

--注意看 OPTIMIZED_PHYBLKRD字段。

6.最后做一个粗暴的测试,破坏ram盘看看会发生什么?

$ dd if=/dev/zero of=/mnt/ramdisk/ram.dbf bs=1M count=120;
120+0 records in
120+0 records out
125829120 bytes (126 MB) copied, 0.125441 seconds, 1.0 GB/s

SCOTT@book> select count(*) from  test_tbl1;
  COUNT(*)
----------
  16000000
--可以发现没有任何问题。

--检查alert*.log出现如下提示:

Mon Dec 21 17:03:50 2015
Encounter problem verifying flash cache /mnt/ramdisk/ram.dbf. Disable flash cache and issue an ORA-700 for diagnostics
Errors in file /u01/app/oracle/diag/rdbms/book/book/trace/book_gen0_25635.trc  (incident=70483):
ORA-00700: soft internal error, arguments: [kcbl2vfyfh_action], [db_flash_cache_file integrity check failed], [], [], [], [], [], [], [], [], [], []
Incident details in: /u01/app/oracle/diag/rdbms/book/book/incident/incdir_70483/book_gen0_25635_i70483.trc
Flash Cache: disabling started.
Flash Cache: future reads are disabled.
Start disabling flash cache writes..
Flash cache: future write-issues disabled
Mon Dec 21 17:03:51 2015
Flash cache: DBW1 stopping flash writes...
Mon Dec 21 17:03:51 2015
Flash cache: DBW0 stopping flash writes...
Mon Dec 21 17:03:51 2015
Flash cache: DBW2 stopping flash writes...
Flash cache: DBW1 garbage-collecting for issued writes..
Flash cache: DBW1 invalidating existing flash buffers..Flash cache: DBW0 garbage-collecting for issued writes..

Flash cache: DBW0 invalidating existing flash buffers..
Flash cache: DBW2 garbage-collecting for issued writes..
Flash cache: DBW2 invalidating existing flash buffers..
Flash cache: DBW1 done with write disabling. Checking other DBWs..
Flash cache: DBW0 done with write disabling. Checking other DBWs..
Flash cache: DBW2 done with write disabling. Checking other DBWs..
Mon Dec 21 17:03:52 2015
Dumping diagnostic data in directory=[cdmp_20151221170352], requested by (instance=1, osid=25635 (GEN0)), summary=[incident=70483].
Mon Dec 21 17:03:52 2015
Sweep [inc][70483]: completed
Sweep [inc2][70483]: completed
Flash cache: disable completed
db_flash_cache_file closed by DBW0. Flash cache disabled


$ cat /u01/app/oracle/diag/rdbms/book/book/trace/book_gen0_25635.trc
*** 2015-12-21 17:03:50.524
*** SESSION ID:(57.1) 2015-12-21 17:03:50.524
*** CLIENT ID:() 2015-12-21 17:03:50.524
*** SERVICE NAME:(SYS$BACKGROUND) 2015-12-21 17:03:50.524
*** MODULE NAME:() 2015-12-21 17:03:50.524
*** ACTION NAME:() 2015-12-21 17:03:50.524

Verifying flash cache header read wrong values: corrupt 1, bpid 0, inst_id 0, bsz 0, db_unique_name  db id 0, polluted 0, file_id_string  (retry 0)
Verifying flash cache header read wrong values: corrupt 1, bpid 0, inst_id 0, bsz 0, db_unique_name  db id 0, polluted 0, file_id_string  (retry 1)
Verifying flash cache header read wrong values: corrupt 1, bpid 0, inst_id 0, bsz 0, db_unique_name  db id 0, polluted 0, file_id_string  (retry 2)
Incident 70483 created, dump file: /u01/app/oracle/diag/rdbms/book/book/incident/incdir_70483/book_gen0_25635_i70483.trc
ORA-00700: soft internal error, arguments: [kcbl2vfyfh_action], [db_flash_cache_file integrity check failed], [], [], [], [], [], [], [], [], [], []

Start disabling flash cache..

*** 2015-12-21 17:03:52.212
Disabling completed.

--也就是flash盘出现问题,oracle自动关闭。

SYS@book> select status, count(*) from v$bh group by status;
STATUS       COUNT(*)
---------- ----------
xcur            46636
cr                 18

总结:
--实际上现在有一些服务器出厂已经自带ssd,充分利用这个快速读写设备,可以一定程度提高数据库的性能。当然我的测试测不出来。
--当然要达到exadata的效果那是不可能的。

--补充:
--如果我重启数据库,自动修复ram盘的错误信息。

$ strings /mnt/ramdisk/ram.dbf | less
Oracle RDBMS Flash Cache File
book

--另外不知道条件下触发会进入flash cache。