您的位置:首页 > 数据库 > Oracle

oracle日常运维及应急故障处理手册

2016-10-06 18:58 507 查看

常见问题及处理方案

CPU使用率高的问题

通过操作系统命令toptopasglance等查看top进程号,确认是系统进程还是oracle应用进程,查询当前top进程执行的操作和sql语句进行分析。

根据进程号获取正在执行的sql

SELECTa.osuser,a.username,b.address,b.hash_value,b.sql_textfromv$sessiona,v$sqltextb,v$processp
wherep.spid=&spid
andp.addr=a.paddr
anda.STATUS='ACTIVE'
anda.sql_address=b.address
orderbyaddress,piece;

数据库无法连接

数据库无法连接,一般可能是如下原因造成:
(1)数据库宕了
(2)监听异常
(3)数据库挂起
(4)归档目录满
(5)数据库或应用主机的网卡出现问题不能正常工作
(6)应用主机到数据库主机的网络出现问题。
1、数据库宕了
立即启动数据库。
2、监听异常
此时一般体现为:
监听进程占用CPU资源大;
监听日志异常。
此时,立即重启监听,监听重启一般能在1分钟之内完成。
3、数据库挂起
立即重启数据库。
4、归档目录满
(1)在没有部署OGG数据同步的情况下,立即清理归档日志文件。
(2)如果部署了OGG数据同步,查看OGG正在读取的归档日志文件,立即
清理OGG不再需要的日志文件。
5、数据库或应用主机的网卡出现问题不能正常工作。
立即联系主机工程师处理。
6、应用主机到数据库主机的网络出现问题。
立即联系网络维护人员查看。

CRS/GI无法启动

对于10g及11gR1版本的CRS问题

1、进入/tmp目录下,看是否产生了crsctl.xxxxx文件
如果有的话,看文件内容,一般会提示OCR无法访问,或者心跳IP无法
正常绑定等信息。
2、如果/tmp目录下没有crsctl.xxxxx文件
此时查看ocssd.log文件,看是否能从中得到有价值的信息。
可能的问题:网络心跳不通。
3、/tmp目录无crsctl.xxxxx且日志中没有报错信息,只有停CRS时的日志信
息。
此时可能是RAC两个节点对并发裸设备的访问有问题,此时考虑:
(1)停掉两个节点的CRS。
(2)两个节点先同时去激活并发VG,然后再激活VG。
(3)重新启动CRS。

对于11gR2的GI问题

分析$GRID_HOME/log/nodename目录下的日志文件,看是否能从中找出无法启动的原因。
常见问题:
1、心跳IP不同。
2、ASM实例无法启动。

对CRS的故障诊断和分析,参加本文档中RAC部分的MOS文档.

数据库响应慢

应急处理步骤:

(1)找到占用CPU资源大的sql或者模块,然后停掉此应用模块。
(2)如果属于由于种种原因引起的数据库hang住情况,立即重启数据库,此时重启需要约15分钟时间。
重要说明:
如果重启数据库的话,会有如下负面影响:
(1)要kill掉所有连接到数据库中的会话,所有会话都会回滚。
(2)立即重启的话,不能获取并保留分析数据库挂起原因的信息,在后续分析问题时,没有足够信息用于分析问题产生的根本原因。
一般正常重启的话,都需要手动获取用于分析数据库重启原因的信息,以便编写分析报告,但是在最长情况下,获取日志信息可能就要40分钟时间。此时一般做systemstatedump,且如果是rac情况的话,需要2个节点都做,且需要做2次或以上。
常规处理步骤,分如下几种情况处理:
(1)所有业务模块都慢。
(2)部分业务模块慢。
(3)数据库hang住。

所有业务模块都慢

此时首先查看系统资源,看是否属于CPU资源使用率100%的问题,如果是,参考本章“CPU使用率高的问题”解决办法。如果系统资源正常,那很可能是数据库hang住了,此时参考数据库Hang部分。

部分业务模块慢

分析运行慢的模块的sql语句:
(1)看是否是新上的sql。
(2)看执行计划是否高效。
(3)优化运行慢的模块的sql语句。

数据库hang住

应急处理方式:重启数据库。

常规处理方式:

(1)分析alert日志,看是否能从alert日志中,可以很快找到引起问题的原
因。

(2)做3级别的hanganalyze,先做一次,然后隔一分钟以后再做一次。
并分析hanganalyze生成的trace文件,看是否可以找到引起数据库hang
住的会话的信息。

(3)做systemstatedump
此时生成systemstatedump的时间会比较长,尤其是在会话数量较多的情
况下。且生成dump文件的大小较大,在G级别以上。在生成一次以
后,过一分钟再收集一次,另外如果是RAC,那么两个节点都需要收
集。
对hang做dump请参考“对数据库HANG做DUMP一章”。

数据误删除

此问题,没有应急办法,只能按如下步骤处理:
1、对于10g及以上版本,看是否可
4000
以通过闪回进行恢复。
2、查看测试环境数据库,看其中是否有需要的数据。
3、使用备份进行恢复,此方法一般花费时间较长。

快速shutdown数据库

1.停止监听

2.做一个检查点操作

SQL>altersystemcheckpoint;
3.杀掉所有LOCAL=NO的操作系统进程

AIX、HP-UX、Linux、Solaris:
$ps-ef|grep$ORACLE_SID|grepLOCAL=NO|grep-vgrep|awk'{print$2}'|xargs-ikill-9{}

Windows:
SQL>select'orakill'||
(selectvaluefromv$parameterwherename='instance_name')||''||p.spid
fromv$processp,v$bgprocessbp
wherep.ADDR=bp.PADDR(+)
andbp.PADDRisnull
andp.SPIDisnotnull;

在命令行执行:
C:\>orakilldb17642
C:\>orakilldb17644
4.停止数据库

SQL>shutdownimmediate

清理分布式事务

--9i需要设置_sum_debug_mode
SQL>altersessionset"_smu_debug_mode"=4;

altersessionsetnls_date_format='YYYY-MM-DDHH24:MI:SS';
columnlocal_trna_idformata20
columnglobal_tran_idformata25
SELECTLOCAL_TRAN_ID,GLOBAL_TRAN_ID,FAIL_TIME,STATE,MIXED

FROMDBA_2PC_PENDING;

LOCAL_TRAN_IDGLOBAL_TRAN_IDFAIL_TIMESTATEMIX
------------------------------------------------------------------------------
12.29.103137TAXIS.9572b613.12.29.10313730-aug-201110:09:11collectingno

SQL>commitforce'12.29.103137';
Commitcomplete.
SQL>EXECUTEDBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('12.29.103137');
PL/SQLproceduresuccessfullycompleted.
SQL>commit;--清理每个分布式事务都需要commit;

数据泵

1.相关参数

PARALLEL参数考虑
可以设置成物理CPU(不是逻辑CPU)数的两倍数目,然后调整
对于DataPumpExport,PARALLEL参数必须要小于等于dumpfiles数
对于DataPumpImport,PARALLEL不要比dump文件数大很多,可以大一些。这个参数也指定了导入时创建索引的并行度。
PARALLEL只允许在企业版使用。

nohupexpdpsystem/managerschemas=kdjmDIRECTORY=DUMP_FILESPARALLEL=3dumpfile=expCASES_%U.dmplogfile=nnsiexp2008_12_28.log&
通配符%U,它指示文件将按需要创建,格式将为expCASES_nn.dmp,其中nn从01开始,然后按需要向上增加

相关监控

--监控长事务
setlinesize120
columnopnameheading'Operation'formata25
columntargetheading'Target'formata15
columnpctheading'Percent'format999
columnesheading'Elapsed|Seconds'format999999
columntrheading'Time|Remaining|Seconds'format99999
columnprogramformata30
columnmachineformata16

selectL.sidssid,
substr(opname,1,25)opname,
target,
trunc((sofar/totalwork)*100)pct,
to_char(60*sofar*8192/(24*60*(last_update_time-start_time))/1024/1024/60,
'9999.0')Rate,
round(elapsed_seconds/60,2)es,
round(time_remaining/60,2)tr,
program,
machine
fromv$session_longopsL,v$sessions
wheretime_remaining>0andl.sid=s.sid
orderbystart_time;

坏块恢复

在遇到坏块的时,一般应按以下的流程来处理:
1如果坏块的对象是索引,重建索引
2使用备份来进行恢复
3使用10231事件,或者DBMS_REPAIR.SKIP_CORRUPT_BLOCKS过程,让oracle跳过坏块,然后用exp导出表和使用CREATETABLEAS创建新表。
4尝试使用SQL脚本将完好的数据复制到一个新表中,或者用EXP配合QUERY参数导出完好的数据。
5手工修改坏块。

有两种情况是不能使用事件10231和DBMS_REPAIR.SKIP_CORRUPT_BLOCKS来跳过坏块的:
1硬件问题造成OS层不能读取数据。
2表中的非数据块,或者说是元数据块。比如段头,ExtentMap块。这种坏块是不能跳过的。
3在表中存在有其他异常的块,从单个块来看都没有损坏,checksum值也是正确的,但是有的块在段内却是有问题的。比如在段的高水位下存在未格式化的块,查询这样的表时,会报ORA-8103错误;如果块的objectid与段在数据字典里的dataobjectid不相符,则会报ORA-1401错误。
Oracle数据文件的坏块,可分为物理坏块和逻辑坏块。物理坏块(也称为介质坏块),指的是块格式本身是坏的,块内的数据没有任何意义。而逻辑坏块,指的是块内的数据在逻辑上存在问题。比如说索引块的索引值没有按从小到大排列。物理坏块一般是由于内存问题、OS问题、IO子系统问题和硬件问题,逻辑坏块是由于ORACLEBUG等原因引起。

对数据库中的坏块进行验证。
RMAN>backupvalidatedatabase;

恢复一个数据文件上的多个坏块
RMAN>blockrecoverdatafile14block56,107,276,517;

检验后我们查V$DATABASE_BLOCK_CORRUPTION
SQL>select*fromv$database_block_corruption;

FILE#BLOCK#BLOCKSCORRUPTION_CHANGE#CORRUPTIO
---------------------------------------------------------
1427610CHECKSUM
1451710CHECKSUM
1410710CHECKSUM
145610CHECKSUM

还可以通过blockrecovercorruptionlist进行块的恢复,这是在大量块损坏时或全部块损坏时使用,
前提是先执行backupvalidatedatabase,在V$DATABASE_BLOCK_CORRUPTION里有对应的坏块的列表。
RMAN>blockrecovercorruptionlist;

SQLTUNING

SQLPROFILE

创建PROFILE

declare
v_hhintsys.sqlprof_attr;
cl_sql_textclob;
begin
selectSQL_TEXT
intocl_sql_text
fromv$sql
wheresql_id='1304vvhkfctzq'
andrownum<2;
v_hhint:=sys.sqlprof_attr('BEGIN_OUTLINE_DATA',
'IGNORE_OPTIM_EMBEDDED_HINTS',
'OPTIMIZER_FEATURES_ENABLE(''10.2.0.4'')',
'ALL_ROWS',
'OUTLINE_LEAF(@"SEL$1")',
'INDEX_RS_ASC(@"SEL$1""T2"@"SEL$1"("T2"."STATUS"))',
'END_OUTLINE_DATA');
dbms_sqltune.import_sql_profile(cl_sql_text,
v_hhint,
'SQLPROFILE_1304vvhkfctzq',
force_match=>true,
replace=>true);
end;
/

获取PFOFILE的名字

SELECTname,created,category,sql_Textfromdba_sql_profilesORDERBYcreatedDESC;

删除PFOFILE

BEGIN
DBMS_SQLTUNE.DROP_SQL_PROFILE(name=>'PROFILE_NAME');
END;
/

获取OUTLINEHINT的信息
SELECTsql_attr.attr_valoutline_hints
FROMdba_sql_profilessql_profiles,sys.SQLPROF$ATTRsql_attr

WHEREsql_profiles.signature=sql_attr.signature
ANDsql_profiles.name='SQLPROFILE_1304vvhkfctzq'
ORDERBYsql_attr.attr#ASC;

STA

InordertoexecuteSqlTuningAdviserAPI,onemustbegrantedwith“ADVISER”role.

grantadviserto<user>;

–foraspecificstatementfromAWR

SETSERVEROUTPUTON
--TuningtaskcreatedforspecificastatementfromtheAWR.
DECLARE
l_sql_tune_task_idVARCHAR2(100);
BEGIN
l_sql_tune_task_id:=DBMS_SQLTUNE.create_tuning_task(
begin_snap=>764,
end_snap=>938,
sql_id=>'19v5guvsgcd1v',
scope=>DBMS_SQLTUNE.scope_comprehensive,
time_limit=>60,
task_name=>'19v5guvsgcd1v_AWR_tuning_task',
description=>'Tuningtaskforstatement19v5guvsgcd1vinAWR.');
DBMS_OUTPUT.put_line('l_sql_tune_task_id:'||l_sql_tune_task_id);
END;

–orforaspecificstatementfromSharedLibraryCache

DECLARE
l_sql_tune_task_idVARCHAR2(100);
BEGIN
l_sql_tune_task_id:=DBMS_SQLTUNE.create_tuning_task(
sql_id=>'fhahkc71k304u',
scope=>DBMS_SQLTUNE.scope_comprehensive,
time_limit=>60,
task_name=>'fhahkc71k304u_tuning_task',
description=>'Tuningtaskforstatementfhahkc71k304u.');
DBMS_OUTPUT.put_line('l_sql_tune_task_id:'||l_sql_tune_task_id);
END;
/

--Interruptandresumeatuningtask.

EXECDBMS_SQLTUNE.interrupt_tuning_task(task_name=>'emp_dept_tuning_task');
EXECDBMS_SQLTUNE.resume_tuning_task(task_name=>'emp_dept_tuning_task');

--Cancelatuningtask.

EXECDBMS_SQLTUNE.cancel_tuning_task(task_name=>'emp_dept_tuning_task');

--Resetatuningtaskallowingittobere-executed.

EXECDBMS_SQLTUNE.reset_tuning_task(task_name=>'emp_dept_tuning_task');

executethetuningtask

EXECDBMS_SQLTUNE.execute_tuning_task(task_name=>'fhahkc71k304u_AWR_tuning_task');

reporttuningtaskfindings

SETLONG100000;
SETPAGESIZE1000
SETLINESIZE300
SELECTDBMS_SQLTUNE.report_tuning_task('fhahkc71k304u_AWR_tuning_task')ASrecommendationsFROMdual;
SETPAGESIZE24

acceptrecommendations

executedbms_sqltune.accept_sql_profile(task_name=>'fhahkc71k304u_AWR_tuning_task',replace=>TRUE);

usefulviews

DBA_ADVISOR_TASKS
DBA_ADVISOR_FINDINGS
DBA_ADVISOR_RECOMMENDATIONS
DBA_ADVISOR_RATIONALE
DBA_SQLTUNE_STATISTICS
DBA_SQLTUNE_BINDS
DBA_SQLTUNE_PLANS
DBA_SQLSET
DBA_SQLSET_BINDS
DBA_SQLSET_STATEMENTS
DBA_SQLSET_REFERENCES
DBA_SQL_PROFILES
V$SQL
V$SQLAREA
V$ACTIVE_SESSION_HISTORY

收集统计信息

execdbms_stats.gather_table_stats(
ownname=>'SYS',
tabname=>'T2',
estimate_percent=>100,
cascade=>true,
method_opt=>'forallcolumnssize1');

显示执行计划

select*fromtable(dbms_xplan.display);
select*fromtable(dbms_xplan.display_cursor(null,null,'ALLSTATSLAST'));
select*fromtable(dbms_xplan.display_awr('a7tgurqg403wp',null,null,'ALL'));

显示执行计划的outline
select*fromtable(dbms_xplan.display_cursor('sql_id',null,'outline'));

显示queryblock(qb_name)

select*
from
table(
dbms_xplan.display(
null,
null,
'typicalalias-rows-bytes-cost'
)
)
;

柱状图

删除柱状图

declare
srecdbms_stats.statrec;
m_distcntnumber;
m_densitynumber;
m_nullcntnumber;
m_avgclennumber;
n_arraydbms_stats.numarray;
begin
dbms_stats.get_column_stats(
ownname=>user,
tabname=>'t1',
colname=>'n1',
distcnt=>m_distcnt,
density=>m_density,
nullcnt=>m_nullcnt,
srec=>srec,
avgclen=>m_avgclen
);
srec.bkvals:=null;
srec.novals:=dbms_stats.numarray(
utl_raw.cast_to_number(srec.minval),
utl_raw.cast_to_number(srec.maxval)
);
srec.epc:=2;
dbms_stats.prepare_column_values(srec,srec.novals);

m_density:=1/m_distcnt;

dbms_stats.set_column_stats(
ownname=>user,
tabname=>'t1',
colname=>'n1',
distcnt=>m_distcnt,
density=>m_density,
nullcnt=>m_nullcnt,
srec=>srec,
avgclen=>m_avgclen
);
exception
whenothersthen
raise;--shouldhandlediv/0
end;
/

表碎片整理

Oracle10g之前

一般使用altertabletable_namemovetablespace,然后rebuild索引,因为move会导致rowid改变,从而原来的索引失效。
查看哪些表在空间上存在问题,可以查看dba_tables视图的avg_space列,这列显示的是数据库块的平均空闲空间大小,我们在建表的时候可以通过制定PCTFREE参数来设置每个数据块中保留空间的百分比,这部分空间用于因更新块内的行而导致的增长,默认值是10%,也就是819bytes左右(块大小为8KB)。如果avg_space大于2KB,可能重整空间会有意义,这个值太大说明空间利用率较低,块空闲较多。我们调整空间的主要目的是降低高水位线(HIGHWATER
MARK),使扫描的表块数变小,从而提高效率。

Oracle10g之后

altertabletable_nameenablerowmovement;
altertabletable_nameshrinkspacecascade;

altertabletable_namemovedisablerowmovement;

清除监听日志

lsnrctlsetlog_statusoff
lsnrctlsetlog_statuson

重建oraInventory

$cat/etc/oraInst.loc
inventory_loc=/oracle/oraInventory
inst_group=oinstall

$cd$ORACLE_HOME/oui/bin
$./runInstaller-silent-attachHomeORACLE_HOME=$ORACLE_HOMEORACLE_HOME_NAME="OraDb11g_home1"
或者(/oracle/oraInventory目录可以mv掉,新建个目录)
exportORACLE_HOME=/oracle/product/crs/10.2.0
cd$ORACLE_HOME/oui/bin
./attachHome.sh

物化视图

删除基于DBLINK的物化视图的时候要确认DBLINK的存在,否则会造成物化视图注册信息无法清除。

删除物化视图并不意味着要删除物化视图日志。因为物化视图日志可以同时支持多个物化视图的刷新,如果物化视图日志被删除,那么所有基于这个物化视图日志的物化视图无法再进行快速刷新。

在ONCOMMIT刷新模式下,如果基表的DML很频繁,会造成刷新很频繁,这可能会造成DROP物化视图的语句一直挂起。

迁移数据文件

1.使数据文件离线
alterdatabasedatafile'old_path'offline

2.移动数据文件
RMAN>copydatafile'old_path'to'new_path';

3重命名数据文件
SQL>altertablespacetbs_namerenamedatafile'old_path'to'new_path';

4恢复数据文件
RMAN>recoverdatafile'new_path';

5使数据文件在线
alterdatabasedatafile'new_path'online;

SQLNET

IP访问限制

修改(需重启监听)
$ORACLE_HOME/network/admin/sqlnet.ora:
tcp.validnode_checking=yes
tcp.invited_nodes=(localhost,本机ip,应用服务器ip,管理机ip等)
重启监听:lsnrctlstop;lsnrctlstart。

参考文章

WhendoSQLNET.ORAchangestakeeffect?(DocID562589.1)
HowtoCentralizeTNSNAMES.ORA,LISTENER.ORAAndSQLNET.ORAfiles(DocID362761.1)
ConfigureMultipleDBInstancesToShareSQLNET.ORAWithoutGivingWALLET_LOCATIONForEUS(DocID405682.1)
ParameterOUTBOUND_CONNECT_TIMEOUTinSQLNET.ORA(DocID519391.1)

增加CurrentSCN

主要针对ORA-006002662

通过adjust_scnevent来调整

MOS30681.1文章如下

DocID:Note:30681.1
Subject:EVENT:ADJUST_SCN-QuickReference
Type:REFERENCE
Status:PUBLISHED
ContentType:TEXT/PLAIN
CreationDate:20-OCT-1997
LastRevisionDate:04-AUG-2000
Language:USAENG
ADJUST_SCNEvent
~~~~~~~~~~~~~~~~
***WARNING***
Thiseventshouldonlyeverbeusedundertheguidance
ofanexperiencedOracleanalyst.
IfanSCNisaheadofthecurrentdatabaseSCN,thisindicates
someformofdatabasecorruption.Thedatabaseshouldberebuilt
afterbumpingtheSCN.
****************

TheADJUST_SCNeventisusefulinsomerecoverysituationswherethe
currentSCNneedstobeincrementedbyalargevaluetoensureit

isaheadofthehighestSCNinthedatabase.Thisistypically

requiredifeither:
a.AnORA-600[2662]errorissignalledagainstdatabaseblocks
or
b.ORA-1555errorskeepoccuringafterforcingthedatabaseopen
orORA-604/ORA-1555errorsoccurduringdatabaseopen.
(Note:IfstartupreportsORA-704&ORA-1555errorstogether
thentheADJUST_SCNeventcannotbeusedtobumpthe
SCNastheerrorisoccuringduringbootstrap.
Repeatedstartup/shutdownattemptsmayhelpiftheSCN
mismatchissmall)
or
c.Ifadatabasehasbeenforcedopenused_ALLOW_RESETLOGS_CORRUPTION
(See<Parameter:Allow_Resetlogs_Corruption>)

TheADJUST_SCNeventactsasdescribedbelow.

**NOTE:YoucancheckthattheADJUST_SCNeventhasfiredasit
shouldwriteamessagetothealertlogintheform
"Debuggingeventusedtoadvancescnto%s".
IfthismessageisNOTpresentinthealertlogtheevent
hasprobablynotfired.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
IfthedatabasewillNOTopen:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Takeabackup.
Youcanuseevent10015totriggeranADJUST_SCNondatabaseopen:

startupmount;

altersessionsetevents'10015tracenameadjust_scnlevel1';

(NB:YoucanonlyuseIMMEDIATEhereonanOPENdatabase.Ifthe

databaseisonlymountedusethe10015triggertoadjustSCN,

otherwiseyougetORA600[2251],[65535],[4294967295])

alterdatabaseopen;

IfyougetanORA600:2256shutdown,useahigherlevelandreopen.

Do*NOT*setthiseventininit.oraortheinstancewillcrashassoon
asSMONorPMONtrytodoanycleanup.Alwaysuseitwiththe

"altersession"command.

~~~~~~~~~~~~~~~~~~~~~~~~~~
Ifthedatabase*IS*OPEN:
~~~~~~~~~~~~~~~~~~~~~~~~~~
YoucanincreasetheSCNthus:

altersessionsetevents'IMMEDIATEtracenameADJUST_SCNlevel1';

LEVEL:Level1isusuallysufficient-itraisestheSCNto1billion
(1024*1024*1024)
Level2raisesitto2billionetc...

IfyoutrytoraisetheSCNtoalevelLESSTHANorEQUALtoits
currentsettingyouwillget<OERI:2256>-Seebelow.
Ie:TheeventstepstheSCNtoknownlevels.Youcannotuse
thesameleveltwice.
CalculatingaLevelfrom600errors:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TogetaLEVELforADJUST_SCN:
a)DeterminetheTARGETscn:
ora-600[2662]See<OERI:2662>UseTARGET>=blocksSCN
ora-600[2256]See<OERI:2256>UseTARGET>=CurrentSCN
b)MultiplytheTARGETwrapnumberby4.Thiswillgiveyouthelevel

touseintheadjust_scntogetthecorrectwrapnumber.
c)Next,addthefollowingvaluetotheleveltogetthedesiredbase
valueaswell:
AddtoLevelBase
~~~~~~~~~~~~~~~~~~~~~~~~
00
11073741824
22147483648
33221225472

在Oracle10g之前,一般采用使用这个event的方式来增大SCN.

ORA-00600:internalerrorcode,arguments:[2662],[0],[547743994],[0],[898092653],[8388617],[],[]
这个报错参数的含义在metalink中如此描述的:
Arg[a]CurrentSCNWRAP
ArgCurrentSCNBASE
Arg[c]dependentSCNWRAP
为了存储更大的SCN值,当SCNBASE到足够大并开始重置的时候,SCNWRAP将加1。
Arg[d]dependentSCNBASE
Arg[e]WherepresentthisistheDBAwherethedependentSCNcamefrom.
也就是Arg[d]的值是从哪个block中找到的,通常是一个datablockaddress。
通过这几个参数根据一定的规则可以计算出我们需要的level。计算规则如下:
1.Arg[c]*4得出一个数值,假设为V_Wrap
2.如果Arg[d]=0,则V_Wrap值为需要的level
Arg[d]<1073741824,V_Wrap+1为需要的level
Arg[d]<2147483648,V_Wrap+2为需要的level
Arg[d]<3221225472,V_Wrap+3为需要的level

计算方法的例子

ORA-00600:internalerrorcode,arguments:[2662],[0],[2179133],[8656],[70114056],[33855201],[],[]

Arg[C]*4=8656*4=34624
Arg[d]=70114056<1073741824
所以level=34624+1=34625
因此在这个例子中我们应该执行
altersessionsetevents'IMMEDIATEtracenameADJUST_SCNlevel34625';

但是随着oraclescn的patch更新后,11g后续的版本有些已经不能使用这种方式推进scn了.
11.2.0.4,12.0.1.0默认屏蔽;
11.2.0.2.5屏蔽

_minimum_giga_scn调整

这个参数可以将SCN提高1G的倍数,即1024*1024*1024.

ALTERsystemSET"_minimum_giga_scn"=1scope=spfile;

或者在pfile里加入

但是随着oraclescn的patch更新后,11g后续的版本有些已经不能使用这种方式推进scn了.
11.2.0.4,12.0.1.0默认屏蔽;

修改控制文件推荐SCN

dump函数联合ue修改

oradebug修改SCN

http://blog.mchz.com.cn/?p=9009
http://www.askmaclean.com/archives/advanced-diagnostic-using-oradebug-dumpvar.html

BBED修改SCN

参考文章

http://www.dbform.com/html/2006/208.html
MasterNote:OverviewforSCNissues(DocID1503937.1)
http://www.killdb.com/2013/01/21/about-controlfile-structure.html

分区表

11ginterval分区

按年自增

CREATETABLEyear_interval_partition_table
(idnumber,time_coldate)partitionbyrange(time_col)
INTERVAL(NUMTOYMINTERVAL(1,'year')
(PARTITIONpart1VALUESLESSTHAN(TO_DATE('2013-06-01','YYYY-MM-DD')),
PARTITIONpart2VALUESLESSTHAN(TO_DATE('2014-06-01','YYYY-MM-DD'))
)

按月自增

createtablemonth_interval_partition_table(idnumber,time_coldate)partitionbyrange(time_col)
interval(numtoyminterval(1,'month'))
(
partitionp_month_1valueslessthan(to_date('2014-01-01','yyyy-mm-dd'))
);

begin
foriin0..11loop
insertintoMONTH_INTERVAL_PARTITION_TABLEvalues(i,add_months(to_date('2014-01-01','yyyy-mm-dd'),i));
endloop;
commit;
end;
/

按天分区

createtableday_interval_partition_table(idnumber,time_coldate)partitionbyrange(time_col)
interval(numtodsinterval(1,'day'))
(
partitionp_day_1valueslessthan(to_date('2014-01-01','yyyy-mm-dd'))
);

begin
foriin1..12loop
insertintoDAY_INTERVAL_PARTITION_TABLEvalues(i,trunc(to_date('2014-01-01','yyyy-mm-dd')+i));
endloop;
commit;
end;
/

[b]删除前一天的分区


declare
min_parvarchar2(30);
max_parvarchar2(30);
str_sqlvarchar2(500);
begin
selectmin(partition_name)intomin_parfromuser_tab_partitionswheretable_name='T_PARTITION'andpartition_name!='P_DAY_1';
selectmax(partition_name)intomax_parfromuser_tab_partitionswheretable_name='T_PARTITION'andpartition_name!='P_DAY_1';
ifmin_par<>max_parthen
str_sql:='altertableT_partitiondroppartition'||min_par;
executeimmediatestr_sql;
endif;
end;
/

查看分区表

selecttable_name,partition_namefromuser_tab_partitionswheretable_name=’TABLE_NAME’;

SCHEDULER管理

创建
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name=>'INSERT_STAT_TBL',
job_type=>'STORED_PROCEDURE',
job_action=>'INSERT_TABLESPACE_STAT',
start_date=>sysdate,
repeat_interval=>'FREQ=DAILY;INTERVAL=1');
END;
/

执行
execdbms_scheduler.run_job('INSERT_STAT_TBL');

用户LOGON触发器

在有些情况下需要去trace某些用户的行为,这时候就需要一个登陆触发器
例如下面的脚本
CREATEORREPLACETRIGGERSYS.set_trace
AFTERLOGONONDATABASE
WHEN(USERlike'&USERNAME')
DECLARE
lcommandvarchar(200);
BEGIN
EXECUTEIMMEDIATE'altersessionsetstatistics_level=ALL';
EXECUTEIMMEDIATE'altersessionsetmax_dump_file_size=UNLIMITED';
EXECUTEIMMEDIATE'altersessionsetevents''10046tracenamecontextforever,level12''';
ENDset_trace;
/

需要授权给用户
grantaltersessionto<USERNAME>;

STATSPACK

安装

createtablespaceperfstatdatafile'datafile_path'size500Mextentmanagementlocal;

执行创建脚本,创建过程中会提示输入default_tablespace和temporary_tablespace的内容,若有错误可以查看相应生成的.lis文件.
SQL>@spcreate
若需要重建,可以运行spdrop.sql脚本来删除这些对象.然后重新运行spcreate.sql
SQL>@spdrop.sql
SQL>@spcreate

SNAPSHOT等级

level0:一般性能统计.包括等待事件、系统事件、系统统计、回滚段统计、行缓存、SGA、会话、锁、缓冲池统计等等.
level5:增加SQL语句.除了包括level0的所有内容,还包括SQL语句的收集,收集结果记录在stats$sql_summary中,快照的默认级别.
level6:包括SQL的执行计划,关注SQL的性能
level7:增加了段级统计信息(SegmentlevelStatistics),
level10:增加子锁存统计.包括level5的所有内容.并且还会将附加的子锁存存入stats$lathc_children中.在使用这个级别时需要慎重,建议在Oraclesupport的指导下进行.

收集SNAPSHOT

Level0

executestatspack.snap(i_snap_level=>0,i_modify_parameter=>’true’);
如果你只是想本次改变收集级别,可以忽略i_modify_parameter参数.
executestatspack.snap(i_snap_level=>0);

LEVEL5

默认级别
execstatspack.snap

LEVEL6

execstatspack.snap(i_snap_level=>6,i_modify_parameter=>'true')
如果你只是想本次改变收集级别,可以忽略i_modify_parameter参数.

execstatspack.snap(i_snap_level=>6)

LEVEL7

带注释的snapshot

executestatspack.snap(i_snap_level=>7,I_UCOMMENT=>'performanceissue');

修改SNAPSHOT级别

execstatspack.modify_statspack_parameter(i_snap_level=>6);

设置定时任务

SQL>@spauto
脚本中有关时间间隔的设置内容,可以修改spauto.sql其内容来更改执行间隔,默认间隔为一小时.
dbms_job.submit(:jobno,'statspack.snap;',trunc(sysdate+1/24,'HH'),'trunc(SYSDATE+1/24,''HH'')',TRUE,:instno);
这个job任务定义了收集数据的时间间隔:
一天有24个小时,1440分钟,那么:
1/24HH每小时一次
1/48MI每半小时一次
1/144MI每十分钟一次
1/288MI每五分钟一次

生成报告

SQL>@spreport.sql

删除历史数据

第一种方法:删除stats$snapshot数据表中的相应数据,其他表中的数据会相应的级连删除:
SQL>selectmax(snap_id)fromstats$snapshot;
SQL>deletefromstats$snapshotwheresnap_id<=&snap_id;

第二种方法:使用自带的脚本sptrunc.sql
SQL>@sptrunc

EXP导出快照数据

使用spuexp.par文件exp保存相应数据
spuexp.par内容:
file=spuexp.dmplog=spuexp.logcompress=ygrants=yindexes=yrows=yconstraints=ywner=PERFSTATconsistent=y

导出语句:
expuserid=perfstat/perfstatparfile=spuexp.par

根据给定的SQLHash值生成SQL报告

SQL>@sprepsql.sql

SNAPSHOT门限

快照门限只应用于stats$sql_summary表中获取的SQL语句.
因为每一个快照都会收集很多数据,每一行都代表获取快照时数据库中的一个SQL语句,所以stats$sql_summary很快就会成为Statspack中最大的表.
门限存储在stats$statspack_parameter表中:
executions_th这是SQL语句执行的数量(默认值是100)
disk_reads_tn这是SQL语句执行的磁盘读入数量(默认值是1000)
parse_calls_th这是SQL语句执行的解析调用的数量(默认值是1000)
buffer_gets_th这是SQL语句执行的缓冲区获取的数量(默认值是10000)
任何一个门限值超过以上参数就会产生一条记录.
通过调用statspack.modify_statspack_parameter函数改变门限的默认值:

execstatspack.modify_statspack_parameter(i_buffer_gets_th=>100000,i_disk_reads_th=>100000);

AWR

查看当前的AWR保存策略

select*fromdba_hist_wr_control;

修改AWR保存时间和策略

如将收集间隔时间改为30分钟一次。并且保留5天时间(注:单位都是为分钟):
execdbms_workload_repository.modify_snapshot_settings(interval=>30,retention=>5*24*60);

关闭AWR自动快照

把interval设为0则关闭自动捕捉快照

手工创建快照

execDBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();

查看快照

select*fromsys.wrh$_active_session_history;

删除快照

execWORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE(low_snap_id=>22,high_snap_id=>32,dbid=>3310949047);

在10.2.0.3的环境下执行这个命令并不会删除快照,这是个bug,bug信息为MOS8622802。

如果打算删除指定数据库的所有快照,执行下面的语句

selectdbid,status,count(*)fromwrm$_snapshotgroupbydbid,status;

execdbms_swrf_internal.unregister_database(dbid);

创建删除baseline

selectdbid,baseline_name,start_snap_id,end_snap_idfromdba_hist_baseline;

execdbms_workload_repository.create_baseline(56,59,'baseline_name');

execDBMS_WORKLOAD_REPOSITORY.DROP_BASELINE(baseline_name=>'baseline_name',cascade=>FALSE);

AWR数据的导出和导入

$ORACLE_HOME/rdbms/admin/awrextr.sql--导出

拷贝导出的awr数据到目标数据库的指定DIRECTORY
$ORACLE_HOME/rdbms/admin/awrload.sql--导入
导入需要注意几点,输入DIRECTORY的时候注意大小写,另外输入导入的文件名时只输入前缀,不要输入完整的文件名。

导入的awr保存期限超过了100年,所以不会被自动删除

其他

产生整个数据库的AWR报告,运行脚本awrrpt.sql。
@$ORACLE_HOME/rdbms/admin/awrrpt.sql

产生某个实例的AWR报告,运行脚本awrrpti.sql。
@$ORACLE_HOME/rdbms/admin/awrrpti.sql

产生某条SQL语句的AWR报告,运行脚本awrsqrpt.sql。

ORACLE11GR2中,可以将多个实例生成的AWR汇总到一个文件
@$ORACLE_HOME/rdbms/admin/awrsqrpt.sql

从AWR中获取TOP5事件

Oracle10g

selectdbidfromv$database

setlinesize200
colBEGIN_INTERVAL_TIMEfora40
colEND_INTERVAL_TIMEfora40
coleventfora40
selectsnap_id,begin_interval_time,end_interval_time,snap_levelfromdba_hist_snapshot;
selectmax(snap_id)fromdba_hist_snapshot;

coleventfora40
selectcasewait_rank
when1then
inst_id
end"InstNum",
casewait_rank
when1then
snap_id
end"SnapId",
casewait_rank
when1then
begin_snap
end"BeginSnap",
casewait_rank
when1then
end_snap
end"EndSnap",
event_name"Event",
total_waits"Waits",
time_waited"Time(s)",
round((time_waited/total_waits)*1000)"Avgwait(ms)",
round((time_waited/db_time)*100,2)"%DBtime",
substr(wait_class,1,15)"WaitClass"
from(selectinst_id,
snap_id,
to_char(begin_snap,'DD-MM-YYhh24:mi:ss')begin_snap,
to_char(end_snap,'hh24:mi:ss')end_snap,
event_name,
wait_class,
total_waits,
time_waited,
dense_rank()over(partitionbyinst_id,snap_idorderbytime_waiteddesc)-1wait_rank,
max(time_waited)over(partitionbyinst_id,snap_id)db_time
from(selects.instance_numberinst_id,
s.snap_id,
s.begin_interval_timebegin_snap,
s.end_interval_timeend_snap,
event_name,
wait_class,
total_waits-lag(total_waits,1,total_waits)over(partitionbys.startup_time,s.instance_number,stats.event_nameorderbys.snap_id)total_waits,
time_waited-lag(time_waited,1,time_waited)over(partitionbys.startup_time,s.instance_number,stats.event_nameorderbys.snap_id)time_waited,
min(s.snap_id)over(partitionbys.startup_time,s.instance_number,stats.event_name)min_snap_id
from(selectdbid,
instance_number,
snap_id,
event_name,
wait_class,
total_waitstotal_waits,
round(time_waited_micro/1000000,2)time_waited
fromdba_hist_system_event
wherewait_classnotin('Idle','SystemI/O')
unionall
selectdbid,
instance_number,
snap_id,
stat_nameevent_name,
nullwait_class,
nulltotal_waits,
round(value/1000000,2)time_waited
fromdba_hist_sys_time_model
wherestat_namein('DBCPU','DBtime'))stats,
dba_hist_snapshots
wherestats.instance_number=s.instance_number
andstats.snap_id=s.snap_id
andstats.dbid=s.dbid
ands.dbid=520444635
ands.instance_number=1
andstats.snap_idbetween29930and29943)
wheresnap_id>min_snap_id
andnvl(total_waits,1)>0)
whereevent_name!='DBtime'
andwait_rank<=5
orderbyinst_id,snap_id;

Oracle11g

selectdbidfromv$database
coleventfora40
setlinesize200
colBEGIN_INTERVAL_TIMEfora40
colEND_INTERVAL_TIMEfora40

coleventfora40
selectcasewait_rank
when1then
inst_id
end"InstNum",
casewait_rank
when1then
snap_id
end"SnapId",
casewait_rank
when1then
begin_snap
end"BeginSnap",
casewait_rank
when1then
end_snap
end"EndSnap",
event_name"Event",
total_waits"Waits",
time_waited"Time(s)",
round((time_waited/total_waits)*1000)"Avgwait(ms)",
round((time_waited/db_time)*100,2)"%DBtime",
substr(wait_class,1,15)"WaitClass"
from(selectinst_id,
snap_id,
to_char(begin_snap,'DD-MM-YYhh24:mi:ss')begin_snap,
to_char(end_snap,'hh24:mi:ss')end_snap,
event_name,
wait_class,
total_waits,
time_waited,
dense_rank()over(partitionbyinst_id,snap_idorderbytime_waiteddesc)-1wait_rank,
max(time_waited)over(partitionbyinst_id,snap_id)db_time
from(selects.instance_numberinst_id,
s.snap_id,
s.begin_interval_timebegin_snap,
s.end_interval_timeend_snap,
event_name,
wait_class,
total_waits-lag(total_waits,1,total_waits)over(partitionbys.startup_time,s.instance_number,stats.event_nameorderbys.snap_id)total_waits,
time_waited-lag(time_waited,1,time_waited)over(partitionbys.startup_time,s.instance_number,stats.event_nameorderbys.snap_id)time_waited,
min(s.snap_id)over(partitionbys.startup_time,s.instance_number,stats.event_name)min_snap_id
from(selectdbid,
instance_number,
snap_id,
event_name,
wait_class,
total_waits_fgtotal_waits,
round(time_waited_micro_fg/1000000,2)time_waited
fromdba_hist_system_event
wherewait_classnotin('Idle','SystemI/O')
unionall
selectdbid,
instance_number,
snap_id,
stat_nameevent_name,
nullwait_class,
nulltotal_waits,
round(value/1000000,2)time_waited
fromdba_hist_sys_time_model
wherestat_namein('DBCPU','DBtime'))stats,
dba_hist_snapshots
wherestats.instance_number=s.instance_number
andstats.snap_id=s.snap_id
andstats.dbid=s.dbid
ands.dbid=546108817
ands.instance_number=1
andstats.snap_idbetween66and69)
wheresnap_id>min_snap_id
andnvl(total_waits,1)>0)
whereevent_name!='DBtime'
andwait_rank<=5
orderbyinst_id,snap_id;

数据库补丁和升级

打补丁

在某些情况下,比如解决oraclescn问题,解决某些bug,需要为数据库打补丁,其中既包括DB的补丁,也包括CRS、GI的补丁。在打补丁时需要注意如下事项:
(1)确认补丁打上以后解决问题,也就是说确保“对症下药”。
(2)仔细查看补丁的readme,并严格按照readme中的步骤进行操作。
(3)使用最新版本的opatch。
(4)对于RAC,在打补丁时,尽量分节点打,也就是说,尽量使用:
opatchapply-local方式打补丁。
(5)对于10.2.0.3及以上版本的数据库,如果打的补丁是PSU,则需要为监听配置COST。

数据库升级

对于数据库的大版本升级,根据是否跨平台、停机时间长短、数据量大小,可以根据实际的情况,采用同步软件、RMAN增量备份恢复、逻辑导出等多种方式进行迁移,但是最好是先进行测试。
对于小版本的升级,首先查看升级说明README,然后先在测试环境下进行测试,完成测试后,对生产环境进行备份,备份既包括数据库数据的备份,还包括软件的备份(CRS、DB),当各项工作完成后,确认各项工作都准备好后,在生产环境下进行升级。

相关文档

DifferentUpgradeMethodsForUpgradingYourDatabase(DocID419550.1)
MasterNoteForOracleDatabaseUpgradesandMigrations(DocID1152016.1)
CompleteChecklistforManualUpgradesto10gR2(DocID316889.1)
BestPracticestoMinimizeDowntimeDuringUpgrade(DocID455744.1)
CompleteChecklistforManualUpgradesto11gR2(DocID837570.1)
CompleteChecklistforManualUpgradestoOracleDatabase12cRelease1(12.1)(DocID1503653.1)
Completechecklistforout-of-placemanualupgradefromprevious11.2.0.Nversiontothelatest11.2.0.Npatchset.(DocID1276368.1)
CompleteChecklistforUpgradingtoOracleDatabase12cRelease1usingDBUA(DocID1516557.1)
CompleteChecklisttoUpgradetheDatabaseto11gR2usingDBUA(DocID870814.1)
DatabaseServerUpgradeDowngradeCompatibilityMatrix(DocID551141.1)
Howtoestimatethetimerequiredtoupgradeadatabase(DocID739485.1)
OracleDatabaseUpgradePathReferenceList(DocID730365.1)
UpgradeAdvisorDatabasefrom9.2to11.2(DocID264.1)
UpgradeAdvisorDatabasefrom10.2to11.2(DocID251.1)

RAC

OracleClusterware的命令集可以分为4种
节点层:osnodes
网络层:oifcfg
集群层:crsctl,ocrcheck,ocrdump,ocrconfig
应用层:srvctl,onsctl,crs_stat

启动关闭RAC

停止

emctlstopdbconsole
srvctlstopinstance-draw-iraw1
srvctlstopinstance-draw-iraw2
srvctlstopasm-nraw1
srvctlstopasm-nraw2
srvctlstopnodeapps-nraw1
srvctlstopnodeapps-nraw2

启动

srvctlstartnodeapps-nraw1
srvctlstartnodeapps-nraw2
srvctlstartasm-nraw1
srvctlstartasm-nraw2
srvctlstartinstance-draw-iraw2
srvctlstartinstance-dorcl-iraw1
emctlstartdbconsole

CRS管理

CRS启动和关闭

--10.2、11.1
crsctlstopcrs#stopsOracleclusterware
crsctlstartcrs#startsOracleClusterware
crsctlenablecrs#enablesOracleClusterware
crsctldisablecrs#disablesOracleClusterware

--11.2
crsctlstopcluster–all
crsctlstopcluster-n<nodename>

1.命令汇总

--查看节点
$CRS_HOME/bin/olsnodes
--查看网络
$CRS_HOME/bin/oifcfggetif
--检查CRS
$CRS_HOME/bin/crsctlcheckcrs
--检查VIP
srvctlconfignodeapps-n<nodename>-a-g-s-l

--11gR2查看CRS状态
crsctlstatres-t-init
crsctlstatusresource-t

--检查CRS版本
crsctlquerycrsactiveversion

--启动CRS排它模式
crsctlstartcrs-excl-nocrs11.2.0.2
crsctlstartcrs-excl11.2.0.1

--直接启动CRSD服务
crsctlstartresora.crsd-init

--注册资源
crs_unregisterora.node1.ASM1.asm
crs_stat-pora.node1.ASM1.asm>ora.node1.ASM1.asm.cap
crs_registerora.node1.ASM1.asm
--11gR2
crsctlstatresora.scan1.vip-p>/tmp/1.txt
crsctladdresourceora.n2_scan1.vip-typeora.scan_vip.type-file/tmp/1.txt

--查看资源未启用的资源
crsctlstatres-w'ENABLED!=0'

OCR和VoteDisk

常用命令

--查看当前OCR
ocrcheck
--查看OCR备份
ocrconfig-showbackup
--查看Votingdisk
crsctlquerycssvotedisk

--备份OCR,路径:Grid_home/cdata/cluster_name,
ocrconfig-exportocr.bak
ocrconfig-manualbackup

--转储OCR
ocrdump-backupfilebackup_file_name

--OCR先加后删
ocrconfig-addnew_OCR_location
ocrconfig-deletecurrent_OCR_location

--移动OCR位置,OCR必须要2份以上
ocrconfig-repair-replacecurrent_OCR_location-replacementtarget_OCR_location

--查看OLR
ocrcheck-local
--以文件模式查看OLR
ocrdump-local-stdout

--备份与恢复
ocrconfig-local-exportfile_name
ocrconfig-local-importfile_name
ocrconfig–local–manualbackup

--查看OLR备份内容
ocrdump-local-backupfileolr_backup_file_name
--修改OLR备份路径
ocrconfig-local-backuplocnew_olr_backup_path

迁移OCR到ASM

a.设置ASMCompatibility为11.2.0.0
b.检查Clusterware升级完成
crsctlquerycrsactiveversion
c.使用ASMCA来在所有节点启动ASM
d.使用ASMCA来创建放置OCR的DG
e.往DG中添加OCR(确保Clusterware正在运行)
ocrconfig-add+new_disk_group
f.删除原始的OCR
ocrconfig-deleteold_storage_location

恢复OCR

a.查看节点:olsnodes
b.停止CRS
crsctlstopcrs
crsctlstopcrs-f
c.以排它模式起CRS
crsctlstartcrs-excl
检查crsd是否起,如果起了的话,停止
crsctlstopresourceora.crsd-init
d.导入OCR
ocrconfig-importfile_name
ocrcheck
e.停止CRScrsctlstopcrs-f
f.正常启动CRScrsctlstartcrs
g.检查cluvfycompocr-nall-verbose

恢复OLR

#crsctlstopcrs
#ocrconfig-local-restorefile_name
#ocrcheck-local
#crsctlstartcrs
$cluvfycompolr

迁移VotingDisk

$crsctlstartcrs-excl
$crsctlquerycssvotedisk
------------------------------------------
##STATEFileUniversalIdFileNameDiskgroup
1.ONLINE7c54856e98474f61bf349401e7c9fb95(/dev/sdb1)[DATA]
$crsctlreplacevotedisk+asm_disk_group
$crsctldeletecssvotediskFUID
#crsctlstopcrs
#crsctlstartcrs

相关文章

PlacementofVotingdiskandOCRFilesinOracleRAC10gand11gR1(DocID293819.1)

OCR/VotediskMaintenanceOperations:(ADD/REMOVE/REPLACE/MOVE)(DocID428681.1)

SCANIP

配置SCANIP

$GRID_HOME/bin/srvctlconfigscan
SCANname:onocrsst-scan,Network:1/113.52.185.0/255.255.255.0/bge0
SCANVIPname:scan1,IP:/onocrsst-scan/113.52.185.230

#DB配置初始化参数
*.remote_listener='onocrsst-scan:1521'

通过DNS查看SCANIP

$nslookuponcndb-situat-scanip
Server:10.16.26.33
Address:10.16.26.33#53

Name:oncndb-situat-scanip.sit.shanghaionstar.com
Address:113.52.185.230

切换SCANIP所在的节点

当停止SCANIP所在节点的CRS时,SCANIP自动漂到另一个节点
也可以手工发出命令:
srvctlrelocatescan-i<ordinal_number>[-n<node_name>]
srvctlrelocatescan_listener-i<ordinal_number>[-n<node_name>]

SCANIP修改监听端口

srvctlmodifyscan_listener-p3521
srvctlstopscan_listener
srvctlstartscan_listener

SCANIP配置多端口

srvctlmodifyscan_listener-p"TCP:3521/TCP:1521"

srvctlstopscan_listener
srvctlstartscan_listener

cluvfy

--校验OCR的一致性
cluvfycompocr-nall-verbose
--校验gpnp的一致性11gR2
cluvfycompgpnp-nall-verbose

查看RACinterconnectip

1.oradebugipc
sqlplus/assysdba
oradebugipc
oradebugtracefile_name;
2.select*fromx$skgxpia;
3.select*fromx$ksxpia;
4.select*fromv$cluster_interconnects;
5.SELECT*FROMV$CONFIGURED_INTERCONNECTS;

LoadBalance

--查看连接分布
setlinesize120
setpagesize999
columnservice_nameformata20
columnusernameformata20
SELECTinst_id,TYPE,service_name,Count(*)
FROMgv$sessionGROUPBYinst_id,TYPE,service_name;
INST_IDTYPESERVICE_NAMECOUNT(*)
--------------------------------------------------
1BACKGROUNDSYS$BACKGROUND29
2BACKGROUNDSYS$BACKGROUND28
2USERSYS$USERS46
1USERSYS$USERS48
1USERonpdlcl51
2USERonpdlcl65

SELECTinst_id,TYPE,service_name,username,Count(*)

FROMgv$sessionGROUPBYinst_id,TYPE,service_name,username
orderby1,2,3,4;

管理service_name

$srvctlrelocateservice-h
$srvctladdservice-h

$srvctladdservice-dorcl-sszcg2-rorcl2-aorcl1
$srvctlstartservice-dorcl-sszcg2
$srvctlstopservice-dorcl-sszcg2
$srvctlstatusservice-dRPTS
$srvctlrelocateservice-dRPTS-sRPTS3-iRPTS2-tRPTS3

Service

检查服务

SETPAGESIZE60COLSEP'|'NUMWIDTH8LINESIZE132VERIFYOFFFEEDBACKOFF
COLUMNservice_nameFORMATA20TRUNCATEDHEADING'Service'
COLUMNbegin_timeHEADING'BeginTime'FORMATA10
COLUMNend_timeHEADING'EndTime'FORMATA10
COLUMNinstance_nameHEADING'Instance'FORMATA10
COLUMNservice_timeHEADING'ServiceTime|mSec/Call'FORMAT999999999
COLUMNthroughputHEADING'Calls/sec'FORMAT99.99
BREAKONservice_nameSKIP1
SELECT
service_name
,TO_CHAR(begin_time,'HH:MI:SS')begin_time
,TO_CHAR(end_time,'HH:MI:SS')end_time
,instance_name
,elapsedpercallservice_time
,callspersecthroughput
FROM
gv$instancei
,gv$active_servicess
,gv$servicemetricm
WHEREs.inst_id=m.inst_id
ANDs.name_hash=m.service_name_hash
ANDi.inst_id=m.inst_id
ANDm.group_id=10
ORDERBY
service_name
,i.inst_id
,begin_time;

||||ServiceTime|
Service|BeginTime|EndTime|Instance|mSec/Call|Calls/sec
--------------------|----------|----------|----------|------------|---------
SYS$BACKGROUND|09:52:39|09:52:44|tea1|0|.00
|09:52:39|09:52:44|tea2|0|.00

SYS$USERS|09:52:39|09:52:44|tea1|0|.00
|09:52:39|09:52:44|tea2|0|.00

dp_test|09:52:39|09:52:44|tea2|0|.00

tea|09:52:39|09:52:44|tea1|0|.00
|09:52:39|09:52:44|tea2|0|.00

管理服务

--停止服务
execdbms_service.stop_service('SYS$SYS.SCHEDULER$_EVENT_QUEUE.INAS','inas1');
--启动服务
execdbms_service.start_service('SYS.SCHEDULER$_EVENT_QUEUE','inas1');

查看组件日志

--查看组件模块
[oracle@ora1bin]$<CRS_HOME>/bin/crsctllsmodulescss
--设置组件模块(root用户)
[root@ora1bin]#<CRS_HOME>/bin/crsctldebuglogcss"CSSD:2"
--日志级别(一般设置2即可)
level0=turnoff
level2=default
level3=verbose
level4=superverbose

CSS

查看心跳网络超时时间

crsctlgetcssmisscount

设置心跳网络超时时间

crsctlsetcssmisscount60

crsctlgetcssdisktimeout--VD的超时时间,如果超时,VD置为offline

crsctlgetcssreboottime--CSS被驱逐后,等待的时间

修改查看cssdiagwait

$crsctlsetcssdiagwait13
$crsctlgetcssdiagwait

11g不需要设置

相关文章

Top11ThingstodoNOWtoStabilizeyourRACClusterEnvironment(DocID1344678.1)
Pre-11.2:NodeFailstoRebootafterNodeEvictionorCRSCan'tRejointheClusterafterNoderebootasdiagwaithasWrongValue(DocID1277538.1)
UsingDiagwaitasadiagnostictogetmoreinformationfordiagnosingOracleClusterwareNodeevictions(DocID559365.1)
Pre-11.2CRSNotStartingAfterRebootasdiagwaitwasChangedtoWrongValue(DocID1481477.1)

定位masternode的方法

1.查询ocssd.log:不一定会有
grep-i"masternode"ocssd.log|tail-1
2.查询crsd.log文件:
grepMASTERcrsd.log|tail-1
3.查看OCR备份,OCR备份在master节点上
ocrconfig-showbackup
4.查询V$GES_RESOURCE视图

查看集群名称

方法一:
[root@tea2~]#su-grid
[grid@tea2~]$cd$ORACLE_HOME/bin
[grid@tea2bin]$./cemutlo-n
tea-cluster
方法二:
[root@rac1~]#cd/oracle/app/crs/bin
[root@rac1bin]#./ocrdump
[root@rac1bin]#viOCRDUMPFILE

设置某个资源不启动

crsctlmodifyres'ora.oc4j'-attr"ENABLED=0"
crsctlmodifyres'ora.oc4j'-attrAUTO_START=never

打开srvctl的trace

exportSRVM_TRACE=true

手工在SCAN_LISTENER中配置服务名

[grid@tea1admin]$catlistener.ora
LISTENER_SCAN1=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN1))))#lineaddedbyAgent
LISTENER=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER))))#lineaddedbyAgent
SID_LIST_LISTENER=(SID_LIST=(SID_DESC=(SID_NAME=newtea1)(GLOBAL_DBNAME=newtea_DGMGRL)(ORACLE_HOME=/oracle/app/11.2.0.4/db)))
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON#lineaddedbyAgent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN1=ON#lineaddedbyAgent

[grid@tea2admin]$catlistener.ora
LISTENER_SCAN1=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN1))))#lineaddedbyAgent
LISTENER=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER))))#lineaddedbyAgent
SID_LIST_LISTENER=(SID_LIST=(SID_DESC=(SID_NAME=newtea2)(GLOBAL_DBNAME=newtea_DGMGRL)(ORACLE_HOME=/oracle/app/11.2.0.4/db)))
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON#lineaddedbyAgent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN1=ON#lineaddedbyAgent

当在LISTENER_SCAN1上配置了GLOBAL_NAME后,自动在每个节点的LISTENER上有相应的服务名
[grid@tea2admin]$lsnrctlstatusLISTENER_SCAN1
......
Service"newtea_DGMGRL"has3instance(s).
Instance"newtea1",statusREADY,has1handler(s)forthisservice...
Instance"newtea2",statusUNKNOWN,has1handler(s)forthisservice...
Instance"newtea2",statusREADY,has1handler(s)forthisservice...
Thecommandcompletedsuccessfully

[grid@tea2admin]$lsnrctlstatusLISTENER
......
Service"newtea_DGMGRL"has1instance(s).
Instance"newtea2",statusREADY,has1handler(s)forthisservice...
Thecommandcompletedsuccessfully

[grid@tea1admin]$lsnrctlstatusLISTENER
......
Service"newtea_DGMGRL"has1instance(s).
Instance"newtea1",statusREADY,has1handler(s)forthisservice...
Thecommandcompletedsuccessfully

RAC节点驱逐

节点被驱逐一般是因为心跳超时所致,此时需要从crs日志、css日志、alert日志、操作系统日志等入手进行分析。同时,可以参考metalink上的如下文档:
1、Top5issuesforInstanceEviction[文章ID1374110.1]

2、FrequentInstanceEvictionin9iorNodeEvictionin10g/11g[文章ID461662.1]

3、Noderebootoreviction:HowtocheckifyourprivateinterconnectCRScantransmitnetworkheartbe[文章ID1445075.1]

4、11gR2:LMONreceivedaninstanceevictionnotificationfrominstancen[文章ID1440892.1]

5、Exadata:InstanceevictionwithIPCsendtimeoutmessages.[文章ID1404576.1]

6、11gR2GINodeMaynotJointheClusterAfterPrivateNetworkisFunctionalAfterEvictionduetoPr[文章ID1479380.1]

RAC修改IP地址

Oracle10grac(修改所有ip)
1.备份OCR
2.停止oracle相关进程(root执行)
./srvctlstopdatabase-ddatabase_name
./srvctlstopasm-nnode_name
./srvctlstopasm-nnode_name
./srvctlstopnodeapps-nnode_name
./srvctlstopnodeapps-nnode_name
/etc/init.d/init.crsstop所有的节点

备份修改/etc/hosts文件
修改网卡ip地址,重启网络生效
启动crs,但是不启动asmdatabase和nodeapp

--查看当前配置:root

./oifcfggetif-global

eth010.223.10.0globalpublic

eth1192.168.1.0globalcluster_interconnect

--删除当前配置root执行下同

./oifcfgdelif-globaleth0

./oifcfgdelif-globaleth1

./oifcfggetif

--重新添加root

./oifcfgsetif-globaleth0/10.223.10.0:public

./oifcfgsetif-globaleth1/192.223.1.0:cluster_interconnect

./oifcfggetif

eth010.223.10.0globalpublic

eth1192.168.1.0globalcluster_interconnect

3.3修改VIProot

./srvctlmodifynodeapps-nraw1-A10.223.10.100/255.255.255.0/eth0

./srvctlmodifynodeapps-nraw2-A10.223.10.101/255.255.255.0/eth0

修改listener.ora和tnsnames.ora
如果你使用了ocfs,修改ocfs配置文件(/etc/ocfs/cluster.conf),验证修改后是否可用。
启动asmdatabasenodeapp

相关文档

HowtoModifyPrivateNetworkInformationinOracleClusterware(DocID283684.1)
HowtoValidateNetworkandNameResolutionSetupfortheClusterwareandRAC(DocID1054902.1)
HowtoModifyPublicNetworkInformationincludingVIPinOracleClusterware(DocID276434.1)

FailOver模式

1安装

第一步安装执行dbca,选择OracleRealApplicationClusterdatabase,点”Next”

第二步:选择ServicesManagement,点”Next”

第三步:添加servicename,需设定不同的InstanceRole
(1)点击”Add”,添加servicename,在填出框输入servicename,名称可自定,本例使用cwvpd,然后点”OK”

(2)默认情况下,新创建servicename的InstanceRole是相同的,都为Preferred,这里需调整一个实例为Preferred,一个为Available;接着设置TAFPolicy为Basic,然后点”Finish”
上述两种方式各有优劣,前者建立连接的开销相对较小,但failover时会产生延迟,而后者正好与前者相反。

(3)在弹出框点”OK”

(4)在弹出框点”Yes”

2修改service的TAF配置

OracleRAC客户端故障转移(failover),当采用TAF方式时,对于已经建立连接的客户端,在连接的实例或节点出现故障时,客户端无需再次发出连接请求,仍然可以继续之前的数据库操作,此称之为透明故障转移。
TAF就是说对于那些已经成功连接到特定实例的客户端,如果该实例或节点异常宕机,客户端会自动重新发出到剩余实例的连接请求。使得客户端感觉不到它所连接的实例或节点已经出现故障,这个就称之为透明转移。但其间的活动事务将被回滚。

使用Server-sideTAF配置,可采用本文档中推荐的参数设置。
步骤如下:
1)调用dbms_service.modify_service修改failover设置
Begin
Dbms_Service.Modify_Service(
Service_Name=>'cwvpd',--根据实际情况定义服务名
Failover_Method=>Dbms_Service.Failover_Method_Basic,
Failover_Type=>Dbms_Service.Failover_Type_Select,

Failover_Retries=>180,
Failover_Delay=>5);
End;
2)检查修改是否生效
SELECTNETWORK_NAME,FAILOVER_METHOD,FAILOVER_TYPE,FAILOVER_RETRIES,FAILOVER_DELAYFROMDBA_SERVICESWHERENAME='CWVPD';

3检查CRS资源状态

查看节点state是否为ONLINE状态

4检查service状态

检查状态,命令参考如下:

5检查service配置

检查配置,包括InstanceRole和TAF策略,命令如下:

setlinesize120
setpagesize999
columnservice_nameformata15
selectINST_ID,service_name,FAILOVER_TYPE,FAILOVER_METHOD,FAILED_OVER
fromgv$sessionwheretype='USER';

RAC添加在线日志

ALTERDATABASEADDLOGFILETHREAD1GROUP5('+DGIDT2PLF/idt2plf/onlinelog/redo05_1.log','+DGIDT2PLF/idt2plf/onlinelog/redo05_2.log')SIZE500M;
ALTERDATABASEADDLOGFILETHREAD1GROUP6('+DGIDT2PLF/idt2plf/onlinelog/redo06_1.log','+DGIDT2PLF/idt2plf/onlinelog/redo06_2.log')SIZE500M;
ALTERDATABASEADDLOGFILETHREAD2GROUP7('+DGIDT2PLF/idt2plf/onlinelog/redo07_1.log','+DGIDT2PLF/idt2plf/onlinelog/redo07_2.log')SIZE500M;
ALTERDATABASEADDLOGFILETHREAD2GROUP8('+DGIDT2PLF/idt2plf/onlinelog/redo08_1.log','+DGIDT2PLF/idt2plf/onlinelog/redo08_2.log')SIZE500M;

alterdatabasedroplogfilegroup1;
alterdatabasedroplogfilegroup2;
alterdatabasedroplogfilegroup3;
alterdatabasedroplogfilegroup4;

增加控制文件

步骤一:检查参数
一个节点操作:
SQL>showparametercontrol_files
SQL>showparameterspfile

步骤二:关闭数据库
两个节点操作:
SQL>shutdownimmediate(两个节点)

步骤三:启动数据库到nomount状态
一个节点:
SQL>startupnomount

步骤四:恢复控制文件到默认路径
一个节点:
使用RMAN恢复控制文件。
ORACLE$rmantarget/
RMAN>restorecontrolfilefrom'+DATA/yyjc/controlfile/xxxx.xxx.xx';
(登录ASM查看恢复出的控制文件名,修改参数需要用到此文件名)

步骤五:修改参数文件
一个节点:
修改SPFILE增加控制文件,并重启实例
altersystemsetcontrol_files='+DATABASE_DG/yjdb/controlfile/current.260.817470477','文件名'scope=spfilesid='*';

步骤六:关闭数据库
两个节点:
SQL>shutdownimmediate

步骤七:启动数据库
两个节点操作:
SQL>startup

步骤八:检查数据库
一个节点操作:
检查并确认
SQL>showparametercontrol_files
SQL>showparameterspfile
SQL>select*fromv$controlfile;
看到两个控制文件,则正常。

查询数据块的MASTER和OWNER

selectkj.*,le.le_Addrfrom(
selectkjblname,kjblname2,kjblowner,kjblmaster,kjbllockp,
substr(kjblname2,instr(kjblname2,',')+1,instr(kjblname2,',',1,2)-instr(kjblname2,',',1,1)-1)/65536fl,
substr(kjblname2,1,instr(kjblname2,',')-1)blk
fromx$kjbl
)kj,x$lele
wherele.le_kjbl=kj.kjbllockp
orderbyle.le_addr;

手动REMASTER(DRM)

oradebuglkdebug-mpkeyobject_id

MOS相关文档(RAC)

AddingaNodetoa10gRACCluster(DocID270512.1)
HowToRebuildaCorruptedCRSHome(DocID1296093.1)
Top3RACDatabaseInstanceHangIssues(DocID1389520.1)
Top5RACInstanceCrashIssues(DocID1375405.1)
Top5issuesforInstanceEviction(DocID1374110.1)
NoderebootorevictionHowtocheckifyourprivateinterconnectCRScantransmitnetworkheartbeats(DocID1445075.1)
OracleClusterwareCannotStartonallNodesNetworkcommunicationwithnodeNAMEmissingfor90%oftimeoutinterval(DocID1507482.1)
RACandOracleClusterwareBestPracticesandStarterKit(HP-UX)(DocID811303.1)
RACandOracleClusterwareBestPracticesandStarterKit(Linux)(DocID811306.1)
RACandOracleClusterwareBestPracticesandStarterKit(AIX)(DocID811293.1)
DataCollectingforTroubleshootingOracleClusterware(CRSorGI)AndRealApplicationCluster(RAC)Issues(DocID289690.1)
AddingaNodetoa10gRACCluster(DocID270512.1)
addnode.shThevirtualhostnamevipfornodenodenameisalreadyinuse.(DocID782849.1)
TroubleshootGridInfrastructureStartupIssues(DocID1050908.1)
CRSDiagnosticDataGatheringASummaryofCommontoolsandtheirUsage(DocID783456.1)
CSSTimeoutComputationinOracleClusterware(DocID294430.1)
FailoverIssuesandLimitations[Connect-timefailoverandTAF](DocID97926.1)
InstanceServiceRegistrationtoListeners(DocID69546.1)
CRS10gDiagnosticCollectionGuide(DocID272332.1)
CRS10gR211gR111gR2DiagnosticCollectionGuide(DocID330358.1)
DataGatheringforInstanceEvictionsinaRACenvironment(ORA-29740)(DocID412884.1)
ResolvingInstanceEvictionsonWindowsPlatforms(DocID297498.1)
Troubleshooting11.2ClusterwareNodeEvictions(Reboots)(DocID1050693.1)
TroubleshootingORA-29740inaRACEnvironment(DocID219361.1)
StepsToShutdown(stop)/Startup(start)TheCRS,OHAS,ASM,RDBMS&ACFSServicesonRAC11.2Configuration.(DocID1355977.1)
HowToValidateASMInstancesAndDiskgroupsOnARACCluster(WhenCRSDoesNotStart).(DocID1609127.1)

ASM

磁盘管理

创建磁盘组

外部冗余
CREATEDISKGROUPDATAEXTERNALREDUNDANCYDISK
'c:/asmdisks/_file_disk1',
'c:/asmdisks/_file_disk2',
'c:/asmdisks/_file_disk3',
'c:/asmdisks/_file_disk4';

Normal冗余
CREATEDISKGROUPDATA_DW01NORMALREDUNDANCY
FAILGROUPdw01cel01DISK
'/oracle/disks/_asm_disk1',
'/oracle/disks/_as
37102
m_disk2',
'/oracle/disks/_asm_disk3',
'/oracle/disks/_asm_disk4'
FAILGROUPdw01cel02DISK
'/oracle/disks/_asm_disk5',
'/oracle/disks/_asm_disk6',
'/oracle/disks/_asm_disk7',
'/oracle/disks/_asm_disk8';

--11gR2参数
attribute
'AU_SIZE'='4M',
'CELL.SMART_SCAN_CAPABLE'='TRUE',
'compatible.rdbms'='11.2.0.2',
'compatible.asm'='11.2.0.2'

添加磁盘

alterdiskgroupdataadddisk'/dev/raw/raw4';

查看磁盘

SQL>selectdisk_number,state,namefromv$asm_disk;

DISK_NUMBERSTATENAME
-----------------------------------------------
2NORMALDATA_0002
1NORMALDATA_0001
3NORMALDATA_0003
0NORMALDATA_0000

删除磁盘

alterdiskgroupdatadropdiskDATA_0001;
在drop磁盘时,会自动迁移数据,所以drop不是瞬间完成
alterdiskgroupdatadropdiskDATA_0001rebalancepower5;

alterdiskgroupdatadropdiskDATA_0001force;
注意:force是直接删除磁盘,如果diskgroup的normal或high,ASM拿另一份数据再生成冗余。不使用force是先平衡数据,再删除磁盘。

放弃删除磁盘
ALTERDISKGROUP<DGNAME>UNDROPDISKS;

查看ASM状态

select*fromv$asm_operation;
GROUP_NUMBEROPERATIONSTATEPOWERACTUALSOFAREST_WORKEST_RATEEST_MINUTES
-------------------------------------------------------------------------------------------
1REBALRUN112685152960

修改ASM平衡数据速度

--POWER值为0到11,0为停止,11为最快
ALTERDISKGROUPdataREBALANCEPOWER5;

磁盘组重新平衡

alterdiskgroupDATA_DW01rebalance;

磁盘组check

alterdiskgroupDATA_DW01checkallnorepair;
alterdiskgroupDATA_DW01checkallrepair;

在相应的ASM的alert日志中会发现:
ThuOct1000:48:50CST2013
SQL>alterdiskgroupDATA_DW01checkallrepair
ThuOct1000:48:50CST2013
NOTE:startingcheckofdiskgroupDATA_DW01
WARNING:diskDATA_DW01_0001,changingDDusedAUsfrom981to979
WARNING:diskDATA_DW01_0002,changingDDusedAUsfrom500to490
WARNING:diskDATA_DW01_0004,changingDDusedAUsfrom479to491
SUCCESS:checkofdiskgroupDATA_DW01foundnoerrors

空间管理

添加数据文件

--ASM使用OMF自管理,添加数据文件更简单

建议添加的时候最好还是制定全路径,免得误操作添加到文件系统中。

createtablespacetestdatafile‘+DATA/tea/datafile/system.264.773951505’size20M;

ASM块设备

Linux2.6内核,RDBMS在10.2.0.2版本之后支持直接访问块设备
但OUI(10.1.0和10.2.0)在装CRS时不支持直接访问块设备,必须要在11.1.0.6.0版本之后
参考Linux2.6KernelDeprecationofRawDevices[ID357492.1]

asm_diskstring

asm_diskstring不允许设置成/dev/或/dev/*,这会引起扫描所有设备,参考如下:
root.shHangsorRebootsNodeonNonFirstNodeifASMDiscoveryStringasm_diskstringisSetto/dev/or/dev/*[ID1356567.1]
在11.2.0.2AIX5.3上设置挂起。

ACFS

查看ACFS挂载点
selectFS_NAME,VOL_DEVICE,TOTAL_MB,FREE_MBfromV$ASM_ACFSVOLUMES;

修改ASM密码

1.11gR2RAC
ASMCMD>orapwusr--modify--passwordsys
2.11gR2SI
ASMCMD>passwdsys

修复磁盘头

读取磁盘头
$kfedread/dev/raw/raw1234text=raw1234.out

从10.2.0.5开始,Oracle备份磁盘头信息
$kfedread/dev/raw/raw1234blknum=510text=raw1234.out->一般备份的磁盘头放在510块上
$kfedrepair/dev/raw/raw1234->grid用户操作

SQL>alterdiskgroupdata_dgmount;

监控ASM磁盘性能

ORACLE提供了相关工具叫做asmiostat用来监控磁盘的IO性能。
具体请查阅文章
ASMIOSTATScripttocollectiostatsforASMdisks(DocID437996.1)

ASM的相关文档

HowtoPrepareStorageforASM(DocID452924.1)
MasterNoteforAutomaticStorageManagement(ASM)(DocID1187723.1)
ASMTechnicalBestPracticesFor10gand11gR1Release(DocID265633.1)
ASMConceptsQuickOverview(DocID1086199.1)
HowToValidateASMDiskgroupConsistency/StateAfterASMReclamationUtility(ASRU)ExecutionAborted.(DocID1668673.1)
ASMTechnicalBestPracticesFor10gand11gR1Release(DocID265633.1)
InformationCenter:OracleAutomaticStorageManagement(DocID1472204.2)
InformationCenter:InstallandConfigureOracleAutomaticStorageManagement(DocID1522675.2)
ASMCMD-ASMcommandlineutility(DocID332180.1)
ASMTechnicalBestPracticesFor10gand11gR1Release(DocID265633.1)

DATAGUARD

日常维护

启动停止DG

--在生产库停止DataGuard操作
SQL>showparameterlog_archive_dest
SQL>altersystemsetlog_archive_dest_state_2=defer;

--在生产库开启DataGuard操作:
SQL>altersystemsetlog_archive_dest_state_2=enable;

查看归档情况:

主库:
SELECTTHREAD#"Thread",SEQUENCE#"LastSequenceGenerated"
FROMV$ARCHIVED_LOG
WHERE(THREAD#,FIRST_TIME)IN
(SELECTTHREAD#,MAX(FIRST_TIME)FROMV$ARCHIVED_LOGGROUPBYTHREAD#)
ORDERBY1;

备库:
SELECTARCH.THREAD#"Thread",
ARCH.SEQUENCE#"LastSequenceReceived",
APPL.SEQUENCE#"LastSequenceApplied",
(ARCH.SEQUENCE#-APPL.SEQUENCE#)"Difference"
FROM(SELECTTHREAD#,SEQUENCE#
FROMV$ARCHIVED_LOG
WHERE(THREAD#,FIRST_TIME)IN
(SELECTTHREAD#,MAX(FIRST_TIME)
FROMV$ARCHIVED_LOG
GROUPBYTHREAD#))ARCH,
(SELECTTHREAD#,SEQUENCE#
FROMV$LOG_HISTORY
WHERE(THREAD#,FIRST_TIME)IN
(SELECTTHREAD#,MAX(FIRST_TIME)
FROMV$LOG_HISTORY
GROUPBYTHREAD#))APPL
WHEREARCH.THREAD#=APPL.THREAD#
ORDERBY1;

跳过事务(逻辑)

在备库查看应用事件:
SELECTEVENT_TIME,EVENT,XIDUSN,XIDSLT,XIDSQNFROMDBA_LOGSTDBY_EVENTSorderby1desc;

可跳过某些引起阻塞的DDL或DML应用,然后手工执行这些应用:
alterdatabasestoplogical
standbyapply;
execdbms_logstdby.skip_transaction(14,21,517969);
ALTERDATABASESTARTLOGICALSTANDBYAPPLYIMMEDIATE;

在备份库跳过特定的DML或DDL操作
alterdatabasestoplogicalstandbyapply;
begin
executedbms_logstdby.skip(stmt=>'DML',
schema_name=>'BANPING',
object_name=>'TABLENAME',
proc_name=>null);
end;

alterdatabasestartlogicalstandbyapply;

重新初始化表(逻辑)

alterdatabasestoplogicalstandbyapply;
executedbms_logstdby.unskip('DML','BANPING','TABLENAME');
execdbms_logstdby.instantiate_table('BANPING','TABLENAME','dblink_name');
alterdatabasestartlogicalstandbyapply;
注意这里建立的DBLINKdblink_name必须是public的

在备库查看日志应用状态和进度(逻辑)

select*fromV$LOGSTDBY_STATE;
select*fromV$LOGSTDBY_PROGRESS;

在备库手动注册归档日志

SQL>ALTERDATABASEREGISTERLOGICALLOGFILE'/stb_arch/1_143313_640266118.dbf';
Databasealtered.

应用模式

1.应用日志

--开启应用
SQL>ALTERDATABASERECOVERMANAGEDSTANDBYDATABASEDISCONNECT;
--停止应用
SQL>ALTERDATABASERECOVERMANAGEDSTANDBYDATABASECANCEL;
2.实时应用

前提是Standby数据库端配置了StandbyRedologs。
--物理Standby
SQL>ALTERDATABASERECOVERMANAGEDSTANDBYDATABASEDISCONNECTUSINGCURRENTLOGFILE;
--逻辑Standby
SQL>ALTERDATABASESTARTLOGICALSTANDBYAPPLYIMMEDIATE;
3.延迟应用

--delay单位是分钟,归档会正常发送,standby应用归档延迟
SQL>alterdatabaserecovermanagedstandbydatabaseDELAY60disconnectfromsession;
4.执行不完全应用

SQL>alterdatabaserecovermanagedstandbydatabasecancel;
SQL>ALTERDATABASERECOVERAUTOMATICSTANDBYDATABASEuntiltime'2008-02-2517

:25:53';

相关视图

--进程状态
selectprocess,statusfromv$managed_standby;
RFS-Remotefile
server(负责接收远程日志文件)
MRP0-Detachedrecoveryserverprocess(负责应用恢复接收的日志
MR(fg)-Foregroundrecoverysession·

SQL>descv$archive_gap;
NameNull?Type
-----------------------------------------------------------------------------
THREAD#NUMBER
LOW_SEQUENCE#NUMBER
HIGH_SEQUENCE#NUMBER

查看日志传送情况:
SQL>setlinesize120
SQL>formatdest_nameformata25
SQL>formaterrorformata50
SQL>selectdest_name,status,errorfromv$archive_dest;

查看备库的状态,保护模式,归档日志路径状态
selectdest_name,status,database_mode,recovery_mode,protection_modefromv$archive_dest_status;

查看归档应用情况:
SQL>selectfirst_time,applied,sequence#,status,next_timefromv$archived_log;

RMAN备份恢复

Oracle归档撑满磁盘的处理

1.使用rm删除部分归档文件

$ls-lt--查看文件,按时间排序
$rm-rfarch1_4601*--删除部分归档日志
2.手工切换重做日志,让系统继续运行

SQL>altersystemswitchlogfile;
3.处理RMAN中手工删除的归档

--无catalog库手工删除归档的处理
$rmantarget/
RMAN>crosscheckarchivelogall;--检查归档
RMAN>deletenopromptexpiredarchivelogall;--删除所有过期归档

--有catalog库手工删除归档的处理
RMAN>crosscheckcopyofarchivelogall
RMAN>crosscheckarchivelogall
RMAN>resynccatalog
RMAN>deleteforceobsolete;
RMAN>deleteexpiredarchivelogall;

归档进程的起动和停止

有时侯碰到归档进程无法归档,可能IO有问题,需要重启归档进程
停止归档
altersystemarchivelogstop;

kill掉归档进程(这个时侯注意下是否可以正常杀掉归档进程)

重启归档
altersystemarchivelogstart

删除指定序号的归档

1.查看归档备份情况:

RMAN>listbackupofarchivelogtimebetween"to_date('2011-11-0818:00:00','yyyy-mm-ddhh24:mi:ss')"and"to_date('2011-11-0911:00','yyyy-mm-ddhh24:mi:ss')";
RMAN>listarchivelogall--查看保存在归档目录下未备份的归档日志。
RMAN>listbackupofarchivelogall--查看是已被RMAN备份的归档日志。
2.归档status说明

STATUS=AAvailable,表示归档日志文件有效
STATUS=UUnavailable,表示归档日志文件无效
STATUS=DDeleted,表示归档日志已经被删除
STATUS=XeXpired,表示归档日志被用户使用操作系统的命令删除了
3.删除指定sequence之前的归档

deletenopromptarchiveloguntilsequence46975thread1;--46975会删除删除thread1的
4.删除归档(通配符)

deletenopromptarchiveloglike'/home/arch/1_20725%.dbf';
5.删除指定目录的归档

deletenopromptarchiveloguntilsequence315like'/u01/app/oracle/arch/db1/%';
6.备份指定目录归档(只删除已备份的归档,其它目录归档不删除)

backuparchiveloglike'/u01/app/oracle/arch/db1/%'format'/u01/app/oracle/arch/rman/ARC_%d_%T_%s_%p'deleteinput;

闪回查询

1.查看当前时间点前1天的数据

select*fromt1ASOFTIMESTAMP(SYSTIMESTAMP-INTERVAL'1'DAY);

2.查看当前时间点前10秒的数据

select*fromt1asoftimestamp(systimestamp-interval'10'second);
3.查看某个时间点的数据

select*fromnjcomm.staffASOFTIMESTAMPto_timestamp('2014-03-1100:00:00','yyyy-mm-ddhh24:mi:ss');
4.查看在该SCN下的数据

select*fromt1asofSCN10771468800439
5.查看闪回查询的事务(10g)

selectq.start_scn,q.commit_scn,q.logon_user,q.undo_change#,q.undo_sql,q.operation

fromflashback_transaction_queryq
whereq.table_owner='SCOTT';
6.多版本查询(10g)

setlinesize160
columnVERSIONS_STARTTIMEformata25
columnversions_endtimeformata25
altersessionsetnls_date_format='YYYY-MM-DDHH24:MI:SS';

SELECTversions_startscn,
versions_starttime,

versions_endscn,versions_endtime,

versions_xid,versions_operation,

DEPTNO,
DNAME,
LOC

FROMdeptVERSIONSBETWEENTIMESTAMPMINVALUEANDMAXVALUE;
7.闪回表

flashbacktabletesttobeforedroprenametotest3;

恢复归档

指定序列号
RMAN>run{
setarchivelogdestinationto‘/tmp’;
restorearchivelogfromlogseq=60untillogseq=70thread1;
}

列出某个归档的备份信息
listbackupofarchivelogsequence18884thread2;

利用dbms_backup_restore包来恢复归档
DECLARE
v_devvarchar2(50);
v_doneboolean:=false;
BEGIN
v_dev:=sys.dbms_backup_restore.deviceAllocate(type=>'sbt_tape',ident=>'t1',params=>'ENV=(TDPO_OPTFILE=/usr/tivoli/tsm/client/oracle/bin64/tdpo.opt)');

dbms_backup_restore.RestoreSetArchivedLog(destination=>'/arch');

dbms_backup_restore.RestoreArchivedLog(thread=>2,sequence=>18884);

dbms_backup_restore.RestoreBackupPiece(done=>v_done,handle=>'xxx_archlog_backup<xxxx1_7941:796937510>.dbf',params=>null);
sys.dbms_backup_restore.deviceDeallocate;
END;

恢复时跳过表空间

recoverdatabaseskiptablespaceGGISSTAGING_DATA,GGISSTAGING_INDEXuntilscn20076662789;

RMANCopy

run
{
allocatechannelc1typedisk;
allocatechannelc2typedisk;
copydatafile'/oradata/anqing/users01.dbf'to'/oradata/anqing2/users01.dbf';
copydatafile'/oradata/anqing/sysaux01.dbf'to'/oradata/anqing2/sysaux01.dbf';
copydatafile'/oradata/anqing/undotbs01.dbf'to'/oradata/anqing2/undotbs01.dbf';
copydatafile'/oradata/anqing/system01.dbf'to'/oradata/anqing2/system01.dbf';
releasechannelc2;
releasechannelc1;
}

如果是10g
RMAN>switchdatafile1tocopy;

RMANTrace调试

$rmantarget/logrman.logtracerman.trcdebug

闪回检查

SpaceissueinFlashRecoveryArea(FRA)[ID829755.1]
--查询闪回区使用情况
Selectfile_type,percent_space_usedasused,
percent_space_reclaimableasreclaimable,
number_of_filesas"number"
fromv$flash_recovery_area_usage;

columnnameformata20
columnSPACE_USEDformat999999999
columnSPACE_RECLAIMABLEheading"Space|Reclaimable"
columnNUMBER_OF_FILESheading"Number|Of|Files"
SELECTname,SPACE_LIMIT/1024/1024asSPACE_LIMIT,
SPACE_USED/1024/1024asSPACE_USED,
SPACE_RECLAIMABLE,NUMBER_OF_FILES
FROMV$RECOVERY_FILE_DEST;

Number
SpaceOf
NAMESPACE_LIMITSPACE_USEDReclaimableFiles
--------------------------------------------------------------
/oradata/arch_tmp40960012227073

备份不删除归档,不重复备份归档

11.2.0.3数据库环境,使用rman进行归档日志备份,想实现:
(1)每天备份归档日志,备份完并不删除归档日志
(2)归档日志备份成功一次之后,下次再备份的时候rman就自动不会再次备份这个归档日志
RMAN>backuparchivelogallnotbackedup;

使用该命令如果遇到满足notbackedupxxtimes的归档才会备份,否则即便该归档仍在DISK上未被删除也不会重复备份,避免了重复备份带来的问题,也无需每次备份均删除磁盘上的归档文件。

常见等待事件

gcbufferbusy

概述

gcbufferbusy是RAC数据库中常见的等待事件,11g开始gcbufferbusy分为gcbufferbusyacquire和gcbufferbusyrelease。
gcbufferbusyacquire是当session#1尝试请求访问远程实例(remoteinstance)buffer,但是在session#1之前已经有相同实例上另外一个session#2请求访问了相同的buffer,并且没有完成,那么session#1等待gcbufferbusyacquire。

gcbufferbusyrelease是在session#1之前已经有远程实例的session#2请求访问了相同的buffer,并且没有完成,那么session#1等待gcbufferbusyrelease。

产生的原因

热点块(hotblock)
在AWR中SegmentsbyGlobalCacheBufferBusy记录了访问频繁的gcbuffer.

解决方法可以根据热点块的类型采取不同的解决方法,比如采取分区表,分区索引,反向index等等。这点与单机数据库中的bufferbusywaits类似。

低效SQL语句
低效SQL语句会导致不必要的buffer被请求访问,增加了bufferbusy的机会。在AWR中可以找到TOPSQL。解决方法可以优化SQL语句减少buffer访问。这点与单机数据库中的bufferbusywaits类似。

数据交叉访问
RAC数据库,同一数据在不同数据库实例上被请求访问。
如果应用程序可以实现,那么我们建议不同的应用功能/模块数据分布在不同的数据库实例上被访问,避免同一数据被多个实例交叉访问,可以减少buffer的争用,避免gc等待。

indexbranchblocksplit
对于10g可以使用hash分区索引,对于9i数据库,只能使用反转键索引,但是反转键不支持rangescan.

Tofindtheoffendingindex:

Findthedatablockaddresses(dba)ofthesplittingindexfromtheV$SESSION_WAITview.Twodifferentdbasaregivenplustheleveloftheindexblock:

P1:rootdba:Therootoftheindex
P2:level:Theleveloftheindexwheretheblockisbeingsplit
P3:childdba:Theactualblockoftheindexbeingsplit

SELECTsid,event,p1,p2,p3FROMv$session_wait

FindthephysicallocationofthesplittingindexbyusingtheDBMS_UTILITYpackage.Twofunctionswillhelpzeroinonthephysicallocationoftheindexblockusingtherootdbavaluefromstep1:
DATA_BLOCK_ADDRESS_FILE:Returnsthefilenumberofthedba

DATA_BLOCK_ADDRESS_BLOCK:Returnstheblocknumberthedba

SELECT
DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(<rootdba>)FILE_ID,
DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(<rootdba>)BLOCK_ID

FROMdual;

FindtheoffendingindexobjectfromDBA_EXTENTSusingtheFILE_IDandBLOCK_IDvaluesdeterminedfromstep2:

SELECTowner,segment_name
FROMdba_extents
WHEREfile_id=<FILE_ID>
AND<BLOCK_ID>BETWEENblock_idANDblock_id+blocks-1;

解决办法

对数据库做hanganalyze对诊断数据库hang是很有帮助的

RAC数据库收集hanganalyze的命令:

SQL>conn/assysdba
SQL>oradebugsetmypid
SQL>oradebugunlimit
SQL>oradebug-gallhanganalyze3

DIAG进程的dia0trace也会记录hang信息
有些情况dba_hist_active_sess_history也会记录hang信息

BUG信息

Bug13787307:HANGINRACWITH'GCCURRENTREQUEST'<='GCBUFFERBUSYACQUIRE'SIGNATURE

Bufferbusywait

等待事件的原因

当一个session试图去访问buffercache中的一个块但是因为buffer正忙的时候,bufferbusywait就发生了。换言之,就是说另一个session正在修改这个块,块的内容处在变化状态。
为保证读的会话可以获取到coherentimageoftheblock(coherentimage可以包括块的全部改变或者没有改变),oracle的session会给blockheader标记一个flag,让otherusers知道这个change发生了,等待全部的change完成。

这个等待事件主要发生在下面两种情况:

1.Anothersessionisreadingtheblockintothebuffer-thisspecificcasehasbeensplitoutintoa"readbyothersession"waiteventin10gandhigher。

2.Anothersessionholdsthebufferinanincompatiblemodetoourrequest。

下面是产生等待事件的例子
1)Hotblockissue,suchasthefirstblockonthefreelistofatable,withhighconcurrentinserts.Alluserswillinsertintothatblockatthesametime,untilitfillsup,thenusersstartinsertingintothenextfreeblockon
thelist,andsoon。

2)MultipleusersrunninganinefficientSQLstatementperformingafulltablescanonthesamelargetableatthesametime.Oneuserwillreadtheblockoffdisk,andtheotheruserswillwaitonbufferbusywaits(orreadbyother
sessionin10gandhigher)forthephysicalI/Otocomplete

根据等待时间获取信息

SELECTs.sql_hash_value,sw.p1file#,sw.p2block#,sw.p3reason
FROMgv$session_waitsw,gv$sessions
WHEREsw.event='bufferbusywaits'
ANDsw.sid=s.sid;

获取等待事件的对象

SELECTowner,segment_name,segment_type
FROMdba_extents
WHEREfile_id=&FileNo
AND&BlockNoBETWEENblock_idAND(block_id+blocks-1);

SELECTowner,segment_name,file_id,block_idstarting_block_id,block_id+blocksending_block_id,blocks
FROMdba_extents
WHEREfile_id=&file_numAND(block_id<=&block_idAND(&block_id<(block_id+blocks)))

Top10对象

colownerformata10
colobject_nameformata20
coltsnameformata10
colvalueformat99999
SELECT*
FROM(
SELECTowner,object_name,subobject_name,object_type,tablespace_nameTSNAME,value
FROMgv$segment_statistics
WHEREstatistic_name='bufferbusywaits'
ORDERBYvalueDESC)
WHEREROWNUM<11;

参考文章

HowtoIdentifyWhichSegmentisAssociatedwithBufferBusyWaits(DocID413931.1)

enq:TX-allocateITLentry

概述

BydefaultINITRANSvaluefortableis1andforindexis2.WhentoomanyconcurrentDMLtransactionsarecompetingforthesamedatablockweobservethiswaitevent-"enq:TX-allocateITLentry"

解决办法

Toreduceenq:TX-allocateITLentry"waitevents,Weneedtofollowthebelowsteps.

A)
1)DependingontheamountoftransactionsinthetableweneedtoalterthevalueofINITRANS.
altertable<tablename>INITRANS50;

2)Thenre-organizethetableusingmove(altertable<table_name>move;)

3)Thenrebuildalltheindexesofthistableasbelow

alterindex<index_name>rebuildINITRANS50;

Iftheissueisnotresolvedbytheabovesteps,pleasetrybyincreasingPCTFREE

B)
1)Spreadingrowsintomorenumberofblockswillalsohelpstoreducethiswaitevent.
altertable<tablename>PCTFREE40;
2)Thenre-organizethetableusingmove(altertableservice_Tmove;)

3)Rebuildindex

alterindexindex_namerebuildPCTFREE40;
ORYoucancombinestepsAandBasbelow

1)SetINITRANSto50pct_freeto40
altertable<table_name>PCTFREE40INITRANS50;
2)Thenre-organizethetableusingmove(altertable<table_name>move;)

3)Thenrebuildalltheindexesofthetableasbelow
alterindex<index_name>rebuildPCTFREE40INITRANS50;

对表和索引可以通过ALTER去改变INITRANS的值,但是这个命令只对新块生效,所以你需要去REBUILD这些对象。
索引可以重建,表的话可以通过exp/imp、altertablemove、dbms_redefenition。

gccrdiskread

概述

Globalcache操作必须在毫秒级很快的完成,以维护RAC数据库整体的性能。LMS是个很关键的进程,他不会去做繁重搬运任务,比如diskio等。如果LMS必须要发动I/O操作,他会对block的mode降级,然后把这个block发送给请求的前台进程,前台进程会把undo的信息应用到block上构成block的CR版本。
如果前台进程在本地的cache中没有找到undoblock,那么就会发送一个请求给remoteLMS进程去访问undoblock。如果undoblock也不在remote的cache中,remoteLMS进程会发送一个授权给前台进程去从磁盘读取undoblock。前台进程对这个undosegmentblocks授权的过程进行计算等待时间,就构成了这个gccrdiskread等待事件。
还有一些其他的原因造成前台进程必须去读取undoblock:
1)LMS触发的降级降频。如果一个block被访问过多的次数,就会造成很多CR块的构造,这个时候LMS进程会简单的对这个块进行降级转换,然后发送这个块和授权给请求者访问,而不是去做更多的工作去构造。前台进程会自己应用undo来构造CR块。gv$cr_block_server这个视图可以用来查看downconvert的数量。
2)延迟块清除是这个等待事件发生另一个原因。正常的情况下,当一个session提交,这个会话会重新访问这个修改过的块去清除ITLentry。但是如果块改变的数量超过了在SGA中这个会话维护的blocklist的话,那么这个会话就会标记事务表为已经提交状态,而不是去清理block的ITLentries。如果修改过的block不在本地的buffercache中的话,那么延迟块清除不会发生。其他节点的session读取这些块的时候会用upper
boundSCN来closeout块上的ITLentry,延迟快清除操作会请求获取是事务的状态和最大的可查询SCN。为了获取这个事务是提交了还是没有提交,其他节点的会话就必须读取undo头块来获取这个信息,等待这个授权的过程被计时成gccrdiskread事件。

解决办法

查看应用程序的性质,在一个节点上做大量的对象修改的操作可以减少这个等待。
调优语句
减少延迟块清除。
并行查询不会进行延迟块清除,只有序列化的查询才会进行延迟块清除。
对表的所有块执行select操作可以消除延迟块清除。

Cachebufferchainlatch

CBC概述

1.首选获取要从磁盘读取的数据块
2.检查数据块是否已经在buffercache中,对数据块的DBA应用哈希函数来确认hashbucket,如果块的buffer在buffercache中,那么它也在与hashbucket关联的hashchain上。
3.获取CBClatch保护hashchain,在hashchain上查看这个block的某个版本是否可以在这个chain上找到。
4.如果这个块在hashchain上找到了,那么就使用这个block。如果没有找到,那么就会在buffercache找到一个一个freebuffer,从他当前的chain上delink下来,然后把这个freebuffer的header在CBClatch的保护下link到这个hashchain上。Pin住bufferheader,释放latchchildren,把块读到buffer中。

产生的原因

cachebufferschains的问题

至少在oracle9i之前是可能存在的。
大量的buffer需要挂到一个hashchain,进程需要持有latch很久,有许多bufferheader必须去查看,长时间的持有这个latch造成了CBClatch等待。即使进程试图访问不同的对象,但是因为这个latch
保护在hashchain上所有linked的bufferheaders,子lactch可以引起很严重的这个等待。
这个问题从oracle10g上得到了解决,因为在这个发行版本中hashbucket的数量从默认上就得到了增加。

索引根块或分支快的过度并发访问

对一个唯一键或者主键的NESTLOOP访问模式下,如果访问比较严重,相关的索引的root块会被过度的访问,会造成这个等待事件比较严重。

叶子块的过度并发访问

这种访问主要发生在对于非分区表的并发INSERT操作情况下,此时的分区表是单调递增的序列号作为主键或者唯一键,sequence-base的值是严格排序的,这样的情况下当前生成的值会插入到相同的leafblock上,CBC保护这些buffer的hashchain,这些CBClatch会被过度的访问,造成这个等待事件严重。

过度访问小表

在NLjoin发生的情况下,如果内表是个小表,并且没有index,那么对于外表的每一次扫描,内标都会进行一次全表扫描,可能会造成这个小表的一小部分块被高并发的访问,造成CBClatch争用。

consistentread块的大量生成

一个select查询语句会请求一个处在特定状态下的数据块。在很多情况下,buffer可能已经被修改了,select语句无法看到刚刚发生的改变。这个时候针对当前的select语句进行buffer的克隆操作就很必要。Buffer克隆是采用应用undo记录的方式来进行的,创建了一个数据块的CR(consistentread)。这个克隆的操作可能会造成大量的访问undoheaderblock和undoblock。随着并发的增大,这个问题可能比较严重。此外,如果很多进程访问相同的表,恰好这个表存在没有提交的事务,那么每个进程都会根据undo克隆创建一个CR,因为这就增加了CBC
latch的需求,可能造成这个等待较为严重。

大量会话全表扫描某个小表

全表扫描的情况下,表的数据块是从HWM下第一个块扫描到最后一个块,这就意外着可能会发生很多进程都在为相同的数据块或者一组数据块发生着争用,造成CBClatchcontention。

分析方法

查看latch_children中gets的分布

Select*from(
selectchild#,gets,misses,sleeps,
rank()over(partitionbylatch#orderbygetsdesc)rnk_gets,
rank()over(partitionbylatch#orderbymissesdesc)rnk_misses,
rank()over(partitionbylatch#orderbysleepsdesc)rnk_sleeps
fromv$latch_childrenwherename='cachebufferschains'
)
wherernk_gets<=20andrnk_misses<=20andrnk_sleeps<=20
orderbyrnk_gets;

获取SQL语句

selectsubstr(w.event,1,28)event,s.sql_hash_value,count(*)
fromv$session_waitw,v$sessions,v$processp
wheres.sid=w.sid
andp.addr=s.paddr
ands.usernameisnotnull
andw.eventnotlike'%pipe%'
andw.eventnotlike'SQL*%'
groupbysubstr(w.event,1,28),sql_hash_value
orderby3
/

查看LATCH和SQL的HASH值

Setlines160pages100
ColumneventformatA35
ColumnnameformatA35
selectx.event,x.sql_hash_value,
casewhenx.eventlike'latch%'then
l.name
else''
endname,
x.cntfrom(
selectsubstr(w.event,1,28)event,s.sql_hash_value,w.p2,count(*)cnt
fromv$session_waitw,v$sessions,v$processp
wheres.sid=w.sid
andp.addr=s.paddr
ands.usernameisnotnull
andw.eventnotlike'%pipe%'
andw.eventnotlike'SQL*%'
groupbysubstr(w.event,1,28),sql_hash_value,w.p2
)x,
v$latchl
where
x.p2=l.latch#(+)
orderbycnt
/

从oracle10g,oracle提供了ASH,也可以获取CBC的SQL

selectevent,sql_id,sql_child_number,count(*)cnt
fromv$active_session_historywhereeventlike'latch%'
andsample_time>sysdate-(1/24)
groupbyevent,sql_id,sql_child_number
orderby4desc
/

查询请求和HOLDlatch的SQL哈希值(至少执行10次)
selects.sql_hash_value,lh.*from
v$latchholderlh,v$sessionswhere
lh.sid=s.sid
orderbys.sql_hash_value
/

获取引起争用的object

withbh_lcas
(select
lc.addr,lc.child#,lc.gets,lc.misses,lc.immediate_gets,lc.immediate_misses,
lc.spin_gets,lc.sleeps,
bh.hladdr,bh.tchtch,bh.file#,bh.dbablk,bh.class,bh.state,bh.obj
from
v$session_waitsw,
v$latchnameld,
v$latch_childrenlc,
x$bhbh
wherelc.addr=sw.p1raw
andsw.p2=ld.latch#
andld.name='cachebufferschains'
andlower(sw.event)like'%latch%'
andbh.hladdr=lc.addr
)
selectbh_lc.hladdr,bh_lc.tch,o.owner,o.object_name,o.object_type,
bh_lc.child#,
bh_lc.gets,bh_lc.misses,bh_lc.immediate_gets,
bh_lc.immediate_misses,spin_gets,sleeps
from
bh_lc,dba_objectso
wherebh_lc.obj=o.data_object_id(+)
orderby1,2desc
/

查看引起问题的SQL语句的执行计划

select*fromtable(dbms_xplan.display_cursor('&sqlid','','ALLSTATSLAST'));

如何解决CBC

减少对小表的全表扫描和索引全扫描
用分区解决叶子块的争用
用HASHJOIN解决NL引起的问题
调整没有效率的索引访问引起的CBC
CPU使用率很高也会造成这个等待,减低CPU的使用率也会减少这个等待.

SharedPoolLatchContention

产生的原因

1)共享池的碎片化严重;
2)不正确的配置,如果大池配置不合理或者没有配置,那么RMAN进行备份的ommunicationbuffers或者并行查询子进程communicationbuffers会从共享池中分配,会造成共享池的争用;
3)共享池的子池的个数减少;
4)服务器端CPU使用率很高会造成进程获取latch的时候得不到足够的CPU资源过早的进入sleep状态造成这个事件;
5)频繁的刷新共享池

分析方法

查看childlatch的分布

是否存在latch获取的严重倾斜
selectchild#,gets,misses,immediate_gets,immediate_misses
fromv$latch_childrenwherename='sharedpool';

查看statspack报告的SGAbreakdowndifferenceforDB部分。

查看哪个池相对异常的大
selectksmdsidx,ksmssnam,size_areafrom(
selectksmdsidx,ksmssnam,sum(ksmsslen)size_areafromx$ksmss
whereksmssnam!='freememory'
groupbyksmdsidx,ksmssnam
orderby3desc
)
Whererownum<21;

查看共享池的碎片化程度

--对于10g有用,11g不适用
select
ksmchidx,ksmchdur,
case
whenksmchsiz<1672thentrunc((ksmchsiz-32)/8)
whenksmchsiz<4120thentrunc((ksmchsiz+7928)/48)
whenksmchsiz<8216then250
whenksmchsiz<16408then251
whenksmchsiz<32792then252
whenksmchsiz<65560then253
whenksmchsiz>=65560then253
endbucket,
sum(ksmchsiz)free_space,
count(*)free_chunks,
trunc(avg(ksmchsiz))average_size,
max(ksmchsiz)biggest
from
sys.x$ksmsp
where
inst_id=userenv('Instance')and
ksmchcls='free'
groupby
case
whenksmchsiz<1672thentrunc((ksmchsiz-32)/8)
whenksmchsiz<4120thentrunc((ksmchsiz+7928)/48)
whenksmchsiz<8216then250
whenksmchsiz<16408then251
whenksmchsiz<32792then252
whenksmchsiz<65560then253
whenksmchsiz>=65560then253
end,
ksmchidx,ksmchdur
orderbyksmchidx,ksmchdur
/

查询引起共享池flush的对象

Select*fromx$ksmlruorderbyksmlrnum;

没有使用绑定变量的SQL语句

Querytoseethetop20SQLstatementsthatuseliteralvalues
select*from(
selectplan_hash_value,count(distinct(hash_value)),sum(executions),
sum(parse_calls)
fromv$sql
groupbyplan_hash_value
havingcount(distinct(hash_value))>10
orderby2desc
)whererownum<21;

Querytoseetop20SQLstatementswithhighversion_countvalues
select*from(
selecthash_value,module,action,executions,parse_calls,
version_count,sharable_mem,persistent_memfromv$sqlarea
whereversion_count>10
orderbyversion_countdesc
)whererownum<21;

解决办法

避免不必要地heaps,通过x$ksmlru可以对诊断进行
使用绑定变量来减少和避免共享池的碎片,或者cursor_sharing参数。
避免设置_kghdsidx_count为1
避免刷新共享池,在刷新共享池的过程中会将recreatableandfreeablechunks抛弃掉,这些chunk必须在共享池的childlatch保护下增加到共享池的freelist上,这样会增加共享池latch的活跃性引起争用。有时候刷新会提高性能,但是正确的方法不是刷新共享池而是去找到问题的原因。
避免SharedPoolReservedFreeList的碎片化,sharedpoolreservedfreelist只有在没有足够的连续空间的情况下才会被搜索,或者分配的请求大于_shared_pool_reserved_min_alloc参数指定的大小的情况下。这个参数在11g下默认是4200,当这个数值过小的话可能会引起这个等待事件的争用。

LibraryCacheLatchContention

SQL解析概述

1)用sql文本或者librarycache中的object计算出一个唯一的hashvalue;
2)用计算出来的hashvalue得到librarycachebucket号。
3)librarycachebucket是被librarycachechildlatch保护的,解析进程在搜索hashchain去寻找匹配的hashvalue的时候会持有这个librarycachechildlatch。
4)如果匹配找到了,就是说SQL语句(或者其他对象)的解析representation是存在的,否则就是不存在的,需要走硬解析。

产生等待时间的可能原因

1)过度的解析,如果app使用literalvalues来写sql,那么每一个sql的hash值都是不同的,cursor也就没办法共享。硬解析是一个很耗费资源的过程,会造成很多次的librarycachegets和release,此外,每一次sql语句的解析都需要分配新的heap,因此会因为不必要的分配造成librarycache的污染。
Allocation和Deallocation造成共享池的碎片化。

2)硬解析的负面影响也会造成这个争用,如果没有足够的free空间去给新进来的分配请求,那么在librarycache已经存在的cursor就需要被刷新出去,这就会造成共享池和librarycache的latch的过度活跃。

3)子游标的过度创建生成。如果子游标不适合被共享的话,那么子右边就不会被共享。如果在数据库中存在很多schema,虽然应用程序的sql语句(假设使用了绑定变量)可以产生相同的hash值,但是因为他们隶属于不同的schema,这些右边也是不能被共享的。缺少共享会造成很长的hashchain,并且很多objects将hang在某个chain上。进程将遍历整个整个hashchain,增加librarycachelatch的工作。

分析方法

找到使用LiteralValues的游标并找出子游标没有共享的原因,v$sql_shared_cursor获取需要的信息
Statspack、awr、session_wait视图

解决办法

使用绑定变量或者cursor_sharing,但是使用这个参数需要慎重。
避免刷新共享池
调整session_cached_cursors参数,在使用绑定变量的情况下,可以考虑将这个值增大到200-400,具体看实际的情况。
可以考虑调整参数cursor_space_for_time,这个参数在10.2.0.5和11.1.0.7中是deprecated的。
对柱状图进行合理的控制和限制,不要对表的所有列收集柱状图,只针对需要使用的或表关联的列进行收集。
Oracle12c之前柱状图有2种
height-balanced(HBH)andfrequency(akavalue-based)histograms(FHorVBH)

Criteria|Type|Meaningofxxx_tab_histograms.endpoint_number
----------------------------|----------|----------------------------------------------------------
Distinctvalues>#buckets|HBH|ordinalnumberofbucket(i.e."Histogrambucketnumber")
Distinctvalues<=#buckets|FH(VBH)|cumulativecount

从oracle12c开始,当distinctvalue的个数超过254的话,可以创建topfrequency类型的柱状图。

EnqueueHashChainsLatchContention

产生原因

过多的lock,对行进行更新的时候会申请一个TM锁在表上或者分区表上,事务开始的时候也会申请一个TX锁,当大量的这种短事务会造成resourcestructures,lockstructures,andenqueuehashchainslatches.
死锁检测的算法检测是周期性被调用的,当进程间搜索死锁的过程中是持有父enqueuehashchains的latch(也是持有所有的子latches)的,如果有大量的进程、锁、和resourcecombinations在数据库中并发,那么死锁检测算法将需要很长的时间而造成这个latch争用。

分析问题

1)查看子latches的分布是否存在skew的问题
select*from(
selectchild#,gets,misses,sleeps
fromv$latch_childrenwherenamelike'enqueuehash%'
orderbygetsdesc)
whererownum<=20;

2)对进程进程trace

3)获取高gets的锁类型
select*from(
selecteq_name,eq_type,total_req#,total_wait#,succ_req#,failed_req#
fromv$enqueue_statistics
orderbytotal_Req#desc)
whererownum<21

解决办法

避免过多的短事务
Disable行级锁,但是同时也意味着不能对表做DDL
针对锁类型做相应的处理,比如所类型是分布式锁,那么久减少分布式事务的应用设计,或者使用MV来解决分布式事务的问题。

Logfilesync

概述

Logfilesync等待事件当用户的会话commit或者rollback的时候触发,用户的sesion会给LGWR进程发送信号或者通知LGWR去写logbuffer到redologfile。当LGWR进程完成写之后,会反馈给用户进程写完成。这个等待完全靠LGWR进程写redoblocks以及给用户会话回复完成的信号。等待的时间包括LGWR写的时间和LGWRpost用户会话的时间。
当然,诸如latching、匿名块的提交或者IMU等会让这个过程不太准备,但是基本的概念是这样。

V$session_wait中的参数P1=buffer#。

针对这样的一个过程,logfilesync这个等待事件可以被拆分以下几个部分:
1.WakeupLGWRifidle
2.LGWRgatherstheredotobewrittenandissuestheI/O
3.WaittimeforthelogwriteI/Otocomplete
4.LGWRI/Opostprocessing
5.LGWRpostingtheforeground/usersessionthatthewritehascompleted
6.Foreground/usersessionwakeup

步骤2和步骤3的和就是statistics中的redowritetime
步骤3是logfileparallelwrite等待事件
步骤5和6在系统负载持续增加的情况下是很重要的,os的调度可能造成这个等待。

IftheSQLstatementisaSELECTstatement,reviewtheOracleAuditingsettings.IfAuditingisenabledforSELECTstatements,OraclecouldbespendingtimewritingandcommitdatatotheAUDIT$table.

DataGuardnote
IfDataGuardwithsynchronoustransportandcommitWAITdefaultsisused,theabovetuningstepswillstillapply.Howeverstep3willalsoincludethenetworkwritetimeandtheredowritetothestandbyredologs.The"logfile
sync"waiteventandhowitappliestoDataGuardisexplainedindetailintheMAAOTNwhitepaper-Note387174.1:MAA-DataGuardRedoTransportandNetworkBestPractices.

解决办法

1)如果I/O问题是这个等待事件的原因的话,那么最好的办法就是解决磁盘IO的问题。

2)如果CPU紧张是问题的元凶,那么解决cpu的问题是解决这个等待的方式,或者提高LGWR的优先级,从参数中修改或者从操作系统命令提升进程的级别都可以。

3)如果提交的频率太高,那么减少提交的次数是解决这个问题的最好方式,但是如果这个方案不可行的话,增加LGWR的优先级也是一种方案。

4)如果数据的审计打开了的话,那么也可能是因为审计的表AUDIT$成为这个等待事件的原因

5)SSD硬盘也可以作为这个问题的解决办法

6)如果大量的redologsize是问题的元凶的话,那么可以考虑减少redo的产生的办法来解决这个问题。

DUMP

内存DUMP

GlobalArea

ALTERSESSIONSETEVENTS'immediatetracenameglobal_arealevel
level';
等于
ORADEBUGDUMPGLOBAL_AREAlevel;

level包括如下

等级

说明

1

IncludePGA

2

IncludeSGA

4

IncludeUGA

8

Includeindirectmemorydumps

LIBRARY_CACHE

ALTERSESSIONSETEVENTS'immediatetracenamelibrary_cachelevel
level';

ORADEBUGDUMPLIBRARY_CACHElevel

等级包括如下

等级

说明

1

Dumplibrarycachestatistics

2

Includehashtablehistogram

3

Includedumpofobjecthandles

4

Includedumpofobjectstructures(heap0)

例如
ALTERSESSIONSETEVENTS'immediatetracenamelibrary_cachelevel1';

DictionaryCache

ALTERSESSIONSETEVENTS'immediatetracenamerow_cachelevel
level';

ORADEBUGDUMPROW_CACHElevel

等级对照表
Level
Description
1
Dumprowcachestatistics
2
Includehashtablehistogram
8
Includedumpofobjectstructures
例如
ALTERSESSIONSETEVENTS'immediatetracenamerow_cachelevel1';

MultipleBuffers

Todumpbufferheadersandbuffercontentsforbufferscurrentlyinthecache

ALTERSESSIONSETEVENTS'immediatetracenamebufferslevel
level';
wherelevelisoneofthefollowing
Level
Description
1
Bufferheadersonly
2
Level1+blockheaders
3
Level2+blockcontents
4
Bufferheadersonly+hashchain
5
Level1+blockheaders+hashchain
6
Level2+blockcontents+hashchain
8
Bufferheadersonly+hashchain+users/waiters
9
Level1+blockheaders+hashchain+users/waiters
10
Level2+blockcontents+hashchain+users/waiters

MemoryHeaps

Todumpthetop-levelheapinamemoryarea
ALTERSESSIONSETEVENTS'immediatetracenameheapdumplevel
level';
level包括
Level
Description
1
PGAsummary
2
SGAsummary
4
UGAsummary
8
Callheap(Current)
16
Callheap(User)
32
Largepool
64
Streamspool
128
Javapool
1025
PGAwithcontents
2050
SGAwithcontents
4100
UGAwithcontents
8200
Callheapwithcontents(Current)
16400
Callheapwithcontents(User)
32800
Largepoolwithcontents
65600
Streamspoolwithcontents
131200
Javapoolwithcontents

ProcessState

Todumptheprocessstateuse:

ALTERSESSIONSETEVENTS'immediatetracenameprocessstatelevel
level';

ORADEBUGDUMPPROCESSSTATElevel;
Forexample

ALTERSESSIONSETEVENTS'immediatetracenameprocessstatelevel10';


SystemState

systemstatedump包含每个进程的进程状态。
Stateobjects被保存在SGA中。
Oracle推荐用systemdump去诊断下面的问题:

hangingdatabases
slowdatabases
databaseerrors
waitingprocesses
blockingprocesses
resourcecontention

Todumpthesystemstateuse
ALTERSESSIONSETEVENTS'immediatetracenamesystemstatelevel
level';
例如
ALTERSESSIONSETEVENTS'immediatetracenamesystemstatelevel10';
or
ORADEBUGDUMPSYSTEMSTATElevel

Asystemstatedumpcanbetriggeredbyanerror,forexamplethefollowinginit.oraparameter

Systemstatedump可以被一个ORA错误触发,比如在pfile里如下的ORA-00060错误参数,在数据库出现ORA-00060错误时即会触发systemdump。
event="60tracenamesystemstatelevel10"

ErrorStack

Errorstack描述了进程的当前状态信息,包括了当前SQL语句的信息和当前进程的进程状态信息。
Oracle推荐用errorstack诊断下面的问题:

whattheprocessisdoing
aproblemidentifiedbyasystemstatedump
processesloopingorhanging

Errorstackdumpscanalsobetriggeredbyanerror.
Todumpanerrorstackuse
ALTERSESSIONSETEVENTS'immediatetracenameerrorstacklevel
level';

ORADEBUGDUMPERRORSTACKlevel;
Level包含如下
Level
Description
0
Errorstackonly
1
Errorstackandfunctioncallstack
2
Aslevel1plustheprocessstate
3
Aslevel2plusthecontextarea

Enqueues

Todumpthecurrentenqueuestatesuse
ALTERSESSIONSETEVENTS'immediatetracenameenqueueslevel
level';

ORADEBUGDUMPENQUEUESlevel;

Level
Description
1
Dumpasummaryofactiveresourcesandlocks,theresourcefreelistandthehashtable
2
Includeadumpofresourcestructures
3
Includeadumpoflockstructures

Latches

Todumpthecurrentlatchstatususe
ALTERSESSIONSETEVENTS'immediatetracenamelatcheslevellevel';

ORADEBUGDUMPLATCHESlevel

Level
Description
1
Latches
2
Includestatistics

文件DUMP

数据块

Todumpablock
ALTERSYSTEMDUMPDATAFILEabsolute_file_numberBLOCKblock_number;
Todumparangeofblocks
ALTERSYSTEMDUMPDATAFILEabsolute_file_number
BLOCKMINminimum_block_number
BLOCKMAXmaximum_block_number;
TheDATAFILEclausecanspecifyanabsolutefilenumberofadatafilename.IftheDATAFILEclausespecifiesadatafilename,theblockscanalsobedumpedfromacloseddatabasee.g.

ALTERSYSTEMDUMPDATAFILE'file_name'BLOCKblock_number;
Normallyasymbolicblockdumpisoutput.However,thismaynotbepossibleiftheblockhasbecomecorrupt.Itispossibletooutputtheblockdumpinhexadecimal.

Todumpablockinhexadecimal,enableevent10289
ALTERSESSIONSETEVENTS'10289tracenamecontextforever,level1';
dumptheblock(s)usingoneoftheabovecommandsandthendisable10289againusing

ALTERSESSIONSETEVENTS'10289tracenamecontextoff';

索引

Anindextreecanbedumpedusing
ALTERSESSIONSETEVENTS'immediatetracenametreedumplevel
object_id';

ORADEBUGDUMPTREEDUMPobject_id;
whereobject_idistheobjectnumberoftheindex(inDBA_OBJECTS)

Thetreedumpincludes

branchblockheaders
leafblockheaders
contentsofleafblocks

UNDO段头

Todumpanundosegmentheaderusethecommandfunction
ALTERSYSTEMDUMPUNDO_HEADER'segment_name';
AlistofundosegmentIDsandnamescanbeobtainedusing
SELECTsegment_id,segment_name
FROMdba_rollback_segs
ORDERBYsegment_id;

UNDO块

Dumpundo块跟dump普通的数据文件块一样。

DUMP事务ID的UNDO信息

Todumpalltheundowrittenforaspecifictransaction,firstidentifythetransactionIDusing

SELECTxidusn,xidslot,xidsqnFROMv$transaction;
DumptheundousingthetransactionID
ALTERSYSTEMDUMPUNDOBLOCK'segment_name'XIDxidusnxidslotxidsqn;

RedologDUMP

Todumparedologfileuse
ALTERSYSTEMDUMPLOGFILE'FileName';

对数据库HANG做DUMP

sqlplus连接Hang住的Oracle

--10g后使用
sqlplus-prelim/assysdba

oradebugsetmypid
oradebugunlimit;
oradebugdumpsystemstate10

使用GDB做Systemstate_Linux

参考HowtoCaptureaSystemstateDumpUsingGDBUtilityonLinux[ID374569.1]
当Oracle系统hang住,无法使用一切方法登录时(包括sqlplus-prelim/assysdba),我们可以使用gdb调试工具来对Oracle做系统dump,通过系统dump信息判断具体hang的原因。

查找任意Oracle进程

ps-ef|greporcl(LOCAL=NO)
oracle38461010:00?00:00:00orcl(LOCAL=NO)
oracle51161010:15?00:00:00orcl(LOCAL=NO)
oracle91211011:00?00:00:00orcl

使用GDB调试OS进程,例如3846

Example:processid3846

$gdb$ORACLE_HOME/bin/oracle3846
(outputofthiscommandwillreturntothescreen)

.....
Readingsymbolsfrom/lib....done
LoadingSymbolsfor/lib....
.....

在GDB中执行命令

(gdb)printksudss(10)

使用DBX做Systemstate_AIX

参考TakingSystemstateDumpswhenYoucannotConnecttoOracle[ID121779.1]

查找Oracle进程

(saki)%ps-ef|grepsqlplus
osupport78526154096012:11:05pts/10:00sqlplusscott/tiger

osupport9413084332112:11:20pts/30:00grepsqlplus

(saki)%ps-ef|grep78526
osupport2834878526012:11:05-0:00oracles734(DESCRIPTION=(LOCAL

osupport78526154096012:11:05pts/10:00sqlplusscott/tiger

osupport9413284332112:11:38pts/30:00grep78526

使用DBX调试OS进程

(saki)%dbx-a28348
Waitingtoattachtoprocess28348...
Successfullyattachedtooracle.
warning:Directorycontainingoraclecouldnotbedetermined.
Apply'use'commandtoinitializesourcepath.

Type'help'forhelp.
readingsymbolicinformation...
stoppedinreadat0xd016fdf0
0xd016fdf0(read+0x114)80410014lwzr2,0x14(r1)

在DBX做systemdump

(dbx)printksudss(10)
(dbx)detach--退出
在user_dump_dest目录中会生成相关进程ID的trc文件

(saki)%ls-lrt*28348*
-rw-r-----1osupportdba46922Oct1012:12ora_28348.trc

使用GDB做Systemstate_HP-UX

参考UsingHP-UXDebuggerGDBToProduceSystemStateDump[ID273324.1]

打印后台进程堆栈

pstack<pid_of_pmon>
pstack<pid_of_smon>

Goldengate日常维护

1.1启停OGG

说明:数据库或主机停机,需要提前关闭OGG。数据库或主机启动后,需要手动开启OGG。
1、启动OGG

Oracle用户下

$cd/ogghome
$./ggsci
GGSCI>startmgr
GGSCI>start*

2、关闭OGG

Oracle用户下
$cd/ogghome
$./ggsci
GGSCI>stop*
GGSCI>stopmgr!
如果不能正常停则:

GGSCI>sendsextr01forcestop
GGSCI>sendspump01forcestop
GGSCI>stopmgr!

1.2日常监控

1、检查进程状态

Oracle用户下

$cd/ogghome
$./ggsci
GGSCI>infoall

ProgramStatusGroupLagTimeSinceChkpt
MANAGERRUNNING

EXTRACTRUNNINGSEXTR0100:00:0000:00:05

EXTRACTRUNNINGSPUMP0100:00:0000:00:00
REPLICATRUNNINGTREPLVA00:00:0000:00:00

说明:其中manager为OGG的管理进程,EXTRAC为OGG的抽取进程或者投递进程,REPLICAT为OGG的投递进程,确保所有进程都是RUNNING状态。具体的进程状态可使用以下命令查看:

GGSCI>infoSEXTR01
GGSCI>infoSPUMP01
…..

2、检查进程的统计信息

GGSCI>stats<进程名称>,<时间频度>,table<ownername>.<tablename>可以查看进程处理的记录数。

GGSCI>stats<进程名称>,total列出自进程启动以来处理的所有记录数。
GGSCI>stats<进程名称>,daily,table<ownername>.<tablename>列出当天以来处理的有关gg.test表的所有记录数。
其中<进程名称>分别是SEXTR01和SPUMP01,<ownername>.<tablename>需要通过查看抽取进程参数文件来得到,如下:

GGSCI>viewparamSEXTR01--可以得到抽取的表名
GGSCI>statssextr01,total--列出抽取进程启动以来处理的所有记录
GGSCI>statssextr01,daily--列出抽取进程启动当天处理的所有记录
GGSCI>statssextr01,daily,table<ownername>.<tablename>
--列出抽取进程启动当天某张表处理的所有记录
GGSCI>statsSPUMP01,total--列出投递进程启动以来处理的所有记录
GGSCI>statsSPUMP01,daily--列出投递进程启动当天处理的所有记录
GGSCI>statsSPUMP01,daily,table<ownername>.<tablename>
--列出投递进程启动当天某张表处理的所有记录

3、查看进程的参数和报告

GGSCI>viewparamsextr01--查看抽取进程参数文件配置
GGSCI>editparamsextr01--编辑抽取进程参数文件
GGSCI>viewparamSPUMP01--查看投递进程参数文件配置
GGSCI>editparamSPUMP01--编辑投递进程参数文件
GGSCI>viewreportsextr01--查看抽取进程的报告
GGSCI>viewreportSPUMP01--查看投递进程的报告
当进程出现故障时,可通过查看进程的报告来确定故障原因。

1.3进程说明

1.3.1业务系统侧部署说明

序号
复制说明
OGG部署地址
管理端口
动态端口
进程说明
1
基建管控系统复制
7950
7950-7990
SEXTR01(抽取进程)、SPUMP01(投递进程)
2
营销稽查监控复制
7950
7950-7990

3
财务管控系统复制
7950
7950-7990

1.3.2数据中心侧部署说明

序号
复制说明
OGG部署地址
管理端口
动态端口
进程说明
1
基建管控系统复制
7950
7950-7990
TREPLVA(复制进程)
2
营销稽查监控复制
7950
7950-7990
TREPLVB(复制进程)
3
财务管控系统复制
7950
7950-7990
TREPLVC(复制进程)
4
省(市)上传
7950
7950-7990
EXTBAM(抽取进程)、PUMPBAM(投递进程)
5
总部下发
7950
7950-7990
REPBAMXX(复制进程)

单表重新同步方案

如果是某些表由于各种原因造成两边数据不一致,需要重新进行同步,但实际业务始终24小时可用,不能提供时间窗口,则可以参照以下步骤(因较为复杂,使用需谨慎,此处以scott.emp表为例说明。):
1)确认ext/dpe/rep进程均无较大延迟,否则等待追平再执行操作;
2)停止目标端的rep进程;
注意:步骤3-5为将源端数据通过expdp/impdp导入到目标端,客户也可以选择其它初始化方式,比如PL/SQL导入语插入。
3)在源端获得当前的scn号。例如:
selectdbms_flashback.get_system_change_numberfromdual;
以下以获得的scn号为1176681为例
4)在源端使用exp导出所需重新初始化的表或者几张表数据,并且指定到刚才记下的scn号。例如:
expdpogguser/ogguser_123directory=oggdumpfile=nanhai.dmptables=scott.empgrants=nstatistics=nonetriggers=ncompress=nFLASHBACK_SCN=1176681
--以scott.emp为例
5)通过ftp传输到目标端;
6)在目标库删除该表
droptablescott.emp;
7)在目标端,使用imp导入数据;
nohupimpdpogguser/ogguser_123directory=oggdumpfile=nanhai.dmpremap_schema=scott:ods_yyjc_bufrepmap_tablespace=源端表空间名字:odsview
注:需要转换相应用户与表空间名字,可以向DBA求助。
8)对该表添加updatetime字段
Altertablescott.empaddupdatetimedefaultsysdate;
9)编辑目标端对应的rep参数文件,在其map里面加入一个过滤条件,只对这些重新初始化的表应用指定scn号之后的记录(一定要注意不要修改本次初始化之外的其它表,会造成数据丢失!):
mapscott.emp,targetods_yyjc_buf.emp,filter(@GETENV("TRANSACTION","CSN")>1176681);
10)确认参数无误后,重新启动目标端的rep进程;
使用inforepxx或者lagrepxx直到该进程追上,停止该进程去掉filter重启后即可进入正常复制。

新增或者删除表方案

1.1删除表

删除表只需要编辑抽取进程、投递进程、复制进程参数文件,将要删除的表从参数文件都删除即可。

1.2新增表

1.增加表前先查询源数据库,确认表是存在的。
2.在源端为新增表添加附加日志(以SG_BAM.TEST为例):
cd/ogghome
./ggsci
GGSCI>dbloginuseridogguser,passwordogguser_123

GGSCI>addtrandataSG_BAM.TEST--新增表
GGSCI>infotrandataSG_BAM.TEST--查看是否已添加成功,成功为enable
3.停止复制进程。
4.修改抽取进程参数(以extbam为例),添加新表:
GGSCI>editparamextbam--相当于vi/ogghome/dirprm/extbam.prm
EXTRACTextbam
SETENV(NLS_LANG=AMERICAN_AMERICA.ZHS16GBK)

USERIDogguser@yyjc,PASSWORDAACAAAAAAAAAAAHANGWARBMCFHHDCFMF,ENCRYPTKEYdefault
DYNAMICRESOLUTION
tranlogoptionsaltarchivelogdestprimaryinstanceyyjc1/arch1,altarchivelogdestinstanceyyjc2/arch2
reportat1:59
reportrolloverat2:00
Gettruncates
warnlongtrans3h,checkinterval10m
TRANLOGOPTIONSRAWDEVICEOFFSET0
EXTTRAIL./dirdat/SG_BAM/BA
TABLESG_BAM.BAM_PROCESSINST;
TABLESG_BAM.BAM_ACTIVITYINST;
TABLESG_BAM.BAM_PROCINST_VIOLATION_DETAIL;
TABLESG_BAM.BAM_ACTINST_VIOLATION_DETAIL;
TABLESG_BAM.WZ_CGSQ_H;
TABLESG_BAM.WZ_HT_H;
TABLESG_BAM.WZ_CGDD_H;
TABLESG_BAM.WZ_DHYS_H;
TABLESG_BAM.WZ_FKSQ_H;
TABLESG_BAM.WZ_ZLWT_H;
TABLESG_BAM.WZ_Q_CCPSTM;
TABLESG_BAM.WZ_Q_HTGLTM;
TABLESG_BAM.WZ_Q_LCJC;
TABLESG_BAM.WZ_Q_XQCGTM;
TABLESG_BAM.DWM_TRANSMISSIONPRO_H;
TABLESG_BAM.DWM_SINGLEPRO;
TABLESG_BAM.DWM_CONTRACTINFO;
TABLESG_BAM.DWM_TRANSMISSIONPRO_PLAN;
TABLESG_BAM.DWM_TRANSMISSIONPRO_SAFE;
TABLESG_BAM.TEST;--比如添加此行,注意要加分号
5.重启抽取、投递进程。
GGSCI>stopextbam
GGSCI>startextbam
GGSCI>infoall
确认抽取和投递进程都处于running状态。

6.在源端获得当前的scn号。进行表的初始化(如果新增表无数据,则跳过此步)。
selectdbms_flashback.get_system_change_numberfromdual;
以下以获得的scn号为1176681为例

在源端使用expdp导出所需重新初始化的表或者几张表数据,并且指定到刚才记下的scn号,例如:
expdpogguser/ogguser_123directory=oggdumpfile=nanhai.dmptables=scott.testgrants=nstatistics=nonetriggers=ncompress=nFLASHBACK_SCN=1176681
--以scott.test为例
在目标端,使用impdp导入数据。
7.修改目标端的复制进程
编辑目标端对应的rep参数文件,在其map里面加入一个过滤条件,只对这些重新初始化的表应用指定scn号之后的记录(一定要注意不要修改本次初始化之外的其它表,会造成数据丢失!):
mapscott.emp,targetods_yyjc_buf.test,filter(@GETENV("TRANSACTION","CSN")>1176681);
如果本次新增表没有初始化数据,则无需上面加亮总部。
总部启动复制进程,使用inforepxx或者lagrepxx直到该进程追上,停止该进程去掉filter重启后即可进入正常复制。

源系统表结构变更说明

如果源系统中涉及运监流程数据接入的表的结构进行变更,需将变更语句及变更信息及时通知运监人员,运监OGG运维人员需及时进行调整。

在表结构变更之前确保源端抽取进程停止,表结构变更完成之后,表级别附加日志需要重新添加。重新添加表级别附加日志操作如下,以test.t表为例:

$cd/ogghome
$./ggsci
GGSCI>dbloginuseridogguser,passwordogguser
GGSCI>deletetrandatatest.t
GGSCI>addtrandatatest.t
如果采用异构转换方式进程数据同步的系统,还需在源端重新生成异构文件,并传送至目标端,覆盖原先的异构文件,启动复制进程。

待目标端相应设置都完成之后源端可以启动抽取进程。

注意:尽量避免主键列的变动,如果有主键列的变动请将相关变动与ogg运维人员商量实施。

主机操作系统

AIX操作系统

HACMP管理

修改bootIP

1.主/备机节点停止HACMP服务

#smittyclstop
2.主/备机修改en0IP

#smittychinet
3.主/备机编辑/etc/hosts

4.修改HACMP配置

#smittyhacmp->ExtendedConfiguration->ExtendedTopologyConfiguration->ConfigureHACMPCommunicationInterfaces/Devices->Change/ShowCommunicationInterfaces/Devices
依次选择主/备机节点的en0/en0,不做修改,直接回车即可,自动会更新boot1IP地址
5.显示网络接口配置

#/usr/es/sbin/cluster/utilities/cllsif

修改ServiceIP

1.主/备机节点停止HACMP服务

#smittyclstop
2.主/备机编辑/etc/hosts

3.修改HACMP配置

#smittyhacmp->InitializationandStandardConfiguration->ConfigureResourcestoMakeHighlyAvailable->ConfigureServiceIPLabels/Addresses->Change/ShowaServiceIPLabel/Address

*IPLabel/Addressnodesvc
*NewIPLabel/Address[nodesvc]这里再写一遍
*NetworkName[net_ether_01]
4.显示网络接口配置

#/usr/es/sbin/cluster/utilities/cllsif
5.验证后启动HACMP

#smittyhacmp->ExtendedConfiguration->VerificationandSynchronization

删除HACMP配置

odmgetHACMPcluster
odmdelete-oHACMPcluster

AIX5.3内核参数设置

1.内存参数配置:

内存被分为两类,一种为工作区,用于存放进程数据、堆栈、核心Kernal数据以及共享内存,工作区的数据如果需要换页,只会交换到pagingspace。

另一类为持久存储区,主要是文件数据在内存中的缓冲,当持久存储区的数据需要换页,则会交换到其所归属的文件。持久存储区的页又被分成Clientpages和Non-clientpages,其中,None-clientpage只能缓冲JournaledFileSystem(JFS)文件系统的文件数据,而Clientpage缓冲所有其它类型文件系统的数据,如:NFS。

vmo-p-olru_file_repage=0#设置该参数为0,使得内存中文件页面数大于minperm后,只偷取文件页面
#默认为1
vmo-p-ominperm%=5#当文件页面占用的实际内存的百分比低于minperm%时,
#页面替换算法将同时替换文件页面及计算页面
vmo-p-omaxperm%=90#当文件页面占用的实际内存的百分比高于maxperm%时,
#页面替换算法仅替换文件页面
#在AIX5.3ML1前尚未采用lru_file_repage参数,
#因此需要将maxperm设置得很低,避免计算页面被偷取
vmo-p-omaxclient%=90#jfs2与nfs最大文件系统cache使用

一般当使用裸设备时,设置minperm%=5,lru_file_repage=0,maxperm%可以使用默认值。
2.查看内存参数配置

#vmo-Lminperm%-Lmaxperm%-Lmaxclient%-Llru_file_repage
NAMECURDEFBOOTMINMAXUNITTYPE
DEPENDENCIES
--------------------------------------------------------------------------------
lru_file_repage01001booleanD
--------------------------------------------------------------------------------
maxclient%9080901100%memoryD
maxperm%
minperm%
--------------------------------------------------------------------------------
maxperm%9080901100%memoryD
minperm%
maxclient%
--------------------------------------------------------------------------------
minperm%52051100%memoryD
maxperm%
maxclient%
--------------------------------------------------------------------------------
3.网络参数配置:

/usr/sbin/no-r-oipqmaxlen=512
/usr/sbin/no-p-osb_max=1310720
/usr/sbin/no-p-oudp_sendspace=65536
/usr/sbin/no-p-oudp_recvspace=655360
/usr/sbin/no-p-otcp_sendspace=65536
/usr/sbin/no-p-otcp_recvspace=65536
/usr/sbin/no-p-orfc1323=1
4.查看配置的参数:

#cat/etc/tunables/nextboot
......
vmo:
maxclient%="90"
maxperm%="90"
minperm%="5"
lru_file_repage="0"

no:
rfc1323="1"
tcp_recvspace="65536"
tcp_sendspace="65536"
udp_recvspace="655360"
udp_sendspace="65536"
sb_max="1310720"
ipqmaxlen="512"
5.恢复默认配置

注意:会恢复所有参数
#vmo-p-D

AIX5.3文件系统

1.创建文件系统

#crfs-vjfs2-grootvg-asize=20480M-m/oracle-Ayes
2.增加swap大小

#chps-s30hd6增加的是pp个数,如ppsize为256m,增加30个就是增加7268M
3.增加/tmp大小,前提要所有卷组有空闲空间

#chfs-asize=+'1792M'/tmp
4.未建vg情况下,查看pv大小

#bootinfo-supdisk0
307200
5.pv管理

chdev-lhdisk2-apv=clear
chdev-lhdisk2-apv=yes
6.创建卷组(Scalablevg)

/usr/sbin/mkvg-S-y'oradatavg'-f-P128-s256hdisk2

-P:vg中最大可以有的pp数:128*1024=131072个
-s:在每个物理分区中设置兆字节数
-t:缺省每个pv可以有1016个物理分区,如果1016*pp.size<pv盘大小,
那就需要-t来指定pv中,每物理卷的物理分区数的限制,
这会影响加入到vg中的pv数,MAXPVS/factor
注意:ScalableVG的maxppsperpv不是1016,比这个大很多。
MAXPVS普通VG为32,大VG为128,ScableVG为1024
#/usr/sbin/mkvg-S-y'bakvg'-f-P128-s256updisk0
#crfs-vjfs2-gbakvg-asize=20480M-m/backup-Ayes
#chown-Roracle:oinstall/backup
7.向卷组中添加PV

extendvgoradatavghdisk8
extendvg-foradatavghdisk8

检测修复文件系统

fsck/dev/fslv00--先检测,发现问题,再使用-p
fsck–p/dev/fslv00

AIO

#lsattr-Elaio0
#mkdev-laio0
aio0Available
#chdev-P-laio0-aautoconfig='available'
aio0changed
通过如下命令可以查询系统当前aioserver的个数,如果已经达到或者接近maxservers,则需要考虑增加该参数。
#pstat-a|grepaios|wc-l

truss跟踪

#truss-faeio/tmp/truss.out-p962704
#cat/tmp/truss.out|egrep-v"times|_poll"
#tail-f/tmp/truss.out|egrep-v"times|_poll"

硬件查看

1.获取系统中的HBA卡;

#lsdev-C|grepfcs
fcs0Available00-08FCAdapter
fcs1Available05-08FCAdapter
2.获取HBA属性

#lscfg-vlfcs0
以下就是WWN号
NetworkAddress.............10000000C97E5FFA

识别硬件

#cfgmgr-v

错误查看

errpt-dH-TPERM--硬件错误
errpt-ajXXXXXX|more--查看某个错误的详细信息

查看补丁

/usr/sbin/instfix-a-ivkIV09580
/bin/oslevel–s

/usr/sbin/instfix-i|grepML

资源检测

#vmstat210
idCPU空闲时间或无I/O等待时间的百分比;
waCPUI/O等待时间的百分比;
r运行队列中的线程数;运行队列中等待的线程数越多,系统性能受到的影响越大。
如果id和wa的值持续为接近0的值,sample明CPU此时处于繁忙状态。

#tprof-xsleep30
此命令运行30秒钟,生成sleep.prof文件

#netpmon-o/tmp/netpmon.out-Ocpu-v;sleep30;trcstop
此命令运行30秒钟,并在/tmp目录下生成文件netpmon.out。
CPUTime为进程使用CPU的时间总值
CPU%对应其百分比
NetworkCPU%为进程中与网络有关的代码所占用的CPU百分比。

#filemon-u-Oall-o/tmp/fmon.out;sleep30;trcstop
filemon命令用于查看哪些文件/逻辑卷/硬盘处于繁忙状态。
1.最为繁忙的虚拟内存段(segment)、逻辑卷和物理卷;
2.对页空间(pagingspace)的读写次数,确认硬盘I/O是由于应用程序操作还是频繁的换页操作;
3.最为活跃的文件或逻辑卷,如果它们存放在繁忙的物理卷上,可以考虑将数据移至相对空闲的硬盘上,这样有助于提高系统性能。最为繁忙的段的报sample里列示出最繁忙的文件所对应的文件系统和i节点。文件系统的安装点(mountpoint)及文件的i节点(inode)可与命令ncheck一起使用,来找出相对应的文件。这个报sample可用来判断该I/O操作是针对文件系统、JFSLog还是系统页空间的。
通过检查字段"reads"和"readsequences"的值,可以判断该操作是顺序读取还是随机读取。当"readsequences"接近"reads"时,对该文件的访问则以随机读取方式居多。

#svmon-Pu10|more
这条命令显示出使用内存最多的前十个进程,并针对每个进程给出了一个详细列
在每个进程的列sample中,找出Type为"work"及Description为"private"的相应行,查看Pgspace显示的使用页面数(每个页面大小为4096字节),该数值为此段(segment)在虚拟内存空间中占用的工作页面(workingpages)数,即占用的页空间中的页面数。如果Pgspace值持续增长,系统则有可能存在内存泄漏(memoryleak)。当应用程序不能正常释放内存时会出现内存泄漏的问题。

HP-UX操作系统

HP-UX文件系统

1.创建逻辑卷

以mb为单位,此处为100G
#lvcreate-L102400-noradatalv1/dev/vg04

条带化处理
#i:跨多少个PV
#I:条带大小,单位KBDB一般为64KB或128KB,随机读的更小
#lvcreate–i2–I64–nlvdata–L1000/dev/vgdata
2.创建文件系统

#newfs-Fvxfs-olargefiles/dev/vg04/roradatalv1
3.mount文件系统

#mount/dev/vg04/oradatalv1/vg04/webuser
4.在/etc/fstab中添加条目

/dev/vg04/oradatalv1/vg04/webuservxfsrw,suid,largefiles,delaylog,datainlog02
5.删除逻辑卷

#lvremove/dev/vg04/oradatalv1
6.文件系统扩容

umount/db
lvextend–L8000/dev/vg03/dblv#护展到8000M
extendfs/dev/vg03/dblv
mount/db

卷组管理

1.创建VG

mkdir/dev/vg01
mknod/dev/vg01/groupc640x010000
vgcreate-s16vg01/dev/dsk/cxtxdx
2.查看卷组、卷组所包括的逻辑卷以及该卷组所包括的物理磁盘

vgdisplay-vvg00
3.查看硬盘大小信息

diskinfo/dev/rdsk/c2t5d0
4.导出卷组

vgchange-anvg01
vgexport-mvg01.map/dev/vg01

--本机移动
#vgchange-an/dev/vg01
#vgexport/dev/vg01
移动硬盘位置
#vgscan-v
#mkdir/dev/vg01
#mknod/dev/vg01/groupc640x040000
#vgimport/dev/vg01/dev/dsk/c1t0d0
#vgchange–ay/dev/vg01

--跨机移动
#vgchange-an/dev/vg_planning
--先备份
#vgexport-p-s-m/tmp/vg_exp_bak/vg_plan.map/dev/vg_planning
#vgexport/dev/vg_planning
#ioscan-fun-Cdisk
#mkdir/dev/vg_planning
#mknod/dev/vg_planning/groupc640x040000
#vgimport-v-mplan_map/dev/vg_planning
#vgchange-ay/dev/vg_planning

-m参数作用:map文件到底有什么用处?什么情况下需要它?如果你export的时候没有生成map文件,当你import的时候lv的名字就变成了default的lvol1、lvol2....原来的名字将丢失。在配置MC的时候,我们在一台主机上配置好vg,lv,fs之后,export到其他的节点上即可。
-s参数作用:export导出的map文件信息是vgcfgbackup导出信息的一部分,vgcfgbackup所导出的包含了更多的卷组信息的二进制文件。

操作系统日志

/var/adm/syslog/syslog.log

SC/MC管理

1.查看集群和包状态

jsalarm1[/]#cmviewcl-v

#cmruncl启动集群cluster
#cmhaltcl关闭集群cluster
#cmrunnode<node_name>启动一个或多个节点
#cmhaltnode-f<node_name>关闭一个或多个节点
#cmrunpkg<pkg_name>启动应用包
#cmhaltpkg<pkg_name>关闭应用包
#cmviewcl-v查看cluster和cluster里节点的信息
#cmmodpkg-e<pkg_name>使应用包可被接管、切换
#cmmonpkg-e-n<node_name><pkg_name>使节点可接管应用包

人为切换。有两种办法来实现
方法1:使用cmhaltnode命令来停止运行有程序包的节点。
cmhaltnode-fnodename
这样,在停止该节点的同时,应用程序包会自动迁移到另外一个节点上。
方法2:使用cmhaltpkg来启停应用程序包
1)用cmhaltpkg命令来停止需要迁移的程序包
cmhaltpkgpkgname
2)用cmrunpkg来重新在别的节点上运行程序包
cmrunpkg-nnodenamepkgname
3)用cmmodpkg修改切换属性
cmmodpkg-epkgname

补丁管理

1.查看特定补丁包

/usr/sbin/swlist-lpatch|grep33498
/usr/sbin/swlist-lbundle|grep"GOLD"
2.查看替代补丁包

/usr/sbin/swlist-lpatch-asupersedes|grep-in31097

查看系统硬件

1.查看硬件整体情况

/opt/ignite/bin/print_manifest
2.查看内存

/usr/sbin/swapinfo-atm
MbMbMbPCTSTART/Mb
TYPEAVAILUSEDFREEUSEDLIMITRESERVEPRINAME
dev4096832326420%0-1/dev/vg00/lvol2
dev368641071357933%0-1/dev/vg00/lvswap
reserve-36115-36115
memory75619309804463941%
total116579689984758159%-0-

内核参数

1.查看内核参数

11.11命令:
hajf2#[/]kmtune|egrep"shmmni|shmseg|msgmnb|msgmni|msgtql"
msgmnb4194304Y4194304

msgmni32020-32020

msgtql20000-20000

shmmni8192-8192

shmseg3072Y3072

11.23,11.31命令:
$/usr/sbin/kctune

/usr/sbin/sysdef

$/usr/sbin/kctune-vnfile
Tunablenfile
DescriptionMaximumnumberoffiledescriptors(system-wide)
Modulefs_filedscrp
CurrentValue0[Default]
ValueatNextBoot0[Default]
ValueatLastBoot0
DefaultValue0
Constraintsnfile==0ornfile>=2048
nfile<=2147483647
CanChangeImmediatelyoratNextBoot

文件系统缓存大小,在11.23版本中参数为:
dbc_max_pct
dbc_min_pct
在11.11版本中参数为:
filecache_max
filecache_min
2.查看下次启动是否有内核参数变动

11.31命令:
/usr/sbin/kconfig-D

调整内核参数

#sam
KernelConfiguration->
ConfigurableParameters->
选中相应的参数,在Action菜单中
ModifyConfigurableParameter...
全部修改完毕后,在Action菜单中
ProcessNewKernel
系统将会重启

/usr/sbin/kctune-h–Bnproc=7000
以下是调整参数为默认值
kctunenproc=
kctunenproc=default

关机命令

shutdown-y-h0关闭系统,然后关闭电源
shutdown-y-r关闭系统后重新启动

识别硬件

--识别新硬盘
#ioscan-fCdisk

共享内存段管理

ipcs-a或ipc显示当前系统中共享内存段、信号量集、消息队列的使用情况;
ipcs-m显示共享内存段的使用情况;
ipcs-s显示信号量集的使用情况;
ipcs-q显示消息队列的使用情况;

ipcrm-ssemid删除对应的信号量集
ipcrm-mshmid删除对应的共享内存段
ipcrm-qmsqid删除对应的消息队列

查看内存情况

#./kmeminfo-arena|more--内存信息
#./kmeminfo-u--进程内存使用信息

#pmap18174--查看进程使用的库文件

安装TUSC

1、查看tusc是否安装在默认目录
引用
#whichtusc

2、下载tuschttp://hpux.connect.org.uk/hppd/hpux/Sysadmin/tusc-8.0/3、上传至服务器,并将其解压
引用
#gunziptusc-8.0-ia64-11.23.depot.gz
#lltusc-8.0-ia64-11.23.depot*
-rw-r–r–1rootsys983040Jun1315:55tusc-8.0-ia64-11.23.depot

4、对于depot文件有两种安装方法推荐用第一种
1)使用swinstall安装
引用
#swinstall-srx2600:/tmp/tusc-8.0-ia64-11.23.depot

2)直接解压安装
引用
#tarxvf/tmp/tusc-8.0-ia64-11.23.depot

5、安装完成之后即可调用tusc进行进程调度跟踪
引用
#/tmp/tusc/tusc-RUN/usr/local/bin/tusc-aefo/tmp/tusc.outsqlplus“/assysdba”

异步IO设置

(1)#/usr/sbin/setprivgrpdbaMLOCK
(2)#vi/etc/privgroup
dbaMLOCKRTSCHEDRTPRIO

查看是否启用异步IO
#fuser/dev/async

LINUX

1.1.Linux文件系统

1.pv管理

#pvcreate/dev/sda
#pvdisplay
#pvremove/dev/sdb1
2.vg管理

#vgcreateoravg/dev/sda
#vgcreate-s32moravg/dev/sda--创建指定extent大小的的vg
#vgdisplay
#vgremoveoravg

#vgchange-anvg01LV的LVStatus为“NOTavailable”
#vgchange-ayvg01LV的LVStatus为“available”
3.vg扩容

#vgextendVolGroup00/dev/sdb--将新pv添加到vg中
#vgreduceVolGroup00/dev/sdb--从vg中去除掉pv
4.lv管理

#lvcreate-l25599-nlvoradata01oravg--创建lv
#lvdisplay
#lvremove-f/dev/oravg/lvoradata01--删除lv
#lvchange-an/dev/mapper/VolGroup01-LogVol00--lv置为不激活

#lvcreate-m1-l2-nlv_01_control02vg01--lv镜像
#lvconvert-m1vg01/lv_01_control01--非镜像的LV转为镜像

条带化:
-i:此处写lv用到的pv的数量,不能超过所在vg的pv数量,一般设置与vg的pv个数相同
-I:条带单元大小,单位Kb
-L:lv的大小,默认为Mb,可带单位G,M,K
-l:小写L,分配给lv的PE个数,对应VG中的PE,在上条vgdisplay的输出中可看到VG中一共有1533个PE。
-n:自定义lv的名字,默认从lvol0开始往下排。
#lvcreate-i3-I64-l2-nlv_01_control03vg01

查看LV
#lvmlvscan
ACTIVE'/dev/VGExaDb/LVDbSys1'[30.00GB]inherit
ACTIVE'/dev/VGExaDb/LVDbSwap1'[24.00GB]inherit
ACTIVE'/dev/VGExaDb/LVDbOra1'[100.00GB]inherit
ACTIVE'/dev/VGExaDb/LVDbSys2'[30.00GB]inherit
5.文件系统管理

#mkfs.ext3/dev/oravg/lvoradata01--格式化文件系统

1.2.Strace跟踪

1.跟踪1:

[oracle@sybase~]$ps-ef|grepdbwr
oracle34423373013:30pts/600:00:00grepdbwr

[oracle@sybase~]$strace-p32952>&1|grep-vtime
Process3295attached-interrupttoquit

在另一个会话
SQL>alterdiskgroupdatamount;
Diskgroupaltered.

strace的跟踪结果:
[oracle@sybase~]$strace-p32952>&1|grep-vtime
Process3295attached-interrupttoquit
semctl(360448,15,SETVAL,0x1)=0
statfs("/dev/raw/raw4",{f_type=0x1021994,f_bsize=4096,f_blocks=128360,f_bfree=128330,f_bavail=128330,f_files=128360,f_ffree=128079,f_fsid={0,0},f_namelen=255,f_frsize=4096})=0
open("/dev/raw/raw4",O_RDWR|O_NONBLOCK|O_SYNC)=15
fcntl(15,F_SETFD,FD_CLOEXEC)=0
io_submit(46912530558976,1,{{0x2aaaac6962b8,0,1,0,15}})=1
io_getevents(46912530558976,1,1024,{{0x2aaaac6962b8,0x2aaaac6962b8,4096,0}},{1,40000000})=1
io_submit(46912530558976,1,{{0x2aaaac6962b8,0,1,0,15}})=1
io_getevents(46912530558976,1,1024,{{0x2aaaac6962b8,0x2aaaac6962b8,4096,0}},{1,40000000})=1
open("/proc/3289/stat",O_RDONLY)=20
read(20,"3289(oracle)S1328932890-1"...,999)=221

[oracle@sybasefd]$ll
总计0
lr-x------1oracleoinstall6401-3113:260->/dev/null
lr-x------1oracleoinstall6401-3113:261->/dev/null
lr-x------1oracleoinstall6401-3113:2610->/dev/zero
lr-x------1oracleoinstall6401-3113:2611->/dev/zero
lr-x------1oracleoinstall6401-3113:2612->/oracle/app/oracle/product/10.2.0/db_1/rdbms/mesg/oraus.msb
lrwx------1oracleoinstall6401-3113:2613->/oracle/app/oracle/product/10.2.0/db_1/dbs/hc_+ASM.dat
lrwx------1oracleoinstall6401-3113:2614->/oracle/app/oracle/product/10.2.0/db_1/dbs/lk+ASM
lrwx------1oracleoinstall6401-3113:2615->/dev/raw/raw4

“2>&1”的意思
在shell中,文件描述符通常是:STDIN,STDOUT,STDERR,即:0,1,2,
在输出过程中产生的错误信息也放在了STDOUT,即:1中
2.跟踪2:

[oracle@owb~]$strace-cp5561
Process5561attached-interrupttoquit
Process5561detached
%timesecondsusecs/callcallserrorssyscall
--------------------------------------------------------------
41.830.0010212045read
20.810.0005085081shmdt
14.830.000362914write
6.390.000156441getrusage
6.190.0001511411close
4.710.000115383munmap
3.480.000085420times
1.270.000031218rt_sigaction
0.330.000008811open
0.160.00000422rt_sigprocmask
--------------------------------------------------------------
100.000.0024411061total

1.3.检查SeLinux状态

[root@sybase~]#/usr/sbin/sestatus-v
SELinuxstatus:disabled
[root@sybase~]#serviceiptablesstatus
防火墙已停

1.4.查看堆栈

[oracle@sybasebdump]$pstack3866
#10x0000000003d8b862insskgpwwait()
#20x0000000003d6e2bainskgpwwait()
#30x00000000007acfc7inkslges()--获取latch的过程
#40x00000000007ac930inkslgetl()
#50x00000000023d2e07inkqrpre1()
#60x00000000023d2c8binkqrpre()
#70x00000000030a3386inseqcre()
#80x00000000030e62afinopiexe()
#90x0000000003692c7einopiosq0()
#100x00000000032270e4inkpooprx()
#110x00000000032252a7inkpoal8()
#120x00000000013b2a60inopiodr()
#130x0000000003c3043ainttcpip()
#140x00000000013adf94inopitsk()
#150x00000000013b0f3cinopiino()
#160x00000000013b2a60inopiodr()
#170x00000000013a4148inopidrv()
#180x0000000001f9a7deinsou2o()
#190x000000000072d26binopimai_real()
#200x000000000072d1bcinmain()
[oracle@sybase~]$gdb$ORACLE_HOME/bin/oracle<spid>--进入oracle进程调试状态
break<kslges>--设置断点
bt--打印堆栈
clear<kslges>--清除断点
infobreak--查看断点
frame1--切换到1号帧,也可以使用up或down命令
infolocals--在当前帧中打印局部变量
infoframe--获取有关帧的进一步信息,如它的地址和程序语言

1.5.内核参数:

/proc/sys/net/ipv4/--网络参数目录
/proc/sys/vm--虚拟内存目录

vm.lower_zone_protection=400--保护低内存
--分配内存时优先考虑从highmemory分配
vm.min_free_kbytes=204800--保留的内存200M
--值越高,内核越早开始回收内存,空闲内存越高
vm.swappiness=40--设置内存不倾向用swap,默认是60
echo1>/proc/sys/vm/drop_caches--可以暂时清空cache和buffer
echo"0">/proc/sys/vm/oom-kill--关闭oom-kill

1.6.sysrq指令

grep"CONFIG_MAGIC_SYSRQ"/boot/config-`uname-r`--验证系统是否支持sysrq
kernel.sysrq=1--启动sysrq

echo"b">/proc/sysrq-trigger--直接重启系统
Alt+PrintScreen+[Command]--在终端上

安全重启的方法如下:
R-E-I-S-U-B,注意不要一气呵成地按下这六个键
R-把键盘设置为ASCII模式R–1秒
E会向除init以外所有进程发送可捕获的SIGTERM信号E–30秒
I-向除init以外所有进程发送SIGKILL信号I–10秒
S-磁盘缓冲区同步S–5秒
U-重新挂载为只读模式U–5秒
B-立即重启系统

T-打印进程列表
W-打印CPU信息

1.7.内存管理

free–lm

1.8.检查IO

iostat-x-d-m2
iostat-x-d-m2/dev/sda*

1.9.操作技巧

ls-l--color=never#取消颜色闪烁
#partprobe#kernel重新读取分区信息,避免重启系统

1.10.检查网络状态

#netstat-ant|awk'$6~/[A-Z]$/{a[$6]++}END{for(iina)printi,a[i]}'
LISTEN1
ESTABLISHED2
Foreign1

--检查网络流量
sar-nDEV4100
IFACE:LAN接口
rxpck/s:每秒钟接收的数据包
txpck/s:每秒钟发送的数据包
rxbyt/s:每秒钟接收的字节数
txbyt/s:每秒钟发送的字节数

1.11.祼设备管理

raw–qa

1.12.搜集硬件报错

#sosreport
1、查看内存槽数、那个槽位插了内存,大小是多少
#dmidecode|grep-P-A5"Memory\s+Device"|grepSize|grep-vRange
2、查看最大支持内存数
#dmidecode|grep-P'Maximum\s+Capacity'
3、查看槽位上内存的速率,没插就是unknown。
#dmidecode|grep-A16"MemoryDevice"|grep'Speed'

Solaris

1.13.软件包管理

pkginfo-l--显示长格式
pkginfo--显示短格式
pkginfo-iSUNWarcSUNWbtoolSUNWlibC
pkgchk-l-p/usr/bin/showrev--查看文件属于哪个包
pkgchk-lSUNWexplo|grep"^Pathname"--查看包中的所有文件

--Solaris11
使用以下命令在系统信息库中为软件包编写目录并更新搜索索引
#pkgset-publisher-G'*'-g/media/SOL11REPO_FULL/reposolaris
使用在线repo
#pkgset-publisher-Pe-Ohttp://pkg.oracle.com/solaris/releasesolaris
检查repo
#pkgpublisher
PUBLISHERTYPESTATUSURI
solarisoriginonlinefile:///media/SOL11REPO_FULL/repo/
-G'*'删除solaris发布者的所有现有源。
-g将新建的本地系统信息库的URI添加为solaris发布者的新源

安装桌面
#pkginstallsolaris-desktop

1.14.补丁管理

showrev-p

1.15.监控CPU

prstat-J

例:监控某个进程
prstat-Lp21501

1.16.系统调度类

dispadmin-l

1.17.识别硬件

--识别硬件
#devfsadm
--查看硬盘
#iostat–En
--查看内核
#isainfo
sparcv9sparc
--查看周边设备
prtconf
--查看内核模式
#isainfo-b
64
--查看CPU
cd/usr/pl*/sun4u/sbin/prtdiag-v|more
--查看内存
#prtconf|grep'Memory'
Memorysize:32768Megabytes

1.18.关机断电

#shutdown-i5-g0-y
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle