5. ACCOUNT UNLOCK
/
GRANT CONNECT TO 用户名称
/
GRANT DBA TO 用户名称
/
GRANT UNLIMITED TABLESPACE TO 用户名称
/
创建一个基于多个分区的大表
下面利用 voip 项目中得 ti_cdr 的表来示例,将这张表中每个季度产生的数据存放在一
个表空间内。
创建分区
Create tablespace CDR2004Q1
DataFile
'E:ORACLEORADATADESTDBCDR2004Q1.ORA'
Size 104857600 AutoExtend On Next 1 Maxsize 300728320
Create tablespace CDR2004Q2
DataFile
'E:ORACLEORADATADESTDBCDR2004Q2.ORA'
Size 104857600 AutoExtend On Next 1 Maxsize 300728320
Create tablespace CDR2004Q3
DataFile
'E:ORACLEORADATADESTDBCDR2004Q3.ORA'
Size 104857600 AutoExtend On Next 1 Maxsize 300728320
Create tablespace CDR2004Q4
DataFile
'E:ORACLEORADATADESTDBCDR2004Q4.ORA'
Size 104857600 AutoExtend On Next 1 Maxsize 300728320
创建表
假设表有四个字段,在 2004 年中每个季度产生的数据存放在一个单独的表空间内
create table TI_CDR
(
ACCTSTARTTIME DATE ,
ACCTSTOPTIME DATE ,
6. 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:ORACLEORADATADESTDBCDR2005Q1.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
7. 创建同义词
在 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
8. 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
9. 如何查看什么时间有哪些数据库对象结构被修改过?
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,
10. 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
11. 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,
12. 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)"
13. 如上所示,将一个表建成分区表后,如果在查询的时候没有指定分区,可能不会提高表内数据
的查询效率。
查看目前 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;
14. 查询一张表中第几大的值
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
15. (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')
/
16. 查看登录时间超过 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',
22. LOGFILE
GROUP 1 'D:ORACLEORADATATESTREDO01.LOG' SIZE 1M,
GROUP 2 'D:ORACLEORADATATESTREDO02.LOG' SIZE 1M,
GROUP 3 'D:ORACLEORADATATESTREDO03.LOG' SIZE 1M
DATAFILE
'D:ORACLEORADATATESTSYSTEM01.DBF',
'D:ORACLEORADATATESTRBS01.DBF',
'D:ORACLEORADATATESTUSERS01.DBF',
'D:ORACLEORADATATESTTEMP01.DBF',
'D:ORACLEORADATATESTTOOLS01.DBF',
'D:ORACLEORADATATESTINDX01.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、 联机日志损坏
23. 管理功能
常用的 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:lllogin.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');
24. 清除全局变量
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 $视图的列表:
27. 如何查询数据库中字符串字段中%
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";
28. 说明:利用 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;
29. 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
30. 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
31. Archive destination d:oracleoradatademoarchive
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:oracleoradata
DEMOArchive' SCOPE=BOTH;
此操作直接生效
32. 在 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
33. # 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
#
34. 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
35. 修改 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
36. 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
37. 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)
38. 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)
39. ||'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
/
41. 自动杀掉锁住对象的用户
下面是完成这个功能的存储过程,可以生成一个 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,'SYSDATE+
((1/86400)*30)',NULL);
COMMIT;
-- in this case, if the user has a 90 seconds row
-- exclusive lock, will be killed