Quantcast
Channel: Jimmy He – OracleBlog
Viewing all 129 articles
Browse latest View live

升级11.2.0.3到11.2.0.4你可能不知道的事情

$
0
0

升级patchset是小事?不是,patchset的升级从来都不是小事。如12.1.0.1到12.1.0.2就多了一个引人注目的in-memory options。今天说一个你可能不知道的从11.2.0.3升级到11.2.0.4的变化。(Solaris操作系统)

在高并发的连接时,如果listener“太忙”,就会在tcpip这一层把包丢弃,我们可以在操作系统上用命令看:

# netstat -sP tcp
TCP     tcpListenDrop       =     0
        tcpHalfOpenDrop     =     0

如果上述两个值长时间大于0,说明有排队现象,会导致系统网络速度变慢。

对应于listener,我们可以适当的加大queuesize参数,来解决上面的问题。

可是问题是,在没有设置的情况下,默认值是多少?

在文档TNS-12535 / ORA-12535 on Connection to Database (Doc ID 214122.1)中有提及:

Solaris testing shows the following.
 
Solaris
Oracle Version   Default QUEUESIZE Value
 
9.2              20423: listen(10, 5, 1)
10.1             26948: listen(10, 32, 1)
10.2             4621: listen(10, 32, 1)
11.1             12585: listen(10, 32, 1
11.2             552: listen(10, 32, SOV_DEFAULT)
 
From 10.1 onwards Solaris Oracle Net code is set to use value of 32.
This is fixed from release 11.2.0.4 and 12c onwards, that is Solaris QUEUESIZE will default use SOMAXCONN.
Note Unpublished Bug:13113888 Default Queuesize From Solaris not using OS Default

也就是说,在10.1之后,11.2.0.4之前,queuesize的大小是固定值32,而11.2.0.4(含)之后,大小就直接使用操作系统参数SOMAXCONN。

我们来验证一下:

我当前系统是11.2.0.4,也就是说,是受到SOMAXCONN的限制。我先设置了queuesize=123。

然后用truss开始跟踪:

从truss中,我们看到第三行变成了我预设的那个值(注:不同的主机,不同的操作系统版本,grep出来的行数可能不同,不一定在第三行):

好,我们取消queuesize的设置,恢复成默认值。

然后我们继续truss,继续grep看truss的结果:

看到第三行已经变成了128。

也就是说,在我不设置queuesize的情况下,我的11.2.0.4的数据库的listener的queuesize取决于操作系统参数SOMAXCONN,这个值是128。

而操作系统SOMAXCONN的值,我们其实可以看/usr/include/sys/socket.h文件,里面有SOMAXCONN的值:

最后,再说一下,在同一台主机上,还有一个11.2.0.3的数据库,按照上面的truss方法,得到的默认queuesize值为32。确实如文档所说。

所以,这篇文章介绍了用truss验证listener默认queuesize的大小。如MOS文档所说,不同版本的数据库,queuesize的大小是不一样的。

有时候,你从11.2.0.3升级到11.2.0.4,发觉连接风暴的问题缓解了,其实是内部行为不一样了,11.2.0.4默认取操作系统SOMAXCONN值,而现在的主机的SOMAXCONN,一般都比32要大。而这些变化,是Oracle Database 11g Release 2 (11.2.0.4) New Features不会提到的。:)


scalable lgwr

$
0
0

在12c之前的行为,LGWR主线程负责redo strand的读取,而由spawn出来的thread来模拟异步IO进行redo的写入,然后由main thread通知FG进程而结束log file sync的等待。(可以看到第0个lwp的CPU占据比其他几个lwp稍高。)

12c中有了scalable lgwr的功能,LGWR作为主进程做协调工作,具体的事情有slave进程LGnn来做。LGWR负责保证redo是按照顺序写入的,而slave LGnn根据LGWR的指示来进行redo strand的读取和redo的磁盘写入,并且由LGnn来直接通知FG进程写入完成而结束log file sync的等待。

1. lgwr的子进程lgnn,适用在多CPU的系统中,Oracle由参数_use_single_log_writer控制,(默认值是adaptive,另外还有true和false),当设置为默认值adaptive,会根据系统负载,自动的调节是single log writer还是scalable log writer。调节的时候,在lgwr的trace文件中可以看到:

*** 2016-03-10 18:35:27.186
*** SESSION ID:(6.30501) 2016-03-10 18:35:27.186
*** CLIENT ID:() 2016-03-10 18:35:27.186
*** SERVICE NAME:() 2016-03-10 18:35:27.186
*** MODULE NAME:() 2016-03-10 18:35:27.186
*** CLIENT DRIVER:() 2016-03-10 18:35:27.186
*** ACTION NAME:() 2016-03-10 18:35:27.186
*** CONTAINER ID:(1) 2016-03-10 18:35:27.186
 
Created 2 redo writer workers (2 groups of 1 each)
 
*** 2016-03-10 18:36:01.973
kcrfw_slave_adaptive_updatemode: scalable->single group0=612 all=711 rw=21594 single=17982 scalable_nopipe=43188 scalable_pipe=23753 scalable=40044
 
*** 2016-03-10 18:36:01.974
Adaptive scalable LGWR disabling workers
 
*** 2016-03-10 18:37:03.821
kcrfw_slave_adaptive_updatemode: single->scalable redorate=16125727 switch=6310908
 
*** 2016-03-10 18:37:03.821
Adaptive scalable LGWR enabling workers
 
*** 2016-03-10 18:39:04.897
kcrfw_slave_adaptive_updatemode: scalable->single group0=1629 all=1995 rw=23472 single=33246 scalable_nopipe=46944 scalable_pipe=25819 scalable=42197
 
*** 2016-03-10 18:39:04.898
Adaptive scalable LGWR disabling workers
 
*** 2016-03-10 18:46:17.654
Warning: log write elapsed time 513ms, size 7283KB
 
*** 2016-03-10 18:46:49.177
kcrfw_slave_adaptive_updatemode: single->scalable redorate=72735660 switch=35732461
 
*** 2016-03-10 18:46:49.178
 
Adaptive scalable LGWR enabling workers

2. LGnn的最多个数,有_max_outstanding_log_writes决定。

SQL> select KSPPINM,KSPPDESC,KSPPSTVL from x$ksppi a,x$ksppsv b where a.indx=b.indx and a.KSPPINM like '%outstanding_log%';
 
KSPPINM                                  KSPPDESC                                                                 KSPPSTVL
---------------------------------------- -------------------------------------------------------------------------------- -----------
_max_outstanding_log_writes              Maximum number of outstanding redo log writes                            2
 
SQL>

3. Dataguard的SYNC模式不能用到multiple LGWR属性:
LGnn (Log Writer Worker) On multiprocessor systems, LGWR creates worker processes to improve the performance of writing to the redo log.
LGWR workers are not used when there is a SYNC standby destination. Possible processes include LG00-LG99.
参考:New Background Processes In 12c (Doc ID 1625912.1)

4. 存在 scheduling delay for the slaves。在single instance中,high priority和highest priority都没有放LGWR;在RAC中,high priority中有放LGWR,但是没有LG*,可能会导致LGWR虽然有较高优先级,但是子进程没有较高优先级。所以,可能需要设置和lgwr一样priority的lgwr slave进程 。
参考Bug 20055279 : RAC PERF: LGWR CHOOSES TO USE SCALABLE LGWR BUT SINGLE LGWR PERFORMS BETTER

5. multiple LGWR适合多CPU的系统,特别是CPU高于64个以上的系统。我个人猜测是一方面在scalable lgwr情况下,lgwr起到协调者的作用,协调的时候需要消耗CPU进行计算。另外一方面,多个子进程之间也需要CPU资源进行同步信息,以保证其写的顺序。
LGWR workers are used when using a single LGWR would perform better. This applies to small systems (<= 64 cpus).
参考Bug 20055279 : RAC PERF: LGWR CHOOSES TO USE SCALABLE LGWR BUT SINGLE LGWR PERFORMS BETTER

6. LGnn进程之间会进行同步,我想这也是为什么能保证写redo log的时候,保证其一致性的原因。有的时候,LGnn之间不必要的同步,会导致性能变慢。
This means there will be unneeded LGWR slaves in each group and we will incur intra group synchronization costs for these.
参考 Bug 18683889 : SIGNIFICANT WAIT ON ”LGWR INTRA GROUP SYNC” WITH SCALABLE LGWR

7. 在AIX和HPIA环境中,启用scalable lgwr还可能导致数据库起不来,需要提前打好patch 21915719(注:打完patch 21915719之后,_use_single_log_writer=true就自动设置好了。)
参考 ALERT: Bug 21915719 Database hang or may fail to OPEN in 12c IBM AIX or HPUX Itanium – ORA-742, DEADLOCK or ORA-600 [kcrfrgv_nextlwn_scn] ORA-600 [krr_process_read_error_2] (Doc ID 1957710.1)
注意,这个文档已经变成ALERT类型,说明已经发生过比较多的问题。一般ALERT文档都是值得注意的预警性文档。

一窥12.2的新特性

$
0
0

9月的OOW快要到了,估计12.2的版本届时也会发布,今天我们来看提前一下相比于12.1,12.2多了那些新特性。
(注:这些新特性,大家仅当rumor看看就好,真正的12.2新特性,以实际发布为准。)

(1)PDB and CDB相关:

(1.1) PDB level snapshot
(1.2) cdb级别设置sga_target,pdb级别也可以(才可以)设置sga_target,
(1.2.1)总计各个pdb的sga_target可以大于instance级别的sga_target,但是单个pdb的sga_target不能大于instance级别的sga_target
(1.2.2)sga_min_size参数,可以在pdb级别设置。
(1.3) pdb级别设置 PGA_AGGREGATE_LIMIT 和 PGA_AGGREGATE_TARGET (默认情况下PGA_AGGREGATE_TARGET×2=PGA_AGGREGATE_LIMIT)
(1.4)控制PDB的IO使用,在12.2引入2个初始化参数MAX_IOPS和MAX_MBPS(注:这2个参数对non-cdb不适用,对exadata不适用。因为exadata有IO resource manager在cell上)
(1.5)12.2支持cdb的ADO

(2)TSDP(Transparent Sensitive Data Protection)相关:

使用Data Redaction或Oracle Virtual Private Database(12.1中),以及Unified Auditing或者FGA或者TDE.(12.2中新增),创建TSDP policy,为数据进行加密。
Enabling the TSDP policy either creates VPD policies, Data Redaction policies, Unified Audit policies, FGA policies or adds encryption on the protected objects and columns associated with sensitive types.
总体上说,就和DB_ULTRA_SAFE感觉类似,通过一个参数,就修改了默认的db_block_checking,db_block_checksum和db_lost_write_protect。
这个是通过设置TSDP policy,就增加了VPD policy,Data Redaction policy,Unified Audit policies, FGA policies 等等。

(3)rman相关:

(3.1) upgrade catalog或者drop catalog之前要输入2次,现在可以upgrade catalog noprompt,或者drop catalog noprompt
(3.2)repair命令。repaire=offline+restore+recover+online,支持repaire database,tablespace,datafile。
(3.3)增加recover database until available redo命令,用于自动找redo进行恢复。

(4)在线重定义相关:

(4.1)在线重定义增加ROLLBACK功能,在start_redef_table时定义,在finish_redef_table后使用。
(4.2)在线重定义监控视图:v$online_redef

(5) online DDL增强:

(5.1) alter table move ONLINE
(5.2) alter table modify ONLINE
(5.3) alter table split/merge partition ONLINE
(5.4) 为交换分区做准备的表,可以直接通过create table FOR EXCHANGE WITH TABLE命令生成。

(6) data pump相关:

(6.1)%L参数,比%U参数更好,从2位到10位,即原来的dump文件名为dmp%U为dmp01~dmp99,现在是dmp01~dmp2147483646
(6.2) impdp时,支持remap_directory参数。用于将datafile impdp时到不同的路径。

(7)in-memory相关:

(7.1)alter system set inmemory_size 增加inmmeory的大小,可以动态修改。
(7.2)inmemory faststart 通过DBMS_INMEMORY_ADMIN.ENABLE_FASTSTART (仅适用exadata)
(7.3)inmemory expression units(IMEU) 初始化参数INMEMORY_EXPRESSIONS_CAPTURE
(7.4)inmmeory结合ADO使用,通过alter table add policy NO INMEMORY segment after 10 days of no access

(8)Tuning相关:

(8.1)SPM Evolve Advisor不仅仅在SMB中搜索plan,还会从AWR,STS,cursor cache中搜索plan,如果搜到更好的plan,就加到SMB中,mark成accepted。
(8.2) 新功能:DBMS_SPM.LOAD_PLANS_FROM_AWR。不再需要先创建STS(DBMS_SQLTUNE.CREATE_SQLSET),再将awr中的plan load到STS(DBMS_SQLTUNE.SELECT_WORKLOAD_REPOSITORY),再将STS load到SPM(dbms_spm.load_plans_from_sqlset )。
(8.3) SPA测试的三个新参数:EXECUTE_TRIGGERS/REPLACE_SYSDATE_WITH/NUM_ROWS_TO_FETCH
SQL> EXEC dbms_sqlpa.set_analysis_task_parameter('sqlpa_task1', 'EXECUTE_TRIGGERS', 'FALSE')
SQL> EXEC dbms_sqlpa.set_analysis_task_parameter('sqlpa_task2', 'REPLACE_SYSDATE_WITH', 'SQLSET_SYSDATE')
SQL> EXEC dbms_sqlpa.set_analysis_task_parameter ('sqlpa_task3', 'NUM_ROWS_TO_FETCH', 'ALL_ROWS')
(8.4) N-way hash join和band join
(8.5)Continuous adaptive query plan。

(9)分区的新特性和sharding的新特性:

这2个我在之前写过文章,大家可以参考:

Partition:
『12.2 new feature of partition』

sharding:
『Oracle sharding database的一些概念』
『创建Oracle sharding database』
『闲聊sharding database架构』

RMAN active duplicate hanging on restore control file

$
0
0

12.1.0.2之后,duplicate target database for standby from active database的时候,总是hang死在restore controlfile的情况。这个由于Bug 19664695引起。(Bug22468652和Bug 20721271最终都可以归结到Bug 19664695上去。)

解决方法是在ORACLE_HOME和GRID_HOME的sqlnet.ora文件中都设置DISABLE_OOB=on 。详情可参考 RMAN active duplicate hanging on restore control file (Doc ID 2073604.1)

*** RMAN active duplicate hanging on restore control file (Doc ID 2073604.1) ***
 
#################
#
#  APPLIES TO:
#
#################
 
Oracle Database - Enterprise Edition - Version 12.1.0.2 and later
Information in this document applies to any platform.
SYMPTOMS
 
 Duplicate command gets hung while restoring the control file
 
RMAN-08016: channel ORA_AUX_DISK_1: starting datafile backup set restore
RMAN-08169: channel ORA_AUX_DISK_1: using network backup set from service SNPS
RMAN-08021: channel ORA_AUX_DISK_1: restoring control file
 
source database has an inactive session in there waiting on "SQL*Net break/reset to client"
 
 
#################
#
#  CAUSE
#
#################
 
BUG 20721271 DUPLICATE FOR STANDBY FROM ACTIVE DATABASE HANGS WHILE RESTORING CONTROL FILE
 
This bug has been marked as a duplicate of bug 19664695.
 
BUG 19664695 12C RMAN WALLET ORA-01031: INSUFFICIENT PRIVILEGES
 
 
 
#################
#
#  SOLUTION
#
#################
 
At the time of this writing, bug 19664695 is open and being worked on by development.
 
The workaround, until a permanent fix is available, is to:
 
1. On the dataguard (auxiliary) side, add the folowing line to the sqlnet.ora
DISABLE_OOB=on
2. Re-execute the duplicate command again
 
NOTE: Turning this parameter on disables the ability to send and receive "break" messages using urgent data provided by the underlying protocol. This would apply to all protocols used by the client.
 
For additional information, see:
 
What is DISABLE_OOB (Out Of Band Break)? (Note 373475.1)

STAT table 字段含义说明

$
0
0

当我们用DBMS_STATS.CREATE_STAT_TABLE备份统计信息的时候,我们可以看对应的备份统计信息表各个字段的含义。

根据Type有分T=table,I=index,C=column,S=system。具体含义见下:

desc of the STATS table (11.2.0.3)
 
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 STATID                                             VARCHAR2(30)
 TYPE                                               CHAR(1)
 VERSION                                            NUMBER
 FLAGS                                              NUMBER
 C1                                                 VARCHAR2(30)
 C2                                                 VARCHAR2(30)
 C3                                                 VARCHAR2(30)
 C4                                                 VARCHAR2(30)
 C5                                                 VARCHAR2(30)
 N1                                                 NUMBER
 N2                                                 NUMBER
 N3                                                 NUMBER
 N4                                                 NUMBER
 N5                                                 NUMBER
 N6                                                 NUMBER
 N7                                                 NUMBER
 N8                                                 NUMBER
 N9                                                 NUMBER
 N10                                                NUMBER
 N11                                                NUMBER
 N12                                                NUMBER
 D1                                                 DATE
 R1                                                 RAW(32)
 R2                                                 RAW(32)
 CH1                                                VARCHAR2(1000)
 CL1                                                CLOB

参考:Doc ID 188152.1 INTERNAL

谈谈”_db_block_max_cr_dba”

$
0
0

_db_block_max_cr_dba 这个隐含参数的作用是控制每个block(即一个dba下,或者说x$bh.dbablk)的最多cr块的个数。默认值是6(5个CR+1个XCUR)。

当产生一致性读(CR)的时候,session会从前镜像读取块,加载到buffer cache中,加载的这个块,我们叫CR copy。

保留多个版本的CR,可以缓解对buffer中block的并发争用(buffer busy wait),避免多个session同时读取一个buffer block。

但是如果版本过多,挂在一个hash chain下的block太多,又会造成CBC latch的争用。所以oracle选择了6个版本。

我们来测试一下CR copy的特性(数据库版本11.2.0.4):

数据初始化:
drop table t1 purge;
create table t1(c1 int, c2 char(700));
insert into t1 select rownum as c1,'x' as c2 from dual connect by level
<=10;
commit;
SQL> col file# for 999999999
SQL> col block# for 999999999
SQL> select dbms_rowid.rowid_relative_fno(rowid) as file#,
  2  dbms_rowid.rowid_block_number(rowid) as block#
  3  from t1;
 
     FILE#     BLOCK#
---------- ----------
         4       1365
         4       1365
         4       1365
         4       1365
         4       1365
         4       1365
         4       1365
         4       1365
         4       1365
         4       1365
 
10 rows selected.
 
SQL>
检查初始情况
SQL> startup force
ORACLE instance started.
 
Total System Global Area 4960579584 bytes
Fixed Size                  2289720 bytes
Variable Size             989859784 bytes
Database Buffers         3959422976 bytes
Redo Buffers                9007104 bytes
Database mounted.
Database opened.
SQL>
SQL>
SQL> select b.dbarfil, b.dbablk, b.class,tch,flag,
  2    decode(state,0,'free',1,'xcur',2,'scur',3,'cr', 4,'read',5,'mrec',6,'irec',7,'write',8,'pi',9,'memory',10,'mwrite',11,'donated') as state,
  3    decode(bitand(flag,1),0,'N','Y') dirty, decode(bitand(flag,16),0,'N','Y') temp, decode(bitand(flag,1536),0,'N','Y') ping,
  4    decode(bitand(flag,16384),0,'N','Y') stale, decode(bitand(flag,65536),0,'N','Y') direct, decode(bitand(flag,1048576),0,'N','Y') new ,
  5    cr_scn_bas, cr_scn_wrp, cr_uba_fil, cr_uba_blk, cr_uba_seq,
  6    (select object_name from dba_objects where object_id = b.obj) as object_name
  7  from x$bh b
  8  where
  9  dbarfil = 4 and dbablk = 1365;
 
no rows selected
 
SQL>

刚刚启动的时候,我们发现file#=4,block#=1365没有在buffer中。

开始构造一致性读:
 
session 1:
SQL> SELECT dbms_flashback.get_system_change_number from dual;
 
GET_SYSTEM_CHANGE_NUMBER
------------------------
                 2687527
 
SQL> update t1 set c2='y' where c1=1;
 
1 row updated.
 
SQL> SELECT dbms_flashback.get_system_change_number from dual;
 
GET_SYSTEM_CHANGE_NUMBER
------------------------
                 2687528
 
SQL>
 
session 2:
SQL> l
  1  select b.dbarfil, b.dbablk, b.class,tch,flag,
  2    decode(state,0,'free',1,'xcur',2,'scur',3,'cr', 4,'read',5,'mrec',6,'irec',7,'write',8,'pi',9,'memory',10,'mwrite',11,'donated') as state,
  3    decode(bitand(flag,1),0,'N','Y') dirty, decode(bitand(flag,16),0,'N','Y') temp, decode(bitand(flag,1536),0,'N','Y') ping,
  4    decode(bitand(flag,16384),0,'N','Y') stale, decode(bitand(flag,65536),0,'N','Y') direct, decode(bitand(flag,1048576),0,'N','Y') new ,
  5    cr_scn_bas, cr_scn_wrp, cr_uba_fil, cr_uba_blk, cr_uba_seq,
  6    (select object_name from dba_objects where object_id = b.obj) as object_name
  7  from x$bh b
  8  where
  9* dbarfil = 4 and dbablk = 1365
SQL> /
 
   DBARFIL     DBABLK      CLASS        TCH       FLAG STATE          DI TE PI ST DI NE CR_SCN_BAS CR_SCN_WRP CR_UBA_FIL CR_UBA_BLK CR_UBA_SEQ OBJECT_NAME
---------- ---------- ---------- ---------- ---------- -------------- -- -- -- -- -- -- ---------- ---------- ---------- ---------- ---------- ----------------
         4       1365          1          1   33554433 xcur           Y  N  N  N  N  N           0          0          0          0          0 T1
         4       1365          1          1     524288 cr             N  N  N  N  N  N     2687527          0          0          0          0 T1
 
SQL>

当开始DML之后,block中数据文件中加载到buffer中,此时一定会有一个xcur的block,和cr block。这是因为DML is always performed on the current copy of the block (Status=xcur).

Whenever an update is made to the block,
  If the current block is in the buffer (status = xcur)
    A clone of the current block is made (status=cr)
    Update is performed on the current block (status=xcur)
  Else (the desired block is not in the buffer)
    The block is read from the disk (status=xcur)
    A clone of the block is also made (status=cr)
    Update is performed on the current block (status=xcur)

xcur的block表示当前已经被修改过的block,是最新的block,注意DI列(Dirty列)已经是Y,表示这个block是buffer中的脏块。

cr block是在update之前,在内存中copy原来的xcur的block。我们看cr block的CR_SCN_BASE是update前一瞬间的SCN,即2687527。

即当update发生的时候,
   如果块在buffer中(块的状态为xcur),
      那么copy一份这个在buffer中的xcur的块,copy出来的块是cr块。
      更新这个块,且这个块的标记还是xcur。
   如果在buffer中没有这个块
      那么将这个block从磁盘读到buffer中(此时状态为xcur。这个过程,类似进行了一次没有一致性读的select,select的时候,当前块状态也是为xcur)
      将buffer中的xcur块,做一份copy,copy出来的块成为cr块
      更新这个块,且这个块的状态还是xcur

====================

由于刚刚进行了update,且没有commit。所以现在的select是需要进行一致性读。
 
session 3:
SQL> select * from t1 where c1=1;
 
session2:
SQL>
SQL> l
  1  select b.dbarfil, b.dbablk, b.class,tch,flag,
  2    decode(state,0,'free',1,'xcur',2,'scur',3,'cr', 4,'read',5,'mrec',6,'irec',7,'write',8,'pi',9,'memory',10,'mwrite',11,'donated') as state,
  3    decode(bitand(flag,1),0,'N','Y') dirty, decode(bitand(flag,16),0,'N','Y') temp, decode(bitand(flag,1536),0,'N','Y') ping,
  4    decode(bitand(flag,16384),0,'N','Y') stale, decode(bitand(flag,65536),0,'N','Y') direct, decode(bitand(flag,1048576),0,'N','Y') new ,
  5    cr_scn_bas, cr_scn_wrp, cr_uba_fil, cr_uba_blk, cr_uba_seq,
  6    (select object_name from dba_objects where object_id = b.obj) as object_name
  7  from x$bh b
  8  where
  9* dbarfil = 4 and dbablk = 1365
SQL> /
 
   DBARFIL     DBABLK      CLASS        TCH       FLAG STATE          DI TE PI ST DI NE CR_SCN_BAS CR_SCN_WRP CR_UBA_FIL CR_UBA_BLK CR_UBA_SEQ OBJECT_NAME
---------- ---------- ---------- ---------- ---------- -------------- -- -- -- -- -- -- ---------- ---------- ---------- ---------- ---------- ---------------
         4       1365          1          1     524288 cr             N  N  N  N  N  N     2687546          0          3        317        980 T1
         4       1365          1          1     524288 cr             N  N  N  N  N  N     2687545          0          3        317        980 T1
         4       1365          1          1   33554433 xcur           Y  N  N  N  N  N           0          0          0          0          0 T1   
<<原来的xcur block
        
4       1365          1          1     524288 cr             N  N  N  N  N  N     2687527          0          0          0          0 T1  << 原来的cr block
 
SQL>
 
SQL> select tablespace_name from dba_data_files where file_id=3;
 
TABLESPACE_NAME
------------------------------------------------------------
UNDOTBS1
 
SQL>

第一次的select,oracle一次性创建了2个CR block,分别是在SCN 2687545和SCN 2687546的时候。

这个时候,由于是需要一致性读,因此这次的select是从前镜像读取,从undo中读取,所以,也可以看到这个前镜像块是从undo的那个块上读取,可以看到有UBA(undo block address)的file id,block id和sequence。file id为3,是在undo tablespace上。

===============

session 4:
SQL> select * from t1 where c1=1;
 
session 2:
SQL> l
  1  select b.dbarfil, b.dbablk, b.class,tch,flag,
  2    decode(state,0,'free',1,'xcur',2,'scur',3,'cr', 4,'read',5,'mrec',6,'irec',7,'write',8,'pi',9,'memory',10,'mwrite',11,'donated') as state,
  3    decode(bitand(flag,1),0,'N','Y') dirty, decode(bitand(flag,16),0,'N','Y') temp, decode(bitand(flag,1536),0,'N','Y') ping,
  4    decode(bitand(flag,16384),0,'N','Y') stale, decode(bitand(flag,65536),0,'N','Y') direct, decode(bitand(flag,1048576),0,'N','Y') new ,
  5    cr_scn_bas, cr_scn_wrp, cr_uba_fil, cr_uba_blk, cr_uba_seq,
  6    (select object_name from dba_objects where object_id = b.obj) as object_name
  7  from x$bh b
  8  where
  9* dbarfil = 4 and dbablk = 1365
SQL> /
 
   DBARFIL     DBABLK      CLASS        TCH       FLAG STATE          DI TE PI ST DI NE CR_SCN_BAS CR_SCN_WRP CR_UBA_FIL CR_UBA_BLK CR_UBA_SEQ OBJECT_NAME
---------- ---------- ---------- ---------- ---------- -------------- -- -- -- -- -- -- ---------- ---------- ---------- ---------- ---------- -----------------
         4       1365          1          1     524288 cr             N  N  N  N  N  N     2687575          0          3        317        980 T1
         4       1365          1          1     524288 cr             N  N  N  N  N  N     2687546          0          3        317        980 T1
<< 第一次selectcr block
        
4       1365          1          1     524288 cr             N  N  N  N  N  N     2687545          0          3        317        980 T1 << 第一次selectcr block
        
4       1365          1          1   33554433 xcur           Y  N  N  N  N  N           0          0          0          0          0 T1 <<原来的xcur block
        
4       1365          1          1     524288 cr             N  N  N  N  N  N     2687527          0          0          0          0 T1 <<原来的cr block
 
SQL>

第二次的select,oracle只创建了1个CR block,分别是在SCN 2687575的时候。 读取的是在undo上的同一个UBA file id,block id和sequence,所以,在undo文件上的块是同一个块,但是在buffer中,cr块目前已经有3个cr块了。

另外还有一个cr块,但是这个块是在做update的时候,对于该session来说在update之前的xcur的copy。不是从undo文件中读取的block。

===============

session 5:
SQL> select * from t1 where c1=1;
 
session 2:
SQL> l
  1  select b.dbarfil, b.dbablk, b.class,tch,flag,
  2    decode(state,0,'free',1,'xcur',2,'scur',3,'cr', 4,'read',5,'mrec',6,'irec',7,'write',8,'pi',9,'memory',10,'mwrite',11,'donated') as state,
  3    decode(bitand(flag,1),0,'N','Y') dirty, decode(bitand(flag,16),0,'N','Y') temp, decode(bitand(flag,1536),0,'N','Y') ping,
  4    decode(bitand(flag,16384),0,'N','Y') stale, decode(bitand(flag,65536),0,'N','Y') direct, decode(bitand(flag,1048576),0,'N','Y') new ,
  5    cr_scn_bas, cr_scn_wrp, cr_uba_fil, cr_uba_blk, cr_uba_seq,
  6    (select object_name from dba_objects where object_id = b.obj) as object_name
  7  from x$bh b
  8  where
  9* dbarfil = 4 and dbablk = 1365
SQL> /
 
   DBARFIL     DBABLK      CLASS        TCH       FLAG STATE          DI TE PI ST DI NE CR_SCN_BAS CR_SCN_WRP CR_UBA_FIL CR_UBA_BLK CR_UBA_SEQ OBJECT_NAME
---------- ---------- ---------- ---------- ---------- -------------- -- -- -- -- -- -- ---------- ---------- ---------- ---------- ---------- -------------------
         4       1365          1          1     524288 cr             N  N  N  N  N  N     2687595          0          3        317        980 T1
         4       1365          1          1     524288 cr             N  N  N  N  N  N     2687575          0          3        317        980 T1
<< 第二次selectcr block
        
4       1365          1          1     524288 cr             N  N  N  N  N  N     2687546          0          3        317        980 T1 << 第一次selectcr block
        
4       1365          1          1     524288 cr             N  N  N  N  N  N     2687545          0          3        317        980 T1 << 第一次selectcr block
        
4       1365          1          1   33554433 xcur           Y  N  N  N  N  N           0          0          0          0          0 T1 <<原来的xcur block
 
SQL>

第三次的select,oracle只创建了1个CR block,分别是在SCN 2687595的时候。 读取的是在undo上的同一个UBA file id,block id和sequence,所以,在undo文件上的块是同一个块,但是在buffer中,cr块目前已经有4个cr块了。

另外我们注意到,oracle已经把第一次做update的时候,SCN 2687527的cr块刷出去了。这个被丢弃的CR block,对我做update的session来说,已经没有用处,因为当前session的block的值已经更新,当前session所需要的block是xcur的那个block。而对已其他session来说,由于还没有commit,需要读取前镜像,可以直接做第一次和第二次cr block的copy;或者直接从undo中加载。

===============

session 6:
SQL> select * from t1 where c1=1;
 
 
session 2:
SQL> l
  1  select b.dbarfil, b.dbablk, b.class,tch,flag,
  2    decode(state,0,'free',1,'xcur',2,'scur',3,'cr', 4,'read',5,'mrec',6,'irec',7,'write',8,'pi',9,'memory',10,'mwrite',11,'donated') as state,
  3    decode(bitand(flag,1),0,'N','Y') dirty, decode(bitand(flag,16),0,'N','Y') temp, decode(bitand(flag,1536),0,'N','Y') ping,
  4    decode(bitand(flag,16384),0,'N','Y') stale, decode(bitand(flag,65536),0,'N','Y') direct, decode(bitand(flag,1048576),0,'N','Y') new ,
  5    cr_scn_bas, cr_scn_wrp, cr_uba_fil, cr_uba_blk, cr_uba_seq,
  6    (select object_name from dba_objects where object_id = b.obj) as object_name
  7  from x$bh b
  8  where
  9* dbarfil = 4 and dbablk = 1365
SQL> /
 
   DBARFIL     DBABLK      CLASS        TCH       FLAG STATE          DI TE PI ST DI NE CR_SCN_BAS CR_SCN_WRP CR_UBA_FIL CR_UBA_BLK CR_UBA_SEQ OBJECT_NAME
---------- ---------- ---------- ---------- ---------- -------------- -- -- -- -- -- -- ---------- ---------- ---------- ---------- ---------- -------------------
         4       1365          1          1     524288 cr             N  N  N  N  N  N     2687615          0          3        317        980 T1
         4       1365          1          1     524288 cr             N  N  N  N  N  N     2687595          0          3        317        980 T1
<< 第三次selectcr block
        
4       1365          1          1     524288 cr             N  N  N  N  N  N     2687575          0          3        317        980 T1 << 第二次selectcr block
        
4       1365          1          1     524288 cr             N  N  N  N  N  N     2687546          0          3        317        980 T1 << 第一次selectcr block
        
4       1365          1          1     524288 cr             N  N  N  N  N  N     2687545          0          3        317        980 T1 << 第一次selectcr block
        
4       1365          1          1   33554433 xcur           Y  N  N  N  N  N           0          0          0          0          0 T1 <<原来的xcur block
 
6 rows selected.
 
SQL>

第四次的select,oracle只创建了1个CR block,分别是在SCN 2687615的时候。 读取的是在undo上的同一个UBA file id,block id和sequence,所以,在undo文件上的块是同一个块,但是在buffer中,cr块目前已经有5个cr块了。

===============

session 7:
SQL> select * from t1 where c1=1;
 
session 2:
SQL> l
  1  select b.dbarfil, b.dbablk, b.class,tch,flag,
  2    decode(state,0,'free',1,'xcur',2,'scur',3,'cr', 4,'read',5,'mrec',6,'irec',7,'write',8,'pi',9,'memory',10,'mwrite',11,'donated') as state,
  3    decode(bitand(flag,1),0,'N','Y') dirty, decode(bitand(flag,16),0,'N','Y') temp, decode(bitand(flag,1536),0,'N','Y') ping,
  4    decode(bitand(flag,16384),0,'N','Y') stale, decode(bitand(flag,65536),0,'N','Y') direct, decode(bitand(flag,1048576),0,'N','Y') new ,
  5    cr_scn_bas, cr_scn_wrp, cr_uba_fil, cr_uba_blk, cr_uba_seq,
  6    (select object_name from dba_objects where object_id = b.obj) as object_name
  7  from x$bh b
  8  where
  9* dbarfil = 4 and dbablk = 1365
SQL> /
 
   DBARFIL     DBABLK      CLASS        TCH       FLAG STATE          DI TE PI ST DI NE CR_SCN_BAS CR_SCN_WRP CR_UBA_FIL CR_UBA_BLK CR_UBA_SEQ OBJECT_NAME
---------- ---------- ---------- ---------- ---------- -------------- -- -- -- -- -- -- ---------- ---------- ---------- ---------- ---------- -------------------
         4       1365          1          1     524288 cr             N  N  N  N  N  N     2687643          0          3        317        980 T1
         4       1365          1          1     524288 cr             N  N  N  N  N  N     2687615          0          3        317        980 T1
         4       1365          1          1     524288 cr             N  N  N  N  N  N     2687595          0          3        317        980 T1
         4       1365          1          1     524288 cr             N  N  N  N  N  N     2687575          0          3        317        980 T1
         4       1365          1          1     524288 cr             N  N  N  N  N  N     2687546          0          3        317        980 T1
         4       1365          1          1   33554433 xcur           Y  N  N  N  N  N           0          0          0          0          0 T1
 
6 rows selected.
 
SQL>

第五次的select,oracle只创建了1个CR block,分别是在SCN 2687643的时候。 创建这个CR block的时候,把当前cr block列表中最早的SCN 2687545的block丢弃了。只保留5个CR block。

至此,我们看到,不同的session的select,对cr block的影响:
update但不commit,在update时产生一个cr block。
第一次select从undo获得前镜像产生2个cr block,当前共3个cr block
第二次select再产生一个cr block,当前共4个cr block
第三次select再产生一个cr block,且丢弃update时的cr block,当前共4个cr block
第四次select再生产一个cr block,至此已经有了5个cr block和1个xcur block
第五次select再产生一个cr block,丢弃第一次select产生的第一个block,只保留5个cr block和1一个xcur block
再后续select的话,每产生一个cr block,丢弃最早的cr block

===============

我们再来看看flush buffer cache的影响:
 
session 2:
SQL> alter system flush buffer_cache;
 
System altered.
 
SQL> select b.dbarfil, b.dbablk, b.class,tch,flag,
  2    decode(state,0,'free',1,'xcur',2,'scur',3,'cr', 4,'read',5,'mrec',6,'irec',7,'write',8,'pi',9,'memory',10,'mwrite',11,'donated') as state,
  3    decode(bitand(flag,1),0,'N','Y') dirty, decode(bitand(flag,16),0,'N','Y') temp, decode(bitand(flag,1536),0,'N','Y') ping,
  4    decode(bitand(flag,16384),0,'N','Y') stale, decode(bitand(flag,65536),0,'N','Y') direct, decode(bitand(flag,1048576),0,'N','Y') new ,
  5    cr_scn_bas, cr_scn_wrp, cr_uba_fil, cr_uba_blk, cr_uba_seq,
  6    (select object_name from dba_objects where object_id = b.obj) as object_name
  7  from x$bh b
  8  where
  9  dbarfil = 4 and dbablk = 1365;
 
   DBARFIL     DBABLK      CLASS        TCH       FLAG STATE          DI TE PI ST DI NE CR_SCN_BAS CR_SCN_WRP CR_UBA_FIL CR_UBA_BLK CR_UBA_SEQ OBJECT_NAME
---------- ---------- ---------- ---------- ---------- -------------- -- -- -- -- -- -- ---------- ---------- ---------- ---------- ---------- ------------------
         4       1365          1          0          0 free           N  N  N  N  N  N           0          0          0          0          0 T1
         4       1365          1          0          0 free           N  N  N  N  N  N           0          0          0          0          0 T1
         4       1365          1          0          0 free           N  N  N  N  N  N           0          0          0          0          0 T1
         4       1365          1          0          0 free           N  N  N  N  N  N           0          0          0          0          0 T1
         4       1365          1          0          0 free           N  N  N  N  N  N           0          0          0          0          0 T1
         4       1365          1          0          0 free           N  N  N  N  N  N           0          0          0          0          0 T1
 
6 rows selected.
 
SQL>
 
session 8:
SQL> select * from t1 where c1=1;
 
session 2:
SQL> l
  1  select b.dbarfil, b.dbablk, b.class,tch,flag,
  2    decode(state,0,'free',1,'xcur',2,'scur',3,'cr', 4,'read',5,'mrec',6,'irec',7,'write',8,'pi',9,'memory',10,'mwrite',11,'donated') as state,
  3    decode(bitand(flag,1),0,'N','Y') dirty, decode(bitand(flag,16),0,'N','Y') temp, decode(bitand(flag,1536),0,'N','Y') ping,
  4    decode(bitand(flag,16384),0,'N','Y') stale, decode(bitand(flag,65536),0,'N','Y') direct, decode(bitand(flag,1048576),0,'N','Y') new ,
  5    cr_scn_bas, cr_scn_wrp, cr_uba_fil, cr_uba_blk, cr_uba_seq,
  6    (select object_name from dba_objects where object_id = b.obj) as object_name
  7  from x$bh b
  8  where
  9* dbarfil = 4 and dbablk = 1365
SQL> /
 
   DBARFIL     DBABLK      CLASS        TCH       FLAG STATE          DI TE PI ST DI NE CR_SCN_BAS CR_SCN_WRP CR_UBA_FIL CR_UBA_BLK CR_UBA_SEQ OBJECT_NAME
---------- ---------- ---------- ---------- ---------- -------------- -- -- -- -- -- -- ---------- ---------- ---------- ---------- ---------- -----------------
         4       1365          1          1     524288 cr             N  N  N  N  N  N     2687685          0          3        317        980 T1
         4       1365          1          0   34078721 xcur           Y  N  N  N  N  N           0          0          0          0          0 T1
         4       1365          1          0          0 free           N  N  N  N  N  N           0          0          0          0          0 T1
         4       1365          1          0          0 free           N  N  N  N  N  N           0          0          0          0          0 T1
         4       1365          1          0          0 free           N  N  N  N  N  N           0          0          0          0          0 T1
         4       1365          1          0          0 free           N  N  N  N  N  N           0          0          0          0          0 T1
         4       1365          1          0          0 free           N  N  N  N  N  N           0          0          0          0          0 T1
         4       1365          1          0          0 free           N  N  N  N  N  N           0          0          0          0          0 T1
 
8 rows selected.
 
SQL>

我们看到,flush buffer cache之后,xcur的block,即标记为dirty的block也被刷出buffer cache,所有的buffer block都是显示free。

但进行第一次select的时候,被修改的xcur block,还是从db file加载到内存,且被记录成dirty的block。另外,select出来的前镜像,也从undo加载到内存,形成第一个cr block。

到了这个,顺便问个问题,现在都流行database in memory,如果我的内存是256G的,能放得下256G的database吗?读了上面的问题,相信你已经有了初步的答案。:)

rman连接catalog备份时使用的基表解释

$
0
0

rman连接catalog备份时使用的基表和view,解释如下:

Base tables:
=======================
NAME       DESCRIPTION
-------   --------------------
AL         contains archived logs. archived logs are uniquely identified by dbinc_key, recid and stamp.
BCB        contains corrupt block ranges in datafile backups.
BCF        contains control file backups (in backup sets).
BDF        contains all datafile backups (in backup sets).
BP         contains all backup pieces of backup sets.
BRL        contains backup redo logs (in backup sets).
BS         contains all backup sets for all database incarnations.
CCB        contains corrupt block ranges in datafile copies.
CCF        contains control file copies.
CDF        contains all datafile copies.
CKP        records all recovery catalog checkpoints.
DB         contains all target databases that have been registered in this recovery catalog.
DBINC      contains all incarnations of the target databases registered in this recovery catalog.
DF         contains all datafiles of all database incarnations.
DFATT      datafile attributes that change over time.
OFFR       stores datafile offline ranges.
ORL        contains all redo logfiles for all database incarnations.
RCVER      recovery catalog version.
RLH        records all redo log history for all threads.
RR         contains redo ranges for all database incarnations.
RT         redo threads for all database incarnations.
SCR        contains 1 row for each stored script.
SCRL       contains 1 row for each line of each stored script.
TS         contains all tablespaces of all database incarnations.
TSATT      tablespace attributes that change over time.
 
Views:
===================================================
NAME                            DESCRIPTION
------------------           --------------------
RC_ARCHIVED_LOG               information about all archivelogs.
RC_BACKUP_CONTROLFILE         backup control files in backup sets.
RC_BACKUP_CORRUPTION          corrupt blocks in datafile backups and copies.
RC_BACKUP_DATAFILE            datafile backups (in backup sets).
RC_BACKUP_PIECE               backup pieces.
RC_BACKUP_REDOLOG             redo log backups (in backup sets).
RC_BACKUP_SET                 backup sets.
RC_CHECKPOINT                 rc_checkpoint is replaced by rc_resync, but is still used by some tests.
RC_CONTROLFILE_COPY           controlfile copies.
RC_COPY_CORRUPTION            corrupt block ranges in datafile copies for all database incarnations.
RC_DATABASE information       about databases and their current incarnations.
RC_DATABASE_INCARNATION       information about all incarnations registered in recovery catalog.
RC_DATAFILE information       about all datafiles registered in recovery catalog.
RC_DATAFILE_COPY              datafile copies (on disk).
RC_LOG_HISTORY                information about redo log history.
RC_OFFLINE_RANGE              offline ranges for datafiles.
RC_REDO_LOG                   information about online redo logs.
RC_REDO_THREAD                information about redo threads.
RC_RESYNC                     information about recovery catalog resyncs (checkpoints).
RC_STORED_SCRIPT              stored scripts.
RC_STORED_SCRIPT_LINE         each line of each stored script.
RC_TABLESPACE                 information about all tablespaces registered in recovery catalog.

参考 Doc ID 1054528.6

RAC转成单实例

$
0
0

客户有个需求,需要将在一个包含多个rac、多个single instance的大cluster中的某个rac 节点,改成single instance。数据文件还在asm上,原来的数据文件还要继续时候用。

我们可以如下操作:

High Level Step:
1.备份spfile
2.停需要转换的rac database
3.删除在cluster中注册的这个rac database对应的service信息,对应的instance信息,和对应的database信息。
4.修改spfile中,删除关于cluster有关的信息
5.启动单实例,删除多余的redo和undo
6.将spfile还原回asm上,并且将ORACLE_SID从ora11g1改成ora11g

下面我们来具体操作:

(1)备份spfile

切到grid用户                                         
[oracle@rac1 ~]$ crsctl stat res -t
--------------------------------------------------------------------------------
NAME           TARGET  STATE        SERVER                   STATE_DETAILS       
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.ACFS.dg
               ONLINE  ONLINE       rac1                                         
               ONLINE  ONLINE       rac2                                         
ora.DATA.dg
               ONLINE  ONLINE       rac1                                         
               ONLINE  ONLINE       rac2                                         
ora.FRA.dg
               ONLINE  ONLINE       rac1                                         
               ONLINE  ONLINE       rac2                                         
ora.LISTENER.lsnr
               ONLINE  ONLINE       rac1                                         
               ONLINE  ONLINE       rac2                                         
ora.NEW_FRA.dg
               OFFLINE OFFLINE      rac1                                         
               OFFLINE OFFLINE      rac2                                         
ora.OCRVOT.dg
               ONLINE  ONLINE       rac1                                         
               ONLINE  ONLINE       rac2                                         
ora.acfs.acfsvol.acfs
               ONLINE  ONLINE       rac1                     mounted on /acfs   
               ONLINE  ONLINE       rac2                     mounted on /acfs   
ora.asm
               ONLINE  ONLINE       rac1                     Started             
               ONLINE  ONLINE       rac2                     Started             
ora.gsd
               OFFLINE OFFLINE      rac1                                         
               OFFLINE OFFLINE      rac2                                         
ora.net1.network
               ONLINE  ONLINE       rac1                                         
               ONLINE  ONLINE       rac2                                         
ora.ons
               ONLINE  ONLINE       rac1                                         
               ONLINE  ONLINE       rac2                                         
ora.registry.acfs
               ONLINE  ONLINE       rac1                                         
               ONLINE  ONLINE       rac2                                         
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
      1        ONLINE  ONLINE       rac1                                         
ora.cvu
      1        ONLINE  ONLINE       rac1                                         
ora.oc4j
      1        ONLINE  ONLINE       rac1                                         
ora.ora11g.db
      1        ONLINE  ONLINE       rac1                     Open                 
<<<<<
      
2        ONLINE  ONLINE       rac2                     Open                 <<<<<
ora.ora11g.myserv.svc
      
1        ONLINE  ONLINE       rac1                                          <<<<<     
ora.ora11g.srv_di_1.svc
      
1        ONLINE  ONLINE       rac2                                          <<<<<
ora.prydb.db
      
1        OFFLINE OFFLINE                               Instance Shutdown   
ora.rac1.vip
      
1        ONLINE  ONLINE       rac1                                         
ora.rac2.vip
      
1        ONLINE  ONLINE       rac2                                         
ora.scan1.vip
      
1        ONLINE  ONLINE       rac1                                         
[
oracle@rac1 ~]$
 
切到
oracle用户
[
oracle@rac1 ~]$ sqlplus "/ as sysdba"
 
SQL*Plus: Release 11.2.0.4.0 Production on Wed Aug 17 10:22:25 2016
 
Copyright (c) 1982, 2013, OracleAll rights reserved.
 
 
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Real Application Clusters and Automatic Storage Management options
 
SQL> show parameter spfile
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      +DATA/ora11g/spfileora11g.ora
SQL>
SQL>
SQL> create pfile='/tmp/initora11g.ora.bak' from spfile;
 
File created.
 
SQL>

(2)停需要转换的数据库实例

[oracle@rac1 ~]$ srvctl stop database -d ora11g
[oracle@rac1 ~]$
 
切到grid用户
[oracle@rac1 ~]$ crsctl stat res -t
--------------------------------------------------------------------------------
NAME           TARGET  STATE        SERVER                   STATE_DETAILS       
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.ACFS.dg
               ONLINE  ONLINE       rac1                                         
               ONLINE  ONLINE       rac2                                         
ora.DATA.dg
               ONLINE  ONLINE       rac1                                         
               ONLINE  ONLINE       rac2                                         
ora.FRA.dg
               ONLINE  ONLINE       rac1                                         
               ONLINE  ONLINE       rac2                                         
ora.LISTENER.lsnr
               ONLINE  ONLINE       rac1                                         
               ONLINE  ONLINE       rac2                                         
ora.NEW_FRA.dg
               OFFLINE OFFLINE      rac1                                         
               OFFLINE OFFLINE      rac2                                         
ora.OCRVOT.dg
               ONLINE  ONLINE       rac1                                         
               ONLINE  ONLINE       rac2                                         
ora.acfs.acfsvol.acfs
               ONLINE  ONLINE       rac1                     mounted on /acfs   
               ONLINE  ONLINE       rac2                     mounted on /acfs   
ora.asm
               ONLINE  ONLINE       rac1                     Started             
               ONLINE  ONLINE       rac2                     Started             
ora.gsd
               OFFLINE OFFLINE      rac1                                         
               OFFLINE OFFLINE      rac2                                         
ora.net1.network
               ONLINE  ONLINE       rac1                                         
               ONLINE  ONLINE       rac2                                         
ora.ons
               ONLINE  ONLINE       rac1                                         
               ONLINE  ONLINE       rac2                                         
ora.registry.acfs
               ONLINE  ONLINE       rac1                                         
               ONLINE  ONLINE       rac2                                         
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
      1        ONLINE  ONLINE       rac1                                         
ora.cvu
      1        ONLINE  ONLINE       rac1                                         
ora.oc4j
      1        ONLINE  ONLINE       rac1                                         
ora.ora11g.db
      1        OFFLINE OFFLINE                               Instance Shutdown   
<<<<
      
2        OFFLINE OFFLINE                               Instance Shutdown   <<<<<
ora.ora11g.myserv.svc
      
1        OFFLINE OFFLINE                                                   <<<<<
ora.ora11g.srv_di_1.svc
      
1        OFFLINE OFFLINE                                                   <<<<
ora.prydb.db
      
1        OFFLINE OFFLINE                               Instance Shutdown   
ora.rac1.vip
      
1        ONLINE  ONLINE       rac1                                         
ora.rac2.vip
      
1        ONLINE  ONLINE       rac2                                         
ora.scan1.vip
      
1        ONLINE  ONLINE       rac1                                         
[
oracle@rac1 ~]$

(3)删除数据库实例在cluster中的注册信息

切到oracle用户
[oracle@rac1 ~]$ srvctl remove service -d ora11g -s myserv
[oracle@rac1 ~]$
[oracle@rac1 ~]$ srvctl remove service -d ora11g -s srv_di_1
[oracle@rac1 ~]$
 
切到grid用户
[oracle@rac1 ~]$ crsctl stat res -t
--------------------------------------------------------------------------------
NAME           TARGET  STATE        SERVER                   STATE_DETAILS       
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.ACFS.dg
               ONLINE  ONLINE       rac1                                         
               ONLINE  ONLINE       rac2                                         
ora.DATA.dg
               ONLINE  ONLINE       rac1                                         
               ONLINE  ONLINE       rac2                                         
ora.FRA.dg
               ONLINE  ONLINE       rac1                                         
               ONLINE  ONLINE       rac2                                         
ora.LISTENER.lsnr
               ONLINE  ONLINE       rac1                                         
               ONLINE  ONLINE       rac2                                         
ora.NEW_FRA.dg
               OFFLINE OFFLINE      rac1                                         
               OFFLINE OFFLINE      rac2                                         
ora.OCRVOT.dg
               ONLINE  ONLINE       rac1                                         
               ONLINE  ONLINE       rac2                                         
ora.acfs.acfsvol.acfs
               ONLINE  ONLINE       rac1                     mounted on /acfs   
               ONLINE  ONLINE       rac2                     mounted on /acfs   
ora.asm
               ONLINE  ONLINE       rac1                     Started             
               ONLINE  ONLINE       rac2                     Started             
ora.gsd
               OFFLINE OFFLINE      rac1                                         
               OFFLINE OFFLINE      rac2                                         
ora.net1.network
               ONLINE  ONLINE       rac1                                         
               ONLINE  ONLINE       rac2                                         
ora.ons
               ONLINE  ONLINE       rac1                                         
               ONLINE  ONLINE       rac2                                         
ora.registry.acfs
               ONLINE  ONLINE       rac1                                         
               ONLINE  ONLINE       rac2                                         
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
      1        ONLINE  ONLINE       rac1                                         
ora.cvu
      1        ONLINE  ONLINE       rac1                                         
ora.oc4j
      1        ONLINE  ONLINE       rac1                                         
ora.ora11g.db
      1        OFFLINE OFFLINE                               Instance Shutdown       
<<<<
      
2        OFFLINE OFFLINE                               Instance Shutdown       <<<<
ora.prydb.db
      
1        OFFLINE OFFLINE                               Instance Shutdown   
ora.rac1.vip
      
1        ONLINE  ONLINE       rac1                                         
ora.rac2.vip
      
1        ONLINE  ONLINE       rac2                                         
ora.scan1.vip
      
1        ONLINE  ONLINE       rac1                                         
[
oracle@rac1 ~]$
 
 
切到
oracle用户
[
oracle@rac1 ~]$ srvctl remove instance -d ora11g -i ora11g1
Remove instance from the database ora11g? (y/[n]) y
[
oracle@rac1 ~]$
[
oracle@rac1 ~]$ srvctl remove instance -d ora11g -i ora11g2
Remove instance from the database ora11g? (y/[n]) y
[
oracle@rac1 ~]$
[
oracle@rac1 ~]$ srvctl remove database -d ora11g
Remove the database ora11g? (y/[n]) y
[
oracle@rac1 ~]$
 
 
切到
grid用户
[
oracle@rac1 ~]$ crsctl stat res -t
--------------------------------------------------------------------------------
NAME           TARGET  STATE        SERVER                   STATE_DETAILS       
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.ACFS.dg
              
ONLINE  ONLINE       rac1                                         
              
ONLINE  ONLINE       rac2                                         
ora.DATA.dg
              
ONLINE  ONLINE       rac1                                         
              
ONLINE  ONLINE       rac2                                         
ora.FRA.dg
              
ONLINE  ONLINE       rac1                                         
              
ONLINE  ONLINE       rac2                                         
ora.LISTENER.lsnr
              
ONLINE  ONLINE       rac1                                         
              
ONLINE  ONLINE       rac2                                         
ora.NEW_FRA.dg
              
OFFLINE OFFLINE      rac1                                         
              
OFFLINE OFFLINE      rac2                                         
ora.OCRVOT.dg
              
ONLINE  ONLINE       rac1                                         
              
ONLINE  ONLINE       rac2                                         
ora.acfs.acfsvol.acfs
              
ONLINE  ONLINE       rac1                     mounted on /acfs   
              
ONLINE  ONLINE       rac2                     mounted on /acfs   
ora.asm
              
ONLINE  ONLINE       rac1                     Started             
              
ONLINE  ONLINE       rac2                     Started             
ora.gsd
              
OFFLINE OFFLINE      rac1                                         
              
OFFLINE OFFLINE      rac2                                         
ora.net1.network
              
ONLINE  ONLINE       rac1                                         
              
ONLINE  ONLINE       rac2                                         
ora.ons
              
ONLINE  ONLINE       rac1                                         
              
ONLINE  ONLINE       rac2                                         
ora.registry.acfs
              
ONLINE  ONLINE       rac1                                         
              
ONLINE  ONLINE       rac2                                         
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
      
1        ONLINE  ONLINE       rac1                                         
ora.cvu
      
1        ONLINE  ONLINE       rac1                                         
ora.oc4j
      
1        ONLINE  ONLINE       rac1                                         
ora.prydb.db
      
1        OFFLINE OFFLINE                               Instance Shutdown   
ora.rac1.vip
      
1        ONLINE  ONLINE       rac1                                         
ora.rac2.vip
      
1        ONLINE  ONLINE       rac2                                         
ora.scan1.vip
      
1        ONLINE  ONLINE       rac1                                         
[
oracle@rac1 ~]$

(4)修改pfile中关于cluster相关的内容

[oracle@rac1 tmp]$ cat initora11g.ora.bak
ora11g2.__db_cache_size=394264576
ora11g1.__db_cache_size=385875968
ora11g2.__java_pool_size=4194304
ora11g1.__java_pool_size=4194304
ora11g2.__large_pool_size=8388608
ora11g1.__large_pool_size=8388608
ora11g1.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
ora11g2.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
ora11g2.__pga_aggregate_target=432013312
ora11g1.__pga_aggregate_target=444596224
ora11g2.__sga_target=641728512
ora11g1.__sga_target=629145600
ora11g2.__shared_io_pool_size=0
ora11g1.__shared_io_pool_size=0
ora11g2.__shared_pool_size=222298112
ora11g1.__shared_pool_size=218103808
ora11g2.__streams_pool_size=0
ora11g1.__streams_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/ora11g/adump'
*.audit_trail='db'
*.cluster_database=true                                                                                           
<<<<
*.
compatible='11.2.0.4.0'
*.
control_files='+DATA/ora11g/controlfile/current.257.863382281','+FRA/ora11g/controlfile/current.261.863382289'
*.
db_block_size=8192
*.
db_create_file_dest='+DATA'
*.
db_domain=''
*.
db_name='ora11g'
*.
db_recovery_file_dest='+FRA'
*.
db_recovery_file_dest_size=3145728000
*.
db_unique_name='ora11g'
*.
diagnostic_dest='/u01/app/oracle'
*.
dispatchers='(PROTOCOL=TCP) (SERVICE=ora11gXDB)'
*.
event='19823 trace name context forever,level 50'
*.
fal_client='ora11g'
*.
fal_server='dgora11g'
ora11g1.instance_number=1                                                                                        <<<<<
ora11g2.instance_number=2                                                                                        <<<<<
ora11g1.local_listener='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.56.113)(PORT=1521))))'   <<<<
ora11g2.local_listener='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.56.114)(PORT=1521))))'   <<<<
*.
log_archive_config='dg_config=(ora11g,dgora11g)'
*.
log_archive_dest_2='service=dgora11g reopen=120 lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=dgora11g'
*.
log_archive_dest_state_2='ENABLE'
*.
memory_target=1073741824
*.
open_cursors=300
ora11g2.parallel_max_servers=80                                                                                   <<<<
*.
processes=150
ora11g1.processes=200                                                                                            <<<<
ora11g2.processes=200                                                                                            <<<<
*.
remote_listener='rac-scan:1521'                                                                                <<<<
ora11g1.remote_listener='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.56.114)(PORT=1521))))'  <<<<
ora11g2.remote_listener='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.56.113)(PORT=1521))))'  <<<<
*.
remote_login_passwordfile='exclusive'
*.
sec_case_sensitive_logon=FALSE
*.
standby_file_management='auto'
ora11g2.thread=2                                                                                                 <<<<
ora11g1.thread=1                                                                                                 <<<<
ora11g1.undo_tablespace='UNDOTBS1'
ora11g2.undo_tablespace='UNDOTBS2'                                                                               <<<<
[
oracle@rac1 tmp]$
 
 
 
修改后:
[
oracle@rac1 tmp]$ cat initora11g.ora.bak
*.
audit_file_dest='/u01/app/oracle/admin/ora11g/adump'
*.
audit_trail='db'
*.
compatible='11.2.0.4.0'
*.
control_files='+DATA/ora11g/controlfile/current.257.863382281','+FRA/ora11g/controlfile/current.261.863382289'
*.
db_block_size=8192
*.
db_create_file_dest='+DATA'
*.
db_domain=''
*.
db_name='ora11g'
*.
db_recovery_file_dest='+FRA'
*.
db_recovery_file_dest_size=3145728000
*.
db_unique_name='ora11g'
*.
diagnostic_dest='/u01/app/oracle'
*.
dispatchers='(PROTOCOL=TCP) (SERVICE=ora11gXDB)'
*.
event='19823 trace name context forever,level 50'
*.
fal_client='ora11g'
*.
fal_server='dgora11g'
*.
log_archive_config='dg_config=(ora11g,dgora11g)'
*.
log_archive_dest_2='service=dgora11g reopen=120 lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=dgora11g'
*.
log_archive_dest_state_2='ENABLE'
*.
memory_target=1073741824
*.
open_cursors=300
*.
processes=150
*.
remote_login_passwordfile='exclusive'
*.
sec_case_sensitive_logon=FALSE
*.
standby_file_management='auto'
ora11g1.undo_tablespace='UNDO

(5)启动单实例,并修改redo和undo

SQL> startup pfile='/tmp/initora11g.ora.bak'
ORACLE instance started.
 
Total System Global Area 1068937216 bytes
Fixed Size                  2260088 bytes
Variable Size             671089544 bytes
Database Buffers          390070272 bytes
Redo Buffers                5517312 bytes
Database mounted.
Database opened.
SQL>
SQL>
SQL>
SQL> 
SQL>
SQL> select * from v$log;
 
 
    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ ---------
         1          1        593   52428800        512          2 YES ACTIVE                 4025536 17-AUG-16      4025592 17-AUG-16
         2          1        594   52428800        512          2 NO  CURRENT                4025592 17-AUG-16   2.8147E+14
         3          2        523   52428800        512          2 YES INACTIVE               4025588 17-AUG-16      4025779 17-AUG-16
         4          2        522   52428800        512          2 YES INACTIVE               4022067 17-AUG-16      4025588 17-AUG-16
 
SQL>
SQL>
SQL>
SQL> alter system checkpoint;
 
System altered.
 
SQL> select * from v$log;
 
    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ ---------
         1          1        593   52428800        512          2 YES INACTIVE               4025536 17-AUG-16      4025592 17-AUG-16
         2          1        594   52428800        512          2 NO  CURRENT                4025592 17-AUG-16   2.8147E+14
         3          2        523   52428800        512          2 YES INACTIVE               4025588 17-AUG-16      4025779 17-AUG-16
         4          2        522   52428800        512          2 YES INACTIVE               4022067 17-AUG-16      4025588 17-AUG-16
 
SQL> alter system switch logfile;
 
System altered.
 
SQL> --检查确实是thread 1发生了切换
SQL>  select * from v$log;
 
    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ ---------
         1          1        595   52428800        512          2 NO  CURRENT                4025868 17-AUG-16   2.8147E+14
         2          1        594   52428800        512          2 YES INACTIVE               4025592 17-AUG-16      4025868 17-AUG-16
         3          2        523   52428800        512          2 YES INACTIVE               4025588 17-AUG-16      4025779 17-AUG-16
         4          2        522   52428800        512          2 YES INACTIVE               4022067 17-AUG-16      4025588 17-AUG-16
 
SQL>
 
SQL>  select * from v$log;
 
    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ ---------
         1          1        595   52428800        512          2 NO  CURRENT                4025868 17-AUG-16   2.8147E+14
         2          1        594   52428800        512          2 YES INACTIVE               4025592 17-AUG-16      4025868 17-AUG-16
         3          2        523   52428800        512          2 YES INACTIVE               4025588 17-AUG-16      4025779 17-AUG-16
         4          2        522   52428800        512          2 YES INACTIVE               4022067 17-AUG-16      4025588 17-AUG-16
 
SQL>
SQL>
SQL> --先disable thread 2
SQL> alter database disable  thread 2;
 
Database altered.
 
SQL>  select * from v$log;
 
    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ ---------
         1          1        595   52428800        512          2 NO  CURRENT                4025868 17-AUG-16   2.8147E+14
         2          1        594   52428800        512          2 YES INACTIVE               4025592 17-AUG-16      4025868 17-AUG-16
         3          2        523   52428800        512          2 YES INACTIVE               4025588 17-AUG-16      4025779 17-AUG-16
         4          2        522   52428800        512          2 YES INACTIVE               4022067 17-AUG-16      4025588 17-AUG-16
 
SQL> --再删除thread 2的redo group:
SQL> alter database drop logfile group 3;
 
Database altered.
 
SQL> alter database drop logfile group 4;
 
Database altered.
 
SQL> select * from v$log;
 
    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ ---------
         1          1        595   52428800        512          2 NO  CURRENT                4025868 17-AUG-16   2.8147E+14
         2          1        594   52428800        512          2 YES INACTIVE               4025592 17-AUG-16      4025868 17-AUG-16
 
SQL>
 
SQL> select tablespace_name from dba_tablespaces;
 
TABLESPACE_NAME
------------------------------
SYSTEM
SYSAUX
UNDOTBS1
TEMP
UNDOTBS2
USERS
TEST_TBS
 
7 rows selected.
 
SQL>
SQL>
SQL>
SQL> show parameter undo
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     900
undo_tablespace                      string      UNDOTBS1
SQL>
SQL>
SQL>
SQL>
SQL> drop tablespace UNDOTBS2 including contents and datafiles;
 
Tablespace dropped.
 
SQL>

(6)将spfile还原回到asm上。

SQL> create spfile='+DATA/ora11g/spfileora11g.ora' from pfile='/tmp/initora11g.ora.bak';
 
File created.
 
SQL>
 
 
[oracle@rac1 dbs]$ pwd
/u01/app/oracle/product/11.2.0.3/db_1/dbs
[oracle@rac1 dbs]$ ls -l init*
-rw-r--r--. 1 oracle oinstall 2851 May 15  2009 init.ora
-rw-r-----. 1 oracle oinstall   39 Nov 11  2014 initora11g1.ora
<<<
[
oracle@rac1 dbs]$
[
oracle@rac1 dbs]$ mv initora11g1.ora initora11g.ora
[
oracle@rac1 dbs]$
[
oracle@rac1 ~]$ env |grep SID
ORACLE_SID=ora11g1
[
oracle@rac1 ~]$
 
修改
profile,将ORACLE_SIDora11g1改成ora11g
 
[
oracle@rac1 ~]$ env |grep SID
ORACLE_SID=ora11g
[
oracle@rac1 ~]$
[
oracle@rac1 ~]$ sqlplus "/ as sysdba"
 
SQL*Plus: Release 11.2.0.4.0 Production on Wed Aug 17 11:57:07 2016
 
Copyright (c) 1982, 2013, OracleAll rights reserved.
 
Connected to an idle instance.
 
SQL> startup
ORACLE instance started.
 
Total System Global Area  246386688 bytes
Fixed Size                  2252096 bytes
Variable Size             188744384 bytes
Database Buffers           50331648 bytes
Redo Buffers                5058560 bytes
Database mounted.
Database opened.
SQL>

参考:Doc ID 759868.1 INTERNAL


12c比10g索引回表消耗增多的问题

$
0
0

问题是这样的:
在12c中,我们测试了2种情况:
第一种是加了hint,使得12c的执行计划和10g类似,只是由于12c的nlj_batching,多了一次nestloop。但是执行计划本质是相同的,都是索引S_CONTACT_X_U1返回表查询。
第二种是使用了10g的outline hint,OFE=10g的,执行计划完全一样。

但是我们发现,无论是在12c中的哪一种情况,驱动表S_SRV_REQ的索引PA_S_SRV_REQ_1_X的full index scan返回结果差异这么大?

文章最后附在10g和12c环境中的测试经过,以及10g环境中的10046 trace和12c第一种情况的10046 trace。

12c-第一种情况:

12c-第二种情况:

10g数据库的情况:

###################################

另外,根据过滤条件,10g和12c返回结果也差不多。且消耗也差不多!

12c:

10g:

在同事的Fred Liu的帮助下,我们终于找到了答案。(Fred Liu在他近期的微信公共账号也写了这个问题。大家可以关注:『老虎刘谈SQL优化』 )

(1)首先,这个SQL逻辑有问题。可以见我附件10g.txt中的附件,有完整的sql文本

SQL的主要功能是分页,客户这里把rownum和order by写在一层关系中了。所以这个是错误的。

(2)就算是在逻辑错误,为什么10g跑快,A-rows小?
这是因为SQL语句中rownum<=10, 而10g的返回记录是10行,12c的返回记录只有4行。
在rownum<=10的情况下,10g扫描索引的时候,扫描了264行之后,已经够10行了,所以可以返回;而12c中扫描索引,只有4行,也就是说,从开头扫到结尾,扫描全部还没找齐10行。所以需要扫描整个索引。因此消耗就高了。
其实我将SQL语句改写成rownum<=4,这样也可以在3秒多返回记录了。或者我将SQL改成rownum<=8000,那么在10g中运行也很慢了。

(3)修正SQL逻辑后,客户的SQL还是跑的慢,15分钟,发现因为客户写的hint用到的索引不是最优执行计划,使用acct_open_dt这个字段的索引之后(或者不用指定,oracle自己的CBO会选择这个索引),还要把1/3移动到右边,结果不到1秒就出来了。(注,如果1/3不移动到右边,还是会很慢。)

在这个案例中,我们可以学到的知识点:
1. 要分析SQL语句的逻辑,不能光看执行计划
2. 要注意count stopkey和a-rows的值。不然会想不明白为什么在10g扫描了264行就停止了。
3. 对方说数据源是一样的,不能完全相信。上述例子就可以看到,同样语句实际数据源还是有差异的,一个返回10行一个返回4行,而这个原因导致执行效率差别很大。
4. 索引字段有运算关系,需要把运算放到右边。才能正常使用索引。

附件:完整的SQL信息和执行计划 sql_compare_in_10g_and_12c.zip

升级到12.1.0.2之后rman无法删除已经归档日志

$
0
0

客户一个数据库,架构是2地3中心,本地有primary和standby,远程还有一个standby。

primary的rman archivelog deletion policy是ship to all standby
同城standby的rman archivelog deletion policy是backup 1 time,备份在同城standby上进行。
远程standby的rman archivelog deletion policy是applied on all standby。

某一天发现FRA区满了,FRA区积累了大量的规定日志,没有被自动删除,手动删除归档日志的时候,也报错:

RMAN-08120:WARNING: archived log not deleted, not yet applied by standby

只有加force参数才能强行删除日志。

这个问题,是因为在12.1.0.2中,删除归档日志的默认行为发生了变化。原来在11g中不考虑defer的路径,在12.1.0.2时如果有defer的路径,则会报错日志没有applied,即使这些日志实际上已经被applied了

This behavior has changed and is related to:

Bug 16082541 RMAN DELETES ARCHIVELOGS WHICH HAVE NOT BEEN APPLIED TO A DEFERRED STANDBY
which was fixed in 12.1.0.2, ( but has changed behaviour in handling of deleting logs)

Changed behaviour:
-> Destinations that are marked DEFERRED (and valid_now=’UNKNOWN’) are considered in in 12.1.0.2 before deleting logs.

客户的这个环境,设置了log_archive_dest_n(这是为了switchover时方便继续做standby):
在primary设置了log_archive_dest_2为远程standby,log_archive_dest_state_2为enable;log_archive_dest_3为同城standby,log_archive_dest_state_3为enable。
在同城standby设置了log_archive_dest_2为primary,log_archive_dest_state_2为defer;log_archive_dest_3为远程standby,log_archive_dest_state_3为defer。
在远程standby设置了log_archive_dest_2为primary,log_archive_dest_state_2为defer;log_archive_dest_3为同城stanby,log_archive_dest_state_3为defer。

这样在switchover的时候,只需将defer的参数改成enable,就可以继续做dataguard。

可是,就是因为这样的参数设置,加上12.1.0.2的删除日志规则的改变,造成了在远程standby上,由于规则是applied on all standby,且设置成了defer,所以就无法删除。

在远程standby上检查
SQL> SELECT * from v$archive_dest where (valid_now = 'UNKNOWN' AND status = 'DEFERRED') ;
返回有2行记录,即primary和本地standby。

目前可以参考的解决方案:
1. 不改log_archive_dest_state_n,设置log_archive_dest_n=''
2. 不取消log_archive_dest_state_n,修改log_archive_dest_n为enable
3. alter system set "_deferred_log_dest_is_valid"=false
4. archivelog deletion policy从applied on all standby改成applied on standby

参考:Doc ID 2022958.1

Huge page使用的一些问题

$
0
0

12c的数据库在安装的时候,有一个检查项目,叫做Maximum locked memory check。

这是要求设置/etc/security/limits.conf中的memlock的值,官方文档在11g要求是设置比物理内存稍小的一个值,在12c中要求至少为90%的物理内存。

而memlock的设置,是启用huge page的一部分。开启hugepage在大内存大sga的环境下,可以提供系统的性能。

启用hugepage需要设置/etc/security/limits.conf和vm.nr_hugepages(Doc ID 361468.1)

注1:
在asm中,当启用hugepage时oracle建议asm的SGA增大到至少2G,设置hugepage至少1300个以上的大页面(Doc ID 2111010.1)

在Exadata中,默认启用了hugepage,且安装Exadata的时候,就默认禁用了asm的AMM(PGA不使用hugepage,这也是为什么使用hugepage不能同时使用AMM,只能使用ASMM的原因。因为AMM是自动管理SGA+PGA。而hugepage不能被PGA使用。),设置了SGA大小为2G。(Doc ID 1681467.1)。
上述的大小只是一个大概的估算值,如果需要计算大小,也是可以计算的。asm的shared pool的大小,在150M的基础上,external冗余的disks,每增加100G的空间大小,需要额外的1M内存(Doc ID 437924.1)

注2:
在12c中grid中多了一个MGMTDB来记录GI资源信息,这个DB的SGA使用,也要考虑看hugepage的配置中。不过由于mgmtdb不确定会跑在那个节点上,在Exadata的health check检查项目中,是建议把mgmtdb使用hugepage属性关闭的。(Doc ID 1274318.1)

注3:
还有一个参数pre_page_sga,在9i~11g中默认值是false,在12c中默认值是true。在12c之前,默认值false可以避免在进程启动时,access sga中所有的page页面加快进程的启动速度(见connection management call elapsed time)。而在12.1之后,算法发生了改变,设置为true和false几乎没有差别。

注4:
上面说的hugepages,指的是regular hugepages,而对于transparent hugepages,我们是需要禁用的。见Disable Transparent HugePages on SLES11, RHEL6, RHEL7, OL6, OL7, and UEK2 and above (Doc ID 1557478.1)。
regular hugepages是提前分配,不是动态分配,transparent hugepages是通过khugepaged线程动态配置的,这可能会导致Oracle运行过程中出现一些奇怪的问题,Oracle建议关闭Transparent HugePages功能。

注5:
放在small pages上的sga,不会直接占用物理内存(这样应该是在page fault时才会申请物理内存)。即ipcs -am看到占用的内存的是在vm中,不是在RSS中,实际物理内存中。

所以,
(1)oracle推荐在大内存大sga的情况下,使用hugepage。文档上说是大于8G物理内存(Doc ID 361468.1);在实际使用中,客户如果超过64G内存,我们一般都推荐使用。
(2)对于asm我们可以设置sga至少2G,同时注意要求至少1300个以上的大页面。
(3)对于mgmtdb,我们可以设置use_large_pages=false禁用mgmtdb使用hugepage。
(4)如果多个数据库共享一个主机,但是如果我们提前把hugepage的配置能覆盖到所有instance,那么就不存在什么问题。在11g中,有use_large_page参数,默认值为true。即默认尝试配合OS使用hugepage。但是在11.2.0.2的时候,如果hugepage不够cover sga,会导致数据库启动不了。在11.2.0.3以后,oracle会在hugepage不够的情况下,将使用small page来弥补剩余的page,从而启动数据库(Doc ID 1392497.1)
(5)禁用transparent hugepages(Doc ID 1557478.1)

分区索引知识点拾遗

$
0
0

索引是一般索引还是分区索引,可以看dba_indexes的partitioned字段。

如果partitioned字段是YES,说明是分区索引,那么,这个索引是global还是local,可以看dba_part_indexes的LOCALITY字段。

另外,我们还可以看ALIGNMENT字段,看这个索引是基于前导列(prefixed)还是非前导列。(注:global肯定是基于前导列,因为不能建基于非前导列的global索引。而local索引可以基于前导列和非前导列)

SQL> drop table invoices;

Table dropped.

--创建分区表,是range分区:
SQL> CREATE TABLE invoices
  2  (invoice_no    NUMBER NOT NULL,
  3   invoice_date  DATE   NOT NULL,
  4   invoice_area varchar2(200),
  5   invoice_serial number,
  6   comments      VARCHAR2(500),
  7   invoice_name varchar2(20)
  8   )
  9  PARTITION BY RANGE (invoice_date)
 10  (PARTITION invoices_q1 VALUES LESS THAN (TO_DATE('01/04/2001', 'DD/MM/YYYY')) TABLESPACE users,
 11   PARTITION invoices_q2 VALUES LESS THAN (TO_DATE('01/07/2001', 'DD/MM/YYYY')) TABLESPACE users,
 12   PARTITION invoices_q3 VALUES LESS THAN (TO_DATE('01/09/2001', 'DD/MM/YYYY')) TABLESPACE users,
 13   PARTITION invoices_q4 VALUES LESS THAN (TO_DATE('01/01/2002', 'DD/MM/YYYY')) TABLESPACE users);

Table created.

SQL>
SQL> --创建global分区索引,分区类型可以和表一样,也可以不一样。这个索引是和表分区类型一样,但是value less值不一样。
SQL> CREATE INDEX idx_glob_inv_ser ON invoices (invoice_serial,comments) GLOBAL
  2  PARTITION BY range (invoice_serial)
  3  (PARTITION invoices_q1 VALUES LESS THAN (10) TABLESPACE users,
  4   PARTITION invoices_q2 VALUES LESS THAN (20) TABLESPACE users,
  5   PARTITION invoices_q3 VALUES LESS THAN (30) TABLESPACE users,
  6   PARTITION invoices_q4 VALUES LESS THAN (40) TABLESPACE users,
  7   PARTITION invoices_qmax VALUES LESS THAN (MAXVALUE) TABLESPACE users);

Index created.

SQL>
SQL> --注意global分区索引,必须使用前导列,及如果索引列是 (comments,invoice_serial),
SQL> --但partition by xx(invoice_serial)用了非前导列,是会报错,不能创建成功的。
SQL> CREATE INDEX idx_glob_inv_date ON invoices (comments,invoice_serial) GLOBAL
  2  PARTITION BY hash (invoice_serial) partitions 16;
PARTITION BY hash (invoice_serial) partitions 16
                                 *
ERROR at line 2:
ORA-14038: GLOBAL partitioned index must be prefixed


SQL>
SQL>
SQL> --创建另一个global分区索引,这个索引的分区类型是和表分区类型不一样的。用了hash分区。但是prefix前导列的原理也是一样的,需要使用前导列。
SQL> CREATE INDEX idx_glob_inv_date ON invoices (comments,invoice_serial) GLOBAL
  2  PARTITION BY hash (comments) partitions 16;

Index created.

SQL>
SQL>
SQL> --创建local索引,注意不能指定partition by的类型的,local索引的分区类型和分区数量必须和table一致,但是可以指定不同的表空间。这个local使用了前导列。
SQL> CREATE INDEX idx_glo_inv_dt ON invoices (invoice_date,invoice_serial) LOCAL
  2   (PARTITION invoices_q1 TABLESPACE users,
  3    PARTITION invoices_q2 TABLESPACE users,
  4    PARTITION invoices_q3 TABLESPACE users,
  5    PARTITION invoices_q4 TABLESPACE users);

Index created.
SQL>
SQL> --如果分区数量必须和table不一致,会报错:
SQL> CREATE INDEX idx_glo_inv_dt ON invoices (invoice_date,invoice_serial) LOCAL
  2   (PARTITION invoices_q1 TABLESPACE users,
  3    PARTITION invoices_q2 TABLESPACE users,
  4    PARTITION invoices_q3 TABLESPACE users,
  5    PARTITION invoices_q4 TABLESPACE users,
  6    PARTITION invoices_q5 TABLESPACE users);
CREATE INDEX idx_glo_inv_dt ON invoices (invoice_date,invoice_serial) LOCAL
                               *
ERROR at line 1:
ORA-14024: number of partitions of LOCAL index must equal that of the underlying table

SQL> --创建local索引,注,local索引可以使用非前导列。而global索引只能使用前导列,不能使用非前导列。
SQL> CREATE INDEX idx_glo_inv_serl ON invoices (invoice_serial,invoice_date) LOCAL
  2   (PARTITION invoices_q1 TABLESPACE users,
  3    PARTITION invoices_q2 TABLESPACE users,
  4    PARTITION invoices_q3 TABLESPACE users,
  5    PARTITION invoices_q4 TABLESPACE users);

Index created.
SQL>
SQL> --如果分区数量必须和table不一致,会报错:
SQL> CREATE INDEX idx_glo_inv_serl ON invoices (invoice_serial,invoice_date) LOCAL
  2   (PARTITION invoices_q1 TABLESPACE users,
  3    PARTITION invoices_q2 TABLESPACE users,
  4    PARTITION invoices_q3 TABLESPACE users,
  5    PARTITION invoices_q4 TABLESPACE users
  6    PARTITION invoices_q5 TABLESPACE users,
  7    PARTITION invoices_q6 TABLESPACE users);
  PARTITION invoices_q5 TABLESPACE users,
  *
ERROR at line 6:
ORA-14010: this physical attribute may not be specified for an index partition


SQL>
SQL> --创建一般索引(即非分区索引):
SQL> create index idx_glo_inv_comm on invoices (comments);

Index created.

SQL>
SQL>
SQL>
SQL>
SQL> select index_name,PARTITIONED from dba_indexes where table_name='INVOICES';

INDEX_NAME           PARTIT
-------------------- ------
IDX_GLOB_INV_SER     YES
IDX_GLOB_INV_DATE    YES
IDX_GLO_INV_DT       YES
IDX_GLO_INV_SERL     YES
IDX_GLO_INV_COMM     NO

SQL>
SQL> select INDEX_NAME,PARTITIONING_TYPE,LOCALITY,ALIGNMENT from dba_part_indexes where table_name='INVOICES';

INDEX_NAME           PARTITIONING_TYPE  LOCALITY     ALIGNMENT
-------------------- ------------------ ------------ ------------------------
IDX_GLOB_INV_SER     RANGE              GLOBAL       PREFIXED
IDX_GLOB_INV_DATE    HASH               GLOBAL       PREFIXED
IDX_GLO_INV_DT       RANGE              LOCAL        PREFIXED
IDX_GLO_INV_SERL     RANGE              LOCAL        NON_PREFIXED

SQL>

查找被kill掉的session的操作系统进程号

$
0
0

11g之前:

select spid, program from v$process
where program!= 'PSEUDO'
and addr not in (select paddr from v$session)
and addr not in (select paddr from v$bgprocess )
and addr not in (select paddr from v$shared_server);

11g之后:

select * from v$process where addr=(select creator_addr from v$session where sid=140);

参考:
How To Find The Process Identifier (pid, spid) After The Corresponding Session Is Killed? (Doc ID 387077.1)

关于oradebug -prelim

$
0
0

在oracle数据库hang的情况下,我们可以用sqlplus -prelim / as sysdba登录数据库,进行一些收集信息的操作,也可以进行shutdown database的操作。这里需要注意几点:

1. process满是可以用sqlplus -prelim / as sysdba登录的

2. 从11.2.0.2开始,sqlplus -prelim / as sysdba是不能收集hanganalyze的信息,即使hanganalyze命令运行成功,但是在trace文件中看不到对应的信息,只能看到如下的报错:

ERROR: Can not perform hang analysis dump without a process state object and a session state object.
( process=(nil), sess=(nil) )

3. sqlplus -prelim / as sysdba可以收集process state dump,system state dump,dump errorstack,short_stack的操作。

参考:How to Collect Diagnostics for Database Hanging Issues (Doc ID 452358.1)

解决主库报错HeartBeat failed to connect to standby Error 12154

$
0
0

有一个库自从上线之后,主库的alertlog中一直有如下报错:

Tue Dec 20 14:42:16 2016
Error 12154 received logging on to the standby
PING[ARC2]: Heartbeat failed to connect to standby 'rmydb'. Error is 12154.

1. 检查远端的standby库已经启动,且已经到了mount以上的状态(即在read only的模式下Real Time Apply)。

2. 检查主库到远端的tnsping,正常。

3. 检查主库sqlplus user/pwd@tns 也是正常连接。

4. defer log_archive_dest_state_2后再enable,让archive进程意识到tnsnames.ora的变动。(怕之前修改过,archive进程没有意识到。),还是没用。依旧报错。

5. 再检查了一下,发现TNS_ADMIN的环境变量没有设置。所以用于心跳检测的archive进程,会找不到tns的配置文件。

临时解决办法:

不使用tnsnames.ora的配置文件,直接在log_archive_dest_2中设置:
alter system set log_archive_dest_2='SERVICE="(description=(address_list=(address=(protocol=TCP)(host=rhost)(port=1534)))(connect_data=(sid=mydb)))" LGWR ASYNC NOAFFIRM reopen=60 valid_for=(online_logfile,primary_role) db_unique_name=rmydb';

alter system set log_archive_dest_state_2=defer;

alter system set log_archive_dest_state_2=enable;

修改环境变量,添加TNS_ADMIN,待下次重启数据库生效。

参考:
Error 12154 received logging on to the standby whenever primary instance startup with srvctl (Doc ID 1943178.1)
RFS Is not coming up on standby Due to ORA-12154 on transport (primary side) (Doc ID 2196182.1)
Troubleshooting – Heartbeat failed to connect to standby (Doc ID 1432367.1)


博客运行在vultr主机上一个月的性能数据

$
0
0

我申请的vultr主机是单核CPU,15GB的ssd的硬盘,768M内存,每月1TB的流量,对于ss来说已经完成足够,目前有日本,新加坡,美国,德国,荷兰,法国等地的服务器。价格是每月5刀(每小时0.007刀),首次注册,如果用我这个Summer Promo Code,你可以额为获得20刀的费用;或者这个Linking Code,获得10刀的费用。前者的优惠幅度比较大,送你20刀,但是可能过了夏天就没有了,后者送10刀的优惠长期存在。目前已经运行了几个月,运行的非常稳定。除了php-fpm比较吃内存(单个进程40m~50M,有10个进程),其他都还好。

因此写了脚本当free小于50M的时候,自动重启php-fpm进程,当mysqld进程数小于2的时候,重启主机。两个多月下来,没有重启过主机,mysqld只是重启了3次。

另外由于将博客走了https,申请了letsencrypt的证书,每个月用脚本更新一次。更新的时候,先停nginx和php-fpm(其实只要停nginx就可以了。但是由于php-fpm比较吃内存,导致更新证书的时候,有时候需要更新Python packages,而在installing Python packages会因为内存不足而失败。所以我就干脆停了二者),然后调用certbot-auto renew –quiet 自动进行证书更新。

####################[2016-12-10 02:10:01] OPERATION START ##################################
#
#
Free Memory before stop nginx&php-fpm: 64 MB
Stopping nginx: [  OK  ]
Stopping php-fpm: [  OK  ]
Free Memory after stop nginx&php-fpm: 233 MB
/root/.local/share/letsencrypt/lib/python2.6/site-packages/cryptography/__init__.py:26: DeprecationWarning: Python 2.6 is no longer supported by the Python core team, please upgrade your Python. A future version of cryptography will drop support for Python 2.6
  DeprecationWarning
Starting php-fpm: [  OK  ]
Starting nginx: [  OK  ]
Free Memory after restart nginx&php-fpm: 180 MB
#
#
####################[2016-12-10 02:10:15] OPERATION END ##################################

(1)一个月的osw记录:

(2)vultr官方的后台性能数据:


(3)loader.io网站进行了并发压力测试:

如果响应时间是2秒为可接受时间,那么大概可以承受500个左右的并发。

设置threaded_execution启用12c的多线程模式

$
0
0

Unix/Linux中oracle数据库进程采用多进程模式,如我们可以在系统进程列表中看到pmon,smon,dbwr,lgwr,ckpt等oracle系统进程。随着oracle数据库功能增多,进程数量也随之增加,创建进程的开销以及进程上下文切换的开销也越来越大(进程状态切换 switching 是要直接硬件CPU资源),多线程结构中,线程切换在用户空间通过库函数实现,开销不在一个量级。所以,在oracle 12c中,有一个关于多线程的参数:threaded_execution,默认为false。启用的话,将其设置为true。启用之后,有如下变化:

1.进程数变少:
之前:

[oracle@ol6-121-rac2 diag]$ ps -ef |grep ora_
oracle    7562     1  0 14:54 ?        00:00:00 ora_pmon_cdbrac_1
oracle    7564     1  0 14:54 ?        00:00:00 ora_psp0_cdbrac_1
oracle    7567     1  4 14:54 ?        00:00:20 ora_vktm_cdbrac_1
oracle    7571     1  0 14:54 ?        00:00:00 ora_gen0_cdbrac_1
oracle    7573     1  0 14:54 ?        00:00:00 ora_mman_cdbrac_1
oracle    7577     1  0 14:54 ?        00:00:00 ora_diag_cdbrac_1
oracle    7579     1  0 14:54 ?        00:00:00 ora_dbrm_cdbrac_1
oracle    7581     1  0 14:54 ?        00:00:00 ora_ping_cdbrac_1
oracle    7583     1  0 14:54 ?        00:00:00 ora_acms_cdbrac_1
oracle    7585     1  0 14:54 ?        00:00:01 ora_dia0_cdbrac_1
oracle    7587     1  0 14:54 ?        00:00:00 ora_lmon_cdbrac_1
oracle    7589     1  0 14:54 ?        00:00:04 ora_lmd0_cdbrac_1
oracle    7591     1  0 14:54 ?        00:00:03 ora_lms0_cdbrac_1
oracle    7595     1  0 14:54 ?        00:00:00 ora_rms0_cdbrac_1
oracle    7597     1  0 14:54 ?        00:00:00 ora_lmhb_cdbrac_1
oracle    7599     1  0 14:54 ?        00:00:02 ora_lck1_cdbrac_1
oracle    7601     1  0 14:54 ?        00:00:00 ora_dbw0_cdbrac_1
oracle    7603     1  0 14:54 ?        00:00:00 ora_lgwr_cdbrac_1
oracle    7605     1  0 14:54 ?        00:00:00 ora_ckpt_cdbrac_1
oracle    7607     1  0 14:54 ?        00:00:00 ora_smon_cdbrac_1
oracle    7609     1  0 14:54 ?        00:00:00 ora_reco_cdbrac_1
oracle    7611     1  0 14:54 ?        00:00:00 ora_lreg_cdbrac_1
oracle    7613     1  0 14:54 ?        00:00:00 ora_rbal_cdbrac_1
oracle    7615     1  0 14:54 ?        00:00:00 ora_asmb_cdbrac_1
oracle    7617     1  0 14:54 ?        00:00:01 ora_mmon_cdbrac_1
oracle    7621     1  0 14:54 ?        00:00:00 ora_gcr0_cdbrac_1
oracle    7623     1  0 14:54 ?        00:00:00 ora_mmnl_cdbrac_1
oracle    7625     1  0 14:54 ?        00:00:00 ora_d000_cdbrac_1
oracle    7627     1  0 14:54 ?        00:00:00 ora_s000_cdbrac_1
oracle    7629     1  0 14:54 ?        00:00:00 ora_lck0_cdbrac_1
oracle    7634     1  0 14:54 ?        00:00:00 ora_rsmn_cdbrac_1
oracle    7644     1  0 14:54 ?        00:00:00 ora_ppa7_cdbrac_1
oracle    7668     1  0 14:54 ?        00:00:00 ora_mark_cdbrac_1
oracle    8033     1  0 14:55 ?        00:00:00 ora_o000_cdbrac_1
oracle    8038     1  0 14:56 ?        00:00:00 ora_tmon_cdbrac_1
oracle    8040     1  0 14:56 ?        00:00:00 ora_tt00_cdbrac_1
oracle    8042     1  0 14:56 ?        00:00:00 ora_gcr1_cdbrac_1
oracle    8044     1  0 14:56 ?        00:00:00 ora_smco_cdbrac_1
oracle    8046     1  0 14:56 ?        00:00:00 ora_w000_cdbrac_1
oracle    8049     1  0 14:56 ?        00:00:00 ora_gtx0_cdbrac_1
oracle    8054     1  0 14:56 ?        00:00:00 ora_rcbg_cdbrac_1
oracle    8101     1  0 14:56 ?        00:00:00 ora_aqpc_cdbrac_1
oracle    8126     1  3 14:56 ?        00:00:11 ora_p000_cdbrac_1
oracle    8188     1  0 14:56 ?        00:00:00 ora_o001_cdbrac_1
oracle    8247     1  1 14:56 ?        00:00:04 ora_p001_cdbrac_1
oracle    8249     1  0 14:56 ?        00:00:00 ora_p002_cdbrac_1
oracle    8251     1  0 14:56 ?        00:00:00 ora_p003_cdbrac_1
oracle    8302     1  0 14:56 ?        00:00:00 ora_qm02_cdbrac_1
oracle    8304     1  0 14:56 ?        00:00:00 ora_qm05_cdbrac_1
oracle    8306     1  0 14:56 ?        00:00:00 ora_q002_cdbrac_1
oracle    8310     1  0 14:56 ?        00:00:00 ora_q004_cdbrac_1
oracle    8327     1  0 14:56 ?        00:00:00 ora_ppa6_cdbrac_1
oracle    8663     1  1 14:56 ?        00:00:02 ora_cjq0_cdbrac_1
oracle    8708     1  0 14:56 ?        00:00:00 ora_p004_cdbrac_1
oracle    8710     1  0 14:56 ?        00:00:00 ora_p005_cdbrac_1
oracle    9052     1  0 14:58 ?        00:00:00 ora_q003_cdbrac_1
oracle    9118     1  0 14:59 ?        00:00:00 ora_p006_cdbrac_1
oracle    9120     1  0 14:59 ?        00:00:00 ora_p007_cdbrac_1
oracle    9294  7647  0 15:01 pts/0    00:00:00 grep ora_
[oracle@ol6-121-rac2 diag]$

之后:

[oracle@ol6-121-rac1 admin]$ ps -ef |grep ora_
oracle   10514     1  0 14:59 ?        00:00:00 ora_pmon_cdbrac_1
oracle   10516     1  0 14:59 ?        00:00:00 ora_psp0_cdbrac_1
oracle   10548     1  3 14:59 ?        00:00:13 ora_vktm_cdbrac_1
oracle   10552     1  2 14:59 ?        00:00:07 ora_u004_cdbrac_1
oracle   10558     1  7 14:59 ?        00:00:28 ora_u005_cdbrac_1
oracle   10563     1  0 14:59 ?        00:00:00 ora_ping_cdbrac_1
oracle   10569     1  0 14:59 ?        00:00:02 ora_u010_cdbrac_1
oracle   10578     1  0 14:59 ?        00:00:00 ora_dbw0_cdbrac_1
oracle   11244  9828  0 15:05 pts/0    00:00:00 grep ora_
[oracle@ol6-121-rac1 admin]$

2. 必须网络登录,不能本地验证:

[oracle@ol6-121-rac1 admin]$ sqlplus "sys/oracle@CDBRAC as sysdba"

SQL*Plus: Release 12.1.0.1.0 Production on Wed Dec 9 15:04:33 2015

Copyright (c) 1982, 2013, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Advanced Analytics and Real Application Testing options

SQL>
SQL>


3. 可以不同实例不同值:

SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
cdbrac_1

SQL> show parameter thread

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
parallel_threads_per_cpu             integer     2
thread                               integer     0
threaded_execution                   boolean     TRUE
SQL>


SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
cdbrac_2

SQL> show parameter thread

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
parallel_threads_per_cpu             integer     2
thread                               integer     0
threaded_execution                   boolean     FALSE
SQL>

4. listener相关修改:
当threaded_execution这个字被设置成true后,在listener.ora文件中,需要加上:

DEDICATED_THROUGH_BROKER_[listener-name]=ON。

参考:
http://docs.oracle.com/database/121/REFRN/GUID-7A668A49-9FC5-4245-AD27-10D90E5AE8A8.htm#REFRN10335
http://docs.oracle.com/database/121/CNCPT/process.htm#CNCPT1245

闰秒(Leap Second)问题

$
0
0

2017年的第一天,因为闰秒的关系,加上时差的原因,我国将在北京时间2017年1月1日的7时59分59秒和全球同步进行闰秒调整,届时会出现7:59:60的特殊现象。(国家授时中心闰秒公告)

那么闰秒对数据库有什么影响?

(一)具体的说:
可以参考:Information Center: Leap Second Information for All Products – Database – Exadata – Middleware – Exalogic – Linux – Sun – Fusion – EBS – JDE – Siebel – Peoplesoft (Doc ID 2019397.2)

这是一篇非常详尽的关于Oracle所有产品,是否受闰秒影响的汇总文档。包括了Sun Microsystems,Linux & VM,Database & EM,Exadata & Exalogic,Fusion Middleware,Applications。

(二)简单的说:

1. 对于RAC系统,NTP闰秒问题可能会导致节点reboot。但以下两种情况将不受影响:
1.1 使用了第三方cluster 软件,如Sun Cluster or Veritas SFRAC 配置。
1.2 使用 Oracle Clusterware 10.2.0.4 及更高的版本(包括 11g、12c 等)。

2. 对于Linux 及Oracle VM,部分应用程序无法处理该非常规“23:59:60”的时间戳,可能会导致应用挂起或主机重启。

3. 对于单节点数据库运行无影响,系统层闰秒调整不会对RDBMS 产生影响。

解决方案:
对于10.2.0.4以下的版本的RAC,导致节点reboot的触发条件必须同时满足如下2个条件:
1. xntpd没有启用slewing
2. oracle的clusterware(10g还没有gi),没有打上fix for bug 5015469 or bug 6022204

因此,推荐的解决方案是避免上面的条件1,启用xntpd的slewing来解决问题:

a). 在linux中修改/etc/sysconfig/ntpd中,修改:
OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid -x",使用-x参数启动ntp。

b). 在solaris中修改/etc/inet/ntp.conf中,添加:
slewalways yes
disable pll

c). 其他平台,请参考厂家的系统管理手册

修改后重启ntpd服务。

参考:
Information Center: Leap Second Information for All Products – Database – Exadata – Middleware – Exalogic – Linux – Sun – Fusion – EBS – JDE – Siebel – Peoplesoft (Doc ID 2019397.2)
How Leap Second Affects The OS Clock on Linux and Oracle VM (Doc ID 1453523.1)
NTP leap second event causing Oracle Clusterware node reboot (Doc ID 759143.1)

Solaris操作系统真的停止开发了吗?

$
0
0

Solaris系统将被停止开发,这个消息,据我所看到的,最初的来源是来自thelayoff网站的消息『Solaris being canned, at least 50% of teams to be RIF’d in short term

All hands meetings being cancelled on orders from legal to prevent news from spreading.

Hardware teams being told to cease development.

There will be no Solaris 12, final release will be 11.4.

Orders coming straight from Larry.

No info on timing yet.

但是Oracle官方一直没有回应这个消息。

估计很多客户也在求证这个消息,上周,system团队的老大发了个邮件,希望澄清这个事情。

首先,开篇就说了solaris没有死。

然后说Solaris后续的功能更新将基于版本的后面的小数点,而不是大版本。———— 所以……谣言没错,确实没有了solaris 12,只有solaris 11.XX。

然后,说了solaris 11的Premier Support至少会持续到2031年。

最后,说了如果客户需要和硬件团队的领导邮件沟通上述情况,他们会很乐意。

swap不足导致ora-4030

$
0
0

客户一个测试环境,一个主机上面运行了很多数据库,某库的程序会时不时报错ora-4030。

加大了pga,然后还检查了ulimit的 data 和 stack都是ulimit。还是报错。

进而检查/var/adm/messages,发现有报错swap不足的情况。

所以,解决方法是加大物理内存,或者加大swap(文档要求是对于8G以上物理内存,swap的设置是0.7倍物理内存),

参考:『一个奇怪的ora-4030错误的诊断过程』(其实这个文档中的客户和我的客户,是同一个。:))

Viewing all 129 articles
Browse latest View live