oracle 查询统计

发布时间 2023-03-22 21:08:56作者: 蚌壳里夜有多长

1.是否锁定统计信息

select owner,table_name from dba_tab_statistics where statype_locked='ALL';

2.rowid算出文件号号块行号和object_id

select dbms_rowid.rowid_object(rowid) object_id

,dbms_rowid.rowid_relative_fno(rowid) file_id

,dbms_rowid.rowid_block_number(rowid) block_id

,dbms_rowid.rowid_row_number(rowid) row_number

from emp;

3.文件号块号反查出segment_name

select segment_name from dba_extents where file_id=7 and 1158 between block_id and block_id+blocks-1;

file_id=7

1158是块号

4.dump导出7号文件1158号块sql

alter system dump datafile 7 block 1158;

5.v$process和v$session 关联

select spid from v$process where addr in (select paddr from v$session where sid=1051);

6.找出dump文件路径

select value from v$diag_info where name='Default Trace File';

block_row_dump:
tab 0, row 0, @0x1f2d
tl: 83 fb: --H-FL-- lb: 0x0 cc: 6
col 0: [ 3] c2 64 0a
col 1: [ 3] 72 65 64
col 2: [ 8] 63 79 6c 69 6e 64 65 72
col 3: [ 3] c2 07 42
col 4: [ 7] 78 79 02 11 0c 01 01
col 5: [50]
78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78
78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 35 34
tab 0, row 1, @0x1edd
tl: 80 fb: --H-FL-- lb: 0x0 cc: 6
col 0: [ 3] c2 64 14
col 1: [ 3] 72 65 64
col 2: [ 5] 70 72 69 73 6d
col 3: [ 3] c2 02 08
col 4: [ 7] 78 79 02 11 0c 29 01
col 5: [50]

col 0: [ 3] c2 64 14 取出来,转换成实际

select replace('70 72 69 73 6d',' ','') from dual;

REPLACE('78790
--------------
707269736d

select utl_raw.cast_to_varchar2('707269736d') from dual;这里只支持varchar2

UTL_RAW.CAST_TO_VARCHAR2('707269736D')
--------------------------------------------------------------------------------
prism

7.加密后效果

执行加密:

alter table C##HRZ.BRICKS modify(servnumber encrypt using 'AES128' NO SALT);

重开一个窗口

alter system dump datafile 7 block 1158;

把trace文件在转出tab 0, row 30, @0x13a9tl: 111 fb: --H-FL-- lb: 0x2 cc: col 0: [ 3] c2 64 2f

col 1: [ 3] 72 65 64
col 2: [36]
e1 f2 f0 a3 85 76 0c 64 59 be 17 fa 38 c6 17 54 44 4d b7 ff 3f 76 4d fc 7b
31 05 b0 b3 46 f0 96 8f 8c d1 7f
col 3: [ 3] c2 04 23
col 4: [ 7] 78 79 02 12 11 29 01
col 5: [50]
78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78
78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 35 35
tab 0, row 31, @0x13a0
tl: 9 fb: --H----- lb: 0x2 cc: 0
nrid: 0x01c0020c.19
tab 0, row 32, @0x1331
tl: 111 fb: --H-FL-- lb: 0x2 cc: 6
col 0: [ 3] c2 64 31
col 1: [ 3] 72 65 64
select replace('e1 f2 f0 a3 85 76 0c 64 59 be 17 fa 38 c6 17 54 44 4d b7 ff 3f 76 4d fc 7b 31 05 b0 b3 46 f0 96 8f 8c d1 7f',' ','') from dual;

REPLACE('E1F2F0A385760C6459BE17FA38C61754444DB7FF3F764DFC7B3105B0B346F09
------------------------------------------------------------------------
e1f2f0a385760c6459be17fa38c61754444db7ff3f764dfc7b3105b0b346f0968f8cd17f

select utl_raw.cast_to_varchar2('e1f2f0a385760c6459be17fa38c61754444db7ff3f764dfc7b3105b0b346f0968f8cd17f') from dual;

UTL_RAW.CAST_TO_VARCHAR2('E1F2F0A385760C6459BE17FA38C61754444DB7FF3F764DFC7B3105
--------------------------------------------------------------------------------
???v
dY??8?TDM???vM?{1??F??

加密之后转出来是乱码了

开启WALLET

Oracle数据库加密表空间详解及操作过程 - 墨天轮 (modb.pro)

 

临时log

SELECT s.username, s.SID, u.TABLESPACE, u.CONTENTS, u.segtype,
ROUND (u.blocks * 8192 / 1024 / 1024, 2) mb
FROM v$session s, v$tempseg_usage u
WHERE s.saddr = u.session_addr AND u.CONTENTS = 'TEMPORARY'
ORDER BY mb DESC;

//##查看RMAN备份进度和进程19c

#!/bin/bash

export ORACLE_BASE=/home/db/oracle
export GRID_HOME=/home/db/grid/product/19.3.0
export ORACLE_HOME=/home/db/oracle/product/19.3.0
export PATH=$ORACLE_HOME/bin:$GRID_HOME/bin:$PATH:$ORACLE_HOME/OPatch
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/rdbms/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE/rdbms/jlib:$ORACLE_HOME/network/jlib
export ORACLE_SID=CNN000042
export Today=`date '+%Y%m%d%H%M%S'`

rman target / log /home/db/oracle/rman/log/fullback_$Today.log <<EOF

run{
allocate channel ch1 device type disk;
allocate channel ch2 device type disk;
allocate channel ch3 device type disk;
allocate channel ch4 device type disk;

backup section size 100G database root format '/home/db/oracle/rman/cnn00004_root/full_%d_%I_%T_%U.bk' tag='root_backup';
backup section size 100G datafile 2,4,6,8 format '/home/db/oracle/rman/cnn00004_seed/full_%d_%I_%T_%U.bk' tag='seed_backup';
backup section size 100G pluggable database cnn00004_01 format '/home/db/oracle/rman/cnn00004_01/full_%d_%I_%T_%U.bk' tag='cnn00004_01_backup';
###backup section size 100G pluggable database cnn00004_02 format '/home/db/oracle/rman/cnn00004_02/full_%d_%I_%T_%U.bk' tag='cnn00004_02_backup';
###backup section size 100G pluggable database cnn00004_03 format '/home/db/oracle/rman/cnn00004_03/full_%d_%I_%T_%U.bk' tag='cnn00004_03_backup';

### backup archivelog all not backed up 1 times 说明 - 备份过一次及以上的归档均不备份
backup archivelog all not backed up 1 times format '/home/db/oracle/rman/cnn00004_arch/arch_%d_%I_%T_%U.bk';

backup current controlfile format '/home/db/oracle/rman/cnn00004_control/c_%T_%t.bk';

backup spfile format '/home/db/oracle/rman/cnn00004_spfile/s_%T_%t.bk';

crosscheck backup;
crosscheck archivelog all;

delete noprompt expired backup of controlfile;
delete noprompt obsolete redundancy 3;

release channel ch1;
release channel ch2;
release channel ch3;
release channel ch4;
}
EOF

 

//##11gRMAN备份

run{

CONFIGURE RETENTION POLICY TO REDUNDANCY 2;

CONFIGURE CONTROLFILE AUTOBACKUP ON;

ALLOCATE CHANNEL ch00 TYPE DISK;

ALLOCATE CHANNEL ch01 TYPE DISK;

backup format '/mnt/backupfile/ora_full_%T_%t_%U' full database;

crosscheck backupset;

delete noprompt expired backup;

delete noprompt obsolete DEVICE TYPE DISK;

sql 'alter system archive log curent';

backup format '/mnt/backupfile/ora_arch_%T_%t_%U' archivelog all;

release channel ch00;

release channel ch01;

}

//##查看RMAN运行情况

select sid,SERIAL#,CONTEXT,SOFAR,TOTALWORK,round(sofar/totalwork*100,2) "%_complete" from v$session_longops where opname like '%RMAN%' and totalwork !=0;rman运行进度

select sid,spid,client_info from v$process p,v$session s where p.addr=s.paddr and client_info like '%rman%';rman运行进程id

select to_char(start_time,'YYYYMMDD-HH24MISS'),to_char(end_time),input_bytes,status from v$rman_backup_job_details;查看rman历史运行情况

//##杀RMAN会话

crsctl start crs -exc1 -nocrs

//归档使用率

select * from v$flash_recovery_area_usage;单实例快速恢复区

Delete archivelog until time 'sysdate-1/288'; 1/288=1/24/12=5分钟

Delete archivelog until time 'sysdate-1/480'; 1/480=1/24/20=3分钟

delete archivelog until time 'sysdate-1/720'; 1/720=1/24/30=2分钟

delete archivelog until time 'sysdate-1/1440';1/1440=1/24/60=1分钟

delete force archivelog until time ’sysdate-4/24‘; 4/24就是4小时 //不让删除则加force

//如何查看备份数据量

select input_bytes,output_bytes from v$rman_backup_job_details;

//查看ap的ip

select distinct machine from v$session;

linux:

netstat -tuln 看foreign address

//KILL SESSION 方式快速回滚

select xid,usn,state,pid,undoblocksdone,undoblockstotal,parentusn from v$fast_start_transactions;

//如何判断一个表中是否有重复值

select count(*),col1,col2 from C##HRZ.BRICKS group by col1,col2 having count(*) >=2

topevent看直方图--》看log file sync输出:MS1 MS2 MS4 MS8 MS16 MS32 MS64 MS128

MS128代表128微妙(10的负6次方秒)

MS1代表1微秒(10的负6次方秒)

//##logfilesync时间查看

select inst_id,event,wait_time_milli,wait_count,last_update_time from gv$event_histogram where lower(event)='log file sync' order by LAST_UPDATE_TIME;

select instance_number,event_name,wait_time_milli,wait_count,snap_id from dba_hist_event_histogram where  lower(event_name)='log file sync'  and rownum<10 order by snap_id;

v$system_event -----V$SYSTEM_EVENT displays information on total waits for an event. Note that the TIME_WAITED and AVERAGE_WAIT columns will contain a value of zero on those platforms that do not support a fast timing mechanism. If you are running on one of these platforms and you want this column to reflect true wait times, then you must set TIMED_STATISTICS to TRUE in the parameter file; doing this will have a small negative effect on system performance.

V$ACTIVE_SESSION_HISTORY

ash看time_waited

SELECT TO_CHAR(sample_time,'yyyymmdd hh24:mi:ss.ff'),
time_waited
from v$active_session_history
where event='log file sync'
and rownum<10;

time_waited是mi croseconds是10的负6次方秒

 //近一分钟求平均logfilesync

mos原语句

col minute for a12 tru
col event for a30 tru
col program for a40 tru
col total_wait_time for 999999999.999
col avg_time_waited for 999999999.999
select to_char(sample_time,'Mondd_hh24mi') minute,inst_id,event,
sum(time_waited)/1000 TOTAL_WAIT_TIME,count(*) WAITS,
avg(time_waited)/1000 AVG_TIME_WAITED
from gv$active_session_history
where event = 'log file sync'
group by to_char(sample_time,'Mondd_hh24mi'),inst_id,event
having avg(time_waited)/1000>&&threshold
order by 1,2;

近1分钟求平均

可用
select to_char(sample_time,'YYYYMMDDHH24MI') minute,
sum(time_waited)/1000 TOTAL_WAIT_TIME,count(*) WAITS,
avg(time_waited)/1000 AVG_TIME_WAITED
from gv$active_session_history
where event = 'log file sync'
and to_char(sample_time,'YYYYMMDDHH24MI')>'202303200110'
AND to_char(sample_time,'YYYYMMDDHH24MI')<'202303200111'
group by to_char(sample_time,'YYYYMMDDHH24MI');

log+cpu

select sum(decode(event,'log file sync',time_waited_micro,0)) lfs_waited
,sum(decode(event,'log file parllel',time_waited_micro,0)) lfpw_waited
,sum(decode(event,'db file sequential read',time_waited_micro,0)) seqr_waited
,sum(decode(event,'log file sync',time_waited,0)) lfs_waits
,sum(decode(event,'log file parllel',time_waited,0)) lfpw_waites
,sum(decode(event,'db file sequential read',time_waited,0)) seqr_waits
from v$system_event;

//##历史视图dba_hist_system_event

 

plsql改写,一秒一次求差值

select event,time_waited_micro mus,time_waited,average_wait from v$system_event where event='log file sync';

s求一分钟平均,加入除以total_waits

加带分母zero判断

set serveroutput on
declare
v_lfs1 number;
v_ttw1 number;
v_lfs2 number;
v_ttw2 number;
v_d number;
v_ex number;
begin
select time_waited_micro,total_waits into v_lfs1,v_ttw1 from v$system_event where event='log file sync';
dbms_lock.sleep(5);//改成10就是10秒钟。实测和ash及grafana结果一致。
select time_waited_micro,total_waits into v_lfs2,v_ttw2 from v$system_event where event='log file sync';
v_ex :=v_ttw2-v_ttw1;
if v_ex=0 then
dbms_output.put_line('zero');
else
v_d :=(v_lfs2-v_lfs1)/1000/(v_ex);
dbms_output.put_line('v_lfs1'||v_lfs1||'v_lfs2'||'v_lfs2'||'lfs_waited'||v_d);
end if;
end;
/

//表碎片率

with blocksize as (select value blocksize from v$parameter where name='db_block_size')
select a.owner||'.'||a.table_name name
,partition_name part_name
,round(100*(1-num_rows*avg_row_len/b.blocksize/decode(blocks,0,1,blocks))) fragment_pct
,object_type
,num_rows
,blocks
,last_analyzed
,stattype_locked
,stale_stats
from dba_tab_statistics a,blocksize b
WHERE
a.table_name='BRICKS'
and a.owner='C##HRZ';

 

DECODE(a,b,c,b/a)

参数意义:

当a=b时,输出c,否则输出b/a

decode(status,'OPEN','正常','异常')

select blocks from dba_tab_statistics where table_name='BRICKS' and owner='C##HRZ';

exec dbms_stats.gather_table_stats(ownname=>'SYS',tabname=>'BRICKS',cascade=>true,degree=>8,force=>TRUE);

//查看索引要看索引碎片率(就像表要看高水位)---逻辑读时高时低,且无索引失效,可能是碎片率高

看碎片率

dailycheck 里查索引碎片语句,查的是top20

条件是先排序后分页

order by fragment_pct)

where rownum<21

 

with seg as (select owner,segment_name||decode(partition_name,null,null,'.'||partition_name)segment_name,blocks,bytes segsize
from dba_segments
where owner not in
('SYSTEM','SYS','OUTLN','ORACLE_OCM','DBSNMP','APPQOSSYS','WMSYS','DIP','TSMSYS',
'EXFSYS','XDB','ANONYMOUS','MDSYS','ORDPLUGINS','ORDSYS','SI_INFORMTN_SCHEMA',
'SYSMAN','MGMT_VIEW','XS$NULL','ORDDATA','FLOWS_FILES','DMSYS','CTXSYS','OLAPSYS',
'MDDATA','SCOTT')
and segment_type like 'INDEX%'
and segment_name not like 'BIN$%==$0'
and bytes/1024/1024 > 8)
select * from (
select b.owner||'.'||b.index_name name
,round(100*(1-b.leaf_blocks/a.blocks)) fragment_pct
,leaf_blocks
,distinct_keys
,num_rows
,last_analyzed
from seg a,
(select owner,index_name,leaf_blocks,distinct_keys,num_rows,last_analyzed,initial_extent
from dba_indexes) b
where a.owner=b.owner
and a.segment_name=b.index_name
and a.segsize>b.initial_extent
union all
select b.owner||'.'||b.index_name name
,round(100*(1-b.leaf_blocks/a.blocks)) fragment_pct
,leaf_blocks
,distinct_keys
,num_rows
,last_analyzed
from seg a,
(select index_owner owner,index_name||'.'||partition_name index_name
,leaf_blocks,distinct_keys,num_rows,last_analyzed,initial_extent
from dba_ind_partitions) b
where a.owner=b.owner
and a.segment_name=b.index_name
and a.segsize>b.initial_extent
order by fragment_pct)
where rownum < 21;

//每个会话的Oracle数据库用户和当前用户全局区域(UGA)内存使用情况

SELECT USERNAME, VALUE || 'bytes' "Current UGA memory"
FROM V$SESSION sess, V$SESSTAT stat, V$STATNAME name
WHERE sess.SID = stat.SID
AND stat.STATISTIC# = name.STATISTIC#
AND name.NAME = 'session uga memory';

//##查看sql历史执行计划

SET PAGESIZE 10000

SET LINE 300
COL EVENT FOR A30
select TO_CHAR(SAMPLE_TIME,'YYYY-MM-DD HH24:MI:SS') TIME,SQL_ID,EVENT,USER_ID FROM dba_hist_active_sess_history WHERE SQL_ID='2d1p0p5k3f8fu' ORDER BY 1 desc;
//##开启10053trace追踪
alter session set tracefile_identifier='10053';
alter session set events='10053 trace name context forever,level 1';
select count(*) from v$rman_status;
alter session set events '10053 trace name context off';
select value from v$diag_info where name='Default Trace File';
//##检查OCR状态
grid@cjc-db-02:/home/grid$ ocrcheck
//##检查OCRDISK
grid@cjc-db-02:/home/grid$ crsctl query css ocrdisk
 
//##单查普通索引碎片率 不必像dailycheck里所有都查了然后排序再取前20 查单个就可以了

select /*+rule*/ b.owner||'.'||b.index_name name
,round(100*(1-b.leaf_blocks/a.blocks)) fragment_pct
,b.leaf_blocks
,b.distinct_keys
,b.num_rows
,b.last_analyzed
from dba_segments a,dba_indexes b
where a.owner=''
and a.segment_name=''
and a.index_name='';

//online 建立索引取消

再次创建索引报ORA-00955错误,ORA-00095:name is already used by an existing object.

DBMS_REPAIR.ONLINE_INDEX_CLEAN执行成功,但报错依然

select dbms_repair.online_index_clean(<problem index object_id>) from dual;

检查dba_objects,SYS_*的表和索引仍然存在。

DBMS_REPAIR.ONLINE_INDEX_CLEAN(DBMS_REPAIR.ALL_INDEX_ID)

如果在出现问题的对象的数据库活动不能停下来,则如下的PL/SQL block来处理

注:加上dbms_repair.lock_wait表示不是立刻清理,需要不断的寻找资源锁,直到抢到为止

declare
isClean boolean;
begin
isClean := FALSE;
while isClean=FALSE loop
isClean := dbms_repair.online_index_clean(dbms_repair.all_index_id,
dbms_repair.lock_wait);
dbms_lock.sleep(2);
end loop;
exception
when others then
RAISE;
end;
/
http://blog.itpub.net/28218939/viewspace-2638333/原文档

//purge_cursor不行的话加noparallelddl取消表的并行度

alter table tablename noparallel;

//v$session 和v$sql关联查询 看哪个ap上来的

//加上等待事件

select a.SID,
a.SERIAL#,
a.TYPE,
a.BLOCKING_SESSION,
a.EVENT,
a.STATE,
a.MACHINE,
b.SQL_ID,
b.SQL_TEXT,
b.PLAN_HASH_VALUE
from v$session a,v$sql b
where a.SQL_ID=B.SQL_ID
and b.SQL_ID=''
AND b.SQL_TEXT LIKE '%%'
AND b.plan_hash_value='';

V$SQL和v$active_session_history关联查询

select a.SID,
a.SERIAL#,
a.TYPE,
a.BLOCKING_SESSION,
a.EVENT,
a.STATE,
a.MACHINE,
b.SQL_ID,
b.SQL_TEXT,
b.PLAN_HASH_VALUE
from v$active_session_history a,v$sql b
where a.SQL_ID=B.SQL_ID
and b.SQL_ID=''
AND b.SQL_TEXT LIKE '%%'
AND b.plan_hash_value='';

//简单查看MACHINE

select
a.sid,a,serial#,
a.machine,b.sql_id,
b.sql_text,
b.plan_hash_value
from v$session a,v$sql b
where a.SQL_ID=B.SQL_ID
and b.SQL_ID=''
AND b.SQL_TEXT LIKE '%%'
AND b.plan_hash_value='';

//看连接

select distinct machine from v$session;

netstat -an|grep 

//数据泵预导出测试

expdp \'/ as sysdba\' ESTIMATE_ONLY=y schemas=EYGLE ESTIMATE=statistics
expdp \'/ as sysdba\' ESTIMATE_ONLY=y schemas=EYGLE ESTIMATE=blocks

取代getddl

用dba_tab_columns查字段类型

//查数据库会话对应的操作系统SPID

select spid from v$process where addr in (select paddr from v$session where sid=1053)

//查看操作系统用户对应的sid

select sid,serial#,username,sql_id,module,program from v$session where paddr in (select addr from v$process where spid in (ps -ef|grep LOCAL=YES));

//解析失败查看 $ORACLE_HOME/perl/bin/perl profile.pl

//死锁查看$ORACLE_HOME/perl/bin/perl lockchain.pl

//死锁杀会话$ORACLE_HOME/perl/bin/perl  seskill.pl

//##获得当前数据库scn

select dbms_flashback.get_system_change_number from dual;

数据导出

expdp cjc/cjc@cjcpdb DIRECTORY=expdp_dir DUMPFILE=cjc_t1.dmp logfile=cjc_expdp_t1.log 

tables=cjc.t1 flashback_scn=3658620

数据导入

impdp chen/chen@chenpdb DIRECTORY=expdp_dir DUMPFILE=cjc_t1.dmp logfile=cjc_impdp_t1.log 

remap_schema=cjc:chen remap_tablespace=cjctbs:chentbs table_exists_action=REPLACE

 //##查看真实的执行计划,不过需要游标在内存中

select plan_hash_value,child_number from v$sql where sql_id= '1juuwsjz2vvsy';

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(SQL_ID,CHILD_NUMBER));
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('1juuwsjz2vvsy',0)); ---例如

//##通过下边语句列出awr中的执行计划

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_AWR('1juuwsjz2vvsy'));  

//##最经常使用的查看执行计划方法

explain plan for + sql语句;

select * from table(dbms_xplan.display);

//##查看高级的执行计划

explain plan for + sql语句;

select * from table(dbms_xplan.display(NULL,NULL,'advanced -projection'));

//##查看带有A-ROWS的执行计划

select /*+ gather_plan_statistics */ ename from t2 where empno=7902;

select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

//##udev配置

ACTION=="add|change", KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=%N", RESULT=="", RUN+='/bin/raw /dev/raw/raw1 %N'

 

查看 uuid:

for i in b c d e f g; do /usr/lib/udev/scsi_id -g -u -d /dev/sd$i; done

创建 UDEV:

for i in b c d e f g;
do
echo "KERNEL==\"sd*\", ENV{DEVTYPE}==\"disk\",SUBSYSTEM==\"block\", PROGRAM==\"/lib/udev/scsi_id -g -u -d \$devnode\",RESULT==\"`/usr/lib/udev/scsi_id -g -u /dev/sd$i`\",RUN+=\"/bin/sh -c 'mknod /dev/asm-disk$i b \$major \$minor; chown grid:asmadmin /dev/asm-disk$i; chmod 0660 /dev/asm-disk$i'\"">>/etc/udev/rules.d/99-oracle-asmdevices.rules
done

/sbin/udevadm trigger --type=devices --action=change

生成对应硬件设备文件:

udevadm control -R

c

ls -ltr /dev/asm*

 

//##正确udev的配置方式

KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="1ATA_VBOX_HARDDISK_VB028931ab-67c49e98", SYMLINK+="asmdisks/asmdisk01", OWNER="grid", GROUP="asmadmin", MODE="0660"
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="1ATA_VBOX_HARDDISK_VBb60ff90f-fe336617", SYMLINK+="asmdisks/asmdisk02", OWNER="grid", GROUP="asmadmin", MODE="0660"
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="1ATA_VBOX_HARDDISK_VBcd3c03c2-6ba29590", SYMLINK+="asmdisks/asmdisk03", OWNER="grid", GROUP="asmadmin", MODE="0660"

udevadm trigger