41
Oracle 经经经经

Oracle 经验操作

Embed Size (px)

Citation preview

Page 1: Oracle 经验操作

Oracle 经验操作

Page 2: Oracle 经验操作

目 录

创建功能..................................................................................................................................4

创建数据库......................................................................................................................4

如何建立一个与现存数据库相同,但不包含数据的空库...........................................4

创建表空间......................................................................................................................4

创建一个基于多个分区的大表.......................................................................................5

创建同义词......................................................................................................................7

如何创建临时表..............................................................................................................7

查看功能..................................................................................................................................7

谁正在访问数据库?.........................................................................................................7

谁被锁住?.........................................................................................................................7

谁在锁表?.........................................................................................................................7

查看一个用户拥有哪些表空间的实体信息...................................................................8

如何检测 ROLLBACK SEGMENT竞争?......................................................................8

如何查看什么时间有哪些数据库对象结构被修改过?...............................................8

查看 oracle的版本...........................................................................................................9

查看 oracle的安装的参数...............................................................................................9

判断 oracle数据库的数据文件是否是自动扩展............................................................9

查看哪些 session正在使用哪些回滚段?......................................................................9

查看用户表所占空间大小...............................................................................................9

判断是否是 ITL等待.......................................................................................................9

如何取出某个限定条件下的前 10条记录...................................................................12

如何查看数据库的字符集.............................................................................................12

查询一个分区表的方法.................................................................................................12

查看目前 oracle数据库中执行了很长时间的 sql........................................................12

查看目前系统中的存在的连接(session)对应的 sql语句.......................................12

查看一个表所占用的磁盘空间.....................................................................................12

查看当前用户的连接信息.............................................................................................13

查询一张表中第几大的值.............................................................................................13

查询一张表中第几小的值.............................................................................................13

查询一个数据库 Schema中的所有记录数...................................................................13

查看当前数据库已经使用的天数.................................................................................13

查看数据库中各个表空间所占用的磁盘空间情况.....................................................14

查看每个数据文件的磁盘占用情况.............................................................................14

查看数据库去年每个月的增长情况.............................................................................14

查看登录时间超过 1个小时的连接.............................................................................15

查看数据库中有致命安全隐患的数据库用户及相应的权限.....................................15

查看数据库中有致命安全隐患的数据库用户及相应的角色.....................................15

Page 3: Oracle 经验操作

查看 linux系统中有权启动、停止 oracle的操作系统用户........................................16

备份、恢复............................................................................................................................16

如何导入指定的表.........................................................................................................16

如何备份数据库中一个或者多个用户的数据.............................................................16

如何备份数据库中一个或者多个表.............................................................................16

联机热备份失败后,如何打开数据库?.....................................................................16

Oracle数据库在 linux下自动备份的设置....................................................................17

使用 rman进行数据库恢复...........................................................................................18

管理功能................................................................................................................................21

常用的 Text_io...............................................................................................................21

清除全局变量................................................................................................................22

删除重复记录................................................................................................................22

监控 oracle的性能.........................................................................................................22

如何查询数据库中字符串字段中%.............................................................................24

如何移动表或者表分区.................................................................................................24

如何移动数据文件.........................................................................................................25

如何杀掉特定的数据库连接.........................................................................................25

如何捕获用户的登录信息.............................................................................................25

如何监控数据库DDL的语句或者说数据库对象的变化...........................................26

如何监控数据库DML语句(SELECT除外)...........................................................27

删除表的命令的区别.....................................................................................................27

将数据库的配置改成归档模式.....................................................................................27

在 linux上安装 oracle失败后,手工删除 oracle的方法.............................................29

在 linux上,oracle自动启动的停止服务的步骤.........................................................29

修改 oracle数据库的字符集.........................................................................................32

删除某张表中的某个字段.............................................................................................32

导出数据库中所有表的DDL脚本...............................................................................32

导出整个数据库中的索引的DDL脚本.......................................................................34

导出数据库中所有的触发器的DDL脚本...................................................................36

数据库的用户的缺省密码,确认修改这些用户的密码.............................................36

自动杀掉锁住对象的用户.............................................................................................37

Page 4: Oracle 经验操作

创建功能

创建数据库

如何建立一个与现存数据库相同,但不包含数据的空库

首先,导出数据库结构exp system/manager full=Y rows=N file=full.dmp

其次,将数据库结构导入imp system/manager full=Y rows=N file=full.dmp

创建表空间

-- create tablespace

CREATE TABLESPACE 表空间名称DATAFILE

'/u01/app/oracle/product/8.1.7/dbs/Meeting_Data_Test.ora' SIZE 50971520

AUTOEXTEND ON NEXT 1280 MAXSIZE 300721984

DEFAULT STORAGE (

INITIAL 40960

NEXT 40960

MINEXTENTS 1

MAXEXTENTS 505

PCTINCREASE 50 )

logging

ONLINE

PERMANENT

/

-- create user

Create User 用户名称 Identified By "用户密码"

Page 5: Oracle 经验操作

Default Tablespace 表空间名称 Temporary Tablespace TEMP

Profile DEFAULT

ACCOUNT UNLOCK

/

GRANT CONNECT TO 用户名称/

GRANT DBA TO 用户名称/

GRANT UNLIMITED TABLESPACE TO 用户名称/

创建一个基于多个分区的大表

下面利用 voip 项目中得 ti_cdr 的表来示例,将这张表中每个季度产生的数据存放在一个表空间内。创建分区Create tablespace CDR2004Q1

DataFile

'E:\ORACLE\ORADATA\DESTDB\CDR2004Q1.ORA'

Size 104857600 AutoExtend On Next 1 Maxsize 300728320

Create tablespace CDR2004Q2

DataFile

'E:\ORACLE\ORADATA\DESTDB\CDR2004Q2.ORA'

Size 104857600 AutoExtend On Next 1 Maxsize 300728320

Create tablespace CDR2004Q3

DataFile

'E:\ORACLE\ORADATA\DESTDB\CDR2004Q3.ORA'

Size 104857600 AutoExtend On Next 1 Maxsize 300728320

Create tablespace CDR2004Q4

DataFile

'E:\ORACLE\ORADATA\DESTDB\CDR2004Q4.ORA'

Size 104857600 AutoExtend On Next 1 Maxsize 300728320

创建表假设表有四个字段,在 2004 年中每个季度产生的数据存放在一个单独的表空间内create table TI_CDR

Page 6: Oracle 经验操作

(

ACCTSTARTTIME DATE ,

ACCTSTOPTIME DATE ,

ACCTSESSIONTIME NUMBER(12, 0) ,

CLIENTIPADDRESS VARCHAR2(32) )

PARTITION BY RANGE (ACCTSTARTTIME)

(PARTITION cdr2004_q1

VALUES LESS THAN (TO_DATE('2004-04-01','YYYY-MM-DD'))

TABLESPACE cdr2004q1,

PARTITION cdr2004_q2

VALUES LESS THAN (TO_DATE('2004-07-01','YYYY-MM-DD'))

TABLESPACE cdr2004q2,

PARTITION cdr2004_q3

VALUES LESS THAN (TO_DATE('2004-10-01','YYYY-MM-DD'))

TABLESPACE cdr2004q3,

PARTITION cdr2004_q4

VALUES LESS THAN (TO_DATE('2005-01-01','YYYY-MM-DD'))

TABLESPACE cdr2004q4 )

在 2005 年的时候,需要对表 ti_cdr 现有的表空间进行扩展,此时,由于用户数量的增加,这张表对空间的需求也增加了,所以,同样是存储一个季度的记录,表空间的存储空间需要相应增加。CREATE TABLESPACE cdr2005q1

DATAFILE 'E:\ORACLE\ORADATA\DESTDB\CDR2005Q1.ORA.ora'

SIZE 130M AutoExtend On Next 1 Maxsize 300728320

ALTER TABLE ti_cdr

ADD PARTITION cdr2005_q1

VALUES LESS THAN (TO_DATE('2005-07-01','YYYY-MM-DD'))

TABLESPACE cdr2005q1

在一定时间过后,需要删除不必要的分区空间alter table ti_cdr drop PARtiTION cdr2004_q1

在操作系统上删除该表空间对应的的数据文件

查看数据库中对应的表所对应的分区信息SELECT * FROM user_extents WHERE SEGMENT_NAME =’TI_CDR’

导出特定分区的数据oracle$ exp destdba/dba tables=ti_cdr:cdr2004_q1 rows=Y 

file=cdr2004_q1.dmp 

导入特定分区的数据

Page 7: Oracle 经验操作

oracle$ imp sales/sales_password FILE = cdr2004_q1.dmp 

tables=ti_cdr:cdr2004_q1 IGNORE=y 

创建同义词

在 oracle 中,如果将用户分成不用的角色,授予不同的权限,来保证系统的安全性的话,这样的话,一个用户如果要访问另外一个用户的表的话,就要在表对象前面加上该对象对应的创建用户的的名称,对于已经编好的程序而言,很不方便,可以利用 oracle 的同义词的功能。

创建同义词:create public synonym ti_cdr for voip.ti_cdr

如何创建临时表

create global temporary tablename(column list)

on commit preserve rows; --提交保留数据 会话临时表on commit delete rows; --提交删除数据 事务临时表临时表是相对于会话的,别的会话看不到该会话的数据。

查看功能

谁正在访问数据库?

Select c.sid, c.serial#, c.username, a.object_id, b.object_name, c.program, c.status, d.name,

c.osuser from v$Locked_object a, All_objects b, v$session c, audit_actions d where

a.object_id=b.object_id and a.session_id =c.sid(+) and c.command=d.action;

alter system kill session '&1,&2';

Select a.sid, a.serial#, a.username, a.status, a.program, b.name, a.osuser from v$session

a,audit_actions b where a.command=b.action And username='&1';

Page 8: Oracle 经验操作

谁被锁住?

Select a.sid, a.serial#, a.username, A.LOCKWAIT, a.status, a.program, b.name from

v$session a,audit_actions b where a.command=b.action AND LOCKWAIT IS NOT NULL;

谁在锁表?

Select a.sid, a.serial#, a.username, A.LOCKWAIT, a.status, a.program, b.name from

v$session a, audit_actions b where a.command=b.action AND STATUS='ACTIVE';

Select sid, serial#, object_name, row_wait_block#, row_wait_row#, row_wait_file# from

all_objects, v$session where row_wait_obj#=object_id and type='USER' and lockwait is not

null ;

Select sl.username, sl.sid, sl.serial# from v_$lock l1, v$session s1 where exists (select * from

v_$lock l2, v$session s2 where l2.sid=s2.sid and l2.id1=l1 and s2.lockwait=l2.kaddr and

request=0 and l1.sid=s1.sid) ;

select count(*) from v$session;

select count(*) from sys.v_$process;

select count(*) from sys.v_$transaction

查看一个用户拥有哪些表空间的实体信息

Select tablespace_name, owner, segment_name,segment_type from dba_segments where

owner='SyS' and segment_type='ROLLBACK' order by tablespace_name, owner,

segment_name ; break on owner on segment_name COLUMN segment_name FORMAT A15

cOLUMN tablespace_name FORMAT A15 COLUMN file_name FORMAT A20 SELECT

A.owner, a.segment_name, b.tablespace_name, b.file_name, sum(a.bytes) bytes from

dba_extents a, dba_data_files b where a.file_id-b.file_id group by a.owner, a.segment_name,

b.tablespace_name, b.file_name

如何检测 ROLLBACK SEGMENT 竞争?

select class, count from v$waitstat where class in ('system undo header', 'system undo block',

Page 9: Oracle 经验操作

'undo header', 'undo block') ; select sum(value) from v$sysstat where name in ('db block gets',

'consistents gets') ; 若 count/sum(value)大于 1%,则应考虑增加 ROLLBACK SEGMENT

如何查看什么时间有哪些数据库对象结构被修改过?

SELECT OBJECT_NAME,               --对象名      OBJECT_TYPE,              --对象类型      TO_CHAR(CREATED, 'YYYY-Mon-DD HH24:MI') CREATE_TIME,

--创建时间      TO_CHAR(LAST_DDL_TIME, 'YYYY-Mon-DD HH24:MI') MOD_TIME,

--修改时间      TIMESTAMP,                 --时间戳      STATUS                    --状态   FROM USER_OBJECTS

   WHERE to_char(LAST_DDL_TIME,'yyyymmdd')>'&日期变量'

查看 oracle 的版本

select banner from sys.v_$version

查看 oracle 的安装的参数

select * from sys.v_$option

判断 oracle 数据库的数据文件是否是自动扩展

select file_id,file_name,tablespace_name,autoextensible from dba_data_files order by file_id

查看哪些 session 正在使用哪些回滚段?

SELECT r.name 回滚段名,s.sid,

s.serial#,

s.username 用户名,t.status,

Page 10: Oracle 经验操作

t.cr_get,

t.phy_io,

t.used_ublk,

t.noundo,

substr(s.program, 1, 78) 操作程序FROM sys.v_$session s,sys.v_$transaction t,sys.v_$rollname r

WHERE t.addr = s.taddr and t.xidusn = r.usn

ORDER BY t.cr_get,t.phy_io

查看用户表所占空间大小

select segment_name,tablespace_name,bytes,blocks from user_segments where

segment_type='TABLE'

判断是否是 ITL 等待

当发生 enqueue resource 等待厉害的时候 如果要确诊是不是 ITL 等待

在 9i 中可以查询: SELECT OWNER, OBJECT_NAME

FROM V$SEGMENT_STATISTICS

WHERE STATISTIC_NAME = 'ITL waits'

AND VALUE > 0

9i 以前版本可以查询: Select s.sid SID,

      s.serial# Serial#,

      l.type type,

      ' ' object_name,

      lmode held,

      request request

      from v$lock l, v$session s, v$process p

Page 11: Oracle 经验操作

      where s.sid = l.sid and

            s.username <> ' ' and

            s.paddr = p.addr and

            l.type <> 'TM' and

            (l.type <> 'TX' or l.type = 'TX' and l.lmode <> 6)

union

select s.sid SID,

      s.serial# Serial#,

      l.type type,

      object_name object_name,

      lmode held,

      request request

      from v$lock l, v$session s, v$process p, sys.dba_objects o

      where s.sid = l.sid and

            o.object_id = l.id1 and

            l.type = 'TM' and

            s.username <> ' ' and

            s.paddr = p.addr

union

select s.sid SID,

      s.serial# Serial#,

      l.type type,

Page 12: Oracle 经验操作

      '(Rollback='||rtrim(r.name)||')' object_name,

      lmode held,

      request request

      from v$lock l, v$session s, v$process p, v$rollname r

      where s.sid = l.sid and

            l.type = 'TX' and

            l.lmode = 6 and

            trunc(l.id1/65536) = r.usn and

            s.username <> ' ' and

            s.paddr = p.addr

order by 5, 6

如何取出某个限定条件下的前 10 条记录

SELECT * FROM ti_account WHERE username like ‘0%’ AND rownum<11

如何查看数据库的字符集

select * from nls_database_parameters

查询一个分区表的方法

To select data out of a partitioned table, you can use the regular sql or

"select * from sales",

if you want to select data from a particular partition, you can use

Page 13: Oracle 经验操作

"select * from sales partition (q3)"

如上所示,将一个表建成分区表后,如果在查询的时候没有指定分区,可能不会提高表内数据的查询效率。

查看目前 oracle 数据库中执行了很长时间的 sql

select username,sid,opname,

round(sofar*100 / totalwork,0) || '%' as progress,

time_remaining,sql_text

from v$session_longops , v$sql

where time_remaining <> 0

and sql_address = address

and sql_hash_value = hash_value

查看目前系统中的存在的连接(session)对应的 sql 语句

SELECT t1.machine,t1.logon_time,t2.sql_text FROM v$session t1,v$sql t2 WHERE

t1.sql_address = t2.address

查看一个表所占用的磁盘空间

SELECT segment_name,bytes FROM user_segments WHERE segment_type='TABLE'

查询出来的是整个数据库中各个表所占用的空间,根据每个表的记录数,可以判断出每张表的每条记录所占用的空间。

查看当前用户的连接信息

select 'User: '|| user || ' on database ' || global_name,

' (term='||USERENV('TERMINAL')||

', audsid='||USERENV('SESSIONID')||')' as MYCONTEXT

from global_name;

Page 14: Oracle 经验操作

查询一张表中第几大的值

select level, max('col_name') from my_table

where level = '&n'

connect by prior ('col_name') > 'col_name')

group by level;

其中 my_table 是表名,'col_name'是字段名,'&n'是第几

查询一张表中第几小的值

select level, min('col_name') from my_table

where level = '&n'

connect by prior ('col_name') < 'col_name')

group by level

查询一个数据库 Schema 中的所有记录数

spool countall.tmp

select 'SELECT count(*), '''||table_name||''' from '||table_name||';'

from user_tables

查看当前数据库已经使用的天数

select SYSDATE-logon_time "Days", (SYSDATE-logon_time)*24 "Hours"

from sys.v_$session

where sid=1 /* this is PMON */

查看数据库中各个表空间所占用的磁盘空间情况

SELECT Total.name "Tablespace Name",

Free_space, (total_space-Free_space) Used_space, total_space

FROM

(select tablespace_name, sum(bytes/1024/1024) Free_Space

Page 15: Oracle 经验操作

from sys.dba_free_space

group by tablespace_name

) Free,

(select b.name, sum(bytes/1024/1024) TOTAL_SPACE

from sys.v_$datafile a, sys.v_$tablespace B

where a.ts# = b.ts#

group by b.name

) Total

WHERE Free.Tablespace_name = Total.name

查看每个数据文件的磁盘占用情况

COLUMN free_space_mb format 999999.90

COLUMN allocated_mb format 999999.90

COLUMN used_mb format 999999.90

SELECT SUBSTR (df.NAME, 1, 40) file_name, df.bytes / 1024 / 1024

allocated_mb,

((df.bytes / 1024 / 1024) - NVL (SUM (dfs.bytes) / 1024 / 1024, 0))

used_mb,

NVL (SUM (dfs.bytes) / 1024 / 1024, 0) free_space_mb

FROM v$datafile df, dba_free_space dfs

WHERE df.file# = dfs.file_id(+)

GROUP BY dfs.file_id, df.NAME, df.file#, df.bytes

ORDER BY file_name;

查看数据库去年每个月的增长情况

select to_char(creation_time, 'RRRR Month') "Month",

sum(bytes)/1024/1024 "Growth in Meg"

from sys.v_$datafile

where creation_time > SYSDATE-365

group by to_char(creation_time, 'RRRR Month')

/

Page 16: Oracle 经验操作

查看登录时间超过 1 个小时的连接

select sid,serial#,username,machine,trunc

(last_call_et/3600,2)||' hr'

last_call_et

from V$session where

last_call_et > 3600 and username is not null

查看数据库中有致命安全隐患的数据库用户及相应的权限

select grantee, privilege, admin_option

from sys.dba_sys_privs

where (privilege like '% ANY %'

or privilege in ('BECOME USER', 'UNLIMITED TABLESPACE')

or admin_option = 'YES')

and grantee not in ('SYS', 'SYSTEM', 'OUTLN', 'AQ_ADMINISTRATOR_ROLE',

'DBA', 'EXP_FULL_DATABASE', 'IMP_FULL_DATABASE',

'OEM_MONITOR', 'CTXSYS', 'DBSNMP', 'IFSSYS',

'IFSSYS$CM', 'MDSYS', 'ORDPLUGINS', 'ORDSYS',

'TIMESERIES_DBA')

查看数据库中有致命安全隐患的数据库用户及相应的角色

select grantee, granted_role, admin_option

from sys.dba_role_privs

where granted_role in ('DBA', 'AQ_ADMINISTRATOR_ROLE',

'EXP_FULL_DATABASE', 'IMP_FULL_DATABASE',

'OEM_MONITOR')

and grantee not in ('SYS', 'SYSTEM', 'OUTLN', 'AQ_ADMINISTRATOR_ROLE',

'DBA', 'EXP_FULL_DATABASE', 'IMP_FULL_DATABASE',

'OEM_MONITOR', 'CTXSYS', 'DBSNMP', 'IFSSYS',

Page 17: Oracle 经验操作

'IFSSYS$CM', 'MDSYS', 'ORDPLUGINS', 'ORDSYS',

'TIMESERIES_DBA')

查看 linux 系统中有权启动、停止 oracle 的操作系统用户

echo "Users that can startup, shutdown and admin Oracle Databases:"

echo

grep `grep ^dba /etc/group | cut -d: -f3` /etc/passwd

备份、恢复

如何导入指定的表

D:\>exp scott/tiger file=a.dmp

D:\>imp test/test fromuser=scott tables=emp file=a.dmp

D:\>imp test/test tables=dept file=a.dmp

说明:如果导出用户没有 DBA 权限,则导入用户可以不用指定 fromuser、touser 参数如果导出用户拥有 DBA 权限,则导入用户也必须拥有 DBA 权限

如何备份数据库中一个或者多个用户的数据

exp system/manager owner=(用户 1,用户 2,…,用户 n) file=导出文件

如何备份数据库中一个或者多个表

exp system/manager tables=(用户 1.表 1,用户 2.表 2)

Page 18: Oracle 经验操作

联机热备份失败后,如何打开数据库?

系统环境:

1、操作系统:Windows 2000

2、数据库: Oracle 8i R2 (8.1.6) for NT 企业版3、安装路径:C:\ORACLE

错误现象:

进行联机热备份时,服务器发生故障,如掉电,重新启动服务器,启动数据库时,无法打开数据库,Oracle 要求进行介质恢复,因为表空间还处在热备份状态。

模拟现象及解决方法:

先将数据库设置为归档模式

C:\>svrmgrl

svrmgrl>connect internal

svrmgrl>alter tablespace 表空间名 begin backup;

--表空间热备模式没结束就强行关闭数据库,造成错误svrmgrl>shutdown abort

svrmgrl>startup mount

--将此表空间的数据文件在没打开数据库时置成 end backup模式svrmgrl>alter database datafile '表空间的数据文件名' end backup;

--或执行表空间介质恢复svrmgrl>recover tablespace 表空间名;

svrmgrl>alter database open;

Oracle 数据库在 linux 下自动备份的设置

生成脚本:backup_full

Page 19: Oracle 经验操作

backup_cum

backup_inc

增加一个脚本,在/var/spool/cron/下面的 oracle,内容如下

# DO NOT EDIT THIS FILE - edit the master and reinstall.

# (/tmp/crontab.31464 installed on Fri Nov 28 16:49:39 2003)

# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)

0 01 * * 1 "/home/oracle/backup/backup_full"

0 01 * * 2 "/home/oracle/backup/backup_inc"

0 01 * * 3 "/home/oracle/backup/backup_inc"

0 01 * * 4 "/home/oracle/backup/backup_inc"

0 01 * * 5 "/home/oracle/backup/backup_cum"

0 01 * * 6 "/home/oracle/backup/backup_inc"

0 01 * * 0 "/home/oracle/backup/backup_inc"

表示的是周一的一点执行的是/home/oracle/backup/backup_full,…

使用 rman 进行数据库恢复

使用 rman 进行数据库恢复的时候,可能出现很多种情况:1、数据文件损坏

单个数据文件坏掉A、启动数据库,检查错误 SQL> startup

ORACLE instance started.

Total System Global Area 102020364 bytes

Fixed Size 70924 bytes

Variable Size 85487616 bytes

Database Buffers 16384000 bytes

Redo Buffers 77824 bytes

Database mounted.

ORA-01157: cannot identify/lock data file 3 - see DBWR trace file

ORA-01110: data file 3: 'D:\ORACLE\ORADATA\TEST\USER01.DBF'

B、先打开数据库 SQL> alter database datafile 3 offline drop;

Database altered.

SQL> alter database open;

Database altered.

C、恢复该表空间

Page 20: Oracle 经验操作

恢复脚本可以是恢复单个数据文件 run{

allocate channel c1 type disk;

restore datafile 3;

recover datafile 3;

sql 'alter database datafile 3 online';

release channel c1;

}

也可以是,恢复表空间 run{

allocate channel c1 type disk;

restore tablespace users;

recover tablespace users;

sql 'alter database datafile 3 online';

release channel c1;

}

当多个数据文件毁坏的时候A、启动数据库,检查错误 SQL> STARTUP

ORACLE instance started.

Total System Global Area 102020364 bytes

Fixed Size 70924 bytes

Variable Size 85487616 bytes

Database Buffers 16384000 bytes

Redo Buffers 77824 bytes

Database mounted.

ORA-01157: cannot identify/lock data file 1 - see DBWR trace file

ORA-01110: data file 1: 'D:\ORACLE\ORADATA\TEST\SYSTEM01.DBF'

B、查询 v$recover_file

SQL> select * from v$recover_file;

     FILE# ONLINE ERROR CHANGE# TIME

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

         1 ONLINE FILE NOT FOUND 0

         2 ONLINE FILE NOT FOUND 0

         5 ONLINE FILE NOT FOUND 0

         6 ONLINE FILE NOT FOUND 0

可以知道有四个数据文件需要恢复

C、利用 RMAN 进行恢复 C:\>rman

Recovery Manager: Release 8.1.6.0.0 - Production

RMAN> connect rcvcat rman/rman@back

Page 21: Oracle 经验操作

RMAN-06008: connected to recovery catalog database

RMAN> connect target internal/virpure

RMAN-06005: connected to target database: TEST (DBID=1788174720)

RMAN> run{

2> allocate channel c1 type disk;

3> restore database;

4> recover database;

5> sql 'alter database open';

6> release channel c1;

7> }

2、控制文件损坏一般来讲,oracle 数据库的控制文件都会进行镜像处理,可以将坏掉的控制文件用好的控制文件替换。损坏多个控制文件,或者人为的删除了所有的控制文件,通过控制文件的复制已经不能解决问题,这个时候需要重新建立控制文件。 同时注意,alter database backup control file to trace 可以产生一个控制文件的文本备份。 以下是详细重新创建控制文件的步骤 1、关闭数据库 SQL>shutdown immediate;

2、删除所有控制文件,模拟控制文件的丢失3、启动数据库,出现错误,并不能启动到 mount 下 SQL>startup

ORA-00205: error in identifying controlfile, check alert log for more info

查看报警日志文件,有如下信息 alter database mount

Mon May 26 11:53:15 2003

ORA-00202: controlfile: 'D:\Oracle\oradata\chen\control01.ctl'

ORA-27041: unable to open file

OSD-04002: unable to open file

O/S-Error: (OS 2) 系统找不到指定的文件。 4、关闭数据库 SQL>shutdown immediate;

5、在 internal或 sys 下运行如下创建控制文件的脚本,注意完整列出联机日志或数据文件的路径,或修改由 alter database backup control file to trace备份控制文件时产生的脚本,去掉多余的注释即可。 STARTUP NOMOUNT

CREATE CONTROLFILE REUSE DATABASE "TEST" NORESETLOGS NOARCHIVELOG

    MAXLOGFILES 32

    MAXLOGMEMBERS 2

    MAXDATAFILES 254

    MAXINSTANCES 1

Page 22: Oracle 经验操作

    MAXLOGHISTORY 226

LOGFILE

  GROUP 1 'D:\ORACLE\ORADATA\TEST\REDO01.LOG' SIZE 1M,

  GROUP 2 'D:\ORACLE\ORADATA\TEST\REDO02.LOG' SIZE 1M,

  GROUP 3 'D:\ORACLE\ORADATA\TEST\REDO03.LOG' SIZE 1M

DATAFILE

  'D:\ORACLE\ORADATA\TEST\SYSTEM01.DBF',

  'D:\ORACLE\ORADATA\TEST\RBS01.DBF',

  'D:\ORACLE\ORADATA\TEST\USERS01.DBF',

  'D:\ORACLE\ORADATA\TEST\TEMP01.DBF',

  'D:\ORACLE\ORADATA\TEST\TOOLS01.DBF',

  'D:\ORACLE\ORADATA\TEST\INDX01.DBF'

CHARACTER SET ZHS16GBK;

-- Recovery is required if any of the datafiles are restored backups,

-- or if the last shutdown was not normal or immediate.

RECOVER DATABASE

--if the last shutdown was not normal or immediate

--noarchive

-- RECOVER DATABASE UNTIL CANCELUSING BACKUP CONTROLFILE

--archive

-- RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL

-- Database can now be opened normally.

ALTER DATABASE OPEN;

--if recover database until cancel

--ALTER DATABASE OPEN RESETLOGS;

6、如果没有错误,数据库将启动到 open 状态下。

说明: 1、重建控制文件用于恢复全部数据文件的损坏,需要注意其书写的正确性,保证包含了所有的数据文件与联机日志 2、经常有这样一种情况,因为一个磁盘损坏,我们不能再恢复(store)数据文件到这个磁盘,因此在 store 到另外一个盘的时候,我们就必须重新创建控制文件,用于识别这个新的数据文件,这里也可以用这种方法用于恢复 5.3 损坏回滚数据文件的恢复方法 回滚段表空间中的一个数据文件丢失或者损坏导致数据库无法识别它,在启动数据库的时候会出现 ORA-1157, ORA-1110 的错误,或者操作系统级别的错误,例如 ORA-7360。在关闭数据库的时候(normal或者 immediate)会出现 ORA-1116, ORA-1110 的错误,或者操作系统级别的错误,例如 ORA-7368。

2、联机日志损坏

Page 23: Oracle 经验操作

管理功能

常用的 Text_io

Delcare out_file text_io.file_type;

Begin

out_file:=text_io.fopen('prn','w');

text_io.new_line(out_file,' ');

text_io.put_line(out_file,' ');

text_io.fclose(out_file);

End;

---文本输入输出 TEXT_IO TEXT_IO PACKAGE TEXT_IO.FCLOSE

TEXT_IO.FILE_TYPE

TEXT_IO.FOPEN

TEXT_IO.IS_OPEN

TEXT_IO.GET_LINE

TEXT_IO.NEW_LINE

TEXT_IO.PUT

TEXT_IO.PUTF

TEXT_IO.PUT_LINE

USING TEXT_IO CONSTRUCTS

Declare Out_file Text_io.file_type;

L Varchar2(100);

L1 Varchar2(100);

L2 Varchar2(100);

Begin

Out_file :=text_io.fopen('c:\ll\login.txt','r');

If text_io.is_open(Out_file) then

text_io.get_line(Out_file,L);

text_io.get_line(Out_file,L1);

text_io.get_line(Out_file,L2);

Else

Null;

End if; End;

---清除全局变量 erase('global.var_name');

Page 24: Oracle 经验操作

清除全局变量

erase('global.var_name');

删除重复记录

Delete from emp e where e.rowid > (select min(f.rowid) from emp f where

f.empno=e.empno);

监控 oracle 的性能

O r a c l e维护着一组称作动态性能表的表,数据库正常操作期间,这些表里的数据不断变化。大多数表包括与数据库性能有关的数据,而有一些表涉及到控制文件、数据文件、日志文件的信息和备份信息。还有一组为这些表生成的称作V _ $视图的视图集,这些视图以V $为前缀,开头具有公共同义词。一些V $对象(通常是指V $视图)在诊断日常问题并监视正常数据库活动和状态时非常有,另一些则在诊断与备份和恢复有关的问题时非常有用。下面是一些重要V $视图的列表:

视图名 说明V$ACCESS 正在使用的对象信息V$ARCHIVE 数据库的已存档事务日志信息V$BACKUP 数据库中所有联机表空间的备份状态信息V$BGPROCESS 数据库服务器后台进程信息V$CIRCUIT 一个多线程服务器配置中的所有通路信息V$DATABASE 数据库控制文件得到的关于数据库的信息V$DBFILE 数据库的数据库文件信息V$DB_OBJECT_CACHE 数据库服务器的对象高速缓存中的对象的信息,包括表、视

图、索引、过程、函数和包V$DISPATCHER 一个多线程数据库服务器中当前启动了的调度器的后台服

务器进程的信息V$ENABLEDPRIVS 被启用的权限信息V$FILESTAT 数据库文件的I/O统计信息V$FIXED_TABLE 数据库中的所有固定表的信息V$INSTANCE 数据库服务器当前状态信息V$LATCH 数据库的内部锁信息

Page 25: Oracle 经验操作

V$LATCHHOLDER 当前掌握着的内部锁的会话信息V$LATCHNAME 数据库的内部锁名信息V$LIBRARYCACHE 数据库高速缓存管理情况统计信息V$LICENSE ORACLE许可证限制信息V$LOADCSTAC 以直接路径方式使用Oralce Loader编译的统计信息V$LOCK 数据库服务器的DML锁信息V$LOG 数据库中事务日志信息V$LOGFILE 数据库中事务日志文件信息V$LOG_HISTORY 数据库中事务日志顺序历史信息V$MTS 多线程服务器配置的调整信息V$NLS_PARAMETERS 当前语言参数设置信息V$OPEN_CURSOR 每个数据库中打开的游标信息V$PARAMETER 每个数据库中初始化参数信息V$PROCESS 当前活动的进程信息V$QUEUE 多线程服务器队列的信息V$RECOVERY_LOG 执行数据库恢复时所需的已存档事务日志组信息V$RECOVERY_FILE 执行数据库恢复时需要恢复的数据文件状态信息V$REQDIST 请示次数统计信息V$RESOURCE 系统资源信息V$ROLLNAME 所有联机回滚段信息V$ROLLSTAT 所有联机回滚段统计信息V$ROWCACHE 数据字典活动情况统计信息V$SECONDARY 已经安装的从属数据库信息V$SESSION 数据库会话信息续表:

视图名 说明V$SESSION_EVENTS 每个会话及每个事件的等待统计信息V$SESSION_WAIT 会话正在等待的资源信息V$SESS_IO 每个会话使用I/O情况信息V$SGA 数据库服务器的SGA内存区域统计信息V$SHARED_SERVER 多线程数据库服务器的共享前台服务器信息V$SQLAREA 共享游标信息V$STATNAME 对V$SESSTAT中显示的会话统计码的描述V$SYSLABEL 系统标签信息V$SYSTAT 对V$SESSTAT中每个统计数据的全系统范围的统计信息V$SYSTEM_EVENTS 按会话计算的事务统计的系统信息V$THREAD 数据库事务日志的线程信息V$TIMER 精确到百分之一秒的当前系统时间V$TRANSACTION 当前数据库事务的信息V$TYDE_SIZE 有助于空间使用估计判断的数据信息V$VERSION ORACLE服务器核心软件库版本信息

Page 26: Oracle 经验操作

V$WAITSTAT 事务之间数据块竞争的统计信息

如何查询数据库中字符串字段中%

select * from ti_account where username like 'name\%' escape '\'

如何移动表或者表分区

[A]移动表的语法Alter table tablename move

[Tablespace new_name

Storage(initial 50M next 50M

pctincrease 0 pctfree 10 pctused 50 initrans 2) nologging]

移动分区的语法alter table tablename move (partition partname)

[update global indexes]

之后之后必须重建索引Alter index indexname rebuild

如果表有 Lob 段,那么正常的 Alter 不能移动 Lob 段到别的表空间,而仅仅是移动了表段,可以采用如下的方法移动 Lob 段alter table tablename move

lob(lobsegname) store as (tablespace newts);

如何移动数据文件

[A]1、关闭数据库,利用 os拷贝a.shutdown immediate关闭数据库b.在 os 下拷贝数据文件到新的地点c.Startup mount 启动到 mount 下d.Alter database rename datafile '老文件' to '新文件';

e.Alter database open; 打开数据库2、利用 Rman联机操作RMAN> sql "alter database datafile ''file name'' offline";

RMAN> run {

2> copy datafile 'old file location'

3> to 'new file location';

4> switch datafile ' old file location'

Page 27: Oracle 经验操作

5> to datafilecopy ' new file location';

6> }

RMAN> sql "alter database datafile ''file name'' online";

说明:利用 OS拷贝也可以联机操作,不关闭数据库,与 rman 的步骤一样,利用 rman

与利用 os拷贝的原理一样,在 rman 中 copy 是拷贝数据文件,相当于 OS 的 cp,而switch 则相当于 alter database rename,用来更新控制文件。

如何杀掉特定的数据库连接

A] Alter system kill session 'sid,serial#';

或者alter system disconnect session 'sid,serial#' immediate;

在 win 上,还可以采用 oracle 提供的 orakill杀掉一个线程(其实就是一个 Oracle 进程)在 Linux/Unix 上,可以直接利用 kill杀掉数据库进程对应的 OS 进程

如何捕获用户的登录信息

CREATE TABLE session_info

2 (username VARCHAR2(30),

3 logon_date DATE,

4 session_id VARCHAR2(30),

5 ip_addr VARCHAR2(30),

6 hostname VARCHAR2(30),

7 auth_type VARCHAR2(30));

Table created.

Here is the code for the BEFORE LOGOFF trigger:SQL> CREATE OR REPLACE TRIGGER trg_session_info

BEFORE LOGOFF

ON DATABASE

DECLARE

session_id VARCHAR2(30);

ip_addr VARCHAR2(30);

hostname VARCHAR2(30);

auth_type VARCHAR2(30);

BEGIN

SELECT sys_context ('USERENV', 'SESSIONID')

INTO session_id

FROM dual;

Page 28: Oracle 经验操作

SELECT sys_context ('USERENV', 'IP_ADDRESS')

INTO ip_addr

FROM dual;

SELECT sys_context ('USERENV', 'HOST')

INTO hostname

FROM dual;

SELECT sys_context ('USERENV', 'AUTHENTICATION_TYPE')

INTO auth_type

FROM dual;

INSERT INTO session_info VALUES

(user, sysdate, session_id, ip_addr, hostname, auth_type);

END;

如何监控数据库 DDL 的语句或者说数据库对象的变化

CREATE table DDL_TRACE

(

LOGIN_USER VARCHAR2(30) ,

DDL_TIME DATE ,

AUDSID NUMBER ,

DDL_SQL VARCHAR2(1023) )

[A]可以采用 DDL触发器,如CREATE OR REPLACE TRIGGER tr_trace_ddl

AFTER DDL ON DATABASE

DECLARE

sql_text ora_name_list_t;

state_sql ddl_trace.ddl_sql%TYPE;

BEGIN

FOR i IN 1..ora_sql_txt(sql_text) LOOP

state_sql := state_sql||sql_text(i);

END LOOP;

INSERT INTO ddl_trace(login_user,ddl_time,audsid,ddl_sql)

VALUES(user,SYSDATE,userenv('SESSIONID'),state_sql);

END tr_trace_ddl;

Page 29: Oracle 经验操作

如何监控数据库 DML 语句(SELECT 除外)

[A]可以采用 dml触发器,如CREATE OR REPLACE TRIGGER tr_capt_sql

BEFORE DELETE OR INSERT OR UPDATE

ON manager.test

DECLARE

sql_text ora_name_list_t;

state_sql capt$sql.sql_text%TYPE;

BEGIN

FOR i IN 1..ora_sql_txt(sql_text) LOOP

state_sql := state_sql || sql_text(i);

END LOOP;

INSERT INTO

capt$sql(login_user,capt_time,ip_address,audsid,owner,table_name,sql_text)

VALUES(ora_login_user,sysdate,sys_context('USERENV','IP_ADDRESS'),

userenv('SESSIONID'),'MANAGER','TEST',state_sql);

EXCEPTION

WHEN OTHERS THEN

sp_write_log('Capture DML Exception:'||SQLERRM);

END tr_capt_sql;

在创建以上触发器时要注意几点1、必须创建一个 capt$sql 的表,用来记录 ddl 的记录2、sp_write_log原本是一个写日志的过程,可以置换为自己的需要,如 null跳过。

删除表的命令的区别

drop table name 删除表,不能释放表空间truncate table 在删除表的同时,释放表空间

将数据库的配置改成归档模式

首先确认 Primary数据库是否在归档模式下

SQL> show user

USER is "SYS"

SQL>

Page 30: Oracle 经验操作

SQL> archive log list

Database log mode              Archive Mode

Automatic archival             Enabled

Archive destination            d:\oracle\oradata\demo\archive

Oldest online log sequence     42

Next log sequence to archive   44

Current log sequence           44

如果不在归档模式下,调整数据库。

首先提交命令修改 SPfile:

SQL>alter system set LOG_ARCHIVE_START=TRUE scope=spfile;

然后关闭数据库实例

 

SQL>SHUTDOWN

备份数据库

SQL>STARTUP MOUNT

SQL>ALTER DATABASE ARCHIVELOG;

SQL>ALTER DATABASE OPEN;

SQL>SHUTDOWN IMMEDIATE

1.2 设置本地归档目标

Page 31: Oracle 经验操作

SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=D:\

oracle\oradata\DEMO\Archive' SCOPE=BOTH;

此操作直接生效

在 linux 上安装 oracle失败后,手工删除 oracle 的方法

A.删除 oracle 的安装目录,oracle9 的默认目录是/opt/oracle,oracle8 的默认目录是/u01/oracle。

B.删除 /usr/local/bin/下的 dbhome、oraenv、coraenv

C.删除 /etc 下的 oratab、emtab、orainst.loc

D.删除 /etc/sysconfig 下的 oracle、oracle_ias

在 linux 上,oracle 自动启动的停止服务的步骤

E.安装 oracle 成功后F.下载 oraclerun9i-1.4-1.noarch.rpm

G.安装这个 rpm 文件,rpm ivh oraclerun9i-1.4-1.noarch.rpm

H.修改配置文件/etc 下的 oratab,修改相应 SID 的重启参数,例如*:/opt/oracle/product/9.2.0:N

OIDDB:/opt/oracle/product/9.2.0:Y

I. 修改/etc/profile.d/oracle.sh 文件中的环境变量,例如# Environment for Oracle

# change these settings according to your installation

# You MUST uncomment the following lines after changing

# the values appropriately

ORACLE_HOME=/opt/oracle/product/9.2.0

ORACLE_SID=OIDDB

# CONFIRM and check the path to the SDK

PATH=$PATH:$ORACLE_HOME/bin:/usr/java/j2sdk1.4.1/bin

TNS_ADMIN=$ORACLE_HOME/network/admin

ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data

LD_LIBRARY_PATH=${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}

Page 32: Oracle 经验操作

$ORACLE_HOME/lib

CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:

$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/network/jlib

export ORACLE_BASE ORACLE_HOME ORA_NLS33 ORACLE_SID PATH

LD_LIBRARY_PATH CLASSPATH TNS_ADMIN

# ORACLE_TERM=xterm; export ORACLE_TERM

NLS_LANG="simplified chinesei"; export NLS_LANG

J. 修改/etc/profile.d/oracle.csh 文件中的环境变量,例如# Environment for Oracle

# change these settings according to your installation

# You MUST uncomment the following lines after changing

# the values appropriately

setenv ORACLE_HOME /opt/oracle/product/9.2.0

setenv ORACLE_SID OIDDB

# CONFIRM and check the path to the JVM

setenv PATH ${PATH}:${ORACLE_HOME}/bin:/usr/java/j2sdk1.4.1/bin

setenv TNS_ADMIN ${ORACLE_HOME}/network/admin

setenv ORA_NLS33 ${ORACLE_HOME}/ocommon/nls/admin/data

setenv CLASSPATH ${ORACLE_HOME}/JRE:${ORACLE_HOME}/jlib:$

{ORACLE_HOME}/rdbms/jlib:${ORACLE_HOME}/network/jlib

if ( ${?LD_LIBRARY_PATH} ) then

setenv LD_LIBRARY_PATH

${LD_LIBRARY_PATH}:${ORACLE_HOME}/lib

else

setenv LD_LIBRARY_PATH ${ORACLE_HOME}/lib

endif

# setenv ORACLE_TERM xterm

setenv NLS_LANG "simplified chinese"

K.修改/etc/sysconfig/oracle 文件,配置启动的服务属性

# Start Oracle

# (Note: the environment variables are set in /etc/profile.d/oracle.sh)

#

START_ORACLE="yes"

#

Page 33: Oracle 经验操作

# Owner of Oracle installation (oracle/webdb will be started as that user)

#

ORA_OWNER=oracle

#

# Only done if START_ORACLE is "yes": start listener

# to allow other computers to connect to the database

#

START_LISTENER="yes"

#

# Only if START_ORACLE is "yes": start Oracle

# Intelligent Agent (if installed)

#

START_AGENT="no"

#

# Only if START_ORACLE is "yes": start

# the Apache that comes bundled with Oracle

#

START_ORA_APACHE="no"

#

# Only done if START_ORACLE is "yes": start Connection Manager to

# allow other computers to connect to the database across a NAT type network

#

START_CMANAGER="yes"

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

# Set the kernel parameters

# Have a look at the Oracle ReleaseNotes for the Oracle product you are

# using for how to set these values. If you do not set them we will assume

# some reasonable defaults for a small Oracle 9i database system.

#

# 1) max. shared memory available (does not mean that much is used)

# Enable use of up to 2 GB shared memory.

# Note: you don't have to use that much, this

# parameter only sets the maximum, that's it...

#

# You probably have to relink Oracle to get an Oracle SGA size

# larger than 512 MB. See the Oracle Admin. Guide, section

# "Relocating the SGA" for what to do. That was true for 8i,

# check 9i docs for how it works there.

#

SHMMAX=2147483648

SHMMNI=4096

#

# 2) sempahore values

#

Page 34: Oracle 经验操作

SEMMSL=250

SEMMNS=32000

SEMOPM=100

SEMMNI=128

修改 oracle 数据库的字符集

查看字符集――SELECT * FROM v$nls_parameters;

其中 nls_characterset

修改字符集――sqlplus /nolog

connect system/manager

create database character set 【字 符 集】, 中 文 中常用 到 字 符 集 包括( ZHS16GBK,

ZHS16CGB231280, WE8ISO8859P1)

删除某张表中的某个字段

-- drop table x

-- /

create table x(a date, b date, c date)

/

-- Drop column B:

alter table x set unused column b -- Mark col as UNUSED

/

select * from sys.dba_unused_col_tabs

/

alter table x drop unused columns

/

-- Drop column C (different method):

alter table x drop column c cascade constraints

/

Page 35: Oracle 经验操作

导出数据库中所有表的 DDL脚本

set arraysize 1

set echo off

set heading off

set feedback off

set verify off

set pagesize 0

set linesize 79

define 1 = &&SCHEMA_NAME

spool tbl_&&SCHEMA_NAME

set termout off

col x noprint

col y noprint

select 'rem **** Create Table DDL for '||chr(10)||

'rem **** '||username||''''||'s tables'||chr(10)||chr(10)

from dba_users

where username = upper ('voip')

/

select table_name y,

0 x,

'create table ' ||

rtrim(table_name) ||

'('

from dba_tables

where owner = upper('voip')

union

select tc.table_name y,

column_id x,

rtrim(decode(column_id,1,null,','))||

rtrim(column_name)|| ' ' ||

rtrim(data_type) ||

rtrim(decode(data_type,'DATE',null,'LONG',null,

'NUMBER',decode(to_char(data_precision),null,null,'('),

'(')) ||

rtrim(decode(data_type,

'DATE',null,

'CHAR',data_length,

'VARCHAR2',data_length,

'NUMBER',decode(to_char(data_precision),null,null,

to_char(data_precision) || ',' || to_char(data_scale)),

'LONG',null,

Page 36: Oracle 经验操作

'******ERROR')) ||

rtrim(decode(data_type,'DATE',null,'LONG',null,

'NUMBER',decode(to_char(data_precision),null,null,')'),

')')) || ' ' ||

rtrim(decode(nullable,'N','NOT NULL',null))

from dba_tab_columns tc,

dba_objects o

where o.owner = tc.owner

and o.object_name = tc.table_name

and o.object_type = 'TABLE'

and o.owner = upper('voip')

union

select table_name y,

999999 x,

')' || chr(10)

||' STORAGE(' || chr(10)

||' INITIAL ' || initial_extent || chr(10)

||' NEXT ' || next_extent || chr(10)

||' MINEXTENTS ' || min_extents || chr(10)

||' MAXEXTENTS ' || max_extents || chr(10)

||' PCTINCREASE '|| pct_increase || ')' ||chr(10)

||' INITRANS ' || ini_trans || chr(10)

||' MAXTRANS ' || max_trans || chr(10)

||' PCTFREE ' || pct_free || chr(10)

||' PCTUSED ' || pct_used || chr(10)

||' PARALLEL (DEGREE ' || DEGREE || ') ' || chr(10)

||' TABLESPACE ' || rtrim(tablespace_name) ||chr(10)

||'/'||chr(10)||chr(10)

from dba_tables

where owner = upper('voip')

order by 1,2

导出整个数据库中的索引的 DDL脚本

set arraysize 1

set echo off

set heading off

set feedback off

set verify off

set pagesize 0

set linesize 79

define 1 = &&SCHEMA_NAME

Page 37: Oracle 经验操作

spool ind_&&SCHEMA_NAME

set termout off

col y noprint

col x noprint

col z noprint

select 'rem **** Create Index DDL for '||chr(10)||

'rem **** '||username||''''||'s tables'||chr(10)||chr(10)

from dba_users

where username = upper ('&&1')

/

select table_name z,

index_name y,

-1 x,

'create ' || rtrim(decode(uniqueness,'UNIQUE','UNIQUE',null))

|| ' index ' ||

rtrim(index_name)

from dba_indexes

where table_owner = upper('&&1')

union

select table_name z,

index_name y,

0 x,

'on ' ||

rtrim(table_name) ||

'('

from dba_indexes

where table_owner = upper('&&1')

union

select table_name z,

index_name y,

column_position x,

rtrim(decode(column_position,1,null,','))||

rtrim(column_name)

from dba_ind_columns

where table_owner = upper('&&1')

union

select table_name z,

index_name y,

999999 x,

')' || chr(10)

||'unrecoverable ' || chr(10)

||'STORAGE(' || chr(10)

||'INITIAL ' || initial_extent || chr(10)

||'NEXT ' || next_extent || chr(10)

Page 38: Oracle 经验操作

||'MINEXTENTS ' || '1' || chr(10)

||'MAXEXTENTS ' || max_extents || chr(10)

||'PCTINCREASE '|| '0' ||')' || chr(10)

||'INITRANS ' || ini_trans || chr(10)

||'MAXTRANS ' || max_trans || chr(10)

||'PCTFREE ' || '0' || chr(10)

||'TABLESPACE ' || tablespace_name ||chr(10)

||'PARALLEL (DEGREE ' || DEGREE || ') ' || chr(10)

||'/'||chr(10)||chr(10)

from dba_indexes

where table_owner = upper('&&1')

order by 1,2,3

/

导出数据库中所有的触发器的 DDL脚本

set feedback off

set head off

set echo off

set recsep off

set pages 50000

set long 5000

set lines 200

column trigger_body format a9999 wrap word;

-- Write the script to a file, otherwise it is useless

spool mktrig.run

-- Write the SQL stastements to rebuild the triggers

select 'create or replace trigger ' || description, trigger_body,'/'

from user_triggers;

spool off;

-- Reset some stuff

set feedback on

set head on

set echo on

Page 39: Oracle 经验操作

数据库的用户的缺省密码,确认修改这些用户的密码

conn sys/change_on_install

/

conn system/manager

/

conn hr/hr

/

conn oe/oe

/

conn sh/sh

/

conn scott/tiger

/

conn adams/wood

/

conn jones/steel

/

conn clark/cloth

/

conn blake/paper

/

conn outln/outln

/

conn ctxsys/ctxsys

/

conn tracesvr/trace

/

conn dbsnmp/dbsnmp

/

conn ordplugins/ordplugins

/

conn ordsys/ordsys

/

conn mdsys/mdsys

/

conn dssys/dssys

/

conn perfstat/perfstat

/

conn csmig/csmig

Page 40: Oracle 经验操作

自动杀掉锁住对象的用户

下面是完成这个功能的存储过程,可以生成一个 job,每隔一段时间进行检查

create or replace procedure kill_locked_usr

(time in integer) as

my_cursor integer;

my_statement varchar2(80);

result integer;

cursor c1 is

select 'alter system kill session ' ||

||to_char(a.sid)||','||to_char(a.serial#)||

from v$session a, v$lock b

where a.sid = b.sid

and b.lmode = 6 and

a.username like 'THE_BOREING_USER' and

b.ctime > time;

begin

open c1;

loop

fetch c1 into my_statement;

exit when c1%notfound;

my_cursor := dbms_sql.open_cursor;

dbms_sql.parse(my_cursor,my_statement,dbms_sql.v7);

result :=dbms_sql.execute(my_cursor);

dbms_sql.close_cursor(my_cursor);

end loop;

close c1;

end;

/

-- then, you must submit the job

VARIABLE JOBNO NUMBER;

EXECUTE

DBMS_JOB.SUBMIT(:JOBNO,'KILL_LOCKED_USR(90);',SYSDATE,'SYSD

ATE+((1/86400)*30)',NULL);

COMMIT;

Page 41: Oracle 经验操作

-- in this case, if the user has a 90 seconds row

-- exclusive lock, will be killed