Oracle 经验操作
Transcript of Oracle 经验操作
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
查看 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
创建功能
创建数据库
如何建立一个与现存数据库相同,但不包含数据的空库
首先,导出数据库结构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 "用户密码"
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
(
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
导入特定分区的数据
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';
谁被锁住?
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',
'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,
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
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,
'(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
"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;
查询一张表中第几大的值
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
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')
/
查看登录时间超过 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',
'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)
联机热备份失败后,如何打开数据库?
系统环境:
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
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、恢复该表空间
恢复脚本可以是恢复单个数据文件 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
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
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、联机日志损坏
管理功能
常用的 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');
清除全局变量
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 数据库的内部锁信息
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服务器核心软件库版本信息
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'
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;
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;
如何监控数据库 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>
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 设置本地归档目标
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:}
$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"
#
# 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
#
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
/
导出数据库中所有表的 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,
'******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
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)
||'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
数据库的用户的缺省密码,确认修改这些用户的密码
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
自动杀掉锁住对象的用户
下面是完成这个功能的存储过程,可以生成一个 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;
-- in this case, if the user has a 90 seconds row
-- exclusive lock, will be killed