zoukankan      html  css  js  c++  java
  • oracle表空间操作详解

    表空间是什么

    表空间实质是组织数据文件的一种途径,Oracle就是通过表空间这个数据库对象完成对数据的组织的。在将数据插入 Oracle数据库之前,必须首先建立表空间,然后将数据插入表空间的一个对象中。解释数据库、表空间、数据文件、表、数据的最好办法就是想象一个装满东 西的柜子。数据库其实就是柜子,柜中的抽屉是表空间,抽屉中的文件夹是数据文件,文件夹中的纸是表,写在纸上的信息就是数据。
    根据表空间的用途可分为五类:

    -目录表空间
    每个数据库只有一个目录表空间,它是在发出 CREATE DATABASE 命令时创建的。目录表空间被 DB2 命名为 SYSCATSPACE,它保存了系统目录表。总是在创建数据库时创建该表空间。
    -常规表空间
    常 规表空间保存表数据和索引。它还可以保存诸如大对象(Large Object,LOB)之类的长数据,除非这些数据显式地存储在长表空间中。如果某些表空间是数据库管理的空间(Database Managed Space,DMS),则可以将表及其索引分别放到单独的常规表空间中。我们将在本文后面定义 DMS 和系统管理的空间(System Managed Space,SMS)之间的区别。每个数据库中必须至少有一个常规表空间。创建数据库时指定该表空间的缺省名为 USERSPACE1。
    -长表空间
    长表空间用于存储长型或 LOB 表列,它们必须驻留在 DMS 表空间中。它们还可以存储结构化类型的列或索引数据。如果没有定义长表空间,那么将把 LOB 存储在常规表空间中。长表空间是可选的,缺省情况下一个都不创建。
    -系统临时表空间
    系统临时表空间用于存储 SQL 操作(比如排序、重组表、创建索引和连接表)期间所需的内部临时数据。每个数据库必须至少有一个系统临时表空间。随数据库创建的系统临时表空间的缺省名为TEMPSPACE1。
    -用户临时表空间
    用户临时表空间存储已声明的全局临时表。创建数据库时不存在用户临时表空间。至少应当创建一个用户临时表空间以允许定义已声明的临时表。用户临时表空间是可选的,缺省情况下一个都不创建

    CREATE TABLESPACE message
    DATAFILE '/opt/oracle/oradata/surecomp/message01.dbf' size 200M
    EXTENT MANAGEMENT local;
    CREATE USER message IDENTIFIED BY message
    DEFAULT TABLESPACE message;
    GRANT connect, resource TO message;
    CREATE TABLE userinfo (
    id VARCHAR2(32) NOT NULL,
    name VARCHAR2(32) NOT NULL,
    password VARCHAR2(32) NOT NULL,
    CONSTRAINT userinfo_pk PRIMARY KEY (id),
    CONSTRAINT userinfo_unique_name UNIQUE ( name )
    );
    这里先是用SYSTEM用户创建了一个message表空间
    然后创建一个用户message,使这个message用户默认使用message表空间
    之后创建一个表USER,这个时候USER表是不是应该在SYSTEM的临时表空间里?
    那下次用message登陆往USER表中插记录的时候记录是不是就存在message表空间中?
    SYSTEM表空间是不是只存了USER表的逻辑?
    概念不清请指教

    当你用system创建了message表空间,和message用户后,如果你不从system用户退出,再以 message用户登陆,那么,运行以上创建表的指令,所创建的表userinfo,就会被system用户所拥有。所以,这个表应该在system表空 间里。在这样的情况下,用户message与这张表没有任何关系。下次用message登陆时,message在一般情况下,不能往userinfo表里 插记录,除非system给予message用户特别许可,(GRANT insert on system.userinfo TO message;)。如果system给予了这种许可,用户message所插的一切记录,都会储存在system表空间里,而不是在message表空 间中。

    显然,这是很糟糕的情况。一般情况下,应该避免让普通用户把数据储存在system表空间里。现有二种方法可以避免以上的情况:

    1.从system用户退出,再以message用户登陆,然后运行以上创建表的指令。
    2.依然是system用户登陆,修改上述创建表的指令。在表名前,加上用户名,并且在最后注明表空间名。请看下例:
    CREATE TABLE message.userinfo
    (
        id  VARCHAR2(32) NOT NULL,
        name VARCHAR2(32) NOT NULL,
        password VARCHAR2(32) NOT NULL,
      CONSTRAINT userinfo_pk PRIMARY KEY (id),
      CONSTRAINT userinfo_unique_name UNIQUE ( name )
    )
    TABLESPACE message;
    用上述二种方法所创建的表userinfo,都会属于用户message。因此,message所插的一切记录,都会储存在message表空间中。

    补充:
    建立表空间
    CREATE TABLESPACE data01
    DATAFILE '/oracle/oradata/db/DATA01.dbf' SIZE 500M
    UNIFORM SIZE 128k; #指定区尺寸为128k,如不指定,区尺寸默认为64k
    删除表空间
    DROP TABLESPACE data01 INCLUDING CONTENTS AND DATAFILES;
    修改表空间大小
    alter database datafile '/path/NADDate05.dbf' resize 100M
    移动表至另一表空间
    alter table move tablespace room1;
    一、建立表空间
    CREATE TABLESPACE data01
    DATAFILE '/oracle/oradata/db/DATA01.dbf' SIZE 500M
    UNIFORM SIZE 128k; #指定区尺寸为128k,如不指定,区尺寸默认为64k
    二、建立UNDO表空间
    CREATE UNDO TABLESPACE UNDOTBS02
    DATAFILE '/oracle/oradata/db/UNDOTBS02.dbf' SIZE 50M
    #注意:在OPEN状态下某些时刻只能用一个UNDO表空间,如果要用新建的表空间,必须切换到该表空间:
    ALTER SYSTEM SET undo_tablespace=UNDOTBS02;
    三、建立临时表空间
    CREATE TEMPORARY TABLESPACE temp_data
    TEMPFILE '/oracle/oradata/db/TEMP_DATA.dbf' SIZE 50M
    四、改变表空间状态
    1.使表空间脱机
    ALTER TABLESPACE game OFFLINE;
    如果是意外删除了数据文件,则必须带有RECOVER选项
    ALTER TABLESPACE game OFFLINE FOR RECOVER;
    2.使表空间联机
    ALTER TABLESPACE game ONLINE;
    3.使数据文件脱机
    ALTER DATABASE DATAFILE 3 OFFLINE;
    4.使数据文件联机
    ALTER DATABASE DATAFILE 3 ONLINE;
    5.使表空间只读
    ALTER TABLESPACE game READ ONLY;
    6.使表空间可读写
    ALTER TABLESPACE game READ WRITE;
    五、删除表空间
    DROP TABLESPACE data01 INCLUDING CONTENTS AND DATAFILES;
    六、扩展表空间
    首先查看表空间的名字和所属文件
    select tablespace_name, file_id, file_name,
    round(bytes/(1024*1024),0) total_space
    from dba_data_files
    order by tablespace_name;
    1.增加数据文件
    ALTER TABLESPACE game
    ADD DATAFILE '/oracle/oradata/db/GAME02.dbf' SIZE 1000M;
    2.手动增加数据文件尺寸
    ALTER DATABASE DATAFILE '/oracle/oradata/db/GAME.dbf'
    RESIZE 4000M;
    3.设定数据文件自动扩展
    ALTER DATABASE DATAFILE '/oracle/oradata/db/GAME.dbf'
    AUTOEXTEND ON NEXT 100M
    MAXSIZE 10000M;
    4.设定后查看表空间信息
    SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE,
    (B.BYTES*100)/A.BYTES "% USED",(C.BYTES*100)/A.BYTES "% FREE"
    FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C
    WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND A.TABLESPACE_NAME=C.TABLESPACE_NAME;
  • 相关阅读:
    一天搞懂深度学习--深度学习简介
    Ubuntu16.04下安装Hive
    Ubuntu16.04下安装Hadoop
    Hive入门学习--HIve简介
    循环神经网络(RNN)--学习笔记
    如何使用GitHub
    python pandas import 失败
    Azure ARM VM内部关机了,但门户却显示虚拟机还在处在“正在运行”的状态
    Exchange 2010 与 RMS(集成权限管理服务)集成
    统计 Exchange 2010 时间段收发邮件总量
  • 原文地址:https://www.cnblogs.com/datalife/p/1985314.html
Copyright © 2011-2022 走看看