二三:基于表空间的备份恢复方式
以表空间的方式备份数据可以根据一下几个步骤进行。
1:把表空间置于read only状态
alter tablespce tablespace_name read only;
2:用exp备份以表空间方式备份数据
exp “ ’sys/manager as sysdba’ ” file=test.dmp tablespaces=表空间名字 transport_tablespace=y log=test.log
3:备份原来的表空间中的所有数据文件以及test.dmp文件.
4:恢复原来表空间中所有的数据文件到新的数据库下。
5:用imp方式恢复数据
imp “ ’sys/manager as sysdba’ ” file=test.dmp tablespaces=表空间名字 transport_tablespace=y datafiles=’要恢复数据的文件路径’(如果多个文件用逗号分开)
6:将表空间置于read write模式下
alter tablespce tablespace_name read write;
至此,基于表空间的恢复完成。
二四:sqlplus中通过错误号查错误信息
SQL>host oerr ora 03113
SQL>exec dbms_output.put_line(sqlerrm(-03113));
二五:利用ORADEBUG命令DUMP控制文件
先利用oradebug命令来dump出控制文件中的内容
[zhangleyi@fedora zhangleyi]$ sqlplus /nolog
SQL*Plus: Release 10.1.0.2.0 - Production on Thu Apr 15 01:17:54 2004
Copyright (c) 1982, 2004, Oracle. All rights reserved.
@>conn sys/dba as sysdba
Connected.
SYS@ora10g>oradebug setmypid
Statement processed.
SYS@ora10g>oradebug dump controlf 4
Statement processed.
生成的dump文件作为附件上传了,有兴趣的可以下载看看。
如果搞清楚了控制文件中的各个部分的含义,对于Oracle的很多机制,特别是备份和恢复,就能更明白了。
IXDBA.NET技术社区
先说一个,我们注意下面两个部分。
***********************************************************
DATABASE ENTRY
***********************************************************
Database checkpoint: Thread=1 scn: 0x0000.00120a61
***********************************************************
DATA FILE RECORDS
***********************************************************
DATA FILE #1:
(name #7) /u01/oracle/oradata/ora10g/system01.dbf
creation size=0 block size=8192 status=0xe head=7 tail=7 dup=1
tablespace 0, index=1 krfil=1 prev_file=0
unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
Checkpoint cnt:267 scn: 0x0000.00121076 04/14/2004 23:23:58
Stop scn: 0xffff.ffffffff 04/14/2004 05:32:53
我们可以看到所有的数据文件Stop scn: 0xffff.ffffffff,这是一个极大的值,说明我们的数据库是打开的。我们知道,shutdown abort的时候,没有checkpoint,控制文件也不会被更新,当数据库重新启动的时候,Oracle会发现这个SCN仍然是这个极大值,和数据库的Checkpoint SCN不一样,此时数据库就会进行恢复,只有当这两个SCN一样,数据库才能OPEN。
大家也可以自己作个实验,shutdown immediate数据库,这是正常关闭,然后startup mount,然后dump控制文件,会发现Stop SCN和Checkpoint SCN是一样的值。
另外大家都知道SCN这个名词,但是我们可以看到其实Oracle中有很多类型的SCN,而每个SCN负责不同的功能。
二六:如何通过oracle系统进程查找正在执行的SQL语句
1、 先用ps -aux查询,发现有个进程占用大量CPU,记录下PID
2、 用语句SELECT a.username,a.sid,a.serial# FROM v$session a,v$process c
WHERE c.addr=a.paddr and spid=PID
查出相应的SESSION
3、 用语句select * from v$session_wait where sid=...
就查出等待事件是什么。
以上操作其实还可以用一个sql实现:
SELECT /*+ ORDERED */
sql_text
FROM v$sqltext a
WHERE (a.hash_value, a.address) IN (
SELECT DECODE (sql_hash_value,
0, prev_hash_value,
sql_hash_value
),
DECODE (sql_hash_value, 0, prev_sql_addr, sql_address)
FROM v$session b
WHERE b.paddr = (SELECT addr
FROM v$process c
WHERE c.spid = '&pid'))
ORDER BY piece ASC
/
这里我们涉及了3个视图,并应用其关联进行数据获取.
首先需要输入一个pid,这个pid即process id,也就是在Top或ps中我们看到的PID.
通过pid和v$process.spid相关联我们可以获得Process的相关信息
进而通过v$process.addr和v$session.paddr相关联,我们就可以获得和session相关的所有信息.
再结合v$sqltext,我们即可获得当前session正在执行的SQL语句.
通过v$process视图,我们得以把操作系统和数据库关联了起来.