十万个为什么-Oracle(0-100)

俗话说“好记性不如烂笔头”。本文章记录的是我在日常工作中记录的oracle的相关知识,希望对大家有帮助。


1. 如何进行数据库的表分析?

答案

1.      使用sys用户登录数据库;

2.      针对单个表,运行如下指令:

execute dbms_stats.gather_table_stats(ownname => '数据库用户名', tabname =>'表名',estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,method_opt => 'FOR ALLCOLUMNS SIZE AUTO', cascade => TRUE);

 

2. 如何批量收集统计信息?

答案

刚安装的系统(如刚安装了一天),没有进行表分析,所以系统运行会比较慢。为了解决这个问题,可以手动的表分析。以HAHA表空间的表为例,步骤如下:

1.      在ad库中运行如下A语句,或者B语句

A语句select'analyze table '||table_name||' compute statistics;'from user_tables x where x.tablespace_name ='HAHA' /*后面是排除的表*/andx.table_name!='SYS_STANDARDTIME'

B语句select'execute dbms_stats.gather_table_stats(ownname => ''HAHA'',tabname =>'''||table_name||''', estimate_percent =>DBMS_STATS.AUTO_SAMPLE_SIZE,method_opt => ''FOR ALL COLUMNS SIZE AUTO'',cascade => TRUE);'from user_tables x wherex.tablespace_name ='HAHA' /*后面是排除的表*/and x.table_name!='SYS_STANDARDTIME'

2.      把执行的结果放入命令窗口运行。

备注:A语句中的方法一般都不用了,在oracle来看,已经过时并且效率不高。

 

3.如何查看表空间的大小和使用情况(百分比)?

答案:方法一:

SELECT UPPER(F.TABLESPACE_NAME) "表空间名",

      D.TOT_GROOTTE_MB "表空间大小(M)",

      D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",

      TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB *100,

                     2),

               '990.99') || '%' "使用比",

      F.TOTAL_BYTES "空闲空间(M)",

      F.MAX_BYTES "最大块(M)"

 FROM (SELECT TABLESPACE_NAME,

               ROUND(SUM(BYTES) / (1024 *1024), 2) TOTAL_BYTES,

               ROUND(MAX(BYTES) / (1024 *1024), 2) MAX_BYTES

         FROM SYS.DBA_FREE_SPACE

        GROUP BY TABLESPACE_NAME) F,

      (SELECT DD.TABLESPACE_NAME,

               ROUND(SUM(DD.BYTES) / (1024 *1024), 2) TOT_GROOTTE_MB

         FROM SYS.DBA_DATA_FILES DD

        GROUP BY DD.TABLESPACE_NAME) D

 WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME

 ORDER BY 1

备注:可以参考问题31,查看表空间文件的大小。

参考

select TableSpace,Max_G,Used_G,Percent_Used

from (

select n.tablespace_name as TableSpace,count(*) * 32 as Max_G, sum(n.USED_G) as Used_G, round(sum(n.USED_G) /(count(*) * 32), 4) *

 100as Percent_Used

from (select b.file_id, b.tablespace_name,round((b.bytes - sum(nvl(a.bytes, 0))) / (

1024 * 1024 * 1024), 2) USED_G

from dba_free_space a, dba_data_files b

where a.file_id(+) = b.file_id group byb.tablespace_name, b.file_id, b.bytes) n

group by n.tablespace_name order byPercent_Used Desc

)

参考

selectsum(blocks)*8/1024/1024from dba_tables x

where x.TABLESPACE_NAMElike'PM4H_%'escape'\'

 

4. 如何从spfile创建pfile

答案

第一步:Sqlplus ‘/ assysdba’

第二步:以下是实例

create pfile=' /opt/oracle/app/oracle/product/11.1.0/mos5200/dbs/pfile2012121901.ora' from spfile

备注

 

5. 如何从pfile启动数据库?

答案

第一步:Sqlplus ‘/ assysdba’

第二步:

startup pfile=’你的目录/pfilepm4h2011100901.ora

备注

 

6. 如何删除使用过的undo表空间?

答案

1、新建立UNDOTBS2表空间  

create undo tablespace UNDOTBS2 datafile'/opt/oracle/oradata/pm4h/undotbs02.dbf' SIZE 10M AUTOEXTEND on maxsize 1G;

2、切换回UNDOTBS2

alter system set undo_tablespace=UNDOTBS2scope=both;  

3、等待UNDO表空间UNDOTBS1 is OFFLINE;  

alter tablespace UNDOTBS1 offline;

4、删除UNDOTBS1表空间

drop tablespace UNDOTBS1 including contentsand datafiles;

到此完毕!

备注

 

7.如何新建表undo空间,并使用?

答案同上

备注

 

8.如何扩展表空间的大小?

答案

方法一:增加数据文件。

system表空间示例:

alter tablespace SYSTEM add datafile '你的数据文件目录/system02.dbf' size 500M;

普通用户表空间示例:

alter tablespace 表空间名字 add datafile '你的数据文件目录/pm4h_db102.dbf'  SIZE 5G AUTOEXTEND ON NEXT 128M MAXSIZEUNLIMITED;

方法二:扩大数据文件大小

alter database datafile '你的数据文件目录/undotbs01.dbf' resize 1000M;

备注

1.      表空间尽量让free百分比保持在10%以上,如果低于10%建议尽快增加datafile或者resizedatafile。

2.      给undo表空间添加表空间文件的语句比较特殊,是这样的:

alter tablespace UNDOTBS2 add datafile size 5G autoextend on next 1G maxsize unlimited;

 

9.如何修改oracle的参数?

答案

举例:

第0步:先备份spfile。方法见“问题7”。

第一步:alter system setaudit_trail='FALSE' scope=spfile;

第二步:重启数据库。

备注:是否需要重启数据库,看参数的类型来定。


10.如何查看Oracle的参数?

答案

举例:

show parameter undo;

show parameter session;


11.如何创建表空间

记录人:汤姆孙

日期:20111009

答案

举例:

普通的

Create tablespace 你的表空间 datafile '你的数据文件目录/pm4h_db01.dbf'  SIZE 2G AUTOEXTEND ON NEXT 128M MAXSIZEUNLIMITED;

undo

create undo tablespace UNDOTBS2 datafile '你的数据文件目录/undotbs02.dbf' size 500m reuse autoextend on next 10m maxsize 2048m;


12.Suse下,如何查看目录的大小?

答案

du -sh

备注:具体的用法,使用man du来看一下。

 

13.Suse的日志在哪里?

答案:

/var/log目录下。分message、warn、error3个等级。


14. SolarisSuse,在命令上有哪些差别?

答案

碰到的,列举如下:

1.  问题:Solaris下if语句不能用参数 –e来判断文件是否存在。

解决:可以使用参数 –f来进行替代。

2.  问题:Solaris下非root用户不能使用ping命令。

解决:给ping命令加权限,使得pm4h用户也可以使用。

3.  问题:Solaris下不能使用hours ago语句。

解决:调用timeCalucate.jar来计算补采周期。也可以根据具体问题自行解决。

4.  问题:Solaris下用ftp命令登录远程服务器 ,然后使用命令ls 只会显示一列结果(文件名或文件夹名)而不是Suse下的9列。

解决:Solaris下用ftp命令登录远程服务器,使用 命令 ls –l 来得到9列结果。

5.  问题:Solaris下不能使用sed –i命令。

解决:这个要看实现的逻辑,M2000下使用sed –i命令是为了标记满足条件的行,然后将满足条件的行写到另外一个文件中,再用sed -i取消标记。

替换的做法:用grep 命令找出满足条件的行然后写到(追加)到一个临时文件中,再将临时文件中的内容写到输出文件中即可。

另外一种做法(不考虑到逻辑,直接替换命令的),sed –i命令做了两步操作1选择满足正则表达式的行做处理2将处理后的结果写到源文件中,如果sed 没有用-i选项,那么只会完成第一步,处理后的结果它会写到输出流中,现在将输出流中的数据重定向到文件就可以实现sed –i的效果了。

6.  问题:Solaris下不能使用系统环境变量中的awk –F,系统环境变量对应的/usr/bin/awk没有-F选项。

解决:建议使用我们自己的环境变量里封装的$AWK(/usr/bin/nawk),里面有-F选项。


15.如何删除已存在的监听日志?

答案

A:关闭监听日志步骤:

1、 Oracle用户登录,进入监听器:

#lsnrctl

2、 检查监听器日志状态

LSNRCTL>show log_status

3、 如果为ON,关闭日志

LSNRCTL>set log_status off

4、 保存配置

LSNRCTL>save_config

5、 验证是否更改成功

LSNRCTL>show log_status

6、 退出

LSNRCTL>quit

     B:删除已存在的监听日志

#cd $ORACLE_BASE/diag/tnslsnr/hostname/listener/alert

#rm –rf *

#cd $ORACLE_BASE/ diag/tnslsnr/hostname/listener/trace

#echo “”>listener.log

建议所有的trace都保存有效的天数。保留太久了以后,磁盘空间会满。


16.数据库监听卡住了,怎么办?

或者:lsnrctl status 卡住不动了,怎么办?

或者:lsnrctl stop 无反应,怎么办?

答案

1.发现远程无法登陆,本地数据库可以登陆,数据库运行正常(这一点因为运维人员对命令行不熟悉,以为本地数据库也连接不上了)

2.lsnrctl status 卡住了,lsnrctl start/stop 卡住了

3.查看计算机名称,是正确的

4.在监听文件中加入 listener.ora 跟踪参数,运行lsnrctl start 卡住,但是未生成任何跟踪日志

5.增加一个新的监听listener2,启动lsnrctl start listener2,依然卡住

6.listener.ora文件,格式应该是正确的

7.运行netstat -a|grep 1521 未发现监听进程

8.ps -ef|grep tns 发现有两个进程

  oracle 13420  3287  0 04:22:51 ?         0:00 /u01/app/oracle/product/10.2.0/bin/tnslsnr LISTENER -inherit

  oracle  6541  2308  0 19:19:25 pts/1     0:00 grep tns

  oracle  3287     1  0  Oct 18  ?         5:16 /u01/app/oracle/product/10.2.0/bin/tnslsnr LISTENER -inherit

  

尝试kill -9 13420

kill -9 3287

9.lsnrctl start 启动成功

 

事后google了一下:

 

这个问题暂时定为oracle的bug,bug号 4518443
处理方法: listener.ora加入SUBSCRIBE_FOR_NODE_DOWN_EVENT_LISTENER=OFF

 

备注:http://blog.sina.com.cn/s/blog_4ea0bbed0100n8oa.html


17.Oracle RAC的相关知识?

答案

《RAC最佳实践》网址:

http://wenku.baidu.com/view/3fc0bb28647d27284b735149.html

 

18.如何查看一个表占用的空间大小。

答案

selectx.segment_name,sum(x.bytes)/1024/1024 from user_extents x group by segment_name


19.如何压缩表空间?

答案

alter table cell_tchh enable rowmovementalter table cell_tchh shrink   space;

备注:前台是该表空间是自动段空间管理(ASSM)。查看是否是自动段空间管理的方法:

select t.segment_space_management,t.* fromdba_tablespaces t ;


20.如何查看表空间文件的大小和使用情况(%)?

记录人:汤姆孙

答案:

select

b.file_name 物理文件名,

b.tablespace_name 表空间,

b.bytes/1024/1024 大小M,

(b.bytes-sum(nvl(a.bytes,0)))/1024/1024  已使用M,

substr((b.bytes-sum(nvl(a.bytes,0)))/(b.bytes)*100,1,5)  利用率

from dba_free_space a,dba_data_files b

where a.file_id=b.file_id

group byb.tablespace_name,b.file_name,b.bytes

order by b.tablespace_name

 

21.Oracle的监听日志放在哪里了?

记录人:汤姆孙

答案:

~/app/oracle/diag/tnslsnr/suse/listener/trace

用法:

cd ~/app/oracle/diag/tnslsnr/suse/listener/trace

tail -f listener.log

 

可以使用:show parameterbackg;来看到。


22.如何关闭Oralce的监听日志?

答案:

1.oracle用户登录数据库服务器

2.执行命令:lsnrctl set log_status off

3.观察listener.log文件中的内容是否变化,如果没有变化,则表明关闭成功

listener.log的路径,可以使用find .name listener”查找

 

23.如何设置linux系统的IP地址

答案:

1、  用root用户登录系统

2、  运行命令 yast2



24.服务器中重新考一个虚拟机并设置好IP之后,oracle的监听启动不起来

记录人:朱洪明

答案:

1、  oracle的监听文件tnsnames.ora中的IP要修改为新的IP;

2、  切换root用户,修改文件/etc/hosts 把旧的虚拟机的IP删除,新的IP地址最后一定要加上主机的名称,格式如下:10.18.11.81    linux-156y.site linux-156y


25.如何修改oracle实例的processes/session数目?

答案:

第一步:sqlplus ‘/ as sysdba’

第二步:备份spfile

createpfile='/opt/oracle/app/oracle/product/11.1.0/mos5200/dbs/pfilepm4h2011100901.ora'from spfile

把其中的/opt/oracle/app/oracle/product/11.1.0/mos5200/dbs改为你自己的路径。

第三步:

alter system set processes=1000 scope =spfile;

第四步:

shutdown immediate;

第五步:

startup

第六步:确认一下是否修改成功

show parameter processes;


26.Spfile安装时的pfile在哪个目录下?

答案:

1)  spfile:show parameter spfile;

2)  pfile:使用如下命令搜索即可得到:find .-type d -name "*pfile*"。结果:

~/app/oracle/admin/ABC/pfile/init.ora.8152011165649


27.Oracelalert.log日志在哪里?

答案:在参数background_dump_dest指定的路径下。使用showparameter background_dump_dest;即可得到。


28.Oracle的统计信息收集相关的表有哪些?

答案

l  dba_tab_statistics

l  dba_autotask_operation

l  dba_scheduler_job_run_details

l  DBA_AUTOTASK_CLIENT_JOB

l  dba_autotask_client_history

l  dba_scheduler_jobs

 

SELECT JOB_NAME,AUTO_DROP,RESTARTABLE,STATE,program_name,schedule_name,LAST_START_DATE ,NEXT_RUN_DATE  from dba_scheduler_jobs x
where x.program_name='BSLN_MAINTAIN_STATS_PROG' ;

select * from dba_autotask_operation;
select * from dba_tab_statistics ts where ts.owner like 'PM4H_%' and ts.table_name like 'INDICATOR%' /*andnum_rows>1000000*/
 order by ts.last_analyzed desc
select * from dba_scheduler_job_run_details wherejob_name='BSLN_MAINTAIN_STATS_JOB';
select client_name, JOB_SCHEDULER_STATUS from DBA_AUTOTASK_CLIENT_JOB whereclient_name='auto optimizer stats collection';
SELECT client_name, window_name, jobs_created, jobs_started, jobs_completedFROM dba_autotask_client_history WHERE client_name like '%stats%';

 

29.如何进行标准时间到yyyy-mm-dd hh24:mi:ss格式的时间的转换?

记录人:汤姆孙

答案

         1)把yyyy-mm-dd hh24:mi:ss格式的时间转化为从标准时间开始经历的毫秒数

          select (to_date('2010-12-2518:10:15','yyyy-mm-dd hh24:mi:ss') - to_date('1970-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss')) * 86400000 from dual;

         2) 把从标准时间开始经历的毫秒数转化为yyyy-mm-dd hh24:mi:ss格式的时间

          select to_date('1970-01-0100:00:00','yyyy-mm-dd hh24:mi:ss') + 1293190805036 / 86400000 from dual;


30.如何查看oracleawr报告多长时间收集一次?并修改?

答案

查看:select * fromdba_hist_wr_control;

修改:

exec dbms_workload_repository.modify_snapshot_settings(interval=>60, retention=>7*24*60);

 

31.如何查看被哪些SYSAUX表空间对象占据?

答案:select * from v$sysaux_occupants;


32.如何收集AWR报告?

答案

@$ORACLE_HOME/rdbms/admin/awrrpt.sql;


33.Oracle如何使用SQL turning

记录人:汤姆孙

答案:SQL> @?/rdbms/admin/sqltrpt


34.如何使用TKPROF转换trace文件?

记录人:汤姆孙

答案

在CMD中执行:

tkprof vmos52001_ora_22401_i84333.trcvmos52001_ora_22401_i84333.trc.txt

说明

TKPROF的使用

tkprof
的目的是将sqltrace生成的跟踪文件转换成用户可以理解的格式
格式
tkprof inputfile outputfile [optional | parameters ]
参数和选项:
explain=user/password
执行explain命令将结果放在SQLtrace的输出文件中
table=schema.table
指定tkprof处理sqltrace文件时临时表的模式名和表名
insert=scriptfile
创建一个文件名为scriptfile的文件,包含了tkprof存放的输出sql语句
sys=[yes/no]
确定系统是否列出由sys用户产生或重调的sql语句
print=number
将仅生成排序后的第一条sql语句的输出结果
record=recordfile
这个选项创建一个名为recorderfile的文件,包含了所有重调用的sql语句
sort=sort_option
按照指定的方法对sqltrace的输出文件进行降序排序
sort_option
选项
prscnt
按解析次数排序
prscpu
按解析所花cpu时间排序
prsela
按解析所经历的时间排序
prsdsk
按解析时物理的读操作的次数排序
prsqry
按解析时以一致模式读取数据块的次数排序
prscu
按解析时以当前读取数据块的次数进行排序
execnt
按执行次数排序
execpu
按执行时花的cpu时间排序
exeela
按执行所经历的时间排序
exedsk
按执行时物理读操作的次数排序
exeqry
按执行时以一致模式读取数据块的次数排序
execu
按执行时以当前模式读取数据块的次数排序
exerow
按执行时处理的记录的次数进行排序
exemis
按执行时库缓冲区的错误排序
fchcnt
按返回数据的次数进行排序
fchcpu
按返回数据cpu所花时间排序
fchela
按返回数据所经历的时间排序
fchdsk
按返回数据时的物理读操作的次数排序
fchqry
按返回数据时一致模式读取数据块的次数排序
fchcu
按返回数据时当前模式读取数据块的次数排序
fchrow
按返回数据时处理的数据数量排序

步骤

1、登陆sqlplus /nolog,然后conn /as sysdba;

2show parameter sql_trace;查看sql_trace参数是否为true(检查是否有人打开过)

3、如果sql_trace=false,则执行alter session set sql_trace=true;打开sql trace设置

4、然后执行相应的有问题的SQL语句

5show parameter user_dump_dest;查看新生成的trace文件位置

6alter session set sql_trace=false;然后关闭sql trace设置,如果不关闭的话,会对oracle性能有响应,具体多大影响我没有研究过,想想就知道啦。

7exit;退出sqlplus

6cd新生成的trace文件位置,找到这个trc文件,但是这个trc文件中有很多二进制的东西,我们根本看不懂,除非天才测试人员。所以我使用tkprof工具编译这个新生成的trc文件

结果示例

SQLID : 0zzk39z279q41
SELECT version
FROM
product_component_version WHERE product LIKE 'Oracle%'


call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 1 0.00 0.00 0 0 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 3 0.00 0.00 0 0 0 1

Missesin library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 69

RowsRow Source Operation
------- ---------------------------------------------------
1 VIEW PRODUCT_COMPONENT_VERSION (cr=0 pr=0 pw=0 time=0 us cost=2 size=168card=2)
1 SORT UNIQUE (cr=0 pr=0 pw=0 time=0 us cost=2 size=110 card=2)
1 UNION-ALL (cr=0 pr=0 pw=0 time=0 us)
0 FIXED TABLE FULL X$VERSION (cr=0 pr=0 pw=0 time=0 us cost=0 size=55 card=1)
1 FIXED TABLE FULL X$VERSION (cr=0 pr=0 pw=0 time=0 us cost=0 size=55 card=1)

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

 

35.SQL ordered by Version Count具体的含义是什么?

记录人:汤姆孙:

答案

记录了SQL的打开子游标的TOP SQL。

在硬解析的过程中,进程会一直持有librarycach latch,直到硬解析结束。硬解析结束以后,会为该SQL产生两个游标,一个是父游标,另一个是子游标。父游标里主要包含两种信息:SQL文本以及优化目标(optimizer goal)。父游标在第一次打开时被锁定,直到其他所有的session都关闭该游标后才被解锁。当父游标被锁定的时候是不能被交换出library cache的,只有在解锁以后才能被交换出librarycache,这时该父游标对应的所有子游标也被交换出librarycache。子游标包括游标所有的信息,比如具体的执行计划、绑定变量等。子游标随时可以被交换出library cache,当子游标被交换出librarycache时,oracle可以利用父游标的信息重新构建出一个子游标来,这个过程叫reload。可以使用下面的方式来确定reload的比率:

SELECT 100*sum(reloads)/sum(pins)Reload_Ratio FROM v$librarycache;

一个父游标可以对应多个子游标。子游标具体的个数可以从v$sqlarea的version_count字段体现出来。而每个具体的子游标则全都在v$sql里体现。当具体的绑定变量的值与上次的绑定变量的值有较大差异(比如上次执行的绑定变量的值的长度是6位,而这次执行的绑定变量的值的长度是200位)时或者当SQL语句完全相同,但是所引用的对象属于不同的schema时,都会创建一个新的子游标


36.如何修改PM的分区表模式和非分区表模式?

记录人:汤姆孙

答案

修改文件/opt/netwatcher/pm4h2/app/conf/sysprofile.pmp的PARTITION变量。

37.使用FTP命令,如何批量下载文件?

记录人:汤姆孙

答案:使用mget命令。如:mget *1435*,可以得到1275071435这个counterset的所有文件。

38.如何收缩表空间?

记录人:汤姆孙

答案

使用下列命令收缩表的空间

alter table 表名 enable row movement;

alter table 表名 shrink space;

 

39.如何使用awk批量修改文件名?

记录人:汤姆孙

答案

mv示例:

ls *.os|awk -F . '{print "mv"$0" "$1"."$2"."$3}'

替换示例:

ls|while read line; do mv $line `echo$line|sed -i 's/20120202/20120203/g'`; done

 

40.如何使用sed修改文件中的内容?

记录人:汤姆孙

答案

ls|while read line; do `sed's/20120202/20120203/g' $line > $line.ok`; done

41.如何查看oracletemp表空间文件在哪里?

记录人:汤姆孙

答案

select TABLESPACE_NAME,FILE_NAME fromdba_temp_files;
or
select * from v$tempfile;

42.如何为oracle添加新的redo日志?

记录人:汤姆孙

答案

select * from v$logfile;
select * from v$log;

alter database add logfile thread 1 group 4'/oradata/mos5200/redo_1_4_01.log'  size2048m;

具体要添加几组,看情况而定。

删除前要多次在所有节点上手动切换日志altersystem switch logfile;

注,切换日志会将日志从current,变为active; 注意每个节点对应一个线程,所以要再所有节点上切换。

系统检查点 alter systemcheckpoint;

注,checkpoint会降active且不为current的变为inactive;

在通过select * from v$log确定原日志组已经inactive以后,

删除,alter database drop logfilegroup 2;

 

43.如何把表改为nologing模式?

记录人:汤姆孙

答案:alter table table_name nologging;

注意:非归档模式下nologging没有作用。

44.新上线的oracle系统,要做哪些操作,使系统优化运行?

答案

第一步:关闭审计

alter system set audit_trail=nonescope=both;

然后删除签权数据,oracle用户登录到数据库服务器:
sqlplus / as sysdba
truncate table SYS.AUD$;

第二步:增加redo日志组;

第三步:对ad库的所有表和DB库重要的表进行表分析;

第四步:增加temp表空间文件;

 

45.如何通过一个sql语句查看具体sql的执行计划?

提问人:

记录人:黄践焜

答案:

 

46.Linux的系统日志在哪里?

记录人:汤姆孙

答案:

Linux的系统日志放在/var/log目录下,对于出错或警告信息存放在/var/log/warn文档中,

其他的信息主要保存在/var/log/messages文档中。这些日志文档通过syslog守护进程进行管理。内核的messagebuffer能够用命令dmesg查看。

 

47.如何移动数据文件?

记录人:汤姆孙

答案:

1.       停止数据库;

Shutdown immediate

2.       移动数据文件;

mv old_place/XXX.dbf new_place/XXX.dbf

3.      Mount数据库;

Startup mount

4.      Rename数据文件;

alter database rename file 'old_place/XXX.dbf'to 'new_place/XXX.dbf';

5.       Open数据库;

Alter database open

 

48.如何根据SQL ID查询SQL全文?

记录人:汤姆孙

答案:

select * from v$sql where sql_id ='f02dtyphhh234';

 

49.如何查找耗时最长的sql

答案:

RAC的:

selectsid,gv$sqlarea.sql_id,gv$session.username用户名,last_call_et持续时间,status状态,LOCKWAIT等待锁,machine用户电脑名

,logon_time 开始登入时间,sql_text

fromgv$session ,gv$process ,gv$sqlarea

   where paddr=addrand sql_hash_value=hash_value 

  and status='ACTIVE'and gv$session.username isnotnull

   orderby last_call_etdesc ;

 

单机的:

selectsid,v$sqlarea.sql_id,v$session.username用户名,last_call_et持续时间,status状态,LOCKWAIT等待锁,machine用户电脑名

,logon_time 开始登入时间,sql_text

fromv$session ,v$process ,v$sqlarea

   where paddr=addrand sql_hash_value=hash_value 

  and status='ACTIVE'and v$session.username isnotnull

   orderby last_call_etdesc ;

 

双机包含等待事件的:

selecta.SID,c.sql_id, a.username用户名,last_call_et持续时间,status状态,

LOCKWAIT 等待锁,machine用户电脑名

,logon_time 开始登入时间,sql_text , d.event

fromgv$session a,gv$process b,gv$sqlarea c,gv$session_wait d

   where paddr=addrand sql_hash_value=hash_value 

  and status='ACTIVE'and a.username isnotnull

  and a.sid=d.sid

   orderby last_call_etdesc ;

 

50.如何查询oracle进程或者SQL拥塞在什么地方?

答案

第一步:

select t1.sid , t3.sql_text from v$sessiont1 , v$process t2 , v$sql t3 where t1.paddr = t2.ADDR and t1.sql_id =t3.sql_id(+) and t2.spid = 19320;

第二步:

select * from v$session_wait where sid =916;

 

一般和问题48,问题49,一块使用。

51.如何检查Oracle统计信息是否陈旧?

答案

select * from dba_tab_statistics order bylast_analyzed desc;

从结果集中重点查看工单业务表对应的last_analyzed时间和stale_stats状态。last_analyzed字段表示Oracle最后一次对该表的统计时间,stale_stats表示该表的统计信息是否陈旧。

 

52.如何在线重建rebuild索引?

答案:alter index 索引名 rebuildonline;

 

53.如何循环查看一个目录下(以load目录为例)有多少个文件?不包含bados文件?

记录人:汤姆孙

答案

ls|grep "SIEMEN*"|while readlien1

do

cd /netwatcer/spool/$lien1

ls /netwatcer/spool/$lien1|while read line

do

echo"/netwatcer/spool/$lien1/$line"

cd /netwatcer/spool/$lien1/$line/load/

ls|grep -v "*os"|grep -v"*bad"|wc -l

done

done

54.如何在后台运行sql语句?

答案:

第一步:创建文件,写入sql。

第二步:执行该sql文件:

nohup cat gather_temp | sqlplus '/assysdba' > gather_emp.log &

其中,gather_temp是文件。

 

55.imp命令导入dmp文件以后,表空间非常大,怎么处理?

答案

第一步:truncate tabletable_name;

第二步:表分析;

ANALYZE TABLE table_name COMPUTE STATISTICS;

第三步:让该表move一下;

alter table table_name move;

第四步:对该表的所有索引都重建索引

alter index table_name_1_IDX1 rebuildonline;;

 

56.如何一次查询从某一天开始到某一天结束的所有日期?如果是一个月的呢?

答案:

SQL1

SELECT startday, starttime, startday ||starttime

 FROM (SELECT to_char(to_date('20110301', 'yyyymmdd') + ROWNUM - 1,

                       'yyyymmdd') as startday

         FROM DUAL

       CONNECT BY ROWNUM <= 12),

      (SELECT 0 + ROWNUM - 1 || '0000' as starttime

         FROM DUAL

       CONNECT BY ROWNUM <= 24);

SQL2

 SELECT to_number(to_char(to_date('201102', 'yyyymm') + ROWNUM - 1,

                           'yyyymmdd')) asstartday

   FROM DUAL

 CONNECT BY ROWNUM <=

            TO_NUMBER(TO_CHAR(LAST_DAY(to_date('201102', 'yyyymm')), 'dd'))

57.如何杀死死锁?

记录人:汤姆孙

答案:

select * from v$lock where typein('TM','TX','UL');

select * from v$session where sid=17;

alter system kill session '17,36383'

ORA-00031:session marked for kill,说明已经是被kill一次过的了,session的status为killed

再查操作系统对应的SPID

select spid from v$process p,v$session swhere s.paddr=p.addr and sid=17;

select p.INST_ID,spidfrom gv$processp,gv$session swheres.paddr=p.addrandsid=174

查到是17297

$ kill -9 17297

 

参考:

select b.SESSION_ID,

      b.ORACLE_USERNAME,

      b.OS_USER_NAME,

      b.PROCESS,

      b.LOCKED_MODE,

      a.owner,

      a.object_name,

      a.object_id,

      a.object_type,

      b.XIDUSN,

      b.XIDSLOT,

      b.XIDSQN

 from all_objects a, v$locked_object b

 where a.object_id = b.object_id

58.oraclelog相关的字典表;

记录人:汤姆孙

答案:

select *from v$logfile ;

select *from v$log;

59.find命令的用法?

记录人:汤姆孙

答案:

首先是find的语法:

find [起始目录] 寻找条件 操作

还有种表述方式:find PATH OPTION[-exec COMMAND { } \;]

因为find命令会根据我们给的option,也就是寻找条件从我们给出的目录开始对其中文件及其下子目录中的文件进行递归搜索,所以我觉的这个地方说是“起始目录”是非常好的。

该命令中的寻找条件可以是一个用逻辑运算符 not、and、or 组成的复合条件。逻辑运算符 and、or、not 的含义为:

(1) and:逻辑与,在命令中用“-a”表示,是系统缺省的选项,表示只有当所给的条 件都满足时,寻找条件才算满足。例如:

find –name ’tmp’ –xtype c -user ’inin’

% 该命令寻找三个给定条件都满足的所有文件

(2) or:逻辑或,在命令中用“-o”表示。该运算符表示只要所给的条件中有一个满足 时,寻找条件就算满足。例如:

find –name ’tmp’ –o –name ’mina*’

% 该命令查询文件名为’tmp’或是匹配’mina*’的所有文件。

(3) not:逻辑非,在命令中用“!”表示。该运算符表示查找不满足所给条件的文件 。例如:

find ! –name ’tmp’

% 该命令查询文件名不是’tmp’的所有文件。

需要说明的是:当使用很多的逻辑选项时,可以用括号把这些选项括起来。为了避免Shell本身对括号引起误解,在话号前需要加转义字符“\”来去除括号的意义。例:

find \(–name ’tmp’ –xtype c -user ’inin’ \)

我觉的现在我应该说下出了查询条件,在find中的option的内容了:

在option中,具体有参数:

-name ’字串’ 查找文件名匹配所给字串的所有文件,字串内可用通配符 *、?、[ ]。

-lname ’字串’ 查找文件名匹配所给字串的所有符号链接文件,字串内可用通配符 *、?、[ ]。

-gid n 查找属于ID号为 n 的用户组的所有文件。

-uid n 查找属于ID号为 n 的用户的所有文件。

-group ’字串’ 查找属于用户组名为所给字串的所有的文件。

-user ’字串’ 查找属于用户名为所给字串的所有的文件。

-empty 查找大小为 0的目录或文件。

-path ’字串’ 查找路径名匹配所给字串的所有文件,字串内可用通配符*、?、[ ]。

-perm 权限 查找具有指定权限的文件和目录,权限的表示可以如711,644。

-size n[bckw] 查找指定文件大小的文件,n 后面的字符表示单位,缺省为 b,代表512字节的块。

-type x 查找类型为 x 的文件,x 为下列字符之一:

b 块设备文件

c 字符设备文件

d 目录文件

p 命名管道(FIFO)

f 普通文件

l 符号链接文件(symbolic links)

s socket文件

-xtype x 与 -type 基本相同,但只查找符号链接文件。

以时间为条件查找

-amin n 查找n分钟以前被访问过的所有文件。

-atime n 查找n天以前被访问过的所有文件。

-cmin n 查找n分钟以前文件状态被修改过的所有文件。

-ctime n 查找n天以前文件状态被修改过的所有文件。

-mmin n 查找n分钟以前文件内容被修改过的所有文件。

-mtime n 查找n天以前文件内容被修改过的所有文件。

-print:将搜索结果输出到标准输出。

例子:在root以及子目录查找不包括目录/root/bin的,greek用户的,文件类型为普通文件的,3天之前的名为test-find.c的文件,并将结构输出,find命令如下:

find / -name "test-find.c" -typef -mtime +3 -user greek -prune /root/bin -print

当然在这其中,-print是一个默认选项,我们不必刻意去配置它。

我们再看一下exec选项:

-exec:对搜索的结构指令指定的shell命令。注意格式要正确:"-exec 命令 {} \;"

在}和\之间一定要有空格才行;

{}表示命令的参数即为所找到的文件;命令的末尾必须以“ \;”结束。

例子:对上述例子搜索出来的文件进行删除操作,命令如下:

find/ -name "test-find.c" -type f -mtime +3 -user greek -prune /root/bin-exec rm {} \;

find命令指令实例:

find . - name ‘main*’ - exec more {} \;

% 查找当前目录中所有以main开头的文件,并显示这些文件的内容。

find . \(- name a.out - o - name‘*.o’\)> - atime +7 - exec rm {} \;

% 删除当前目录下所有一周之内没有被访问过的a .out或*.o文件。

% 命令中的“.”表示当前目录,此时 find 将从当前目录开始,逐个在其子目录中查找满足后面指定条件的文件。

% “\(” 和 “\)” 表示括号(),其中的“\” 称为转义符。之所以这样写是由于对 Shell 而言,(和)另有不同的含义,而不是这里的用于组合条件的用途。

% “-name a.out” 是指要查找名为a.out的文件;

% “-name ‘*.o’”是指要查找所有名字以 .o 结尾的文件。

这两个 -name 之间的 -o 表示逻辑或(or),即查找名字为a.out或名字以 .o结尾的文件。

% find命令在当前目录及其子目录下找到这佯的文件之后,再进行判断,看其最后访问时间是否在7天以前(条件 -atime +7),若是,则对该文件执行命令 rm(-exec rm {} \;)。

其中 {} 代表当前查到的符合条件的文件名,\;则是语法所要求的。

% 上述命令中第一行的最后一个 \ 是续行符。当命令太长而在一行写不下时,可输入一个\,之后系统将显示一个 >,指示用户继续输入命令。

举例:

find$CHECKHOME/logs -type f -mtime +31 -exec rm -f {} \;

 

60.Shell date函数得到日期

答案:

date +"%Y%m%d" -d  "+ndays"         今天的后n天日期 

date +"%Y%m%d" -d  "-ndays"          今天的前n天日期

61.Shell中的比较运算符?

答案:

整数比较

-eq      等于,如:if [ "$a" -eq "$b" ]

-ne      不等于,如:if [ "$a" -ne "$b" ]

-gt      大于,如:if [ "$a" -gt "$b" ]

-ge      大于等于,如:if [ "$a" -ge "$b" ]

-lt      小于,如:if [ "$a" -lt "$b" ]

-le      小于等于,如:if [ "$a" -le "$b" ]

<      小于(需要双括号),如:(("$a" <"$b"))

<=      小于等于(需要双括号),如:(("$a" <="$b"))

>      大于(需要双括号),如:(("$a" >"$b"))

>=      大于等于(需要双括号),如:(("$a" >="$b"))

字符串比较

=      等于,如:if [ "$a" = "$b" ]

==      等于,如:if [ "$a" == "$b" ],与=等价

      注意:==的功能在[[]]和[]中的行为是不同的,如下:

      1 [[ $a == z* ]]    # 如果$a以"z"开头(模式匹配)那么将为true

      2 [[ $a == "z*" ]] # 如果$a等于z*(字符匹配),那么结果为true

      3

      4 [ $a == z* ]      # Fileglobbing 和word splitting将会发生

      5 [ "$a" == "z*" ] # 如果$a等于z*(字符匹配),那么结果为true

      一点解释,关于File globbing是一种关于文件的速记法,比如"*.c"就是,再如~也是.

      但是file globbing并不是严格的正则表达式,虽然绝大多数情况下结构比较像.

!=      不等于,如:if [ "$a" != "$b" ]

      这个操作符将在[[]]结构中使用模式匹配.

<      小于,在ASCII字母顺序下.如:

      if [[ "$a" < "$b" ]]

      if [ "$a" \< "$b" ]

      注意:在[]结构中"<"需要被转义.

>      大于,在ASCII字母顺序下.如:

      if [[ "$a" > "$b" ]]

      if [ "$a" \> "$b" ]

      注意:在[]结构中">"需要被转义.

      具体参考Example 26-11来查看这个操作符应用的例子.

-z      字符串为"null".就是长度为0.

-n      字符串不为"null"

      注意:

      使用-n在[]结构中测试必须要用""把变量引起来.使用一个未被""的字符串来使用! -z

      或者就是未用""引用的字符串本身,放到[]结构中。虽然一般情况下可

      以工作,但这是不安全的.习惯于使用""来测试字符串是一种好习惯.

62.如何在一个RAC节点上一次性查看所有RAC节点的时间?

答案:

date;ssh mos5200db2 date;ssh mos5200db2date;

其中mos5200db2,mos5200db3是另外两个节点的hostname,可以用hostname命令得到。

63.oracleset指令有哪些?

答案:

SQL>set colsep' '; //-域输出分隔符
SQL>set echo off; //显示start启动的脚本中的每个sql命令,缺省为on
SQL> set echo on //设置运行命令是是否显示语句
SQL> set feedback on; //设置显示“已选择XX行”
SQL>set feedback off; //回显本次sql命令处理的记录条数,缺省为on
SQL>set heading off; //输出域标题,缺省为on
SQL>set pagesize 0; //输出每页行数,缺省为24,为了避免分页,可设定为0。
SQL>set linesize 80; //输出一行字符个数,缺省为80
SQL>set numwidth 12; //输出number类型域长度,缺省为10
SQL>set termout off; //显示脚本中的命令的执行结果,缺省为on
SQL>set trimout on; //去除标准输出每行的拖尾空格,缺省为off
SQL>set trimspool on; //去除重定向(spool)输出每行的拖尾空格,缺省为off
SQL>set serveroutput on; //设置允许显示输出类似dbms_output
SQL> set timing on; //设置显示“已用时间:XXXX”
SQL> set autotrace on-; //设置允许对执行的sql进行分析
set verify off //可以关闭和打开提示确认信息old 1和new 1的显示.

举例:

#!/bin/sh

sqlplus pm4h_ad/pm4h_ad <<EOF

set feedback off

set linesize 3000

set pagesize 0

set trimspool on

set heading off

set colsep ''

set echo off

spool '/home/oracle/sunyt/execsql.sql'

select * from dual;

quit

EOF

 

sed -i 's/ *$//g'/home/oracle/sunyt/execsql.sql

sed -i 's/^SQL> //g'/home/oracle/sunyt/execsql.sql

sed -i 's/^select.*//g'/home/oracle/sunyt/execsql.sql

sed -i 's/;/;\n\r/g'/home/oracle/sunyt/execsql.sql

 

exit 0

64.如何查看磁阵的使用情况?

答案:

select * from v$asm_disk;

65.如何根据pid找到sidseral,并杀掉该sql操作?使用top命令。

答案:

--查询“通过top命令找到的占用资源多的oracle的pid”,找出oracle占用资源多的操作

 select t1.sid,t1.serial#,t3.sql_text

 from v$session t1, v$process t2, v$sql t3

 where t1.paddr = t2.ADDR

  and t1.sql_id = t3.sql_id(+)

  and t2.spid = 3443; --top 查看到的oracle的pid

 

--kill掉占用资源多的oracle操作

 alter system kill session '222,44663'  --sid,seral#

 

66.如何按SQLID查询执行计划?

答案:

select * fromtable(dbms_xplan.display_awr(sql_id=>'f02dtyphhh234',format=>'ALL'));

select * from table(dbms_xplan.display_cursor(sql_id=>'g07vt88puwczt',format=>'ALL'));

67.如何move表,并重建索引,并进行表分析?

答案:以MO_MOENTITY表为例:

alter table MO_moentity move;

alter index MO_MOENTITY_IDX1rebuild;如果在线重建,需要加onlin关键字。

alter index MO_MOENTITY_IDX2 rebuild;

alter index MO_MOENTITY_IDX3 rebuild;

executedbms_stats.gather_table_stats(ownname => 'PM4H_AD', tabname=>'MO_MOENTITY', estimate_percent =>DBMS_STATS.AUTO_SAMPLE_SIZE,method_opt => 'FOR ALL COLUMNS SIZE AUTO',cascade => TRUE);

68.如何找到线程,并杀死线程?

记录人:汤姆孙

答案:

if [ `ps -ef|grep -i bh_execution.jar|grep-v grep|awk '{print $2}'` -eq 0 ];then

ps -ef|grep -i bh_execution.jar|grep -v grep|awk '{print $2}'|awk'{print "kill -9 "$1}'|sh

fi

69.如何查看一个表是否有行迁移?

答案:

链化分析:

@?/rdbms/admin/utlchain.sql

ANALYZE TABLE pm4h_hw.mo_moentityrelationLIST CHAINED ROWS INTO chained_rows;

SELECT table_name, count(*) fromchained_rows GROUP BY table_name;

如果结果是:no rows selected,说明没有行迁移。

70.如何把一个表cache到内存中?

记录人:汤姆孙

答案:

alter table PM4H_AD.ALY_MONITORINDICATORstorage (buffer_pool keep);

Alter table PM4H_AD.ALY_MONITORINDICATORCACHE;

ANALYZE tablePM4H_AD.ALY_MONITORINDICATOR  ESTIMATESTATISTICS;

 

如何nocache出来呢?

alter table aly_task nocache

 

大约有这么一些表:

alter table PM4H_AD.CM_EMS storage(buffer_pool keep);

alter table PM4H_AD.CM_EMS CACHE;

ANALYZE table PM4H_AD.CM_EMS  ESTIMATE STATISTICS;

alter table PM4H_AD.CM_EMSVERSION storage(buffer_pool keep);

alter table PM4H_AD.CM_EMSVERSION CACHE;

ANALYZE table PM4H_AD.CM_EMSVERSION  ESTIMATE STATISTICS;

alter table PM4H_AD.CM_EQUIPMENT storage(buffer_pool keep);

alter table PM4H_AD.CM_EQUIPMENT CACHE;

ANALYZE table PM4H_AD.CM_EQUIPMENT  ESTIMATE STATISTICS;

alter table PM4H_AD.CM_EQUIPMENTEMSRELATIONstorage (buffer_pool keep);

alter table PM4H_AD.CM_EQUIPMENTEMSRELATIONCACHE;

ANALYZE table PM4H_AD.CM_EQUIPMENTEMSRELATION  ESTIMATE STATISTICS;

alter table PM4H_AD.CM_VENDOR storage(buffer_pool keep);

alter table PM4H_AD.CM_VENDOR CACHE;

ANALYZE table PM4H_AD.CM_VENDOR  ESTIMATE STATISTICS;

alter table PM4H_AD.MDL_BH storage(buffer_pool keep);

alter table PM4H_AD.MDL_BH CACHE;

ANALYZE table PM4H_AD.MDL_BH  ESTIMATE STATISTICS;

alter table PM4H_AD.MDL_DOMAIN storage(buffer_pool keep);

alter table PM4H_AD.MDL_DOMAIN CACHE;

ANALYZE table PM4H_AD.MDL_DOMAIN  ESTIMATE STATISTICS;

alter table PM4H_AD.MDL_INDICATOR storage(buffer_pool keep);

alter table PM4H_AD.MDL_INDICATOR CACHE;

ANALYZE table PM4H_AD.MDL_INDICATOR  ESTIMATE STATISTICS;

alter table PM4H_AD.MDL_INDICATORMAPPINGstorage (buffer_pool keep);

alter table PM4H_AD.MDL_INDICATORMAPPINGCACHE;

ANALYZE tablePM4H_AD.MDL_INDICATORMAPPING  ESTIMATESTATISTICS;

alter table PM4H_AD.MDL_INDICATORSETstorage (buffer_pool keep);

alter table PM4H_AD.MDL_INDICATORSET CACHE;

ANALYZE table PM4H_AD.MDL_INDICATORSET  ESTIMATE STATISTICS;

alter table PM4H_AD.MDL_MOTYPE storage(buffer_pool keep);

alter table PM4H_AD.MDL_MOTYPE CACHE;

ANALYZE table PM4H_AD.MDL_MOTYPE  ESTIMATE STATISTICS;

alter table PM4H_AD.MDL_MOTYPEATTRIBUTEstorage (buffer_pool keep);

alter table PM4H_AD.MDL_MOTYPEATTRIBUTECACHE;

ANALYZE tablePM4H_AD.MDL_MOTYPEATTRIBUTE  ESTIMATESTATISTICS;

alter table PM4H_AD.MDL_MOTYPEMAPPINGstorage (buffer_pool keep);

alter table PM4H_AD.MDL_MOTYPEMAPPINGCACHE;

ANALYZE tablePM4H_AD.MDL_MOTYPEMAPPING  ESTIMATESTATISTICS;

alter table PM4H_AD.MDL_MOTYPERELATIONstorage (buffer_pool keep);

alter table PM4H_AD.MDL_MOTYPERELATIONCACHE;

ANALYZE tablePM4H_AD.MDL_MOTYPERELATION  ESTIMATESTATISTICS;

alter table PM4H_AD.MDL_MOTYPERELATIONFINstorage (buffer_pool keep);

alter table PM4H_AD.MDL_MOTYPERELATIONFINCACHE;

ANALYZE tablePM4H_AD.MDL_MOTYPERELATIONFIN  ESTIMATESTATISTICS;

alter table PM4H_AD.MDL_SUMMARYTASK storage(buffer_pool keep);

alter table PM4H_AD.MDL_SUMMARYTASK CACHE;

ANALYZE table PM4H_AD.MDL_SUMMARYTASK  ESTIMATE STATISTICS;

alter table PM4H_AD.MO_MOENTITY storage(buffer_pool keep);

alter table PM4H_AD.MO_MOENTITY CACHE;

ANALYZE table PM4H_AD.MO_MOENTITY  ESTIMATE STATISTICS;

alter table PM4H_AD.MO_MOENTITYRELATIONstorage (buffer_pool keep);

alter table PM4H_AD.MO_MOENTITYRELATIONCACHE;

ANALYZE tablePM4H_AD.MO_MOENTITYRELATION  ESTIMATESTATISTICS;

alter table PM4H_AD.SUM_TIMEWINDOW storage(buffer_pool keep);

alter table PM4H_AD.SUM_TIMEWINDOW CACHE;

ANALYZE table PM4H_AD.SUM_TIMEWINDOW  ESTIMATE STATISTICS;

alter table PM4H_AD.SYS_BHSTORE storage(buffer_pool keep);

alter table PM4H_AD.SYS_BHSTORE CACHE;

ANALYZE table PM4H_AD.SYS_BHSTORE  ESTIMATE STATISTICS;

alter table PM4H_AD.SYS_INDICATORSTOREstorage (buffer_pool keep);

alter table PM4H_AD.SYS_INDICATORSTORECACHE;

ANALYZE tablePM4H_AD.SYS_INDICATORSTORE  ESTIMATESTATISTICS;

alter table PM4H_AD.SYS_INDICATORTABLEstorage (buffer_pool keep);

alter table PM4H_AD.SYS_INDICATORTABLECACHE;

ANALYZE tablePM4H_AD.SYS_INDICATORTABLE  ESTIMATESTATISTICS;

 

71.如何只看统计信息,不看sql的执行结果?

答案:

set autotrace traceonly

 

72.如何查看suse服务器的路由情况?

答案:

route -e

netstat-in 查看接口卡的信息
netstat -rn 查看路由信息

73.如何看oracle是否启停?

答案:

使用root登陆RAC1,运行:

cd /opt/oracle/crs/bin

./crs_stat -t

74.如何启停CRS

答案:

用root登陆:

db2:/etc/init.d # ./init.crs stop

db2:/etc/init.d # ./init.crs start

 

75.如何使用ASM

答案:

oracle@db1:~> export ORACLE_SID=+ASM1

oracle@db1:~>

oracle@db1:~> asmcmd

ASMCMD>

ASMCMD> ls

ASMREDO1/

DG_ORA/

ASMCMD> cd DG_ORA        

ASMCMD> ls

MOS5200/

MOS52C03/

ASMCMD> cd MOS5200

ASMCMD> ls

ARCHIVELOG/

ARCH_LOG/

CONTROLFILE/

DATAFILE/

RMAN_BAK/

TEMPFILE/

ASMCMD> cd ARCH_LOG

ASMCMD> ls

ASMCMD> rm *dbf

76.如何查找RMAN的相关进程?

答案:

SELECT sid, spid, client_info,p.*,s.*

 FROM gv$process p, gv$session s

 WHERE p.addr = s.paddr

  /*and spid='31642' */

  AND lower(client_info) LIKE '%rman%';

77.如何让ORACLE变为force nologing?

答案:

alter database no force logging

alter database force logging

78.如何用touch命令修改文件的时间?

答案:

touch -t 1205010912 sysclean.log.2012-09-16

或者

touch -t 201205010912 sysclean.log.2012-09-16

 

或者:

华为XML:

ls|while read line; do mv $line ../load;done

 

华为XML:

ls|awk -F[#\.+] '{print "touch -tA"$2$3" "$0}' > haha.txt

sed -i 's/AA//g' haha.txt

cat haha.txt|while read line; do `$line`;done

 

西门子:

ls|awk -F[#\.+] '{print "touch -t C"$2$3""$0}' > haha.txt

sed -i 's/CC//g' haha.txt

cat haha.txt|while read line; do `$line`;done

 

华为csv:

ls |awk -F\_ '{print "touch -t"$4" "$0}'|sh

 

touch -t 201209162300  *A20120916.2300*

touch -t 201209170000  *A20120917.0000*

touch -t 201209170100  *A20120917.0100*

touch -t 201209170200  *A20120917.0200*

touch -t 201209170300  *A20120917.0300*

touch -t 201209170400  *A20120917.0400*

touch -t 201209170500  *A20120917.0500*

touch -t 201209170600  *A20120917.0600*

touch -t 201209170700  *A20120917.0700*

touch -t 201209170800  *A20120917.0800*

touch -t 201209170900  *A20120917.0900*

touch -t 201209171000  *A20120917.1000*

touch -t 201209171100  *A20120917.1100*

touch -t 201209171200  *A20120917.1200*

touch -t 201209171300  *A20120917.1300*

touch -t 201209171400  *A20120917.1400*

touch -t 201209171500  *A20120917.1500*

touch -t 201209171600  *A20120917.1600*

touch -t 201209171700  *A20120917.1700*

touch -t 201209171800  *A20120917.1800*

touch -t 201209171900  *A20120917.1900*

touch -t 201209172000  *A20120917.2000*

touch -t 201209172100  *A20120917.2100*

touch -t 201209172200  *A20120917.2200*

touch -t 201209172300  *A20120917.2300*

touch -t 201209180000  *A20120918.0000*

touch -t 201209180100  *A20120918.0100*

touch -t 201209180200  *A20120918.0200*

touch -t 201209180300  *A20120918.0300*

touch -t 201209180400  *A20120918.0400*

touch -t 201209180500  *A20120918.0500*

touch -t 201209180600  *A20120918.0600*

79.如何查询统计信息陈旧的表?

答案:

select *from dba_tab_statistics

wherestale_stats ='YES' ;

 

80.如何查找控制文件在哪里?

答案:

Select * from v$controlfile;

 

81.如何修改用户的默认表空间?

答案:

alter user PMTEST default tablespacePMTESTUSER;

82.oracle如何取随机数?

答案:

Select dbms_random.value(1,10) from dual;

83. 如何清空数据库的缓存?

答案:

ALTERSYSTEM FLUSH SHARED_POOL/BUFFER_CACHE/GLOBAL CONTEXT;

ALTERSYSTEM FLUSH BUFFER_CACHE

ALTERSYSTEM FLUSH GLOBAL CONTEXT;

84.如何导入、导出统计信息?

答案:

1\ 创建一个专用表保存各表的统计信息:
   exec dbms_stats.create_stat_table('pmtest','fys');
  
2\ 将各表的统计信息导入到pmtest.fys表中;
   exec dbms_stats.export_table_stats('pmtest','tcl_cust_base_info',null,'fys'); 
   ---可以创建不是登陆用户下的表;如用system登陆,可以创建表到‘pmtest'用户下
  
   或将指定schema的统计信息导入到pmtest.fys表中
   exec dbms_stats.export_schema_stats('pmtest','fys');
  
   注:
   若将整个数据库的统计信息导出到某个表必须按以下方式做:
   1)用SYSDBA角色的用户登陆(如system)
   2) exec dbms_stat.create_stat_table('system','tbl_name'); ----记住:此处创建的表必须是登陆用户下的表。
   3) exec dbms_stat.export_database_stats('tbl_name')
  
   ****
   导出表状态、SCHEMA统计信息,保存导出信息的表的SCHEMA可以和登陆用户名不一致;另外导入统计信息的表和原表尽可能
   是同一schema下的
   导出整个数据库统计信息,保存导出信息的表的SCHEMA必须和登陆用户名一致,必须是DBA角色。
 
3\ 查看统计信息是否导入:
   select * from pmtest.fys;
  
4\ 删除某张表的统计信息:
   exec dbms_stats.delete_table_stats('pmtest','tcl_cust_base_info');
  
5\ 查看统计信息是否被删除:
   select table_name ,to_char(LAST_ANALYZED,'yyyymmdd hh24:mi:ss')
   from ALL_tables where lower(table_name) LIKE 'tcl_cust_%_info%';
  
6\ 导入先前导出的统计信息:
   exec dbms_stats.import_table_stats('pmtest','tcl_cust_base_info','fys');
   注意:tcl_cust_base_info和fys都是在’pmtest'用户下的表。

85.如何关闭数据库的统计信息?

答案:

关闭自动搜集功能:alter systemset "_optimizer_autostats_job"=false scope=spfile;

开启自动搜集功能:alter systemset "_optimizer_autostats_job"=true scope=spfile;

执行完毕之后重启数据库。

 

86.如何让数据库的表空间offline?数据文件offline

答案:

1.      startup mount;

2.      alter database datafile '/xxxxxx/yyyy.dbf'offline drop;

3.       

87.如何删除表空间?

答案:

alter tablespace UNDOTBS offline;

drop tablespace UNDOTBS including contentsand datafiles;

 

88.如何对分区表进行统计信息收集?

答案:

execdbms_stats.gather_table_stats(ownname=>'PMTEST',tabname=>'INDICATOR_7',granularity=>'ALL');

 

exec dbms_stats.gather_table_stats(ownname=>'PMTEST',tabname=>'INDICATOR_7',granularity=>'AUTO');

 

 

89.如何移动oracle的数据文件和日志文件?

答案:

第一步:关闭数据库

shutdown immediate

第二步:复制数据文件

cp 'D:\ORACLE\ORADATA\TEST\SYSTEM01.DBF''F:\TEST\SYSTEM01.DBF'

第三步:mount方式启动数据库

startup mount

第四步:修改表空间文件的路径

alter database rename file  'D:\ORACLE\ORADATA\TEST\SYSTEM01.DBF' to'F:\TEST\SYSTEM01.DBF'

第五步:打开数据库

alter database open;

 

日志文件,同上。第四步:

alter database rename file'D:\ORACLE\ORADATA\TEST\REDO01.LOG' to 'F:\TEST\redo01.log';

90.如何移动oracle的控制文件?

答案:

第一步:查询控制文件的路径:

select name from v$controlfile;

第二步:生成pfile文件。

create pfile from spfile

第二步:关闭数据库

shutdown immediate

第三步:复制控制文件

cp

第四步:修改pfile文件中控制文件的路径:

control_files=("F:\TEST\control01.ctl","F:\TEST\control02.ctl", "F:\TEST\control03.ctl")

第五步:从pfile生成spfile

create spfile from pfile;

第三步:mount方式启动数据库

startup mount

第四步:查询控制文件位置

select name from v$controlfile;

第五步:打开数据库

alter database open;

 

91.如何手动强制修改ORACLE的参数?

答案:

将新的pfile和出事故之前的pfile进行了对比,然后:

1)将old-pfile中没有,但是新的pfile中有的参数,在新的pfile中去掉。

这些参数包括:

*.memory_max_target=16106127360

*.memory_target=16106127360

*.sga_max_size=16106127360

*.pga_aggregate_target=0

这个四个参数是按照大容量方案进行设置后的效果。

2)将old-pfile中有,但是新的pfile中没有的参数,在新的pfile中添加上。

这些参数包括:

*.pga_aggregate_target=4194304000

*.shared_pool_size=2000000000

*.db_cache_size=16777216000

*.large_pool_size=33554432

92.如何启动归档备份日志的压缩功能?

答案:

alter database archivelogcompress enable;

93.如何确认数据库是归档模式,还是非归档模式?

答案:

方法一:select name,log_modefrom v$database;

方法二:ARCHIVE LOG LIST;

 

94.如何设置分区表的压缩属性,并压缩?

答案:

altertable indicator_1modifypartition P_1_20120205compress;

altertable indicator_1movepartition P_1_20120205compress;

 

如果这个时候不重建索引,那么索引是不可用的。

可以用这个语句看一下:select *from dba_ind_partitions x

 

所以,需要重建一下索引:

alterindex  LOCAL_INDICATOR_1_INDEX_1rebuild partitionP_1_20120226

 

 

备注:

如何修改全表为compress?或者非压缩?

alter table indicator_1 compress;

alter table indicator_1 nocompress;

分区表也一样。

 

 

95.如何对普通表和分区进行分区交换/交换分区?

答案:

createtable t_tempas

select *from INDICATOR_1where1=2 ;

createuniqueindex t_temp_INDEX_1on t_temp (STARTDAY,STARTTIME, MOENTITYID);

createuniqueindex t_temp_INDEX_2on t_temp (STARTDAY,MOENTITYID, STARTTIME);

altertable INDICATOR_1exchangepartition P_1_20120205withtable t_tempincludingindexes; --交换。

 

altertable INDICATOR_1exchangepartition P_1_20120205withtable t_tempincludingindexes; --交换回来。

96.Eclipse里面如何把tab键自动变为4个空格?

答案:

在java代码中建议不要用tab,因为不同的文本编辑器对tab的长度不一样,有些很长,会非常不好看。可以在Eclipse或者MyEclipse中,修改如下在Window->Preferences->java->Code Style->Formatter点edit按钮弹出窗口中的indentation中的Tab policy项选择Spaces Only,然后Profile name修改一下,保存就可以了,在编写完代码后,按Ctrl+shift+f格式化代码之后,再上传带svn上去

 

97.如何把表空间改为readonly

答案:

alter tablespace abc read only

改为可读写:

alter tablespace abc read write

 

98.分区表的信息,如何查询?

答案:

显示分区表信息

显示数据库所有分区表的信息:DBA_PART_TABLES

显示当前用户可访问的所有分区表信息:ALL_PART_TABLES

显示当前用户所有分区表的信息:USER_PART_TABLES

显示表分区信息 显示数据库所有分区表的详细分区信息:DBA_TAB_PARTITIONS

显示当前用户可访问的所有分区表的详细分区信息:ALL_TAB_PARTITIONS

显示当前用户所有分区表的详细分区信息:USER_TAB_PARTITIONS

显示子分区信息 显示数据库所有组合分区表的子分区信息:DBA_TAB_SUBPARTITIONS

显示当前用户可访问的所有组合分区表的子分区信息:ALL_TAB_SUBPARTITIONS

显示当前用户所有组合分区表的子分区信息:USER_TAB_SUBPARTITIONS

显示分区列 显示数据库所有分区表的分区列信息:DBA_PART_KEY_COLUMNS

显示当前用户可访问的所有分区表的分区列信息:ALL_PART_KEY_COLUMNS

显示当前用户所有分区表的分区列信息:USER_PART_KEY_COLUMNS

显示子分区列 显示数据库所有分区表的子分区列信息:DBA_SUBPART_KEY_COLUMNS

显示当前用户可访问的所有分区表的子分区列信息:ALL_SUBPART_KEY_COLUMNS

显示当前用户所有分区表的子分区列信息:USER_SUBPART_KEY_COLUMNS

 

---------------------------------------------------------------------------------------------------

 

怎样查询出oracle数据库中所有的的分区表

 

select * from user_tables a wherea.partitioned='YES'

删除一个表的数据是truncate tabletable_name;

删除分区表一个分区的数据是alter tabletable_name truncate partition p5;

 

如果我要将分区表中各个分区的数据都清空,可以用truncatetable table_name;吗?

还是必须从头执行alter tabletable_name truncate partition p1;

alter table table_name truncate partitionp2;

alter table table_name truncate partitionp3;

alter table table_name truncate partitionp4;

alter table table_name truncate partitionp5;

alter table table_name truncate partitionp6;

答:truncate table table_name;

 

99.如何在归档模式和非归档模式之间转换?

答案:

1.改变非归档模式到归档模式:

1)SQL> conn / as sysdba (以DBA身份连接数据库)

2)SQL> shutdown immediate; (立即关闭数据库)

3)SQL> startup mount (启动实例并加载数据库,但不打开)

4)SQL> alter database archivelog; (更改数据库为归档模式)

5)SQL> alter database open; (打开数据库)

6)SQL> alter system archive log start; (启用自动归档)

7)SQL> exit (退出)

做一次完全备份,因为非归档日志模式下产生的备份日志对于归档模式已经不可用了.这一步非非常重要!

2.改变归档模式到非归档模式:

1)SQL>SHUTDOWN NORMAL/IMMEDIATE;

2)SQL>STARTUP MOUNT;

3)SQL>ALTER DATABASE NOARCHIVELOG;

4)SQL>ALTER DATABASE OPEN;

3.启用自动归档: LOG_ARCHIVE_START=TRUE

归档模式下,日志文件组不允许被覆盖(重写),当日志文件写满之后,如果没有进行手动归档,那么系统将挂起,直到归档完成为止.

这时只能读而不能写.

运行过程中关闭和重启归档日志进程

SQL>ARCHIVE LOG STOP

SQL>ARCHIVE LOG START

4.手动归档:LOG_ARCHIVE_START=FALSE

归档当前日志文件

SQL>ALTER SYSTEM ARCHIVE LOG CURRENT;

归档序号为052的日志文件

SQL>ALTER SYSTEM ARCHIVE LOG SEQUENCE052;

归档所有日志文件

SQL>ALTER SYSTEM ARCHIVE LOG ALL;

改变归档日志目标

SQL>ALTER SYSTEM ARCHIVE LOG CURRENT TO'&PATH';

5.归档模式和非归档模式的转换

第4步的逆过程.

6.配置多个归档进程

Q:什么时候需要使用多个归档进程?

A:如果归档过程会消耗大量的时间,那么可以启动多个归档进程,这是个动态参数,可以用ALTER SYSTEM动态修改.

SQL>ALTER SYSTEM SETLOG_ARCHIVE_MAX_PROCESSES=10;

Oracle9i中最多可以指定10个归档进程

与归档进程有关的动态性能视图

v$bgprocess,v$archive_processes

7.配置归档目标,多归档目标,远程归档目标,归档日志格式

归档目标 LOG_ARCHIVE_DEST_n

本地归档目标:

SQL>LOG_ARCHIVE_DEST_1 ="LOCATION=D:ORACLEARCHIVEDLOG";

远程归档目标:

SQL>LOG_ARCHIVE_DEST_2 ="SERVICE=STANDBY_DB1";

强制的归档目标,如果出错,600秒后重试:

SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST_4= "LOCATION=E:ORACLEARCHIVEDLOG MANDATORY REOPEN=600";

可选的归档目标,如果出错,放弃归档:

SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST_3= "LOCATION=E:ORACLEARCHIVEDLOG OPTIONAL";

归档目标状态:关闭归档目标和打开归档目标

关闭归档目标1

SQL>ALTER SYSTEM SETLOG_ARCHIVE_DEST_STATE_1 = DEFER

打开归档目标2

SQL>ALTER SYSTEM SETLOG_ARCHIVE_DEST_STATE_2 = ENABLE

归档日志格式

LOG_ARCHIVE_FORMAT

8.获取归档日志信息

V$ARCHIVED_LOG

V$ARCHIVE_DEST

V$LOG_HISTORY

V$DATABASE

V$ARCHIVE_PROCESSES

ARCHIVE LOG LIST;


100.归档满了,如何解决?

答案:

系统报错:ORA-00257: archiver error. Connect internal only,until freed.

SQL> show parameterdb_recovery_file_dest_size; 

NAME                                 TYPE        VALUE 

----------------------------------------------- ------------------------------ 

db_recovery_file_dest_size           big integer 4G 

SQL> selectgroup#,sequence#,archived,status from v$log; 

 

   GROUP#  SEQUENCE# ARC STATUS 

---------- ---------- ------------------- 

        1        103 NO  CURRENT 

        3        102 NO  INACTIVE 

        2        101 NO  INACTIVE 

 

//搞一搞SEQUENCE号最小的一个 

SQL> alter database clear logfile group2; 

alter database clear logfile group 2 

ERROR at line 1: 

ORA-00350: log 2 of instance orcl (thread1) needs to be archived 

ORA-00312: online log 2 thread 1:'/oracle/oradata/orcl/redo02.log' 

ORA-00312: online log 2 thread 1: 

'/backup/oracle_archive/redo_data/redo2/redo021.log' 

SQL> alter database clear unarchivedlogfile group 2; 

Database altered. 

SQL> alter database open; 

Database altered.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值