Oracle ---体系结构

来源:互联网 发布:snmpv3 trap java 编辑:程序博客网 时间:2024/06/05 19:00


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

查询语句工作方式

select * from scott.emp where empno=7839;

至少有两种访问路径:
  全表扫描
  索引访问

将sql语句中的所有打印符号还原成ascii码,传给hash函数,生成hash_value

1.解析
PGA扫描:从pga的cursor info中寻找当前的sql语句,如果命中转入执行阶段,如果失败则进行共享池扫描
        (pga命中快速软解析成功)
共享池扫描:扫描library cache,如果命中转入执行阶段,如果失败则进行硬解析
        (共享池命中软解析成功)
硬解析:语法分析(校验语句是否存在违反oracle sql规则的语法)
       语义分析(校验语句中所涉及到的用户、对象的存在否及有效性)
          select username from dba_users where username='SCOTT';
          select table_name from dba_tables
           where table_name='EMP' and owner='SCOTT';
          select column_name from dba_tab_columns
           where table_name='EMP' and owner='SCOTT';
       安全审核:发出sql语句的用户是否拥有相应的对象权限
       优化:优化器在后台筛选对象的最佳访问路径
       行资源生成:将筛选出来的计划写入library cache和pga的cursor info
                 SELECT STATEMENT
                   TABLE ACCESS BY INDEX ROWID
                     INDEX UNIQUE SCAN

2.执行
按照【执行计划】,访问后台对象

3.获取
向客户端回传结果集(结果集在服务器端过滤得到)

select * from scott.emp where empno=7839;
select * from scott.dept;
##################################################################################


口令文件:

记录超级用户的户名和口令
实现超级的安全审核

安全审核:
数据库审核:只能实现普通用户的安全审核
外部审核: 操作系统审核&口令文件审核

操作系统审核 : oracle用户要属于dba组
conn / as sysdba

关闭操作系统审核
# gpasswd -d oracle dba
conn sys/uplooking as sysdba

操作系统审核的优先级别高于口令文件审核
# gpasswd -a oracle dba
conn kjsadhj/weuriweou as sysdba

查看口令文件中有哪些用户
SYS@ orcl> select * from v$pwfile_users;

USERNAME               SYSDB SYSOP SYSAS
------------------------------ ----- ----- -----
SYS                   TRUE  TRUE  FALSE

SYS@ orcl> select NAME,PASSWORD from user$ where name='SYS';

NAME                   PASSWORD
------------------------------ ------------------------------
SYS                   2FE484ED5A72DF29

将用户加入到口令文件
grant sysdba to scott;

口令文件的位置和命名规则
$ORACLE_HOME/dbs/orapw$ORACLE_SID
重建口令文件
orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=oracle
##################################################################################
查看数据库所有的初始化参数:
select name,value from v$parameter;

*只有一个参数没有默认值:db_name

查看非默认值的初始化参数:
select name,value from v$parameter where ISDEFAULT<>'TRUE';

初始化参数的属性:
静态参数:参数在内存中的当前值不允许被修改
select NAME,ISSYS_MODIFIABLE from v$parameter where ISSYS_MODIFIABLE='FALSE';

动态参数:参数在内存中的当前值可以修改
select NAME,ISSYS_MODIFIABLE from v$parameter where ISSYS_MODIFIABLE<>'FALSE' order by 2;

DEFERRED  : 修改之后对于已持续连接无效
IMMEDIATE : 修改之后全局生效

参数文件:记录非默认值的初始化参数;约束实例的行为,参数文件只有数据库启动时被读取一次!

参数文件的种类:
spfile:
二进制文件
只能放在server端
只能使用sql命令修改spfile中的参数值
spfile$ORACLE_ID.ora
spfile.ora

pfile:
文本文件
可以放在server端,也可以放在client端
只能使用文本编辑器修改文件中的参数值
init$ORACLE_SID.ora

参数文件的默认路径:
$ORACLE_HOME/dbs/

如何简单的查看参数在内存中的取值
SQL> show parameter open_cursors
如何简单的查看参数在spfile中的取值
SQL> show spparameter open_cursors
$ strings spfileorcl.ora | grep open_cursors

1.使用spfile启动的实例,如何修改动态参数的内存值
alter system set open_cursors=400 scope=memory;

2.使用spfile启动的实例,如何修改动态参数在spfile中的值
alter system set open_cursors=500 scope=spfile;

3.使用spfile启动的实例,如何修改动态参数的内存值和spfile中的值
alter system set open_cursors=600;
alter system set open_cursors=600 scope=both;

4.使用spfile启动的实例,如何修改静态参数在spfile中的值(重新启动实例后参数值生效)
alter system set processes=300 scope=spfile;
startup force

*千万不要使用文本编辑器修改并保存spfile!会破坏spfile格式!

如何使用spfile创建pfile?
create pfile from spfile;

如何查看当前使用的是何种参数文件启动的?
SYS@ orcl> show parameter spfile
如果有值就是spfile启动的,如果value为空就是pfile启动的

如何使用pfile启动实例?
将spfile改名或者删除!重新启动数据库!因为spfile优先级别高于pfile!

使用pfile启动实例的时候alter system命令没有scope选项!alter system命令只能修改内存!

5.使用pfile启动的实例,如何修改动态参数的内存值
alter system set open_cursors=400;

6.使用pfile启动的实例,如何修改动态参数在pfile中的值
使用文本编辑器直接修改pfile

7.使用pfile启动的实例,如何修改动态参数的内存值和pfile中的值
先使用alter system命令修改内存值,在使用文本编辑器修改pfile中的值
alter system set open_cursors=600;

8.使用pfile启动的实例,如何修改静态参数在pfile中的值(重新启动实例后参数值生效)
使用文本编辑器直接修改pfile
startup force

启动数据库时改变pfile的默认路径
SYS@ orcl> startup pfile='/home/oracle/1.ora'

如何使用pfile创建spfile?
create spfile='/home/oracle/2.ora' from pfile='/home/oracle/1.ora';

启动数据库时改变spfile的默认路径
vi $ORACLE_HOME/dbs/initorcl.ora
----------------------------------
spfile='/home/oracle/2.ora'
----------------------------------

将spfile写入字符设备,使用设备充当参数文件
使用dd命令创建二进制文件
dd if=/dev/zero of=/home/oracle/disk bs=1M count=10
将文件变成块设备(循环设备)
# losetup /dev/loop1 /home/oracle/disk
将块设备变成字符设备
# raw /dev/raw/raw1 /dev/loop1
修改设备属组
# chown oracle. /dev/raw/raw1
将spfile创建到字符设备
create spfile='/dev/raw/raw1' from pfile='/home/oracle/1.ora';
将spfile值针指向字符设备
vi $ORACLE_HOME/dbs/initorcl.ora
----------------------------------
spfile='/dev/raw/raw1'
----------------------------------
SYS@ orcl> startup force

创建pfile,启动一个新的实例
vi $ORACLE_HOME/dbs/initdemo.ora
---------------------------------
db_name='demo'
---------------------------------

一个参数文件启动两个不同属性的实例:
strings spfile.ora
-----------------------
demo.db_name='demo'
orcl.db_name='orcl'
-----------------------

export ORACLE_SID=demo
export ORACLE_SID=orcl
###################################################################################
跟踪文件的管理:实例管理的外部文件
1.审计文件
show parameter audit_file_dest
/u01/app/oracle/admin/orcl/adump
默认情况下有三种操作会被审计:超级用户的连接和数据库的起停
ORA-09925: Unable to create audit trail file

2.诊断文件
show parameter diagnostic_dest
/u01/app/oracle/diag/rdbms/orcl/orcl/trace

警报日志:alert_$ORACLE_SID.log
后台进程的跟踪文件(故障诊断):$ORACLE_SID_<后台进程名字>_<后台进程的系统pid>.trc
用户进程的跟踪文件(会话产生的sql):$ORACLE_SID_ora_<服务进程的系统pid>.trc
截获指定用户的sql语句写入用户进程的跟踪文件
exec dbms_system.set_sql_trace_in_session(sid,serial#,boolean);

查找指定会话的sid和serial#
select sid,serial#,machine from v$session where username='SCOTT';
打开跟踪
exec dbms_system.set_sql_trace_in_session(250,39,true);
执行sql
关闭跟踪
exec dbms_system.set_sql_trace_in_session(250,39,false);
格式化跟踪文件:
tkprof orcl_ora_6288.trc 1.txt sys=no
查看跟踪文件翻译后的版本
vi 1.txt
#################################################################################
数据库启动:分三个阶段 nomount --> mount --> open
shutdown --> nomount
startup nomount
做了什么?
分配实例;写跟踪文件

查看数据库启动到哪一个阶段
SYS@ orcl> select status from v$instance;

STATUS
------------
STARTED

需要什么?
参数文件
实例管理的目录

我们可以做什么?
查看参数
修改参数
查看内存信息
select * from v$sgainfo;
查看进程信息
select name from v$bgprocess where paddr<>'00';
select count(*) from v$process;
创建数据库
重新创建控制文件
----------------------------------------------
shutdown --> startup mount
nomount --> alter database mount;

做了什么?
加载控制文件的信息到内存

需要什么?
需要控制文件

我们可以做什么?
查看与存储相关的信息(数据库包含哪些物理文件,但并不校验文件的存在否)
备份、还原、恢复数据库
对数据文进行offline(但不能操作tablespace)
移动文件
打开和关闭数据库的存档模式(归档模式)
----------------------------------------------
shutdown --> startup
nomount --> alter database mount; --> alter database open;
mounted --> alter database open;

做了什么?
按照控制的指针校验所有的联机日志文件和数据文件的存在否及有效性,加载所有文件!

需要什么?
需要联机日志文件和数据文件

我们可以做什么?
添删改查 。。。

---------------------------------------------------------------------------------
数据库启动流程:     【nomount】                        【mount】           【open】
ORACLE_SID --> PARAMETER FILE --> control_files -->controlfile-->online redolog & datafile
#################################################################################
停止数据库:四种模式
1.正常停库:shutdown & shutdown normal
新的连接不允许建立(不包括sys)
等待查询结束
等待事务结束
强制产生检查点
关闭联机日志和数据文件
关闭控制文件
关闭实例

2.事务级停库:shutdown transactional
新的连接不允许建立(不包括sys)
不等待查询(查询被强制终止)
等待事务结束
强制产生检查点
关闭联机日志和数据文件
关闭控制文件
关闭实例

3.立即停库(生产库最常用的停库手段): shutdown immediate
新的连接不允许建立(不包括sys)
不等待查询(查询被强制终止)
不等待事务(事务被回退)
强制产生检查点
关闭联机日志和数据文件
关闭控制文件
关闭实例

4.强制停库:shutdown abort
对于数据库相当于拔电源,停止之后是脏库(没有数据同步),重启的时候需要实例恢复(smon)

startup force nomount = shutdown abort + startup nomount
startup force mount = shutdown abort + startup mount
startup force = shutdown abort + startup
##################################################################################
手工创建数据库(demo):
1.修改系统环境变量
export ORACLE_SID=demo

2.创建口令文件
orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=oracle

3.创建参数文件
vi $ORACLE_HOME/dbs/initdemo.ora
-------------------------------------------------------------
db_name='demo'
compatible=11.2.0.4.0
sga_target=800m
control_files='/u01/app/oracle/oradata/demo/control01.ctl'
audit_file_dest='/u01/app/oracle/admin/demo/adump'
diagnostic_dest='/u01/app/oracle'
db_recovery_file_dest_size=4g
db_recovery_file_dest='/u01/app/oracle/fast_recovery_area'
undo_tablespace=undo01
-------------------------------------------------------------

4.创建参数文件中所需要的所有目录
mkdir -p /u01/app/oracle/oradata/demo/
mkdir -p /u01/app/oracle/admin/demo/adump
mkdir -p /u01/app/oracle/fast_recovery_area

5.创建spfile并启动实例
sqlplus / as sysdba
SYS@ demo> create spfile from pfile;
SYS@ demo> startup nomount

6.创建数据库:控制文件、数据文件、联机日志
create database demo
datafile '/u01/app/oracle/oradata/demo/system01.dbf' size 200m autoextend on next 10m extent management local
sysaux datafile '/u01/app/oracle/oradata/demo/sysaux01.dbf' size 100m autoextend on next 10m
default temporary tablespace temp tempfile '/u01/app/oracle/oradata/demo/temp01.dbf' size 50m
undo tablespace undo01 datafile '/u01/app/oracle/oradata/demo/undo01.dbf' size 100m
character set zhs16gbk
national character set al16utf16
logfile
group 1 '/u01/app/oracle/oradata/demo/redo01.log' size 50m,
group 2 '/u01/app/oracle/oradata/demo/redo02.log' size 50m;

7.创建数据字典,构造PL/SQL运行环境
@?/rdbms/admin/catalog
@?/rdbms/admin/catproc
###################################################################################
控制文件的管理:
控制文件记录数据库的物理信息
最少需要一个
最多可以同时指定8个
控制文件的位置和数量由参数决定(control_files)
所有的控制文件都是镜像关系

控制文件中记录的内容:
select TYPE,RECORD_SIZE,RECORDS_TOTAL,RECORDS_USED from v$controlfile_record_section;

数据库使用的控制文件数量:
show parameter control_files

增加控制文件:
alter system set control_files=
'/u01/app/oracle/oradata/demo/control01.ctl',
'/u01/app/oracle/oradata/demo/control02.ctl'
scope=spfile;

shut immediate

cp -v /u01/app/oracle/oradata/demo/control01.ctl /u01/app/oracle/oradata/demo/control02.ctl

startup

查找警报日志的路径
show parameter background

移动控制文件:
减少控制文件:

控制文件丢失:数据库如果没有停
# lsof | grep control01.ctl
cd /proc/2046/fd/
ll
256 -> /u01/app/oracle/oradata/demo/control01.ctl (deleted)
257 -> /u01/app/oracle/oradata/demo/control02.ctl (deleted)
cp -v 256 /home/oracle/control01.ctl

shut abort
# cp /home/oracle/control01.ctl /u01/app/oracle/oradata/demo/control01.ctl
# cp /home/oracle/control01.ctl /u01/app/oracle/oradata/demo/control02.ctl
# chown oracle. /u01/app/oracle/oradata/demo/*.ctl
startup

重建控制文件:控制文件中最重要最核心的内容是所有数据文件的头!
create controlfile reuse database demo noarchivelog noresetlogs
datafile
'/u01/app/oracle/oradata/demo/system01.dbf',
'/u01/app/oracle/oradata/demo/sysaux01.dbf',
'/u01/app/oracle/oradata/demo/undo01.dbf'
logfile
'/u01/app/oracle/oradata/demo/redo01.log',
'/u01/app/oracle/oradata/demo/redo02.log';

SYS@ demo> alter database open;
alter database open
*
ERROR at line 1:
ORA-01113: file 1 needs media recovery
ORA-01110: data file 1: '/u01/app/oracle/oradata/demo/system01.dbf'

SYS@ demo> recover database;
Media recovery complete.
SYS@ demo> alter database open;
###################################################################################
联机日志文件:
以组为单位工作
数据库正常工作至少需要两组联机日志
每组联机日志至少需要一个成员
组是逻辑的,成员是容器!!
同一组下可以有多个和成员,同一组下的成员是镜像关系
组之间是切换运行
切换规则是优先覆盖sequence#最小的组

查看联机日志的工作状态
select * from v$log;
查看联机日志的存储信息
select * from v$logfile;
手工切换日志
alter system switch logfile;
手工产生检查点
alter system checkpoint;
估算联机日志切换的频率
select to_char(FIRST_TIME,'ddhh24'),count(1) from v$log_history group by to_char(FIRST_TIME,'ddhh24') order by 1;
current组重新又变成current组的时间间隔,最好在15~30分钟以上
时当的放大成员的体积,时当的增加组的数量!
alter database add logfile '/u01/app/oracle/oradata/demo/redo03.log' size 100m;
alter database add logfile '/u01/app/oracle/oradata/demo/redo04.log' size 100m;
alter database add logfile '/u01/app/oracle/oradata/demo/redo05.log' size 100m;

当前组不能删除,活动组不能删除,只省两组任何一组都不能删除
alter system switch logfile;
alter system checkpoint;
alter database drop logfile group 1;

添加成员:
alter database add logfile member
'/u01/app/oracle/oradata/demo/redo03b.log' to group 3,
'/u01/app/oracle/oradata/demo/redo04b.log' to group 4;

删除日志成员:清除控制文件中成员的指针,物理文件并没有删除
当前组的成员不能删除,每组中最后一个成员不能删除
alter database drop logfile member '/u01/app/oracle/oradata/demo/redo03b.log';

移动成员的位置:
1.在新的位置增加新的成员,将老的成员删除,不需要停止数据库
2.
停库
shut immediate
使用操作系统命令将成员移动到新的位置
mv /u01/app/oracle/oradata/demo/redo04b.log /home/oracle/redo04b.log
装载数据库
startup mount
修改控制文件的指针
alter database rename file '/u01/app/oracle/oradata/demo/redo04b.log' to '/home/oracle/redo04b.log';
到开数据库
alter database open;

打开归档模式:
shut immediate
startup mount
alter database archivelog;
alter database open;
archive log list

查看归档信息:
select sequence#,name from v$archived_log;

查看存档位置:
show parameter DB_RECOVERY_FILE_DEST
监控闪回区的空间使用情况:
col name for a36
select NAME,SPACE_LIMIT/1048576 limit_mb,SPACE_USED/1048576 used_mb from v$recovery_file_dest;

alter system set db_recovery_file_dest_size=100m;

归档失败,普通用户不能登录数据库:
SYS@ demo> conn scott/tiger
ERROR:
ORA-00257: archiver error. Connect internal only, until freed.
Warning: You are no longer connected to ORACLE.

修改存档位置:
sho parameter dest
mkdir -p /home/oracle/arc_demo_dest1
alter system set log_archive_dest_1='location=/home/oracle/arc_demo_dest1/';
alter system switch logfile;
select sequence#,name from v$archived_log;

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@?/rdbms/admin/utlsampl
SYS@ demo> conn scott/tiger
ERROR:
ORA-00942: table or view does not exist
Error accessing PRODUCT_USER_PROFILE
Warning:  Product user profile information not loaded!
You may need to run PUPBLD.SQL as SYSTEM
Connected.
SCOTT@ demo> conn system/manager
Connected.
SYSTEM@ demo> @?/sqlplus/admin/pupbld
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
日志挖掘:log miner
挖掘ddl:
生成挖掘队列:告诉数据库想要挖掘的日志都有哪些
exec dbms_logmnr.add_logfile('/home/oracle/redo03b',dbms_logmnr.new);
开始挖掘:
exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
查看挖掘的结果:
select scn,sql_redo from v$logmnr_contents
where lower(sql_redo) like 'drop%'
and seg_name='E01'
and seg_owner='SCOTT';
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
create or replace procedure logmnr
(p_log varchar2,
p_owner varchar2,
p_tab varchar2,
p_operation varchar2)
is
  type oper_list is varray (100) of varchar2(2000);
  v_oper oper_list;
begin
  dbms_logmnr.add_logfile(p_log,dbms_logmnr.new);
  dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
  select 'SCN: '||scn||' operation: '||sql_redo
  bulk collect into v_oper
  from v$logmnr_contents
  where lower(sql_redo) like p_operation||'%'
  and seg_name=upper(p_tab)
  and seg_owner=upper(p_owner);
  for i in 1..v_oper.count loop
   dbms_output.put_line(v_oper(i));
  end loop;
end;
/
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
挖掘dml:
打开追加日志数据模式:
alter database add supplemental log data;

执行dml操作:
create table e01 as select * from emp where 1=0;
insert into e01 select * from emp;
commit;

挖掘dml:
生成挖掘队列:告诉数据库想要挖掘的日志都有哪些
exec dbms_logmnr.add_logfile('/home/oracle/redo04b.log',dbms_logmnr.new);
exec dbms_logmnr.add_logfile('/home/oracle/arc_demo_dest1/1_69_954415072.dbf',dbms_logmnr.addfile);
exec dbms_logmnr.add_logfile('/home/oracle/arc_demo_dest1/1_70_954415072.dbf',dbms_logmnr.addfile);
开始挖掘:
exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
查看挖掘的结果:前滚队列
select scn,sql_redo from v$logmnr_contents
where lower(sql_redo) like 'update%'
and seg_name='E01'
and seg_owner='SCOTT';
查看挖掘的结果:回滚队列
select sql_undo from v$logmnr_contents
where lower(sql_redo) like 'update%'
and seg_name='E01'
and seg_owner='SCOTT';

OMF管理的日志文件:
mkdir -p /home/oracle/mflog01/
alter system set db_create_online_log_dest_1='/home/oracle/mflog01/';
mkdir -p /home/oracle/mflog02/
alter system set db_create_online_log_dest_2='/home/oracle/mflog02/';
alter database add logfile size 50m;
#################################################################################
管理表空间和数据文件:
pv        -->      vg    -->  lv
datafile  --> tablespace --> segment (table,index,temporary segment,rollback segment)

永久表空间:保存永久对象(table,index)
临时表空间:保存临时表的数据和排序的中间结果
回退表空间:不能保存对象,数据修改之前的老镜像

查看表空间的信息:
select tablespace_name,contents from dba_tablespaces order by 2;
查看表空间和数据文件的对应关系
select tablespace_name,file_id,file_name from dba_data_files;
select tablespace_name,file_id,file_name from dba_temp_files;

管理永久表空间:保存永久对象(table,index)
create tablespace tbs1 datafile '/home/oracle/tbs01.dbf' size 10m;
向指定的表空间中创建表:
create table scott.e01 tablespace tbs1 as select * from scott.emp;
查看表属于哪一个表空间:
select tablespace_name from dba_tables where table_name='E01';
用户和表空间的关系:创建表的时候如果没有指定存储子句,表被保存到用户的默认表空间
select default_tablespace from dba_users where username='SCOTT';
修改用户的默认表空间:
alter user scott default tablespace tbs1;
数据库默认永久表空间:创建用户时如果没有指定默认表空间,用户会使用数据库默认永久表空间
select * from database_properties where rownum<4;
grant connect,resource to tom identified by tom;
修改数据库默认永久:数据库默认永久表空间不允许删除
alter database default tablespace tbs1;

表空间的状态:
select tablespace_name,status from dba_tablespaces;
ONLINE : read write
READ ONLY : alter tablespace tbs1 read only;
            alter tablespace tbs1 read write;
OFFLINE   : alter tablespace tbs1 offline;
            alter tablespace tbs1 online;
*可以drop

查看表空间中包含哪些表:
select owner,table_name from dba_tables where tablespace_name='TBS1';
select tablespace_name,file_name from dba_data_files where file_id=4;
移动数据文件:如果表空间可以offline
alter tablespace tbs1 offline;
!mv /home/oracle/tbs01.dbf /u01/app/oracle/oradata/demo/tbs1.dbf
alter tablespace tbs1 rename datafile '/home/oracle/tbs01.dbf' to '/u01/app/oracle/oradata/demo/tbs1.dbf';
alter tablespace tbs1 online;

创建字符设备表空间:
使用dd命令创建二进制文件
# dd if=/dev/zero of=/home/oracle/disk bs=1M count=20
将文件变成块设备(循环设备)
# losetup /dev/loop1 /home/oracle/disk
将块设备变成字符设备
# raw /dev/raw/raw1 /dev/loop1
修改设备属组
# chown oracle. /dev/raw/raw1

create tablespace tbs2 datafile '/dev/raw/raw1' size 10m;

移动字符设备表空间:
确定数据文件占用的数据块的数量和偏移量:
SYS@ demo> select blocks,block1_offset from v$datafile where file#=5;

    BLOCKS BLOCK1_OFFSET
---------- -------------
      1280        8192

alter tablespace tbs2 offline;
dd if=/dev/raw/raw1 of=/u01/app/oracle/oradata/demo/tbs2.dbf bs=8K count=1281
alter tablespace tbs2 rename datafile '/dev/raw/raw1' to '/u01/app/oracle/oradata/demo/tbs2.dbf';
alter tablespace tbs2 online;

*IMB AIX 系统数据文件偏移量为12K

表空间下可以包含多个容器(数据文件):
alter tablespace tbs1 add datafile '/u01/app/oracle/oradata/demo/tbs01.dbf' size 10m;

监控表空间容量使用情况:
查看表空间当前文件大小
select TABLESPACE_NAME,sum(BLOCKS)/128 curr_mb from dba_data_files group by TABLESPACE_NAME;
查看表空间空闲空间大小
select TABLESPACE_NAME,sum(BLOCKS)/128 free_mb from dba_free_space group by TABLESPACE_NAME;

select
  a.tablespace_name,
  a.curr_mb,
  a.max_mb,
  nvl(b.free_mb,0) free_mb,
  round(nvl(b.free_mb,0)/a.curr_mb,4)*100||'%' pct_free
from
(select TABLESPACE_NAME,sum(BLOCKS)/128 curr_mb,sum(maxblocks)/128 max_mb from dba_data_files group by TABLESPACE_NAME) a,
(select TABLESPACE_NAME,sum(BLOCKS)/128 free_mb from dba_free_space group by TABLESPACE_NAME)b
where a.tablespace_name=b.tablespace_name(+)
order by 3;

表空间扩容:
1.修改现有文件的大小
select file_name,blocks/128 from dba_data_files where tablespace_name='TBS2';
alter database datafile '/u01/app/oracle/oradata/demo/tbs2.dbf' resize 20m;

2.打开数据文件的自动增长属性
alter database datafile '/u01/app/oracle/oradata/demo/tbs2.dbf' autoextend on next 10m maxsize 100m;

alter database datafile '/u01/app/oracle/oradata/demo/tbs2.dbf' autoextend on next 10m maxsize unlimited;

alter database datafile '/u01/app/oracle/oradata/demo/tbs2.dbf' autoextend off;

3.增加新的数据文件
alter tablespace tbs1 add datafile '/u01/app/oracle/oradata/demo/tbs001.dbf' size 10m;

可恢复的语句:遭遇空间问题时语句的报错信息会延迟抛出!
SYS@ demo> grant resumable to scott;
SCOTT@ demo> alter session enable resumable;
SCOTT@ demo> insert into e04 select * from e04;
SYS@ demo> select * from dba_resumable;
---------------------------------------------------------------------------------
临时表空间的管理:保存临时表的数据和排序的中间结果
查看临时表空间
select tablespace_name from dba_tablespaces where contents='TEMPORARY';
查看临时文件
select file_name from dba_temp_files where tablespace_name='TEMP';
向临时表空间增加临时文件
alter tablespace temp add tempfile '/u01/app/oracle/oradata/demo/temp01.dbf' reuse;
创建临时表
create global temporary table tmp on commit delete rows as select * from emp;
create global temporary table tmp on commit preserve rows as select * from emp;
监控临时表空间的使用情况
select USERNAME,TABLESPACE,BLOCKS from v$sort_usage;

USERNAME               TABLESPACE               BLOCKS
------------------------------ ------------------------------- ----------
SCOTT                   TEMP                      128

创建临时表空间:
create temporary tablespace temp02 tempfile '/u01/app/oracle/oradata/demo/temp02.dbf' size 50m;
表空间改名:
alter tablespace temp rename to temp01;
查看用户的排序表空间
select temporary_tablespace from dba_users where username='SCOTT';
修改用户的排序表空间
alter user scott temporary tablespace temp03;
数据库默认排序表空间
select * from database_properties where rownum<4;
修改数据库默认排序表空间
alter database default temporary tablespace temp02;
临时表空间组:将临时表空间加入到一个组的时候,组名自动出现
select * from dba_tablespace_groups;
alter tablespace temp01 tablespace group tmpgp;
alter tablespace temp02 tablespace group tmpgp;
alter tablespace temp03 tablespace group tmpgp;
alter user scott temporary tablespace tmpgp;
将临时表空间移出表空间组
alter tablespace temp03 tablespace group '';
-----------------------------------------------------------------------------------
管理undo表空间:不能保存对象,数据修改之前的老镜像(rollback segment)

查看undo表空间:
select tablespace_name from dba_tablespaces where contents='UNDO';
查看undo表空间下的rollback segment:
select segment_name,tablespace_name,status from dba_rollback_segs;
跟踪事务内对undo的使用情况:
select s.sid,s.serial#,s.username,t.XIDUSN,t.USED_UBLK from v$session s,v$transaction t where s.saddr=t.ses_addr;

begin
  for i in 1..200000 loop
    update t01 set x=x+1;
  end loop;
end;
/

创建undo表空间:
create undo tablespace undo02 datafile '/u01/app/oracle/oradata/demo/undo02.dbf' size 10m;
切换undo表空间:
alter system set undo_tablespace=undo02;

SCOTT@ demo> set transaction isolation level SERIALIZABLE;

begin
  for i in 1..10 loop
    update e02 set sal=4;
    commit;
  end loop;
end;
/

ORA-01555: snapshot too old: rollback segment number 14 with name "_SYSSMU14_3522641343$" too small

强制回退保持力:优先保证查询不会失败,但不保证交易有undo空间可用
select tablespace_name,retention from dba_tablespaces where contents='UNDO';
alter tablespace undo02 retention guarantee;
alter tablespace undo02 retention noguarantee;

闪回表:利用的表空间下的空闲空间保存删除后的表
show recyclebin
flashback table e01 to before drop;
flashback table "BIN$WSBJlyM/DQDgUwoAGayZPw==$0" to before drop;
flashback table e01 to before drop rename to e02;
purge recyclebin;
purge table "BIN$WSBJlyM/DQDgUwoAGayZPw==$0";
SYS@ demo> purge dba_recyclebin;

为闪回版本查询提供数据:undo,镜像如果被覆盖查询将失败
select
versions_startscn,
versions_endscn,
versions_operation,
ename,sal
from e01
versions between scn minvalue and maxvalue
where empno=7369;

update e01 set sal=sal*1.15;
commit;

为闪回查询提供数据:undo
select * from e01 as of scn 633766;

SYS@ demo> alter system flush buffer_cache;

begin
  for i in 1..10 loop
    update e02 set sal=4;
    commit;
  end loop;
end;
/

闪回事务查询:对连接日志进行反算,所以需要追加日志数据模式
conn / as sysdba
SYS@ demo> select supplemental_log_data_min from v$database;

SUPPLEME
--------
YES

select UNDO_SQL from flashback_transaction_query where TABLE_NAME='E01' and TABLE_OWNER='SCOTT';

闪回数据库:需要结合归档模式一起使用
打开闪回数据库的功能
alter database flashback on;

查看闪回数据库的功能是否已经打开
select flashback_on from v$database;

FLASHBACK_ON
------------------
YES

确定灾难产生时间点:
exec logmnr('/home/oracle/mflog01/DEMO/onlinelog/o1_mf_1_dvh3o66g_.log','scott','e01','drop');

SCN: 636528 operation: drop table e01 purge;

闪回数据库是否可以支持到指定的scn:
SYS@ demo> select OLDEST_FLASHBACK_SCN from V$FLASHBACK_DATABASE_LOG;

OLDEST_FLASHBACK_SCN
--------------------
          636438

开始闪回数据库:
shut immediate
startup mount
flashback database to scn 636528;
alter database open read only;
select current_scn from v$databsae;
$ exp scott/tiger file=e01.dmp tables=e01
shut immediate
startup mount
recover database;
alter database open;
$ imp scott/tiger file=e01.dmp full=y

数据库写盘的最后一条redo的scn:
SYS@ demo> select cpods from x$kcccp;

CPODS
----------------
636979

show parameter flashback
db_flashback_retention_target=1440

undo的手工管理:
alter system set undo_management=manual scope=spfile;

select segment_name,tablespace_name,status from dba_rollback_segs;

ORA-01552: cannot use system rollback segment for non-system tablespace 'TBS1'
SCOTT@ demo> alter table e05 move tablespace system;

create rollback segment rbs1 tablespace undo01;
alter rollback segment rbs1 online;

alter system set rollback_segments='rbs1' scope=spfile;
###################################################################################