Oracle日常维护总结.docx
- 文档编号:15216928
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:119
- 大小:86.07KB
Oracle日常维护总结.docx
《Oracle日常维护总结.docx》由会员分享,可在线阅读,更多相关《Oracle日常维护总结.docx(119页珍藏版)》请在冰点文库上搜索。
Oracle日常维护总结
Oracle日常维护总结
检查TNS是否正常
c:
>tnspingora9
检查登陆用户是否正常
c:
>sqlplususer/password@SID
SQL>connectsystem/managerassysdba
sys/chang_on_install
导入数据:
impuser/pwdfile=*.dmpcommit=y回滚段满就提交,不无限扩展回滚段。
impuser/pwdfile=*.dmpcommit=yfull=y
impuser/pwdfile=*.dmpcommit=ytable=*
查询所有用户:
selectusernamefromdba_users;
===========================================================
scounix中旧版oracle开关数据库
关数据库文件在/etc/rco.d/k100ra
开数据库文件在/etc/rc2.d/sqsora
$sqldbalmode=y
sqldba>connectinternal;
sqldba>shutdownimmediate;
sqldba>startup;
--------------------------------
svrmgrl
svrmgr>connectinternal
svrmgr>shutdownimmediate
svrmgr>startup
lsnrctl
lsnrctl>stop
lsnrctl>start
===========================================================
表空间变大的问题!
UNDOTBS1的表空间增大,现已经达到11G,数据并不大,不知道什么原因造成的!
您可以增加回退段storage中的optimal属性,这个属性就是当回退段中没有活动事务时,自动回缩回退段到optimal设定的值,具体语句如下:
sql>alterrollbacksegment回退段名字storage(optimal10M);
另外您还可以手工回缩回退段,sql>alterrollbacksegment回退段名字shrinkto10M;
继续问一下回滚段问题,UNDOTBS设定是2G,最大没限制,现它已增长到了9G,查了一下,数据现占用3G左右,我用命令:
sql>alterrollbacksegment回退段名字shrinkto4G;时提示ORA-30019:
IllegalrollbackSegmentoperationinAutomaticUndomode,现该怎么缩小它啊?
alterrollbacksegment回退段名字shrinkto4G只允许在回退段为手动管理模式下使用,自动管理时不可使用。
请查看数据库参数showparameterundo_
===========================================================
看用户下有多少个procedure,删除命令
1、想看用户下有多少个procedure请执行以下sql语句:
sql>select*fromuser_objectswhereobject_type='PROCEDURE';
2、删除用
sql>dropprocedureprocedure_name;
===========================================================
oracle高版本库向低版本库如何移植?
操作成功的方法?
oracle高版本的导出(exp)不能向低版本库使用(imp)导入,要移植可以将高版本库中数据输出成文本,再用sqlload装入低版本库。
低版本的导入工具不能导入使用高版本导出工具创建的导出文件。
为了移动表与数据库对象,需要使用与目标数据库兼容的低版本导入,导出工具。
如:
希望将对象从8i移到8中,则可使用8i服务器上的Oracle8导入导出工具创建文件,以便在8上可以读取此文件。
catexp7.sql即为此用,可选择不同的部分(imp,exp)执行,但有一点要注意,8i中的新对象不能被导出和导入到8中。
===========================================================
在数据库中,建有100多个库,运行SELECT*FROMCAT;命令后,大部分库名都运行过去了,只看到最下方的几个,如何全部看到所有的数据库
进入sqlplus环境,执行setpauseon,在执行select*fromcat;
按回车键就可以分屏看了
===========================================================
表空间使用率
一、如何查看tablespace的空间使用情况
sql>select
a.file_idfileid,
a.file_name文件名,
a.tablespace_name表空间名,
a.bytestotal_bytes,
(a.bytes-sum(nvl(b.bytes,0)))已使用,
sum(nvl(b.bytes,0))未使用,
sum(nvl(b.bytes,0))/(a.bytes)*100未使用率
fromdba_data_filesa,dba_free_spaceb
wherea.file_id=b.file_id
groupbya.tablespace_name,a.file_id,a.bytes,a.file_name
orderbya.file_id
二、如何查看table的空间使用情况
1、analyzetabletablename(你想查的表名)compute
statistics;
2、selecttable_name,blocks,empty_blocksfromdba_tables
wheretable_name=‘’;
===========================================================
用户在进行输入操作时,输入了两条完全一样的记录。
当用户想删除这条记录时,系统出错,提示“多条记录被操作”。
无法删除记录。
请教高手,如何解决问题。
1、selectrowid,其他列名fromtablename;(你想进行删除操作的表名)。
2、记下你想删除的记录所对应的rowid的值
3、deletefromtablenamewhererowid='rowid的值';
应该就可以了。
where条件加上rownum=1就可以删除第一条记录。
注意,rownum只能接“=”或“<”,不能接“>”。
其实使用rownum有很大的局限性,比如,只能删除rownum=1的行。
可使用“相关删除”的方法删除重复记录:
SQL>deletetnameowhereo.rowid<>
(selectmax(rowid)fromtnamei
wherei.colname=o.colname);
其中:
colname为基表tname的列名,可用多列。
===========================================================
我用select
b.file_idfile_id,
b.tablespace_nametablespace_name,
b.bytes/1024bytes,
(b.bytes-sum(nvl(a.bytes,0)))*1.0/1024used_spaces,
sum(nvl(a.bytes,0))/1024free_spaces,
sum(nvl(a.bytes,0))/(b.bytes)*100free_pict
fromdba_free_spacea,dba_data_filesb
wherea.file_id=b.file_id
groupbyb.tablespace_name,b.file_id,b.bytes
orderbyb.file_id
查看free_space还有6.26%,大量删除记录后,查看free_space仍为6.26%,不知何故?
如何释放表空间?
举个例子吧:
一个表空间大小为10M,它里边有一张表,这张表当前的大小为2M,则不论这张表里有多少数据,哪怕它是一张空表,它仍然占用了这个表空间2M的空间。
至于你说的如何释放表空间,看了你的描述,你是对表空间里的一些表进行了大量的删除操作,对于你这种情况,你可以用以下SQL语句试试:
ALTERTABLEtablenameDEALLOCATEUNUSED;(这里的tablename是指你进行过大量删除操作的表)
===========================================================
如何修改ORACLE的字符代码集,如何用SQL语句可以修改(ZHS16GBK)(ZHS16CGB)
在sys用户下:
updatetableprops$setvaules='ZHS16CGB'wherename='nls_lang';
updateprops$setvalue$='ZHS16CGB'wherename='NLS_CHARACTERSET';
updateprops$setvalue$='ZHS16CGB'wherename='NLS_NCHAR_CHARACTERSET';
commit;
===========================================================
某存储过程被锁死,用drop命令不能删除,如何停止该存储过程?
1selectjob,failuresfromuser_jobs;
2execdbms_job.remove(thecontentofjob);
3dropprocedure..;
===========================================================
1.怎么验证监听已经开启?
命令:
lsnrctlstatus
2.tnsnames.ora除了修改HOST的地址外还需要改别的地方吗?
host地址,SERVICE_NAME
3.数据库怎样open?
命令:
svrmgrl
svrmgr>connectinternal
svrmgr>startup
===========================================================
ORACLE表空间恢复方案
一)用户表空间
错误:
在启动数据库时出现ORA-01157,ORA-01110或操作系统级错误例如ORA-07360,在关闭数据库(使用shutdownnormal或shutdownimmediate)时将导致错误ORA-01116,ORA-01110以及操作系统级错误ORA-07368
解决:
以下有两种解决方案:
1.用户的表空间可以被轻易地重建
即最近导出的对象是可用的或表空间中的对象可以被轻易地重建等.在这种情况下,最简单的方法是offline并删除该数据文件,删除表空间并重建表空间以及所有的对象.
svrmgrl>startupmount
svrmgrl>alterdatabasedatafilefilenameofflinedrop;
svrmgrl>alterdatabaseopen;
svrmgrl>droptablespacetablespace_nameincludingcontents;
重建表空间及所有对象.
2.用户的表空间不能够被轻易地重建
在大多数情况下,重建表空间是不可能及太辛苦的工作.方法是倒备份及做介质恢复.如果您的系统运行在NOARCHIVELOG模式下,则只有丢失的数据在onlineredolog中方可被恢复。
步骤如下:
1)Restorethelostdatafilefromabackup
2)svrmgrl>startupmount
3)svrmgrl>selectv1.group#,member,sequence#,first_change#
>fromv$logv1,v$logfilev2
>wherev1.group#=v2.group#;
4)如果数据库运行在NOARCHIVELOG模式下则:
svrmgrl>selectfile#,change#fromv$recover_file;
如果CHANGE#大于最小的FIRST_CHANGE#则数据文件可以被恢复。
如果CHANGE#小于最小的FIRST_CHANGE#则数据文件不可恢复。
恢复最近一次的全备份或采用方案一.
5)svrmgrl>recoverdatafilefilename;
6)确认恢复成功
7)svrmgrl>alterdatabaseopenresetlogs;
3.只读表空间无需做介质恢复,只要将备份恢复即可.唯一的例外是:
表空间在最后一次备份后被改为read-write模式
表空间在最后一次备份后被改为read-only模式
在这种情况下,均需进行介质恢复
二)临时表空间
临时表空间并不包含真正的数据,恢复的方法是删除临时表空间并重建即可.
三)系统表空间
如果备份不可用,则只能采用重建数据库的方法
四)回滚表空间
有两种情况:
1、数据库已经完全关闭(使用shutdownimmediate或shutdown命令)
1)确认数据库完全关闭
2)修改init.ora文件,注释"rollback-segment"
3)svrmgrl>startuprestrictmount
4)svrmgrl>alterdatabasedatafilefilenameofflinedrop;
5)svrmgrl>alterdatabaseopen;
基于出现的结果:
"statementprocessed"转(7)
"ORA-00604,ORA-00376,ORA-01110"转(6)
6)svrmgrl>shutdownimmediate
修改init.ora文件,增加如下一行:
_corrupted_rollback_segments=(,...)
svrmgrl>startuprestrict
7)svrmgrl>droptablespacetablespace_nameincludingcontents;
8)重建表空间及回滚段
9)svrmgrl>altersystemdisablerestrictedsession;
10)修改init.ora文件
2、数据库未完全关闭(数据库崩溃或使用shutdownabort命令关闭数据库)
1)恢复备份
2)svrmgrl>startupmount
3)svrmgrl>selectfile#,name,statusfromv$datafile;
svrmgrl>alterdatabasedatafilefilenameonline;
4)svrmgrl>selectv1.group#,member,sequence#,first_change#
>fromv$logv1,v$logfilev2
>wherev1.group#=v2.group#;
5)svrmgrl>selectfile#,change#fromv$recover_file;
见一方案2-4
6)svrmgrl>recoverdatafilefilename;
7)svrmgrl>alterdatabaseopen;
3、数据库处于打开状态
1)删除回滚段和表空间
2)重建表空间和回滚段
五)控制文件恢复
1.所有的控制文件均被破坏
将备份的控制文件拷贝至原目录下
对于RAWDEVICE,则:
ddif='con.bak'of='/dev/rdrd/drd1'seek=128
2.并非所有的控制文件均被破坏
用其他的控制文件启动数据库
===========================================================
如何限制用户登录使用ORACLE?
?
我使用的是oracle816,但是在$ORACLE_HOME/network/admin/中
没有protocol.ora文件,自己生成一个文件,然后怎加两行:
protocol.INVITED_NODES=(10.21.2.51,10.21.72.8,10.21.72.15)
protocol.VALIDNODE_CHECKING=yes
其中10.21.2.51是数据库服务器的地址,10.21.72.8,10.21.72.15是用户机的地址,可是其他机子还是能使用服务器
可能有一些同志对这个话题比较感兴趣,我下面就把具体步骤写一下,希望对大家的工作有所帮助:
对于oracle7:
1、编辑$ORACLE_HOME/network/admin/protocol.ora文件
tcp.invited_nodes=(ip1,ip2....)(这里的ip必须包括数据库所
在机器的所有地址)
tcp.validnode_checking=yes
2、重启listener
对于oracle8:
1、编辑$ORACLE_HOME/network/admin/.protocol.ora文件(注意前边
有个点)
tcp.invited_nodes=(ip1,ip2....)(这里的ip不必包括数据库所
在机器的地址)
tcp.validnode_checking=yes
2、重启listener
以后不管在文件中增加或减少ip,修改完文件后,都必须重启listener,改动才能生效。
===========================================================
查看某个表的空间使用情况:
1、analyzetabletablename(你想查的表名)computestatistics;
2、selecttable_name,blocks(已使用的块数),empty_blocks(未使用的块数)fromdba_tableswheretable_name=‘’;
查看某个表占表空间的大小:
selectsegment_name,tablespace_name,bytes,blocksfromuser_segmentswheresegment_type='';
===========================================================
我们一个服务器的文件系统坏了,oracle的系统文件都找不回来了,但是应用程序的数据文件还是好的。
请问能否重新安装oracle后将没有损坏的数据文件加入数据库中?
你所说的应用程序的数据文件还是好的,到底是导出的数据文件,还是oracle的核心文件(Controlfiles,Datafiles,Redologfiles)?
如果是导出的数据文件,oracle装好后重新导入即可;如果是核心文件是好的,并且是在oracle关闭时备份出来的,则可对应目录copy回去,重新启动oracle。
Oracle的核心文件Controlfiles,Datafiles,Redologfiles)所在的文件系统/oracle都坏了,只有用户的数据文件是好的(/dbf/cxgl.dbf,/dbf/hygl.dbf)?
用户的表空间数据库文件(/dbf/cxgl.dbf,/dbf/hygl.dbf)是无法被别的oracle系统open的,如果你没有做导出备份或oracle的冷备份,那你就没办法了。
请记住重要数据要做备份
连控制文件都坏了,那就没有什么办法了,这些数据文件已经无法使用了
===========================================================
ifrtrim(:
cz.yfbz)isnotnullthen
:
xck.yfbz:
='#='||''''||rtrim(:
cz.yfbz)||'''';
break;message('xck.yfbz='||:
xck.yfbz);*我加的跟踪显示*/
endif;
ifrtrim(:
cz.czjm)isnotnullthen
:
xck.cz:
='#in(selectczfromzd.czzdwherejm='''||
rtrim(:
cz.czjm)||''')';
endif;
这段程序是由块CZ中的域YFBZ和域CZJM的内容来改变块XCK的查询条件。
如当我在CZ.YFBZ中输入A时,执行的结果就是XCK对应的表中YFBZ='A'的记录.而在跟踪信息中显示的是"xck.yfbz=#='A'".
我要请教的是在这里"#"是什么意思?
如何才能动态改变块的查询、排序条件?
你用的是form30;你可以在你的xck.cz的触发器中会发现pre_query这个出发期,然后你打开看一下其中的内容,你会发现有#,实际这是一种表示方式,既根据你所输入的cz信息作为查询条件来进行查询。
这是一种基于动态的最简单的查询处理的程序编写方式,很实用但很老套。
针对于动态改变块的查询和排序条件可以通过程序设置属性的办法来进行处理;希望你能明白!
简单的方法:
使用全局变量来设定动态查询
===========================================================
注:
解释快照
ORACLE的表快照特征允许一个主表在分布式数据库的其它结点进行复制。
只允许修改主表,而复制只可读。
主表达式每一个复制称为一个快照。
快照异步的刷新,反映主表的一个最近事务一致状态。
一个快照可为表的完全拷贝或者为表的一个子集,由引用一个或多个主表、视图或其它快照的分布式查询所定义。
包含主表的数据库称为主数据库。
快照有简单快照和复杂快照。
简单快照的每行是基于单个远程表中的一行。
所以定义简单快照的查询中不能有GROUBBY或CONNECTBY子句,或子查询、连接或集合操作。
如果在快照定义的查询中包含有上述子句或操作,这种快照称为复杂快照。
在快照建立时,ORACLE在快照的模式中建立几种内部对象:
在快照结点,OR
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Oracle 日常 维护 总结