SlideShare une entreprise Scribd logo
1  sur  42
Oracle 经验操作
目            录

创建功能.....................................................................................................................................4
  创建数据库.........................................................................................................................4
  如何建立一个与现存数据库相同,但不包含数据的空库............................................4
  创建表空间.........................................................................................................................4
  创建一个基于多个分区的大表.........................................................................................5
  创建同义词.........................................................................................................................7
  如何创建临时表.................................................................................................................7
查看功能.....................................................................................................................................7
  谁正在访问数据库?...........................................................................................................7
  谁被锁住?...........................................................................................................................7
  谁在锁表?...........................................................................................................................8
  查看一个用户拥有哪些表空间的实体信息....................................................................8
  如何检测 ROLLBACK SEGMENT 竞争?........................................................................8
  如何查看什么时间有哪些数据库对象结构被修改过?................................................9
  查看 oracle 的版本.............................................................................................................9
  查看 oracle 的安装的参数.................................................................................................9
  判断 oracle 数据库的数据文件是否是自动扩展.............................................................9
  查看哪些 session 正在使用哪些回滚段?.......................................................................9
  查看用户表所占空间大小...............................................................................................10
  判断是否是 ITL 等待.......................................................................................................10
  如何取出某个限定条件下的前 10 条记录.....................................................................12
  如何查看数据库的字符集...............................................................................................12
  查询一个分区表的方法...................................................................................................12
  查看目前 oracle 数据库中执行了很长时间的 sql.........................................................13
  查看目前系统中的存在的连接(session)对应的 sql 语句........................................13
  查看一个表所占用的磁盘空间.......................................................................................13
  查看当前用户的连接信息...............................................................................................13
  查询一张表中第几大的值...............................................................................................14
  查询一张表中第几小的值...............................................................................................14
  查询一个数据库 Schema 中的所有记录数....................................................................14
  查看当前数据库已经使用的天数..................................................................................14
  查看数据库中各个表空间所占用的磁盘空间情况......................................................14
  查看每个数据文件的磁盘占用情况..............................................................................15
  查看数据库去年每个月的增长情况..............................................................................15
  查看登录时间超过 1 个小时的连接...............................................................................16
  查看数据库中有致命安全隐患的数据库用户及相应的权限......................................16
  查看数据库中有致命安全隐患的数据库用户及相应的角色......................................16
  查看 linux 系统中有权启动、停止 oracle 的操作系统用户.........................................17
备份、恢复...............................................................................................................................17
  如何导入指定的表...........................................................................................................17
如何备份数据库中一个或者多个用户的数据..............................................................17
  如何备份数据库中一个或者多个表..............................................................................17
  联机热备份失败后,如何打开数据库?......................................................................18
  Oracle 数据库在 linux 下自动备份的设置.....................................................................18
  使用 rman 进行数据库恢复.............................................................................................19
管理功能...................................................................................................................................23
  常用的 Text_io..................................................................................................................23
  清除全局变量...................................................................................................................24
  删除重复记录...................................................................................................................24
  监控 oracle 的性能...........................................................................................................24
  如何查询数据库中字符串字段中%..............................................................................27
  如何移动表或者表分区...................................................................................................27
  如何移动数据文件...........................................................................................................27
  如何杀掉特定的数据库连接...........................................................................................28
  如何捕获用户的登录信息...............................................................................................28
  如何监控数据库 DDL 的语句或者说数据库对象的变化............................................29
  如何监控数据库 DML 语句(SELECT 除外)............................................................29
  删除表的命令的区别.......................................................................................................30
  将数据库的配置改成归档模式.......................................................................................30
  在 linux 上安装 oracle 失败后,手工删除 oracle 的方法..............................................32
  在 linux 上,oracle 自动启动的停止服务的步骤..........................................................32
  修改 oracle 数据库的字符集...........................................................................................35
  删除某张表中的某个字段...............................................................................................35
  导出数据库中所有表的 DDL 脚本.................................................................................35
  导出整个数据库中的索引的 DDL 脚本.........................................................................37
  导出数据库中所有的触发器的 DDL 脚本.....................................................................39
  数据库的用户的缺省密码,确认修改这些用户的密码..............................................39
  自动杀掉锁住对象的用户...............................................................................................41
创建功能


创建数据库




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


    首先,导出数据库结构
    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: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 ,
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
创建同义词


  在 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:ORACLEORADATATESTUSER01.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:ORACLEORADATATESTSYSTEM01.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:Oracleoradatachencontrol01.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: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、 联机日志损坏
管理功能


常用的 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');
清除全局变量


  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$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         事务之间数据块竞争的统计信息
视图名                 说明
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           数据库会话信息

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


 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: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;
此操作直接生效
在 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,'SYSDATE+
   ((1/86400)*30)',NULL);
   COMMIT;
   --     in    this        case,     if       the      user        has       a     90     seconds    row
   -- exclusive lock, will be killed
Oracle 经验操作

Contenu connexe

Similaire à Oracle 经验操作 (8)

F5-Big_IP_LTM-Zh
F5-Big_IP_LTM-ZhF5-Big_IP_LTM-Zh
F5-Big_IP_LTM-Zh
 
Adobe premiere cs4
Adobe premiere cs4Adobe premiere cs4
Adobe premiere cs4
 
Curso
CursoCurso
Curso
 
Pla d'acció per al desenvolupament del contract manufacturing en el sector de...
Pla d'acció per al desenvolupament del contract manufacturing en el sector de...Pla d'acció per al desenvolupament del contract manufacturing en el sector de...
Pla d'acció per al desenvolupament del contract manufacturing en el sector de...
 
Cloud computing
Cloud computingCloud computing
Cloud computing
 
Moodle eskuliburua
Moodle eskuliburuaMoodle eskuliburua
Moodle eskuliburua
 
codi Html osanroma
codi Html osanromacodi Html osanroma
codi Html osanroma
 
Protocollo informatico manuale_usp_mantova
Protocollo informatico manuale_usp_mantovaProtocollo informatico manuale_usp_mantova
Protocollo informatico manuale_usp_mantova
 

Plus de Bob Huang

Cap信令原理
Cap信令原理Cap信令原理
Cap信令原理
Bob Huang
 
Gsm智能网原理
Gsm智能网原理Gsm智能网原理
Gsm智能网原理
Bob Huang
 
移动智能应答业务
移动智能应答业务移动智能应答业务
移动智能应答业务
Bob Huang
 
浙江电信移动业务接入实践20100513
浙江电信移动业务接入实践20100513浙江电信移动业务接入实践20100513
浙江电信移动业务接入实践20100513
Bob Huang
 
Introduction to-taobao-cdn-at-linuxfb-v0-2-100620101417-phpapp01
Introduction to-taobao-cdn-at-linuxfb-v0-2-100620101417-phpapp01Introduction to-taobao-cdn-at-linuxfb-v0-2-100620101417-phpapp01
Introduction to-taobao-cdn-at-linuxfb-v0-2-100620101417-phpapp01
Bob Huang
 
高性能网站建设指南
高性能网站建设指南高性能网站建设指南
高性能网站建设指南
Bob Huang
 
百度排名优化方法及注意事项
百度排名优化方法及注意事项百度排名优化方法及注意事项
百度排名优化方法及注意事项
Bob Huang
 
Random 101214055524-phpapp01
Random 101214055524-phpapp01Random 101214055524-phpapp01
Random 101214055524-phpapp01
Bob Huang
 
Mysql 101014202926-phpapp01
Mysql 101014202926-phpapp01Mysql 101014202926-phpapp01
Mysql 101014202926-phpapp01
Bob Huang
 
Introduction to-taobao-cdn-at-linuxfb-v0-2-100620101417-phpapp01
Introduction to-taobao-cdn-at-linuxfb-v0-2-100620101417-phpapp01Introduction to-taobao-cdn-at-linuxfb-v0-2-100620101417-phpapp01
Introduction to-taobao-cdn-at-linuxfb-v0-2-100620101417-phpapp01
Bob Huang
 
201001 100208094620-phpapp01
201001 100208094620-phpapp01201001 100208094620-phpapp01
201001 100208094620-phpapp01
Bob Huang
 
Mysql gdb-101022041146-phpapp01
Mysql gdb-101022041146-phpapp01Mysql gdb-101022041146-phpapp01
Mysql gdb-101022041146-phpapp01
Bob Huang
 

Plus de Bob Huang (13)

Vpmn业务
Vpmn业务Vpmn业务
Vpmn业务
 
Cap信令原理
Cap信令原理Cap信令原理
Cap信令原理
 
Gsm智能网原理
Gsm智能网原理Gsm智能网原理
Gsm智能网原理
 
移动智能应答业务
移动智能应答业务移动智能应答业务
移动智能应答业务
 
浙江电信移动业务接入实践20100513
浙江电信移动业务接入实践20100513浙江电信移动业务接入实践20100513
浙江电信移动业务接入实践20100513
 
Introduction to-taobao-cdn-at-linuxfb-v0-2-100620101417-phpapp01
Introduction to-taobao-cdn-at-linuxfb-v0-2-100620101417-phpapp01Introduction to-taobao-cdn-at-linuxfb-v0-2-100620101417-phpapp01
Introduction to-taobao-cdn-at-linuxfb-v0-2-100620101417-phpapp01
 
高性能网站建设指南
高性能网站建设指南高性能网站建设指南
高性能网站建设指南
 
百度排名优化方法及注意事项
百度排名优化方法及注意事项百度排名优化方法及注意事项
百度排名优化方法及注意事项
 
Random 101214055524-phpapp01
Random 101214055524-phpapp01Random 101214055524-phpapp01
Random 101214055524-phpapp01
 
Mysql 101014202926-phpapp01
Mysql 101014202926-phpapp01Mysql 101014202926-phpapp01
Mysql 101014202926-phpapp01
 
Introduction to-taobao-cdn-at-linuxfb-v0-2-100620101417-phpapp01
Introduction to-taobao-cdn-at-linuxfb-v0-2-100620101417-phpapp01Introduction to-taobao-cdn-at-linuxfb-v0-2-100620101417-phpapp01
Introduction to-taobao-cdn-at-linuxfb-v0-2-100620101417-phpapp01
 
201001 100208094620-phpapp01
201001 100208094620-phpapp01201001 100208094620-phpapp01
201001 100208094620-phpapp01
 
Mysql gdb-101022041146-phpapp01
Mysql gdb-101022041146-phpapp01Mysql gdb-101022041146-phpapp01
Mysql gdb-101022041146-phpapp01
 

Oracle 经验操作

  • 2. 录 创建功能.....................................................................................................................................4 创建数据库.........................................................................................................................4 如何建立一个与现存数据库相同,但不包含数据的空库............................................4 创建表空间.........................................................................................................................4 创建一个基于多个分区的大表.........................................................................................5 创建同义词.........................................................................................................................7 如何创建临时表.................................................................................................................7 查看功能.....................................................................................................................................7 谁正在访问数据库?...........................................................................................................7 谁被锁住?...........................................................................................................................7 谁在锁表?...........................................................................................................................8 查看一个用户拥有哪些表空间的实体信息....................................................................8 如何检测 ROLLBACK SEGMENT 竞争?........................................................................8 如何查看什么时间有哪些数据库对象结构被修改过?................................................9 查看 oracle 的版本.............................................................................................................9 查看 oracle 的安装的参数.................................................................................................9 判断 oracle 数据库的数据文件是否是自动扩展.............................................................9 查看哪些 session 正在使用哪些回滚段?.......................................................................9 查看用户表所占空间大小...............................................................................................10 判断是否是 ITL 等待.......................................................................................................10 如何取出某个限定条件下的前 10 条记录.....................................................................12 如何查看数据库的字符集...............................................................................................12 查询一个分区表的方法...................................................................................................12 查看目前 oracle 数据库中执行了很长时间的 sql.........................................................13 查看目前系统中的存在的连接(session)对应的 sql 语句........................................13 查看一个表所占用的磁盘空间.......................................................................................13 查看当前用户的连接信息...............................................................................................13 查询一张表中第几大的值...............................................................................................14 查询一张表中第几小的值...............................................................................................14 查询一个数据库 Schema 中的所有记录数....................................................................14 查看当前数据库已经使用的天数..................................................................................14 查看数据库中各个表空间所占用的磁盘空间情况......................................................14 查看每个数据文件的磁盘占用情况..............................................................................15 查看数据库去年每个月的增长情况..............................................................................15 查看登录时间超过 1 个小时的连接...............................................................................16 查看数据库中有致命安全隐患的数据库用户及相应的权限......................................16 查看数据库中有致命安全隐患的数据库用户及相应的角色......................................16 查看 linux 系统中有权启动、停止 oracle 的操作系统用户.........................................17 备份、恢复...............................................................................................................................17 如何导入指定的表...........................................................................................................17
  • 3. 如何备份数据库中一个或者多个用户的数据..............................................................17 如何备份数据库中一个或者多个表..............................................................................17 联机热备份失败后,如何打开数据库?......................................................................18 Oracle 数据库在 linux 下自动备份的设置.....................................................................18 使用 rman 进行数据库恢复.............................................................................................19 管理功能...................................................................................................................................23 常用的 Text_io..................................................................................................................23 清除全局变量...................................................................................................................24 删除重复记录...................................................................................................................24 监控 oracle 的性能...........................................................................................................24 如何查询数据库中字符串字段中%..............................................................................27 如何移动表或者表分区...................................................................................................27 如何移动数据文件...........................................................................................................27 如何杀掉特定的数据库连接...........................................................................................28 如何捕获用户的登录信息...............................................................................................28 如何监控数据库 DDL 的语句或者说数据库对象的变化............................................29 如何监控数据库 DML 语句(SELECT 除外)............................................................29 删除表的命令的区别.......................................................................................................30 将数据库的配置改成归档模式.......................................................................................30 在 linux 上安装 oracle 失败后,手工删除 oracle 的方法..............................................32 在 linux 上,oracle 自动启动的停止服务的步骤..........................................................32 修改 oracle 数据库的字符集...........................................................................................35 删除某张表中的某个字段...............................................................................................35 导出数据库中所有表的 DDL 脚本.................................................................................35 导出整个数据库中的索引的 DDL 脚本.........................................................................37 导出数据库中所有的触发器的 DDL 脚本.....................................................................39 数据库的用户的缺省密码,确认修改这些用户的密码..............................................39 自动杀掉锁住对象的用户...............................................................................................41
  • 4. 创建功能 创建数据库 如何建立一个与现存数据库相同,但不包含数据的空库 首先,导出数据库结构 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
  • 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',
  • 17. '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)
  • 18. 联机热备份失败后,如何打开数据库? • 系统环境: 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
  • 19. 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:ORACLEORADATATESTUSER01.DBF' B 、 先 打 开 数 据 库 SQL> alter database datafile 3 offline drop; Database altered. SQL> alter database open; Database altered. C 、 恢 复 该 表 空 间
  • 20. 复 脚 本 可 以 是 恢 复 单 个 数 据 文 件 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:ORACLEORADATATESTSYSTEM01.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
  • 21. 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:Oracleoradatachencontrol01.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
  • 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 $视图的列表:
  • 25. 视图名 说明 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 事务之间数据块竞争的统计信息
  • 26. 视图名 说明 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 数据库会话信息 续表:
  • 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 /
  • 40. 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
  • 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