oracle04_struc

 
--数据库实例是:
system global area  ---SGA 
program global area---PGA

--而数据库是:
SQL> ho ls $ORACLE_BASE/oradata/lijh
control01.ctl  ii.dbf        redo02.log    system01.dbf   users01.dbf
control02.ctl  perfstat.dbf  redo03.log    temp01.dbf     users02.dbf
control03.ctl  redo01.log    sysaux01.dbf  undotbs01.dbf

1、数据库启动与关闭步骤刚好相反

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup
ORACLE instance started.
Total System Global Area  603979776 bytes
Fixed Size                  1220772 bytes
Variable Size             205524828 bytes
Database Buffers          385875968 bytes
Redo Buffers               11358208 bytes
Database mounted.
Database opened.


--数据库启动三部曲:
startup nomount ---> instance  ---读初始化参数文件($ORACLE_HOME/dbs/spfilesid.ora),分配内存   
alter database mount; ---->挂载数据库  读controlfile .ctl    
alter database open; ---->打开数据库 read write     

1.SQL> startup nomount
ORACLE instance started.
Total System Global Area  603979776 bytes
Fixed Size                  1220772 bytes
Variable Size             209719132 bytes
Database Buffers          381681664 bytes
Redo Buffers               11358208 bytes

2.SQL> alter database mount; 
Database altered.

3.SQL> alter database open; 
Database altered.


2、创建和管理初始化参数文件

pfile  8i 和以前更早版本,只有init.ora初始化参数文件(文本文件)  可以vi  不适合7*24 
spfile  9i才有的,rman 可以备份  能够自我调节  一般存在服务器上 不能vi
路径:
SQL> ho ls $ORACLE_HOME/dbs
hc_clone.dat  hc_tech.dat  lkLIJH      orapwlijh      spfileclone.ora
hc_lijh.dat   init.ora     lkPOD       orapwpod       spfilelijh.ora
hc_ocm.dat    initdw.ora   lkTECH      orapwtech      spfilepod.ora
hc_pod.dat    lkCLONE      orapwclone  snapcf_lijh.f  spfiletech.ora


--修改spfile中的参数:
alter system set db_cache_size=100m scope=memory ;--->临时的内存里生效,下次重启数据库恢复原值 
alter system set db_cache_size=100m scope=spfile;--->下次重启数据库才生效
alter system set db_cache_size=100m scope=both(默认)---->永久生效

SQL> alter system set db_cache_size=100m scope=memory;
SQL> show parameter db_cache  
SQL> startup force
SQL> show parameter db_cache


--pfile与spfile相互创建:
create pfile='...' from spfile;
create spfile from pfile;


--若将spfile文件中的参数修改错误数据库启不来,解决:
   用以前备份的pfile文件启动再重新创建spfile,然后重启
SQL> startup nomount pfile='$ORACLE_HOME/dbs/initpod.ora';
SQL>  alter database  mount;
SQL>  alter database  open; 
SQL> create spfile from pfile;
SQL> startup force

SQL> show parameter spfile
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      /u01/app/oracle/product/10g/db
                                                 s/spfilepod.ora
--关闭数据库:
A=abort   --->不准许新的连接,不等待当前session结束,不等待当前事务结束,不做强制检查点
I=immediate --->不准许新的连接,不等待当前session结束,不等待当前事务结束,强制检查点并关闭文件
T=transaction ---->不准许新的连接,不等待当前session结束,等待当前事务结束,强制检查点并关闭文件
N=normal --->不准许新的连接,等待当前session结束,等待当前事务结束,强制检查点并关闭文件

干净又快速的关闭数据库 方法: shutdown immediate


3、诊断文件

altert_sid.log
bdump
udump
cdump

<alert.log>
记录命令
记录主要事件的结果
用于日常操作信息
用于诊断数据库错误
dba来管理

<后台跟踪文件>
记录后台进程检测到的错误
诊断和解决错误
位置: background_dump_dest
SQL> show parameter back%dest
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
background_dump_dest                 string      /u01/app/oracle/admin/pod/bdump

$ORACLE_BASE/admin/sid/bdump/alert_sid.log  -->路径


<用户跟踪进程>
由用户进程产生
包含sql信息
用户错误
SQL> show parameter user%dest
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
user_dump_dest                       string      /u01/app/oracle/admin/pod/udump

$ORACLE_BASE/admin/pod/udump/  -->路径


SQL> show parameter max_dump%
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
max_dump_file_size                   string      UNLIMITED ----默认的

SQL> alter system set max_dump_file_size=800; ---->800个 operating system block
SQL> alter system set max_dump_file_size='800m';
SQL> show parameter max_dump%
SQL> alter system set max_dump_file_size=unlimited;


4、控制文件

一个二进制文件
定义当前数据库物理状态
丢失需要恢复
维护数据库一致性

控制文件内容:
数据库名字和标识
表空间名字
数据文件和联机日志文件的物理位置和大小
检查点信息
归档信息
等....


控制文件默认有三个镜像,丢失任何一个丢要恢复,为避免介质故障,将它们放到不同的磁盘 
镜像控制文件步骤:
SQL> alter system set control_files='/u01/app/oracle/oradata/pod/control01.ctl',
  2  '/u01/app/oracle/oradata/pod/control02.ctl',             
  3  '/u01/app/oracle/oradata/pod/control03.ctl',
  4  '/u01/app/oracle/oradata/control04.ctl' scope=spfile;

SQL> shutdown immediate   

cp control*.ctl ......    拷贝到不同的磁盘

SQL> startup
SQL> show parameter control_fil


<获得控制文件>
v$controlfile
v$parameter
show parameter control_files

SQL> show parameter control_fil
SQL> select name from v$controlfile;
SQL> alter database backup controlfile to trace ;   --->udump 
SQL> alter database backup controlfile to trace as  '$ORACLE_BASE/aaa.txt'; -->备份出来的文件里面是脚本,有两段,运行set#1 可noresetlog重建控制文件  
SQL> alter database backup controlfile to '/u01/app/oracle/bak/con.bak';---二进制备份文件
SQL> ho more /u01/app/oracle/bak/con.bak


5、表空间和数据文件

--表空间:
	查看表空间:	select tablespace_name from dba_tablespaces;

	不可或缺的几个表空间:
		system -> 系统、字典表空间,不能被损坏
		undo   -> 回滚表空间,DML 把数据快照放到此,数据提交即消失
		sysaux -> 10g新增 高并发系统繁忙时造成system争用,将工具放到sysaux,减轻system 的压力,sysaux损坏不影响系统
		temp   -> 临时表空间,临时数据相关的内容
		users  -> 10g新增 用户数据从system拨离出

	创建和删除表空间:
		create tablespace d3 datafile 'xx.dbf' size 20m autoextend on next 1m maxsize 2g;  
		drop tablespace d3;
		create temporary tablespace temp1 tempfile 'xx.dbf' size 100m; 
		drop tablespace temp1;
		create undo tablespace undo1 datafile 'xx.dbf' size 445m; 

			10g ->新增加功能(区)extent management local       (段)segment space managment auto  
			10gr2 ->默认为extent management local               segment space managment auto 
		create tablespace d4 datafile 'xx.dbf' size 10m autoextend on  next 1m  maxsize unlimited 
		extent management local    segment space management manual ;
		查看:select tablespace_name,extent_management,segment_space_management from dba_tablespaces;

	tablespace 状态--> online,offline | read only,read write(online时) 
		alter tablespace users offline;  -->system,undo 没有offline
		alter tablespace users online; 
		alter tablespace users read only; -->DQL DDL ---NOT DML 
		alter tablespace users read write;
		查看状态:select file#,status,enabled from v$datafile;

		alter tablespace d4 add datafile '/d402.dbf' size 30m; ->添加dbf
		alter tablespace d4 drop datafile 11; ->可以删除为空的dbf,不能删除仅有的dbf,不能删除第一个dbf
		alter tablespace d4 rename to d5; ->重命名

		alter tablespace temp tablespace group tmp; -> 加入临时表空间组
		alter tablespace undo retention guarantee; -> 活动事务在undo存放时间必须到undo_retention指定时间才踢出 

	改默认表空间:
		alter database default tablespace users;
		alter database default temporary tablespace tmp;
	查看默认(临时)表空间:
		select property_name,property_value from database_properties where property_name in		
        ('DEFAULT_TEMP_TABLESPACE','DEFAULT_PERMANENT_TABLESPACE');
		select username,default_tablespace,temporary_tablespace from dba_users;

	表空间的配额限制:
		alter user uu1 quota 200m on users;
		alter user uu1 quota 100m on system;

========================================================================================
--datafile:  v$datafile  dba_data_files
	查看dbf:select file_id,file_name,tablespace_name ,bytes from dba_data_files;

	对dbf的操作:
		alter database datafile 'xx.dbf' autoextend on next 1m maxsize 1g; 
		alter database datafile 'xx.dbf' autoextend off; -> 自动增长关闭
		alter database datafile 'xx.dbf' resize 20m; -> 修改dbf大小
		alter database datafile 4 offline; -->不要轻易offline,除非是offline drop
		alter database datafile 4 offline drop;
		alter database rename file '' to ''; -> 重命名(步骤应是:表空间offline ,拷贝dbf ,alter ,表空间online)

--tempfile:  v$tempfile  dba_temp_files
	temp ->临时段数据,排序数据
	PGA  ->排序默认在内存PGA中,如内存不足,then temp tablespace  ----disk i/o

	查看: select file_name,tablespace_name from dba_temp_files;
	创建临时表空间:
		create temporary tablespace temp1 tempfile 'xx.dbf' size 100m;   
		create temporary tablespace temp2 tempfile 'xx.dbf' size 100m   tablespace group tmp;
		drop tablespace temp;
		alter tablespace temp1   tablespace group tmp;  --> 10g ->temp group
		alter database default temporary tablespace temp2;

--UNDO:
	参数:undo_retention      ----事务在undo保留时间上限默认900秒
	参数:undo_tablespace     ----当前的回滚表空间默认undotbs1 

	create undo tablespace  undo1 datafile 'xx.dbf' size 200m;
	alter system set undo_tablespace=undo1; 
	alter system set undo_retention=10800;
	alter tablespace undo1 retention guarantee; -> 活动事务在undo存放时间必须到undo_retention指定时间才踢出 
	select tablespace_name,retention from dba_tablespaces where tablespace_name='UNDO1';

	select name from v$rollname;  ----undo segment  自动默认分配10个
	alter rollback segment "_SYSSMU19{1}quot; offline;
	alter rollback segment "_SYSSMU19{1}quot; online; 

	delete from tt1;  ->DML
	查看当前回滚段表空间里是否有活动的事物:
	select s.username,t.ubafil,t.ubablk from v$session s,v$transaction t where s.saddr=t.ses_addr; ->查出记录
	rollback;
	select s.username,t.ubafil,t.ubablk from v$session s,v$transaction t where s.saddr=t.ses_addr; ->无记录
SQL> select tablespace_name, status from dba_tablespaces;

TABLESPACE_NAME                STATUS                                           
------------------------------ ---------                                        
SYSTEM                         ONLINE                                           
SYSAUX                         ONLINE                                           
UNDOTBS1                       ONLINE                                           
TEMP                           ONLINE                                           
USERS                          ONLINE                                           
LIU                            ONLINE      --online时的显示                                     

已选择6行。

SQL> select file#,ts#,status,enabled from v$datafile;

     FILE#        TS# STATUS  ENABLED                                           
---------- ---------- ------- ----------                                        
         1          0 SYSTEM  READ WRITE                                        
         2          1 ONLINE  READ WRITE                                        
         3          2 ONLINE  READ WRITE                                        
         4          4 ONLINE  READ WRITE                                        
         5          6 ONLINE  READ WRITE     --online时的显示                                  
         6          6 ONLINE  READ WRITE     --online时的显示                                  

已选择6行。

SQL> alter tablespace liu offline;

表空间已更改。

SQL> select tablespace_name, status from dba_tablespaces;

TABLESPACE_NAME                STATUS                                           
------------------------------ ---------                                        
SYSTEM                         ONLINE                                           
SYSAUX                         ONLINE                                           
UNDOTBS1                       ONLINE                                           
TEMP                           ONLINE                                           
USERS                          ONLINE                                           
LIU                            OFFLINE        --offline时的显示                                  
                                                                             
已选择6行。

SQL> select file#,ts#,status,enabled from v$datafile;

     FILE#        TS# STATUS  ENABLED                                           
---------- ---------- ------- ----------                                        
         1          0 SYSTEM  READ WRITE                                        
         2          1 ONLINE  READ WRITE                                        
         3          2 ONLINE  READ WRITE                                        
         4          4 ONLINE  READ WRITE                                        
         5          6 OFFLINE DISABLED         --offline时的显示                                 
         6          6 OFFLINE DISABLED         --offline时的显示                                 

已选择6行。

SQL> alter tablespace liu read only;     --online时才能将表空间read only|read write
alter tablespace liu read only
*
第 1 行出现错误: 
ORA-01539: 表空间 'LIU' 未联机 


SQL> alter tablespace liu online;

表空间已更改。

SQL> alter tablespace liu read only;

表空间已更改。

SQL> select tablespace_name, status from dba_tablespaces;

TABLESPACE_NAME                STATUS                                           
------------------------------ ---------                                        
SYSTEM                         ONLINE                                           
SYSAUX                         ONLINE                                           
UNDOTBS1                       ONLINE                                           
TEMP                           ONLINE                                           
USERS                          ONLINE                                           
LIU                            READ ONLY    --read only时的显示                                    

已选择6行。

SQL> select file#,ts#,status,enabled from v$datafile;

     FILE#        TS# STATUS  ENABLED                                           
---------- ---------- ------- ----------                                        
         1          0 SYSTEM  READ WRITE                                        
         2          1 ONLINE  READ WRITE                                        
         3          2 ONLINE  READ WRITE                                        
         4          4 ONLINE  READ WRITE                                        
         5          6 ONLINE  READ ONLY       --read only时的显示                                   
         6          6 ONLINE  READ ONLY       --read only时的显示                                   

已选择6行。

SQL> alter tablespace liu read write;

表空间已更改。

SQL> alter database datafile 6 offline;

数据库已更改。

SQL>  select tablespace_name, status from dba_tablespaces;

TABLESPACE_NAME                STATUS                                           
------------------------------ ---------                                        
SYSTEM                         ONLINE                                           
SYSAUX                         ONLINE                                           
UNDOTBS1                       ONLINE                                           
TEMP                           ONLINE                                           
USERS                          ONLINE                                           
LIU                            ONLINE          --数据文件offline,但表空间online                                 

已选择6行。

SQL>  select file#,ts#,status,enabled from v$datafile;

     FILE#        TS# STATUS  ENABLED                                           
---------- ---------- ------- ----------                                        
         1          0 SYSTEM  READ WRITE                                        
         2          1 ONLINE  READ WRITE                                        
         3          2 ONLINE  READ WRITE                                        
         4          4 ONLINE  READ WRITE                                        
         5          6 ONLINE  READ WRITE                                        
         6          6 RECOVER READ WRITE     --数据文件offline,状态变成recover,这里可以做恢复                            

已选择6行。

SQL> alter database datafile 6 online;         --无法online,必须先做recover再online
alter database datafile 6 online
*
第 1 行出现错误: 
ORA-01113: 文件 6 需要介质恢复
ORA-01110: 数据文件 6: 'F:\APP\ADMINISTRATOR\ORADATA\OCM\LIU02.DBF' 


SQL> recover datafile 6;                    --recover数据文件
完成介质恢复。
SQL>  select file#,ts#,status,enabled from v$datafile;

     FILE#        TS# STATUS  ENABLED                                           
---------- ---------- ------- ----------                                        
         1          0 SYSTEM  READ WRITE                                        
         2          1 ONLINE  READ WRITE                                        
         3          2 ONLINE  READ WRITE                                        
         4          4 ONLINE  READ WRITE                                        
         5          6 ONLINE  READ WRITE                                        
         6          6 OFFLINE READ WRITE      --recover完,数据文件状态变成offline                                 

已选择6行。

SQL> alter database datafile 6 online;        --将数据文件online

数据库已更改。

SQL> select file#,ts#,status,enabled from v$datafile;

     FILE#        TS# STATUS  ENABLED                                           
---------- ---------- ------- ----------                                        
         1          0 SYSTEM  READ WRITE                                        
         2          1 ONLINE  READ WRITE                                        
         3          2 ONLINE  READ WRITE                                        
         4          4 ONLINE  READ WRITE                                        
         5          6 ONLINE  READ WRITE                                        
         6          6 ONLINE  READ WRITE                                        

已选择6行。


 


6、重做日志文件

联机重做日志文件:
记录所有对数据的改变
提供恢复机制
能够分组
至少需要2个日志组


联机重做日志文件的结构:

group 1           group 2     group 3
member            member      member ----->disk 1
member             member     member ----->disk 2 

SQL> col member format a40;
SQL> select GROUP# ,MEMBER from v$logfile;
 GROUP# MEMBER
---------- ----------------------------------------
         3 /u01/app/oracle/oradata/pod/redo03.log
         2 /u01/app/oracle/oradata/pod/redo02.log
         1 /u01/app/oracle/oradata/pod/redo01.log

循环使用的
当一个联机日志文件被写满了,lgwr将移到下一个联机日志文件组
被称为日志切换
同时发生一个检查点
信息写到控制文件

强行日志切换:
alter system switch logfile;

SQL> select  GROUP# ,STATUS from v$log;
  GROUP# STATUS
---------- ----------------
         1 INACTIVE
         2 CURRENT
         3 INACTIVE


SQL> alter system switch logfile;

SQL>  select  GROUP# ,STATUS from v$log;
    GROUP# STATUS
---------- ----------------
         1 INACTIVE
         2 ACTIVE
         3 CURRENT


STATUS:
current ---->当前正在写的
ACTIVE---->激活状态 (ckpt正在读它... 归档模式,arcn正在读它....)
INACTIVe---->非激活状态

增加日志文件组成员:
SQL> alter database add logfile member
  2  '/u01/app/oracle/oradata/disk1/redo0102.log' to group 1,
  3  '/u01/app/oracle/oradata/disk1/redo0202.log' to group 2,
  4  '/u01/app/oracle/oradata/disk1/redo0302.log' to group 3;

增加日志组:
SQL> alter database add logfile group 4
  2  ('/u01/app/oracle/oradata/pod/redo0401.log',
  3  '/u01/app/oracle/oradata/disk1/redo0402.log') size 50m;

删除联机重做日志文件组:
SQL> alter database drop logfile group 4; ->当前正在写的日志组,不可以删除


可以查询的视图:
v$log
v$logfile
v$log_history


7、归档日志

写满了的联机重做日志文件可以被归档
归档方式的优势:
恢复: 有联机日志文件和归档文件可以恢复所有提交的事务
备份:可以联机状态下备份

SQL> show parameter log_archive_format
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_format                   string      %t_%s_%r.dbf

%s----->序列号 
%r----->resetlogs  

SQL> show parameter db_rec  --闪回区路径和大小,默认2g 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest                string      /u01/app/oracle/flash_recovery_area
db_recovery_file_dest_size           big integer 2G


--将数据库改为归档模式:
SQL> archive log list;
Database log mode              No Archive Mode
Automatic archival             Disabled       <--
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     30
Current log sequence           32

SQL> shutdown immediate

SQL> startup mount

SQL> alter database archivelog;

SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled    <--
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     30
Next log sequence to archive   32
Current log sequence           32

SQL> alter database open;

# ps-ef |grep ora_arc
oracle   26772     1  0 10:26 ?        00:00:00 ora_arc0_pod ----归档进程
oracle   26774     1  0 10:26 ?        00:00:00 ora_arc1_pod
oracle   26777     1  0 10:26 ?        00:00:00 ora_arc2_pod

--默认不指定归档路径,那么将归档文件放在闪回区域
生产环境,我们一定要将归档路径指定到独立的一块盘 

SQL> alter system set log_archive_dest_1='location=/u01/app/oracle/archivelog/pod/';

SQL> show parameter log_archive_dest_1
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_1                   string      location=/u01/app/oracle/archivelog/pod/
log_archive_dest_10                  string

[oracle@emrep pod]$ ll
total 632
-rw-r----- 1 oracle oinstall 463360 Aug 10 10:32 1_35_726313888.dbf
-rw-r----- 1 oracle oinstall 141824 Aug 10 10:32 1_36_726313888.dbf
-rw-r----- 1 oracle oinstall  27136 Aug 10 10:32 1_37_726313888.dbf
[oracle@emrep pod]$ pwd
/u01/app/oracle/archivelog/pod

--默认分配log_archive_max_processes 指定的个数
SQL> show parameter log_arch%max
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_max_processes            integer     2

SQL> alter system set log_archive_max_processes=4;

SQL> show parameter log_arch%max
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_max_processes            integer     4

# ps -ef|grep ora_arc
oracle   26772     1  0 10:26 ?        00:00:00 ora_arc0_pod
oracle   26774     1  0 10:26 ?        00:00:00 ora_arc1_pod
oracle   27716     1  0 10:37 ?        00:00:00 ora_arc2_pod
oracle   27718     1  0 10:37 ?        00:00:00 ora_arc3_pod
--默认分配log_archive_max_processes 指定的个数,但是在业务高峰期,切换非常频繁情况下,lgwr进程会自动启动多个归档进程,最多30个


8、日志挖掘

oracle 10g 使用logmnr在线分析挖掘日志,使用当前在线的数据字典

--1.查找当前日志
SQL> select * from v$log where status='CURRENT';
    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
FIRST_CHANGE# FIRST_TIM
------------- ---------
         2          1         39   52428800          2 NO  CURRENT
      1009280 10-AUG-10

--2.查看日志成员
SQL> SELECT MEMBER FROM V$LOGFILE WHERE GROUP#=2;
MEMBER
--------------------------------------------------
/u01/app/oracle/oradata/pod/redo02.log
/u01/app/oracle/oradata/disk1/redo0202.lo

--3.执行一些操作:
SQL> CREATE table fff as select * from dba_users;
--4.添加日志并分析
SQL> exec dbms_logmnr.add_logfile('/u01/app/oracle/oradata/pod/redo02.log',dbms_logmnr.new);
SQL> exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
--5.查看分析结果
SQL> desc v$logmnr_contents
SQL> select sql_redo,TIMESTAMP ,username from v$logmnr_contents where sql_redo like '%CREATE table fff as select * from dba_users%';
SQL_REDO
--------------------------------------------------------------------------------
TIMESTAMP           USERNAME
------------------- ------------------------------
CREATE table fff as select * from dba_users;
2010-08-10 11:03:02
--6.结束日志挖掘
SQL> exec dbms_logmnr.end_logmnr         
SQL> select sql_redo,TIMESTAMP ,SESSION#, TABLE_NAME  from v$logmnr_contents ;  ->再访问v$logmnr_contents报错
ERROR at line 1:
ORA-01306: dbms_logmnr.start_logmnr() must be invoked before selecting from
v$logmnr_contents


9、db link

	link 是一个数据库对象,创建此对象的用户需要是dba或者拥有create database link权限
	--权限:select role,privileg from role_sys_privs where privileg='CREATE DATABASE LINK';
	
	--创建link:	
		grant create database link to tom;  -> 授权
		conn tom/tom   -> 连接
		create database link ycwl connect to scott identified by tiger using 'cat'; --> 前提tnsping cat能通
		insert into e1@ycwl values(100); -> 使用link访问cat库.DQL,DML. --不要作DDL操作
	--查询link:
		select owner,db_link,host,username from dba_db_links;
	--全局link :
		必须是dba才能创建public database link,所有用户都能使用全局link连接 
		create public database link lg connect to scott identified by tiger using 'cat';
		conn scott/tiger
		select * from e1@lg;  
	--删除link:
		drop database link link_name;
		drop public database link link_name;

 

10、审计

	参数:audit_file_dest  决定路径 默认 /u01/app/oracle/admin/pod/adump
	参数:audit_trail   决定追踪目标 默认 NONE
		--audit_trail 参数值:
			NONE : 默认值 不做审计
			DB: 将审计记录在相关表中,如aud$,审计的结果只有连接信息
			DB,EXTENDED: 这样审计结果里面除了连接信息还有当时执行的具体语句
			OS:将审计在操作系统文件中,audit_file_dest参数指定
	--激活审计:
		alter system set audit_trail=db,extended scope=spfile;
		startup force

	--开始审计:
		audit all on scott.emp by access;
		audit select,insert,delete on scott.emp by access whenever successful;
				by access : 每个被审计的操作都会生成一条audit trail 
				by session : 一个会话里面同类型的操作只生成一条记录,默认为by session 
				(同一个会话,insert ,update,delete,select 为同一类型操作,只会记录一条)

				whenever successful : 操作成功才审计
				whenever not successful: 反之,操作不成功才审计
				默认,不管操作成功与否都记录

	--查看: 
		select username,obj_name,sql_text from dba_audit_trail;
	--撤销审计: 
		noaudit all on scott.emp;
	--查看哪些对象开启了审计:
		desc dba_obj_audit_opts
	--清理审计信息:
		delete from aud$; ->dba_audit_trail自动清楚记录


11、外部表

extenal table: 外部表,将表放在指定路径而非表空间  
    创建路径:   
        create directory lijh as  '/u01/app/oracle/extenalbak/';  
        grant all on  directory lijh to tom;  
    创建外部表:  
        create table test11   
        organization external   
          (  
          type oracle_datapump    ->文件类型 dmp  
          default directory lijh  ->路径  
          location ('test11.dmp') ->文件名称,不用再写路径了  
          )  
        as select * from scott.dept; ->结构, 或者在第一行指定表结构  
  
    txt文件内容导入外部表:  
        create table xx (a number,b varchar2(20),c varchar2(20))  
        organization external   
          (  
          type oracle_loader     ->文件类型 loader  
          default directory dir  ->路径  
          access parameters  
             (records delimited by newline  ->以换行作为一条记录结束  
             fields terminated by ','      ->以 逗号 作为分隔,空格作为分隔的话要写 whitespace  
             missing field values are null ->没有的值设为空  
             (a,b,c))  
          location('xx.txt')    ->文件名称  
          ); 

--将alert日志建成外部表		  
create table alertlog(text varchar2(999))
organization external
  (type oracle_loader
   default directory bdumpdir
   access parameters
	 (records delimited by newline
      fields
      reject rows with all null fields)
   location('alert_ocm.log')
  );
  
--查看alert日志  
select * from (select lag(text,1) over(order by rownum) s1,text from alertlog) where text like '%&keyword%';
例如输入 to log,可看每组日志的first time



12、内置的数据库对象

在数据库中创建的其他对象:
	数据字典
	性能表
	PL/SQL包
	数据库事件触发器

<数据字典>
	每个Oracle数据库的中枢,描述数据库和它的对象,由Oracle服务器自己维护
	包含只读的表和视图,存储在SYSTEM表空间中,拥有者是SYS用户

	数据字典包括两个部分:
	   基础表:存储数据库的描述,create database命令创建(sql.bsq)
	   数据字典视图:用于简化基础表的信息,通过public同义词访问,由脚本catalog.sql创建

			创建数据字典视图:
				@?/rdbms/admin/catalog.sql ----> 创建常用的数据字典视图和同义词
				@?/rdbms/admin/catproc.sql ---->生成要运行脚本所需要的PL/SQL

	数据字典的内容,提供下列信息:
		逻辑和物理的数据库结构,对象的定义和空间分配,一致性限制,用户,角色,权限,审计

	数据字典的主要用途:
		Oracle服务器用它查找下列信息:用户,对象,存储结构
		Oracle服务器修改数据字典当DDL语句执行的时候.
		用户和管理员们利用它了解数据库的信息.

	三类静态视图:dba_(包含所有的对象), all_(当前用户能够访问的对象), user_(当前用户拥有的对象)

	一般的概况: dictionary, dict_columns
	对象: dba_tables, dba_indexes, dba_tab_columns, dba_constraints --->user_ ,all_
	空间分配: dba_segments, dba_extents
	数据库结构: dba_tablespaces, dba_data_files

<动态性能表>
	虚表,记录当前数据库的活动,不停的更新,用于监控和调整数据库
	所有者是SYS用户,以v$开头,在v$fixed_table有全部的动态性能表

	v$controlfile
	v$database
	v$datafile
	v$instance
	v$parameter
	v$session
	v$sga
	v$spparameter
	v$tablespace
	v$thread
	v$version

	关于版本
	v$version
	v$option


13、分区表

分区表:
	将大表分成几个较小的部分,分别存储在不同表空间,其中每个小部分都可以看成是单独的表。三种:range  hash  list
	--一个table 只能有一个tablespace,一个tablespace可有多个dbf,在不同的磁盘hash存放,只要有一盘挂掉,table不能访问 
		而分区表挂了某一块盘,其它盘仍然可以访问

	range
		按范围建分区表
			create table trans(id int,trans_dt date) 
			partition by range(trans_dt)
			  (partiton p1 values less than (to_date('2009-07-01','yyyy-mm-dd')) tablespace users,
			  partiton p2 values less than (to_date('2010-01-01','yyyy-mm-dd')) tablespace users,
			  partiton p3 values less than (to_date('2010-07-01','yyyy-mm-dd')) tablespace d2,
			  partiton p4 values less than (to_date('2011-01-01','yyyy-mm-dd')) tablespace tools
			  );

		增加一个区,设定无穷大值:
			alter table trans add partition pmax values less than(maxvalue) tablespace system;
		访问分区表的某个区:
			select * from r2 partition(p3); 

		获得分区表信息:
			desc dba_part_tables	->subpartitioning_type
			desc dba_tab_partitions    ->high_value

	hash
		以hash建分区表,目的纯粹是为减轻磁盘负担:
			create table r2 (a int,b varchar2(80)) 
			partition by hash(a)
			  (partition p1 tablespace users,
			  partition p2 tablespace system
			  ); 

		增加一个分区:
			alter table r2 add partition p3 tablespace ii;

	list
		按某个值建分区表:
			create table r3 (city varchar2(80),id int) 
			partition by list(city)
			  (partition p1 values('SZ','GZ'),
			  partition p2 values('BJ','SH')
			  );
		增加一个分区,设置默认在哪个区:
			alter table r3 add partition p3 values(default);

	分裂分区表:
		alter table t_part_range   split partition p2
		at (to_date('2009/10','yyyy/mm'))  into (partition p2,partition p4);

14、版本升级

版本升级(分软件和数据库): 10.2.0.1  -> 10.2.0.4
	1. 要求:
		system表空间 >10m
		shared_pool_size >150m  ->暂时先把sga_target调为0,内存即不再自动调配了,再set 参数
		java_pool_size >150m

~~~~~这个脚本检查 system free~~~~~
set line 110
col f.tablespace_name format a15
col d.tot_grootte_mb format a10
col ts-per format a15
select upper(f.tablespace_name) "ts-name",
       d.tot_grootte_mb "ts-bytes(m)",
       d.tot_grootte_mb - f.total_bytes "ts-used (m)",
       f.total_bytes "ts-free(m)",
       to_char(round((d.tot_grootte_mb - f.total_bytes) / d.tot_grootte_mb * 100,
                     2),
               '990.99') "ts-per"
         from (select tablespace_name,
               round(sum(bytes) / (1024 * 1024), 2) total_bytes,
               round(max(bytes) / (1024 * 1024), 2) max_bytes
          from sys.dba_free_space
         group by tablespace_name) f,
       (select dd.tablespace_name,
               round(sum(dd.bytes) / (1024 * 1024), 2) tot_grootte_mb
          from sys.dba_data_files dd
         group by dd.tablespace_name) d
where d.tablespace_name = f.tablespace_name
order by 5 desc;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-------或用这个脚本检查 system free-----
select a.tablespace_name, a.total, a.total-f.free use, f.free, round(1-f.free/a.total,2) "USE%"
from
  (select tablespace_name,sum(bytes/1048576) total from dba_data_files group by tablespace_name) a,
  (select tablespace_name,round(sum(bytes/1048576)) free from dba_free_space group by tablespace_name) f
where a.tablespace_name=f.tablespace_name(+)
order by "USE%" desc;
--------------------------------------


select file_name,bytes/1024/1024,tablespace_name from dba_data_files;
alter database datafile '/oracle/oradata/red/system01.dbf' resize 800m;

show parameter db_cache
show parameter shared_pool_size
show parameter java_pool_size
alter system set sga_target=0;   ---->内存不再自动调配了
alter system set db_cache_size=100m;
alter system set java_pool_size=150m;
alter system set shared_pool_size=150m;


	2.停库,全备份
	3.升级软件
		./runinstall -> oracle
		root.sh      -> root
	4.更新字典,(每个库都要做)
		startup upgrade
		@?/rdbms/admin/catupgrd.sql
	5.重编译失效对象:
		startup force
		@?/rdbms/admin/utlrp.sql
		select comp_name,version,status from sys.dba_registry; -->升级后的检测
		select * from utl_recomp_errors;  ->看有无失效对象
	6.重启库:
		startup force

若升级失败,回退:
	startup downgrade
	@catdwgrd.sql(10.2.0.1运行的是这个,而10.1降级用的是d92000.sql,即dold_release.sql)
	startup force 


15、查看和修改字符集

修改字符集
	查看字符集:
		select * from nls_database_parameters where  parameter='NLS_CHARACTERSET';  ->默认为 WE8ISO8859P1
	修改方法:  
		1. 停库,全备份
		2. 独占模式
			startup mount; 
			alter system enable restricted session;
			alter system set job_queue_processes=0;
			alter database open;
		3.改字符集
			alter database character set  ZHS16GBK; ->ERROR:superset of old character set,改为低版的会报错
			alter database character set internal_use  ZHS16GBK;  ->强制改为低版
		4.取消独占模式
			startup force mount;
			alter system disable restricted session; 


16、物化视图

<物化视图>
	顾名思义,物化视图不是虚表,而是保存在磁盘上的表。在大型数据库中使用sum,count,avg,min,max等。

权限: create materialized view,select ,create table  等 
要查询重写引用别的模式中的物化视图管理,query_rewrite_enable=TRUE

创建:
	CREATE materalized view mv1 as  
	select * from a,b,c 
	where a...
	group by  
	order by  ;

创建方法: build immediate  ,build deferred 
	build immediate --->创建物化视图的时候就生成数据,默认
	build deferred ---->创建不生成数据,以后根据需要生成数据

刷新方式:
	complete:刷新对整个mv完全刷新 
	fast:快速,增量刷新  --> 要有mv log
	force: 选择性刷新,如果可以用fast方式,就采用fast,否则采用完全刷新 (complete) 默认
	nerver: 从不刷新 
  
	on demand :根据需要手工刷新  job ,mview
	on commit: 基表数据变化,并且commit,触发刷新物化视图

手动刷新:
	execute dbms_mview.refresh('mymv');    
__________________________________________
eg1:
建mv log:
	create materialized view log on scott.emp;  -->log 使mv能fast刷新
	drop materialized view log on scott.emp;
	create materialized view log on scott.emp tablespace users with rowid; --> rowid有增加记录到日志

创建物化视图:
	create materialized view mv10
	build deferred
	refresh force
	on demand
	start with to_date('2010-08-13 10:30:00','yyyy-mm-dd hh24:mi:ss')
	next sysdate + 1/24/12  -->5分钟刷新一次
	as
	select * from scott.emp;

修改已经建立好的物化视图的刷新时间: 
	1.查看job:
	select job,last_date,what from user_jobs;
	       JOB LAST_DATE WHAT
	---------- --------- ---------------------------------------------
	        41 13-AUG-10 dbms_refresh.refresh('"SYS"."MV10"');

	2.改刷新时间:
	begin
	dbms_job.interval(job=>41,interval=>'sysdate +1/48');
	end;
	/

删除物化视图:
	drop materialized view  mv10;
	drop materialized view log on scott.emp;
___________________________________________
eg2:
create materialized view mv11
build immediate
refresh on commit
enable query rewrite
as
select * from scott.emp;

SQL> select count(*) from mv11;

SQL> delete from scott.emp 
  2  where rownum<2;
SQL> commit;

SQL> select count(*) from mv11;
___________________________________________
eg 3:
普通用户创建物化视图并刷新mv的权限:
grant create materialized view to scott;
grant execute on dbms_mview to scott;  -->可手动刷新的权限
conn soctt/tiger

create materialized view mv12
as
select * from emp;

execute dbms_mview.refresh('mv12','c'); -->手动刷新
___________________________
eg4
访问另一台机的表创建物化视图
SQL> create user solo identified by solo account unlock;
SQL> grant connect,resource to solo;
SQL> grant create materialized view to solo;
SQL> grant execute on dbms_mview to solo;
SQL> grant create database link to solo;
SQL> conn solo/solo
SQL> create database link lpod connect to scott identified by tiger using 'sun';
SQL> select count(*) from t_131@lpod;
SQL> create materialized view memp refresh force  as select * from t_131@lpod;
SQL> select count(*) from memp;
SQL> execute dbms_mview.refresh('memp'); 


17、健康脚本

conn / as sysdba
spool htalthcheck.log
whenever sqlerror continue;
set lines 1000
select count(*) from dba_data_files;
select count(*) from v$tablespace;
select sum(bytes)/1024/1024 as "sum(bytes)" from dba_data_files;
select group#,bytes/1024/1024 from v$log;
archive log list;
select * from v$version;
select * from v$option where value='TRUE';

select pool,round(pool_bytes/1048576),round(100*pool_bytes/total_sga,2) pervent 
from (select sum(bytes) total_sga from v$sgastat),
(select nvl(pool,name) pool,sum(bytes) pool_bytes from v$sgastat group by nvl(pool,name)) 
order by 3 desc;

select pool,name,bytes from v$sgastat;
select name,status from v$controlfile;
select group#,status,member from v$logfile;

select tablespace_name,contents,extent_management from dba_tablespaces
where contents='TEMPORARY';

select username,default_tablespace,temporary_tablespace from dba_users where temporary_tablespace='SYSTEM';

select username,default_tablespace from dba_users
where username not in ('SYS','SYSTEM')
and default_tablespace='SYSTEM';

select upper(f.tablespace_name) "ts-name",
       d.tot_grootte_mb "ts-bytes(m)",
       d.tot_grootte_mb - f.total_bytes "ts-used (m)",
       f.total_bytes "ts-free(m)",
       to_char(round((d.tot_grootte_mb - f.total_bytes) / d.tot_grootte_mb * 100,2),'990.99') "ts-per"
from (select tablespace_name,
               round(sum(bytes) / (1024 * 1024), 2) total_bytes,
               round(max(bytes) / (1024 * 1024), 2) max_bytes
      from sys.dba_free_space
      group by tablespace_name
     ) f,
     (select dd.tablespace_name,
               round(sum(dd.bytes) / (1024 * 1024), 2) tot_grootte_mb
      from sys.dba_data_files dd
      group by dd.tablespace_name) d
where d.tablespace_name = f.tablespace_name
order by 5 desc;


spool off




 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值