精华内容
下载资源
问答
  • Oracle 表空间详解

    万次阅读 2018-12-20 14:46:45
    表空间概述 表空间的分类 默认表空间 查看默认的永久表空间 查看默认的TEMP表空间 查看默认的表空间类型 逻辑结构到物理结构的映射 对表空间的操作 查看表空间使用情况 查看数据库拥有的表空间 查看表空间中的数据...

    https://blog.csdn.net/persistencegoing/article/details/84376427

    目录


    表空间概述
    表空间的分类
    默认表空间
    查看默认的永久表空间
    查看默认的TEMP表空间
    查看默认的表空间类型
    逻辑结构到物理结构的映射
    对表空间的操作
    查看表空间使用情况
    查看数据库拥有的表空间
    查看表空间中的数据文件
    查看用户拥有的表空间
    创建表空间
    修改表空间
    修改用户的默认和临时表空间
    修改表空间的状态
    修改表空间的数据文件
    删除表空间
    用户表空间限额


    表空间概述


         Oracle的表空间属于Oracle中的存储结构,是一种用于存储数据库对象(如:数据文件)的逻辑空间,是Oracle中信息存储的最大逻辑单元,其下还包含有段、区、数据块等逻辑数据类型。表空间是在数据库中开辟的一个空间,用于存放数据库的对象,一个数据库可以由多个表空间组成。可以通过表空间来实现对Oracle的调优。(Oracle数据库独特的高级应用)

    表空间的分类

    永久表空间:存储数据库中需要永久化存储的对象,比如二维表、视图、存储过程、索引。
    临时表空间:存储数据库的中间执行过程,如:保存order by数据库排序,分组时产生的临时数据。操作完成后存储的内容会被自动释放。临时表空间是通用的,所的用户都使用TEMP作为临时表空间。一般只有temp一个临时表空间,如果还需要别的临时表空间时,可以自己创建。
    UNDO表空间:保存数据修改前的副本。存储事务所修改的旧址,即被修改之前的数据。当我们对一张表中的数据进行修改的同时会对修改之前的信息进行保存,为了对数据执行回滚、恢复、撤销的操作。


    查看system用户的默认表空间和临时表空间:

    SQL> select DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE from dba_users where username='SYSTEM';

    DEFAULT_TABLESPACE         TEMPORARY_TABLESPACE
    ------------------------------ ------------------------------
    SYSTEM                 TEM



    默认表空间


    用户在登陆后创建数据库对象时,如果没有指定表空间,那么这些数据就会存储到默认表空间。

    查看默认的永久表空间


    注意:如果创建用户时,不指定其永久表空间,则会使用默认的表空间。

    SQL> SELECT PROPERTY_NAME, PROPERTY_VALUE 
    2 FROM DATABASE_PROPERTIES;

    PROPERTY_NAME PROPERTY_VALUE
    ------------------------------ ------------------
    DEFAULT_TEMP_TABLESPACE              TEMP

    DEFAULT_PERMANENT_TABLESPACE         USERS



    查看默认的TEMP表空间


    系统管理员:

    SQL> SELECT PROPERTY_NAME, PROPERTY_VALUE
    2 FROM DATABASE_PROPERTIES
    3 WHERE PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE'
    4 ;

    PROPERTY_NAME                        PROPERTY_VALUE
    ------------------------------ ----------------------------
    DEFAULT_TEMP_TABLESPACE                  TEMP

    普通用户

    SELECT USERNAME, TEMPORARY_TABLESPACE FROM DBA_USERS
    1


    查看默认的表空间类型


    注意:如果不指定表空间类型,就会默认使用DEFAULT_TBS_TYPE参数指定的表空间类型。

    SQL> SELECT PROPERTY_NAME, PROPERTY_VALUE
    2 FROM DATABASE_PROPERTIES
    3 WHERE PROPERTY_NAME='DEFAULT_TBS_TYPE';

    PROPERTY_NAME                    PROPERTY_VALUE
    ------------------------------ ------------------

    DEFAULT_TBS_TYPE                     SMALLFILE



    逻辑结构到物理结构的映射


    表空间与数据文件:表空间实际上是由若干个数据文件来构成的,数据文件的位置和大小可以由我们自己来决定。数据被存放在表空间中的数据文件中。

    注意:表空间是一种逻辑数据结构,其下最小的数据块会映射到物理结构的磁盘块中,一个数据块由若干个磁盘块组成。 

     

     

    或者由下图来理解:表空间逻辑上有若干个段组成,物理上由多个数据文件组成。 
    这里写图片描述

    对表空间的操作

    表空间的操作方式

    字典管理:Oracle中的数据字典可以存储所有的表空间分配信息,但是如果数据库中所有的空间分配都放在数据字典中。容易引起字典争用,而导致性能问题,这是Oracle调优的方向之一。
    本地管理:表空间分配不放在数据字典,而在每个数据文件头部的第3到第8个块的位图块,来管理空间分配。

    查看表空间使用情况


    SELECT A.TABLESPACE_NAME                     AS TABLESPACE_NAME, 
            ROUND(A.BYTES/(1024*1024*1024),2)    AS "TOTAL(G)"     , 
            ROUND(B.BYTES/(1024*1024*1024),2)    AS "USED(G)"      , 
            ROUND(C.BYTES/(1024*1024*1024),2)    AS "FREE(G)"      , 
            ROUND((B.BYTES * 100) / A.BYTES,2)   AS "% USED"       , 
            ROUND((C.BYTES * 100) / A.BYTES,2)   AS "% 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;


    计算表空间使用情况(考虑了数据文件自动增长情况):

    SELECT UPPER(F.TABLESPACE_NAME) AS "表空间名称", 
            ROUND(D.AVAILB_BYTES ,2) AS "表空间大小(G)", 
            ROUND(D.MAX_BYTES,2) AS "最终表空间大小(G)", 
            ROUND((D.AVAILB_BYTES - F.USED_BYTES),2) AS "已使用空间(G)", 
            TO_CHAR(ROUND((D.AVAILB_BYTES - F.USED_BYTES) / D.AVAILB_BYTES * 100, 
                2), '999.99') AS "使用比", 
            ROUND(F.USED_BYTES, 6) AS "空闲空间(G)", 
            F.MAX_BYTES AS "最大块(M)" 
     FROM (
            SELECT TABLESPACE_NAME, 
                    ROUND(SUM(BYTES) / (1024 * 1024 * 1024), 6) USED_BYTES, 
                    ROUND(MAX(BYTES) / (1024 * 1024 * 1024), 6) MAX_BYTES 
            FROM SYS.DBA_FREE_SPACE 
            GROUP BY TABLESPACE_NAME) F, 
          (SELECT DD.TABLESPACE_NAME, 
                    ROUND(SUM(DD.BYTES) / (1024 * 1024 * 1024), 6) AVAILB_BYTES, 
                ROUND(SUM(DECODE(DD.MAXBYTES, 0, DD.BYTES, DD.MAXBYTES))/(1024*1024*1024),6) MAX_BYTES 
           FROM SYS.DBA_DATA_FILES DD 
           GROUP BY DD.TABLESPACE_NAME) D 
            WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME 
    ORDER BY 4 DESC



    查看数据库拥有的表空间


    可以通过下面几个系统视图来查看表空间的基本信息:

    #1.包含数据库中所有表空间的描述信息
    SELECT * FROM DBA_TABLESPACES;  

    #2.包含当前用户的表空间的描叙信息
    SELECT * FROM USER_TABLESPACES; 

    #3.包含从控制文件中获取的表空间名称和编号信息
    SELECT * FROM V$TABLESPACE;     


    查看表空间中的数据文件


    #1.包含数据文件以及所属的表空间的描述信息(永久表空间/UNDO表空间)
    SELECT * FROM DBA_DATA_FILES;   

    #2.包含临时数据文件以及所属的表空间的描述信息
    SELECT * FROM DBA_TEMP_FILES;
    SELECT * FROM V$TEMPFILE;

    #3.包含从控制文件中获取的数据文件的基本信息,包括它所属的表空间名称、编号等
    SELECT * FROM V$DATAFILE;

    #4.包含所有临时数据文件的基本信息
    SELECT * FROM V$TEMPFILE;  


    查看用户拥有的表空间


    不同的用户会使用不同的表空间:

    系统管理员用户使用dba_tablespaces数据字典来查看。
    SQL> desc dba_tablespaces               #Oracle管理员级别的数据字典中记录了管理员级别用户所使用的表空间名称、默认表空间和临时表空间。 TABLESPACE_NAME
     Name                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     TABLESPACE_NAME               NOT NULL VARCHAR2(30)
     BLOCK_SIZE                NOT NULL NUMBER
     INITIAL_EXTENT                     NUMBER
     NEXT_EXTENT                        NUMBER
     MIN_EXTENTS                   NOT NULL NUMBER
     MAX_EXTENTS                        NUMBER
     PCT_INCREASE                       NUMBER
     MIN_EXTLEN                     NUMBER
     STATUS                         VARCHAR2(9)
     CONTENTS                       VARCHAR2(9)
     LOGGING                        VARCHAR2(9)
     FORCE_LOGGING                      VARCHAR2(3)
     EXTENT_MANAGEMENT                  VARCHAR2(10)
     ALLOCATION_TYPE                    VARCHAR2(9)
     PLUGGED_IN                     VARCHAR2(3)
     SEGMENT_SPACE_MANAGEMENT               VARCHAR2(6)
     DEF_TAB_COMPRESSION                    VARCHAR2(8)
     RETENTION                      VARCHAR2(11)
     BIGFILE                        VARCHAR2(3)

    SQL> select tablespace_name from dba_tablespaces;             #查看管理员用户使用的表空间名称列表

    TABLESPACE_NAME
    ------------------------------
    SYSTEM                             #系统表空间,是永久系统表空间,用于存储SYS用户的表、视图、存储过程对象。
    UNDOTBS1                           #存储撤销信息的undo表空间
    SYSAUX                             #作为EXAMPLE的辅助表空间
    TEMP                               #临时表空间,用户存储SQL语句处理的表示索引信息
    USERS                              #永久表空间,存储数据库用户创建的数据库对象
    EXAMPLE                            #安装Oracle数据库示例的表空间

    普通用户使用user_tablespaces数据字典来查看。
    SQL> desc user_tablespaces
     Name                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     TABLESPACE_NAME               NOT NULL VARCHAR2(30)
     BLOCK_SIZE                NOT NULL NUMBER
     INITIAL_EXTENT                     NUMBER
     NEXT_EXTENT                        NUMBER
     MIN_EXTENTS                   NOT NULL NUMBER
     MAX_EXTENTS                        NUMBER
     PCT_INCREASE                       NUMBER
     MIN_EXTLEN                     NUMBER
     STATUS                         VARCHAR2(9)
     CONTENTS                       VARCHAR2(9)
     LOGGING                        VARCHAR2(9)
     FORCE_LOGGING                      VARCHAR2(3)
     EXTENT_MANAGEMENT                  VARCHAR2(10)
     ALLOCATION_TYPE                    VARCHAR2(9)
     SEGMENT_SPACE_MANAGEMENT               VARCHAR2(6)
     DEF_TAB_COMPRESSION                    VARCHAR2(8)
     RETENTION                      VARCHAR2(11)
     BIGFILE                        VARCHAR2(3)

    SQL> connect scott/tiger    #连接到SCOTT用户
    Connected.
    SQL> show user;
    USER is "SCOTT"
    SQL> select tablespace_name from dba_tablespaces;
    select tablespace_name from dba_tablespaces
                                *
    ERROR at line 1:
    ORA-00942: table or view does not exist             #SCOTT用户没有权限去查看系统表空间dba_tablespaces

    SQL> select tablespace_name from user_tablespaces;  #但是SCOTT用户可以查看用户表空间user_tablespaces

    TABLESPACE_NAME
    ------------------------------
    SYSTEM
    UNDOTBS1
    SYSAUX
    TEMP
    USERS
    EXAMPLE

    6 rows selected.



    创建表空间


    基本语法:

    Create [TEMPORARY] TABLESPACE tablespace_name TEMPFILE|DATAFILE 'fileName.dbf' size xx
     #TEMPFILE|DATAFILE 指的是我们存储的数据文件的类型和名字。
     #size 表示数据文件的大小
     #[TEMPORARY] 如果我们创建的是临时表空间,那么需要在create关键字后加上TEMPORARY的关键字,而且使用TEMPFILE关键字。
    1
    2
    3
    4
    注意:如果没有指定数据文件存放的路径,默认会将数据文件存放到Oracle的安装目录下

    Example:

    SQL> show user;
    USER is "SYSTEM"
    SQL> create tablespace test1_tablespace datafile 'test1file.dbf' size 10m;

    Tablespace created.

    SQL> create temporary tablespace temptest1_tablespace tempfile 'tempfile.dbf' size 10m;

    Tablespace created.

    查看表空间数据文件的存放路径:表空间数据文件都存放在永久性表空间中

    SQL> desc dba_data_files;    #数据字典dba_data_file用于存放数据文件的属性。
     Name                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     FILE_NAME                      VARCHAR2(513)
     FILE_ID                        NUMBER
     TABLESPACE_NAME                    VARCHAR2(30)
     BYTES                          NUMBER
     BLOCKS                         NUMBER
     STATUS                         VARCHAR2(9)
     RELATIVE_FNO                       NUMBER
     AUTOEXTENSIBLE                     VARCHAR2(3)
     MAXBYTES                       NUMBER
     MAXBLOCKS                      NUMBER
     INCREMENT_BY                       NUMBER
     USER_BYTES                     NUMBER
     USER_BLOCKS                        NUMBER
     ONLINE_STATUS                      VARCHAR2(7)

    SQL> select file_name from dba_data_files where tablespace_name='TEST1_TABLESPACE';

    FILE_NAME
    --------------------------------------------------------------------------------
    /u01/oracle/dbs/test1file.dbf


    修改表空间


    修改用户的默认和临时表空间
    为了方便以后数据的备份和恢复,仅仅将有价值的数据做备份可以提高效率和节省空间。 
    基本语法:

    ALTER USER username defalut|temporary TABLESPACE tablespace_name;
    1
    注意:普通用户没有修改默认表空间的权限,但是可以通过授权来实现普通用户也能够修改默认表空间。

    Example:

    SQL> show user;
    USER is "SYSTEM"

    SQL> select DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE from dba_users where username='SYSTEM';

    DEFAULT_TABLESPACE         TEMPORARY_TABLESPACE
    ------------------------------ ------------------------------

    USERS               TEMP
     

    修改表空间的状态


    设置表空间的联机或脱机状态:表空间的默认状态是联机状态,如果表空间是脱机状态,那么我们就不能够使用这个表空间了。
    基本语法:

    ALTER TABLESPACE tablespace_name ONLINE|OFFLINE;
    1
    Example:

    SQL> alter tablespace test1_tablespace offline;

    Tablespace altered.

    SQL> select STATUS from dba_tablespaces where tablespace_name='TEST1_TABLESPACE';     // tablespace_name需要使用大些字母

    STATUS
    ---------
    OFFLINE


    设置表空间的只读|可读写状态:表空间默认为可读写状态


    注意:如果表空间状态中拥有可read,那么表空间就必须是联机状态的。 
    基本语法:

    ALTER TABLESPACE tablespace_name [read only][read write];
    1
    Example:

    SQL> alter tablespace test1_tablespace read only;

    Tablespace altered.

    SQL> select STATUS from dba_tablespaces where tablespace_name='TEST1_TABLESPACE';

    STATUS
    ---------
    READ ONLY


    修改表空间的数据文件


    增加表空间中的数据文件 
    基本语法:
    ALTER TABLESPACE tablespace_name ADD DATAFILE'xx.dbf' SIZE xx;
    1
    Example:

    SQL> alter tablespace test1_tablespace add datafile 'test2_file.dbf' size 10m;

    Tablespace altered.

    SQL> select file_name from dba_data_fileS where tablespace_name='TEST1_TABLESPACE';

    FILE_NAME
    --------------------------------------------------------------------------------
    /u01/oracle/dbs/test1file.dbf
    /u01/oracle/dbs/test2_file.dbf

    注意:如果发现某个表空间存储空间不足时,可以为表空间添加新的数据文件,扩展表空间大小

    SQL> ALTER TABLESPACE TBS_TR_IND ADD DATAFILE '/oradata/rTBS_TR_IND_002.dbf' SIZE 32G AUTOEXTEND OFF

    SQL> ALTER TABLESPACE TBS_EDS_DAT
    2 ADD DATAFILE 'G:\datafile\TBS_EDS_DAT01.DBF'
    3 SIZE 100M
    4 AUTOEXTEND ON
    5 NEXT 10M
    6 MAXSIZE 20480M;

    SQL> ALTER TABLESPACE temp01
    2 ADD TMPFILE 'D:\ORACLEDATA\temp01_02.dbf' SIZE 10M REUSE;

    注意:在添加新的数据文件时,如果同名的操作系统已经存在,ALTER TABLESPACE语句将失败。如果要覆盖同名的操作系统文件时,则必须在后面显示的指定REUSE子句。

     

    调整数据文件的大小


    ALTER DATABASE DATAFILE '/database/oracle/oradata/gsp/tbs_dm_data_002.dbf' RESIZE 500M;
    1
    删除数据文件
    注意:不能够删除表空间中的第一个数据文件,如果将第一个数据文件删除的话,相当于删除了整个表空间。 
    基本语法:

    ALTER TABLESPACE tablespace_name DROP DATAFILE'filename.dbf';
    1
    Example:

    SQL> alter tablespace test1_tablespace drop datafile 'test2_file.dbf';

    Tablespace altered.

    SQL> select file_name from dba_data_fileS where tablespace_name='TEST1_TABLESPACE';

    FILE_NAME
    --------------------------------------------------------------------------------
    /u01/oracle/dbs/test1file.dbf


    删除表空间


    基本语法:

    DROP TABLESPAC tablespace_name [INCLUDING CONTENTS];
    1
    注意:如果你希望在删除表空间的同时将表空间中的数据文件一同删除时,需要加上[INCLUDING CONTENTS] 
    Example:

    SQL> drop tablespace test1_tablespace including contents;

    Tablespace dropped.

    SQL> select file_name from dba_data_fileS where tablespace_name='TEST1_TABLESPACE';

    no rows selected
     

    用户表空间限额


    表空间存储限制是用户在某一个表空间中可以使用的存储空间总数。 
    在创建或修改用户时,可以由参数quota指出。若用户在向表空间存储数据时,超出了此限额,则会产生错误。 
    错误信息:ORA-01536:space quota exceeded for tablespace tablespacename..’。 
    可以通过查询字典dba_ts_quotas查看表空间限额信息。

    查看用户的表空间配额

    #查看所有用户表空间的配额情况 
    SELECT * FROM DBA_TS_QUOTAS


    #查看当前用户表空间的配额情况   
    SELECT * FROM USER_TS_QUOTAS


    SQL> DESC DBA_TS_QUOTAS

    Name            Type         Nullable Default Comments                                         
    --------------- ------------ -------- ------- ------------------------------------------------ 
    TABLESPACE_NAME VARCHAR2(30)                  Tablespace name                                  
    USERNAME        VARCHAR2(30)                  User with resource rights on the tablespace      
    BYTES           NUMBER       Y                Number of bytes charged to the user              
    MAX_BYTES       NUMBER       Y                User's quota in bytes.  NULL if no limit         
    BLOCKS          NUMBER       Y                Number of ORACLE blocks charged to the user      
    MAX_BLOCKS      NUMBER       Y                User's quota in ORACLE blocks.  NULL if no limit 
    DROPPED         VARCHAR2(3)  Y                Whether the tablespace has been dropped  


    原文:https://blog.csdn.net/jmilk/article/details/51599260 
     

    希望大家关注我一波,防止以后迷路,有需要的可以加群讨论互相学习java ,学习路线探讨,经验分享与java求职      群号:721515304

    展开全文
  • Oracle创建表空间和表

    千次阅读 2018-12-24 13:28:44
    创建表空间和表 ORACLE物理上是由磁盘上的以下几种文件:数据文件和控制文件和LOGFILE构成的 oracle中的表就是一张存储数据的表。表空间是逻辑上的划分。方便管理的。 数据表空间 (Tablespace) 存放数据总是需要空间...
    创建表空间和表
    ORACLE物理上是由磁盘上的以下几种文件:数据文件和控制文件和LOGFILE构成的
    oracle中的表就是一张存储数据的表。表空间是逻辑上的划分。方便管理的。
    数据表空间 (Tablespace)         
    存放数据总是需要空间, Oracle把一个数据库按功能划分若干空间来保存数据。当然数据存放在磁盘最终是以文件形式,所以一盘一个数据表空间包含一个以上的物理文件
    数据表         
    在仓库,我们可能有多间房子,每个房子又有多个货架,每架又有多层。 我们在数据库中存放数据,最终是数据表的单元来存储与管理的。
    数据文件         
    以上几个概念都是逻辑上的, 而数据文件则是物理上的。就是说,数据文件是真正“看得着的东西”,它在磁盘上以一个真实的文件体现
    1、创建表空间:
    格式: create tablespace 表间名 datafile '数据文件名' size 表空间大小
                    create tablespace data_test datafile 'e:\oracle\oradata\test\data_1.dbf' size 2000M;
                    create tablespace idx_test datafile 'e:\oracle\oradata\test\idx_1.dbf' size 2000M;
                    (*数据文件名 包含全路径, 表空间大小 2000M 表是 2000兆) 
    2、建好tablespace, 就可以建用户了
              格式: create user 用户名 identified by 密码 default tablespace 表空间表;
                    create user study identified by study default tablespace data_test;
                    (*我们创建一个用户名为 study,密码为 study, 缺少表空间为 data_test -这是在第二步建好的.)
                    (*缺省表空间表示 用户study今后的数据如果没有专门指出,其数据就保存在 data_test中, 也就是保存在对应的物理文件 e:\oracle\oradata\test\data_1.dbf中)
    
    创建用户并指定表空间
    CREATE USER cici IDENTIFIED BY cici PROFILE DEFAULT DEFAULT TABLESPACE CICI ACCOUNT UNLOCK;
    create user jykl identified by jykl default tablespace jykl_data temporary tablespace jykl_temp;
    授权给新用户
    GRANT connect, resource TO cici;
    grant create session to cici;
    4. 授权给新用户
              grant connect,resource to study; 
              --表示把 connect,resource权限授予study用户
              grant dba to study;
              --表示把 dba权限授予给 study
    5. 创建数据表           
          在上面,我们已建好了用户 study 我们现在进入该用户           
          sqlplusw study/study@test   然后就可以在用户study中创建数据表了           
          格式: create table 数据表名 
    
    
    oracle命令建立主键外键
     
    1、创建一张学生表
    create table t_stu(  
      stuid      number(10)   primary key,  
      stuname    varchar2(20) not null,  
      stusex     varchar2(2)  default '男' check(stusex in('男','女'))
    );  
       
     2、创建一张课程表
    create table t_couse(  
      couseid     number(10)   primary key,  
      cousename   varchar2(20) not null,  
      cousetype   varchar2(4)
    );  
     
    3、创建一张学生课程成绩表(包括主外键)
    create table t_score(  
      scoreid    number(10) primary key,  
      stuid      number(10) references t_stu(stuid),  
      couseid    number(10),  
      constraint fk_couseid foreign key(couseid)  
      references t_couse(couseid)  
      on delete cascade
    ); 
    
    
    CREATE TABLE log(
    log_id int(10)   unsigned NOT NULL auto_increment,
    log_time         datetime NOT NULL,
    log_user         varchar(30) NOT NULL,
    log_title        varchar(30) default NULL,
    log_content      text default NULL,
    PRIMARY KEY(log_id));

    orale表管理: 

    Oracle创建表同SQL Server一样,使用CREATE TABLE命令来完成。创建约束则使用如下命令:

    语法格式:alter table命令

    alter table 表名 add constraint 约束名 约束内容。

    不论创建表还是约束,与SQL Server基本相同,注:在Oracle中default是一个值,而SQL Server中default是一个约束,因此Oracle的default设置可以在建表的时候创建。

    案例1:创建一个学生信息(INFOS)表和约束

     Oracle创建表和约束

     create table INFOS(

     STUID            varchar2(7) not null,               --学号 学号=‘S’+班号+2位序号

     STUNAME          varchar2(10) not null,              --姓名

     GENDER           varchar2(2) not null,               --性别 

     AGE              number(2) not null,                 --年龄

     SEAT             number(2) not null,                 --座号

     ENROLLDATE       date,                               --入学时间

     STUADDRESS       varchar2(50) default '地址不详',     --住址

     CLASSNO          varchar2(4) not null,               --班号 班号=学期序号+班级序号 

    );

    /  ①

    alter table INFOS add constraint pk_INFOS primary key(STUID)  ②

    /

    alter table INFOS add constraint ck_INFOS_gender check(GENDER = '男' or GENDER = '女')  ③

    /

    alter table INFOS add constraint ck_INFOS_SEAT check(SEAT >=0 and SEAT <=50)  ④

    /

    alter table INFOS add constraint ck_INFOS_AGE check(AGE >=0 and AGE<=100)  ⑤

    /

    alter table INFOS add constraint ck_INFOS_CLASSNO check((CLASSNO >='1001' and CLASSNO<='1999') or

    (CLASSNO >='2001' and CLASSNO<='2999'))  ⑥

    /

    alter table INFOS add constraint un_STUNAME unique(STUNAME)  ⑦

    /

    代码解析:

    ①  在Oracle代码中,“/”执行缓存区中的语句,由于缓冲区中只存储一条刚刚保存过语句,由于每条语句没有用分号结尾,只是保存在缓冲区,因此每条语句后面都有单独一行“/”。

    ②  创建一个主键约束。

    ③  与 ④ ⑤ ⑥ ⑦一起创建各种check约束。其中⑦是唯一约束,表示该列值是唯一的,列中的值不能重复。

     Oracle中创建外键约束与SQL Server相同。比如:现有成绩表定义如下:

     案例2:创建一个成绩表(SCORES)表和约束

     Oracle创建表和约束

    create table scores(

     ID                 number,                   --ID  ①

     TERM               varchar2(2),              --学期 S1或S2

     STUID              varchar2(7) not null,     --学号 

     EXAMNO             varchar2(7) not null,     --考号 E+班号+序号

     WRITTENSCORE       number(4,1) not null,     --笔试成绩

     LABSCORE           number(4,1) not null,     --机试成绩

    );

    ALTER TABLE SCORES ADD CONSTRAINT CK_SCORES_TERM CHECK(TERM = 'S1' OR TERM ='S2')

    /

    ALTER TABLE SCORES ADD CONSTRAINT FK_SCORES_INFOS_STUID FOREIGN KEY(STUID) REFERENCES INFOS(STUID)  ②

    /

    代码解析:

    ①  SQL Server中可以使用identify创建自动增长列,但是Oracle中的自动增长需要借助序列(Sequence)完成,在后面章节中讲解。

    ②  Oracle中的外键约束定义。

    注意:表名,字段名要大写! 

     

    oracle建表、建主键、外键基本语法

    -创建表格语法:     

    create table 表名(       

    字段名1  字段类型(长度)   是否为空,        

    字段名2  字段类型           是否为空 );

    -增加主键     

    alter table 表名 add constraint 主键名 primary key (字段名1);

    -增加外键:     

    alter table 表名 add constraint 外键名 foreign key (字段名1) references 关联表 (字段名2);

    在建立表格时就指定主键和外键

    create table T_STU(

     STU_ID                char(5) not null,    

     STU_NAME              VARCHAR2(8) not null, 

     constraint PK_T_STU primary key (STU_ID));

    主键和外键一起建立:     

    create table T_SCORE(

     EXAM_SCORE             number(5,2), 

     EXAM_DATE              date,

     AUTOID                 number(10) not null,

     STU_ID                 char(5),

     SUB_ID                 char(3),

     constraint PK_T_SCORE primary key (AUTOID),

     constraint FK_T_SCORE_REFE foreign key (STU_ID) references T_STU (STU_ID));

     

    orale数据类型:

    类型

    含义

    CHAR(length)

    存储固定长度的字符串。参数length指定了长度,如果存储的字符串长度小于length,用空格填充。默认长度是1,最长不超过2000字节。

    VARCHAR2(length)

    存储可变长度的字符串。length指定了该字符串的最大长度。默认长度是1,最长不超过4000字符。

    NUMBER(p,s)

    既可以存储浮点数,也可以存储整数,p表示数字的最大位数(如果是小数包括整数部分和小数部分和小数点,p默认是38为),s是指小数位数。可存负数

    DATE

    存储日期和时间,存储纪元、4位年、月、日、时、分、秒,存储时间从公元前4712年1月1日到公元后4712年12月31日。

    TIMESTAMP

    不但存储日期的年月日,时分秒,以及秒后6位,同时包含时区。

    CLOB

    存储大的文本,比如存储非结构化的XML文档

    BLOB

    存储二进制对象,如图形、视频、声音等。

    2. 创建表时给字段加默认值 和约束条件

    创建表时可以给字段加上默认值 例如 : 日期字段 DEFAULT SYSDATE 这样每次插入和修改时, 不用程序操作这个字段都能得到动作的时间

    例如:IS_SEND    NUMBER(1) default 1        --是否已发

    创建表时可以给字段加上约束条件 例如: 非空 NOT NULL ,不允许重复 UNIQUE ,关键字 PRIMARY KEY ,按条件检查 CHECK (条件), 外键 REFERENCES 表名(字段名)

    3. 创建表的例子

    create table DEPT(
      DNAME      varchar2(14),                  
      LOC           varchar2(6),   
      EPTNO       number(2)   constraint PK_DEPT  primary  KEY,                      
    );

    create table region(
      ID                    number(2) not null primary KEY,                  
      postcode           number(6) default '0' not null,   
      areaname          varchar2(30) default '' not null,                      
    );

     

    4. 创建表时的命名规则和注意事项

    1)表名和字段名的命名规则:必须以字母开头,可以含符号A-Z,a-z,0-9,_,$,#

    2)大小写不区分

    3)不用SQL里的保留字, 一定要用时可用双引号把字符串括起来

    4)用和实体或属性相关的英文符号长度有一定的限制

    5)约束名的命名规则和语法 约束名的命名规则约束名如果在建表的时候没有指明,系统命名规则是SYS_Cn(n是数字) 约束名字符串的命名规则同于表和字段名的命名规则

    6)使用约束时的注意事项 约束里不能用系统函数,如SYSDATE和别的表的字段比较 可以用本表内字段的比较

    注意事项:

    1)建表时可以用中文的字段名, 但最好还是用英文的字段名

    2)创建表时要把较小的不为空的字段放在前面, 可能为空的字段放在后面

    3)建表时如果有唯一关键字或者唯一的约束条件,建表时自动建了索引

    4)一个表的最多字段个数也是有限制的,254个.

     

    想在事务处理后, 做约束的

    检查 SQL> alter session set constraints deferred.

    7. 由实体关系图到创建表的例子 s_dept 前提条件:已有region表且含唯一关键字的字段id SQL> CREATE TABLE s_dept (id NUMBER(7) CONSTRAINT s_dept_id_pk PRIMARY KEY, name VARCHAR2(25) CONSTRAINT s_dept_name_nn NOT NULL, region_id NUMBER(7) CONSTRAINT s_dept_region_id_fk REFERENCES region (id), CONSTRAINT s_dept_name_region_id_uk UNIQUE(name, region_id));

    8. 较复杂的创建表例子 SQL> CREATE TABLE s_emp (id NUMBER(7) CONSTRAINT s_emp_id_pk PRIMARY KEY, last_name VARCHAR2(25) CONSTRAINT s_emp_last_name_nn NOT NULL, first_name VARCHAR2(25), userid VARCHAR2(8) CONSTRAINT s_emp_userid_nn NOT NULL CONSTRAINT s_emp_userid_uk UNIQUE, start_date DATE DEFAULT SYSDATE, comments VARCHAR2(25), manager_id NUMBER(7), title VARCHAR2(25), dept_id NUMBER(7) CONSTRAINT s_emp_dept_id_fk REFERENCES s_dept(id), salary NUMBER(11,2), commission_pct NUMBER(4,2) CONSTRAINT s_emp_commission_pct_ck CHECK (commission_pct IN(10,12.5,15,17.5,20)));

    8. 通过子查询建表 通过子查询建表的例子 SQL>CREATE TABLE emp_41 AS SELECT id, last_name, userid, start_date FROM s_emp WHERE dept_id = 41;

    SQL> CREATE TABLE A as select * from B where 1=2; 只要表的结构.

    10. 用子查询建表的注意事项 1)可以关连多个表及用集合函数生成新表,注意选择出来的字段必须有合法的字段名称,且不能重复。 2)用子查询方式建立的表,只有非空NOT NULL的约束条件能继承过来, 其它的约束条件和默认值都没有继承过来. 3)根据需要,可以用alter table add constraint ……再建立其它的约束条件,如primary key等.

    11. Foreign Key的可选参数ON DELETE CASCADE 在创建Foreign Key时可以加可选参数: ON DELETE CASCADE它的含义是如果删除外键主表里的内容,子表里相关的内容将一起被删除. 如果没有ON DELETE CASCADE参数,子表里有内容,父表里的主关键字记录不能被删除掉.

    12. 如果数据库表里有不满足的记录存在,建立约束条件将不会成功.

    13. 给表创建和删除同义词的例子 SQL> CREATE SYNONYM d_sum 2 FOR dept_sum_vu;

    SQL> CREATE PUBLIC SYNONYM s_dept 2 FOR alice.s_dept;

    SQL> DROP SYNONYM s_dept;

     

     

    ORACLE之新建

    创建一个名为INSURES的表

    create table INSURES

    (

     INSURE_NO                CHAR(18) not null,          --医保号

     GETSURE_UNIT_NO          CHAR(9) not null,           --经办机构号

     INSURE_NAME              VARCHAR2(10) not null,      --姓名

     INSURE_SEX               CHAR(1) not null,           --性别

     ID_CARD_NO               CHAR(18) not null,          --身份证号

    );

    创建/修改主键,唯一性约束和外键   这里INSURE_NO, GETSURE_UNIT_NO唯一性约束

    alter table INSURES

    add constraint UNQ_INSURES unique (INSURE_NO, GETSURE_UNIT_NO)

    alter table TWN_SEED

    add constraint UNQ_INSURES primary key (。。。。)

    创建索引

    create index IDX_INSURES on INSURES (GETSURE_UNIT_NO, SONSURE_UNIT_NO, UNIT_NO, FAMILY_NO, HOSPS_NO)

     

    创建一个PK的时候,是自动创建一个与之对应的唯一索引的。  如果不特别指定,那么这个索引的表空间和表格的空间是一样的,但是我们不建议放在一起。

    create table testone(

    name varchar2(10 char))

    TABLESPACE1;

    ALTER TABLE TESTONE ADD CONSTRAINT  PK_TESTONE1 PRIMARY KEY(NAME) USING INDEX TABLESPACE TABLESPACE2;

    作为一种好习惯,不要把索引和表格的数据存在在同一个表空间中

     

    Oracle创建表语法 - create

    --创建Oracle表(使用create关键字)

    -- ******    

    (1)创建新表 use 数据库(在那个数据库中建表) create table 表名

    ( 字段名1(列名) 数据类型 列的特征,

    字段名2(列名) 数据类型 列的特征(NOT NULL),

    ...... )


    (2)创建带有主键约束的表语法 create table 表名 (

    字段名1(列名) 数据类型 列的特征,

    字段名2 数据类型 列的特征(NOT NULL),

    ...... primary key(主键列字段))

     

    (3)利用现有的表创建表 -- 注意:仅复制Oracle数据表结构:采用的是子查询方式 create table 新表 as select * from 旧的表 where 1=2
    (4)利用现有的表的结构创建新表 -- 注意:仅复制Oracle数据表结构:采用的是子查询方式 create table 新表 select 字段1,字段2... from 旧的表 where 条件(旧的表字段满足的条件)
    (5)利用现有的表的结构创建新表 -- 注意:复制Oracle数据表数据 create table 新表 as select * from 旧的表 where 1=1
    (6)利用现有的表的结构创建新表  -- 注意:复制Oracle数据表数据 create table 新表 as select 字段1,字段2... from 旧的表 where 条件(旧的表字段满足的条件)(7)将查询结果插入另一张表 insert into 另一张表     select * from 要查询的表 where 条件(要查询的表的列符合什么条件)

     

    oracle create table(转)

     

    • //建测试表  
    • create table dept(  
    •        deptno number(3) primary key,  
    •        dname varchar2(10),  
    •        loc varchar2(13)   
    •        );  
    • create table employee_info(  
    •        empno number(3),  
    •        deptno number(3),  
    •        ename varchar2(10),  
    •        sex char(1),  
    •        phone number(11),  
    •        address varchar2(50),  
    •        introduce varchar2(100)  
    •        );  
    • --   
    • 重命名  
    • 重命名表:rename dept to dt;  
    •              rename dt to dept; 
    •  
    • 重命名列:alter table dept rename column loc to location;  
    •              alter table dept rename column location to loc;  
    • 添加约束  
    • 1. primary key  
    •       alter table employee_info add constraint pk_emp_info primary key(empno);
    •   
    • 2. foreign key  
    •       alter table employee_info add constraint fk_emp_info foreign key(deptno)  
    •       references dept(deptno);  
    •  
    • 3. check  
    •       alter table employee_info add constraint ck_emp_info check  
    •       (sex in ('F','M'));  
    •  
    • 4. not null  
    •       alter table employee_info modify phone constraint not_null_emp_info not null;  
    •  
    • 5. unique  
    •       alter table employee_info add constraint uq_emp_info unique(phone);  
    •  
    • 6. default  
    •       alter table employee_info modify sex char(2) default 'M';  
    •  
    • 添加列  
    •    alter table employee_info add id varchar2(18);  
    •    alter table employee_info add hiredate date default sysdate not null; 
    •  
    • 删除列  
    •    alter table employee_info drop column introduce;  
    •  
    • 修改列  
    • 1.修改列的长度  
    •       alter table dept modify loc varchar2(50);
    •   
    • 2. 修改列的精度  
    •       alter table employee_info modify empno number(2);
    •   
    • 3. 修改列的数据类型  
    •       alter table employee_info modify sex char(2); 
    •  
    • 4. 修改默认值  
    •       alter table employee_info modify hiredate default sysdate+1; 
    •  
    • 5.禁用约束  
    •   alter table employee_info disable constraint uq_emp_info;
    •   
    • 6.启用约束  
    •   alter table employee_info enable constraint uq_emp_info;  
    •  
    • 7.延迟约束  
    •   alter table employee_info drop constraint fk_emp_info;  
    •   alter table employee_info add constraint fk_emp_info foreign key(deptno)  
    •         references dept(deptno)  
    •   deferrable initially deferred;  
    •  
    • 8.向表中添加注释  
    •   comment on table employee_info is 'information of employees';
    •   
    • 9.向列添加注释  
    •   comment on column employee_info.ename is 'the name of employees';  
    •   comment on column dept.dname is 'the name of department';  
    •  
    • 10.清除表中所有数据  
    •   truncate table employee_info; (DELETE FROM table_name或DELETE * FROM table_name) 
    •  
    • 11.删除表  
    •   drop table employee_info;  
    • --   
    • //下面来看看刚刚才我们对表dept和表employee_info所做的更改  
    • //user_constraints视图里面包含了刚刚才我们创建的所有约束,以及其他信息,  
    • //你可以用desc user_constraints命令查看其详细说明  
    • select constraint_name,constraint_type,status,deferrable,deferred  
    • from user_constraints  
    • where table_name='EMPLOYEE_INFO';  
    • --   
    • CONSTRAINT_NAME                CONSTRAINT_TYPE STATUS   DEFERRABLE     DEFERRED  
    • ------------------------------ --------------- -------- -------------- ---------   
    • PK_EMP_INFO                    P               ENABLED  NOT DEFERRABLE IMMEDIATE  
    • FK_EMP_INFO                    R               ENABLED  DEFERRABLE     DEFERRED  
    • NOT_NULL_EMP_INFO              C               ENABLED  NOT DEFERRABLE IMMEDIATE  
    • SYS_C005373                    C               ENABLED  NOT DEFERRABLE IMMEDIATE  
    • UQ_EMP_INFO                    U               ENABLED  NOT DEFERRABLE IMMEDIATE  
    • CK_EMP_INFO                    C               ENABLED  NOT DEFERRABLE IMMEDIATE  
    • //我们可以通过user_cons_columns视图查看有关列的约束信息;  
    • select owner,constraint_name,table_name,column_name  
    • from user_cons_columns  
    • where table_name='EMPLOYEE_INFO';  
    • --   
    • OWNER                          CONSTRAINT_NAME                TABLE_NAME                     COLUMN_NAME  
    • ------------------------------ ------------------------------ ------------------------------ ---------------   
    • YEEXUN                         PK_EMP_INFO                    EMPLOYEE_INFO                  EMPNO  
    • YEEXUN                         CK_EMP_INFO                    EMPLOYEE_INFO                  SEX  
    • YEEXUN                         NOT_NULL_EMP_INFO              EMPLOYEE_INFO                  PHONE  
    • YEEXUN                         SYS_C005373                    EMPLOYEE_INFO                  HIREDATE  
    • YEEXUN                         UQ_EMP_INFO                    EMPLOYEE_INFO                  PHONE  
    • YEEXUN                         FK_EMP_INFO                    EMPLOYEE_INFO                  DEPTNO  
    • //我们将user_constraints视图与user_cons_columns视图连接起来  
    • //查看约束都指向哪些列  
    • column column_name format a15;  
    • select ucc.column_name,ucc.constraint_name,uc.constraint_type,uc.status  
    • from user_constraints uc,user_cons_columns ucc  
    • where uc.table_name=ucc.table_name and  
    •       uc.constraint_name=ucc.constraint_name and  
    •       ucc.table_name='EMPLOYEE_INFO';  
    • --   
    • COLUMN_NAME     CONSTRAINT_NAME                CONSTRAINT_TYPE STATUS  
    • --------------- ------------------------------ --------------- --------   
    • EMPNO           PK_EMP_INFO                    P               ENABLED  
    • DEPTNO          FK_EMP_INFO                    R               ENABLED  
    • PHONE           NOT_NULL_EMP_INFO              C               ENABLED  
    • HIREDATE        SYS_C005373                    C               ENABLED  
    • PHONE           UQ_EMP_INFO                    U               ENABLED  
    • SEX             CK_EMP_INFO                    C               ENABLED  
    • --   
    • //这里有个constraint_type,他具体指下面几种类型:  
    • //C:check,not null  
    • //P:primary key  
    • //R:foreign key  
    • //U:unique  
    • //V:check option  
    • //O:read only  
    • --   
    • //我们可以通过user_tab_comments视图获得对表的注释  
    • select * from user_tab_comments  
    • where table_name='EMPLOYEE_INFO';  
    • TABLE_NAME                     TABLE_TYPE  COMMENTS  
    • ------------------------------ ----------- --------------------------   
    • EMPLOYEE_INFO                  TABLE       information of employees  
    • --   
    • //我们还可以通过user_col_comments视图获得对表列的注释:  
    • select * from  user_col_comments  
    • where table_name='EMPLOYEE_INFO';  
    • --   
    • TABLE_NAME                     COLUMN_NAME                    COMMENTS  
    • ------------------------------ ------------------------------ ---------------------------   
    • EMPLOYEE_INFO                  EMPNO                            
    • EMPLOYEE_INFO                  DEPTNO                           
    • EMPLOYEE_INFO                  ENAME                          the name of employees  
    • EMPLOYEE_INFO                  SEX                              
    • EMPLOYEE_INFO                  PHONE                            
    • EMPLOYEE_INFO                  ADDRESS                          
    • EMPLOYEE_INFO                  ID                               
    • EMPLOYEE_INFO                  HIREDATE   
    • --   
    • select * from user_col_comments  
    • where table_name='EMPLOYEE_INFO' and  
    •       comments is not null;  
    • --   
    • TABLE_NAME                     COLUMN_NAME                    COMMENTS  
    • ------------------------------ ------------------------------ ------------------------   
    • EMPLOYEE_INFO                  ENAME                          the name of employees  
    • --   
    • //最后我们来查看一下修改后的表:  
    • desc employee_info;  
    • Name     Type         Nullable Default   Comments                
    • -------- ------------ -------- --------- ---------------------    
    • EMPNO    NUMBER(2)                                               
    • DEPTNO   NUMBER(3)    Y                                          
    • ENAME    VARCHAR2(10) Y                  the name of employees   
    • SEX      CHAR(2)      Y        'M'                               
    • PHONE    NUMBER(11)                                              
    • ADDRESS  VARCHAR2(50) Y                                          
    • ID       VARCHAR2(18) Y                                          
    • HIREDATE DATE                  sysdate+1  
    • --   
    • desc dept;  
    • Name   Type         Nullable Default Comments                 
    • ------ ------------ -------- ------- ----------------------    
    • DEPTNO NUMBER(3)                                              
    • DNAME  VARCHAR2(10) Y                the name of department   
    • LOC    VARCHAR2(50) Y  
    
    
    
    
    
                
          create table test_user (               no          number(5)      not null , --pk               username    varchar2(30)    not null , --用户名               passpord    varchar2(30)    not null , --密码               constraint pk_connectdb primary key(no)           )storage (initial 10k next 10k pctincrease 0);

              *下面讲解上面命令的各方面的含义           create table test_user --创建数据表               no              number(5)            not null ,        --pk               (列名或字段名) 数据类型(数据长度) 该数据列不能为空 ,是列之间的分隔符 --后的内容是注释                   constraint pk_connectdb primary key(no)           (约束)    约束名      (主键)    (列名)    意思就是 在数据表 test_user中所有行数据 no的值不能相同(这就是主键的含义)

              storage (initial 10k next 10k pctincrease 0); 这个说起来比较复杂, 反正如果某个数据表要存放大量数据,就把initial和next后的值设置大一点, 否则设置小一点.

              既然上面在创建数据表中没有特别指定 表空间,当然该表就存放在study缺省表空间data_test了.

    create tablespace data_phonepos datefile 'd:\install\OracleXpdb\datafilephonepos.dbf' size 8000M; create user phonepos identified by phonepos default tablespace data_phonepos;

    grant connect, resource to phonepos; grant dba to phonepos;

     

    权限的查询

    5.1 查询某个用户授予其他用户在当前用户模式下的对象权限    select * from user_tab_privs_made --假如当前用户为WENZI,那么查询结果就是由WENZI授权,在WENZI模式下的权限记录

    5.2 查询某个用户授予其他用户在该用户模式对象及其他模式对象上的对象权限    select * from all_tab_privs_made -- 假如当前登录用户为WENZI,那么查询结果就是所有由WENZI授予的权限的记录

     

    修改用户

    ALTER USER avyrros IDENTIFIED EXTERNALLY DEFAULT TABLESPACE data_ts TEMPORARY TABLESPACE temp_ts QUOTA 100M ON data_ts QUOTA 0 ON test_ts PROFILE clerk;

    删除用户 DROP USER username [CASCADE] --CASECADE 选项会删除该用户模式下的所有对象,建议在删除前,先确认是否有其他的依赖关系存在。

    查询属于用户的对象 select owner,object_name,object_type,status from dba_objects where owner='WENZI'

    5.3 查询为某个用户授予的,在其他模式对象上的权限          select * from user_tab_privs_recd --假如当前登录用户为WENZI,那么查询结果就是WENZI在其他模式对象上的权限

    5.4 查询为某个用户授予的,在该用户模式对象与其他模式对象上的权限    select * from all_tab_privs_recd --假如当前用户为wenzi,则查询结果为wenzi在整个数据库中拥有权限的对象

     

    角色管理

    创建口令文件 orapwd file='..........\pwd{SID}.ora' password='***(sys的密码)' tntries=10(口令文件最大的用户数量)

    要使某个用户可以使用口令文件,必须为其授予SYSDBA权限,系统会自动将其加入到口令文件中。 grant sysdba to wenzi 当收回SYSDBA权限时,系统将对应的用户从口令文件中删除。 revoke sysdba from wenzi

    查看口令文件管理的用户 select * from v$pwfile_users

    
    
    
    
    
    
    创建步骤: 
    SYS用户在CMD下以DBA身份登陆:
    [user@root ~]$ sqlplus /nolog

       SQL> conn sys/h1w2D3B4 as sysdba

       SQL> startup

       [user@root ~]$ lsnrctl start

    // 分为四步

    //第1步:创建临时表空间  

    create temporary tablespace user_temp  

    tempfile 'D:\oracle\oradata\Oracle9i\user_temp.dbf'

    size 50m  

    autoextend on  

    next 50m maxsize 20480m  

    extent management local;  

     

     //第2步:创建数据表空间  

    create tablespace user_data

    logging  

    datafile 'D:\oracle\oradata\Oracle9i\user_data.dbf' 

    size 50m  

    autoextend on  

    next 50m maxsize 20480m  

    extent management local;  

     

    //第3步:创建用户并指定表空间  

    create user username identified by password  

    default tablespace user_data  

    temporary tablespace user_temp;  

     

    //第4步:给用户授予权限  

     grant connect,resource to username;  

     

    ---------------------------------------------------------------------------------

    //以后以该用户登录,创建的任何数据库对象都属于user_temp 和user_data表空间,

    这就不用在每创建一个对象给其指定表空间了 

    撤权:  

     revoke   权限...   from  用户名;

    删除用户命令

    drop user user_name cascade;

    建立表空间

    CREATE TABLESPACE data01

    DATAFILE '/oracle/oradata/db/DATA01.dbf' SIZE 500M

    UNIFORM SIZE 128k; #指定区尺寸为128k,如不指定,区尺寸默认为64k

    删除表空间

    DROP TABLESPACE data01 INCLUDING CONTENTS AND DATAFILES;

    一、建立表空间

    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;

    设定后查看表空间信息

    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

     

     

     

    创建数据表:

    Oracle中建表和指定表空间

     

    --建一个表 create table HH2(

    tid number primary key ,--主键设定

    tname varchar2(20)

    );

    --删除表 drop table HH;

     

    --表空间(相当于一个数据库)(DBA权限) create tablespace test datafile 'D:test.dbf' size 10M autoextend on next 10M maxsize 100M

    --指定表在那个表空间里面(默认在USERS表空间里) create table HH(tid number primary key) tablespace test; select * from tabs;

    --删除 表空间 drop tablespace test including contents and datafiles --连带物理文件和表空间中的数据也一起删除

     

     

    --建表建约束 create table student1(    

    sid number primary key,    

    sname varchar2(20) not null,

    sage number,

    ssex char(2),

    saddress varchar2(100),

    cid number references tclass(cid)--建立外键关系 );

    create table tclass (

    cid number primary key,

    cname varchar2(20) );

    --唯一unique 检查 check 默认值 modify 添加外键关系 添加列

    alter table student1 add constraint UQ_student1_sname unique(sname);

    alter table student1 add constraint CK_student1_agae check(sage between 19 and 70);

    alter table student1 modify ssex default '男';

    alter table student1 add constraint FK_student1_cid foreign key(cid) references tclass(cid);

    alter table student1 add dt date;

    --删除约束 alter table student1 drop constraint  UQ_student1_sname ;

     

     

     

     

    1.创建oracle数据表

    创建oracle数据表的语法如下:

    create table命令用于创建一个oracle数据表;括号内列出了数据表应当包含的列及列的数据类型;tablespace则指定该表的表空间。

    创建数据表students。

    在该创建语句中,依次定义了student_id、student_name、student_age、status及version等列;tablespace users表示将表创建于表空间users中。

    通过视图user_tables可以获得当前用户所拥有的表信息,利用如下SQL语句可以查看表student的表空间信息。

    在oracle的SQL命令行下,可以利用describe命令来查看已有数据表的表结构,如下所示。

    2.数据表的相关操作

    数据表创建之后,由于某些原因,例如,设计时的考虑不足,往往需要对其进行结构上的调整。常见的调整包括,增加新列、修改已有列、删除、重命名已有列。另外,还可以转移数据表的表空间。

    修改数据表结构应当使用alter table命令。例如,在表student中,增加新列class_id(班级ID)的SQL语句如下图所示。

    alter table student 用于修改表student的结构;add用于增加列,注意此处没有collumn关键字;小括号内是列及列的数据类型;用户可以一次性为表增加多个列,各列之间使用逗号进行分隔。

    在修改成功之后,表student的结构如下所示。

    同样,可以利用alter命令修改和删除已有列。

    利用alter命令将class_id的数据类型修改为varchar2(20)。

    modify(class_id varchar2(20))用于修改表student中的已有列class_id,实际相当于重新定义。该列新的数据类型为varchar2(20)。此时表student的结构如下:

    通过modify选项可以将列的类型重新定义,而通过drop选项则删除已有列,如下所示。

    drop column class_id用于删除已有列class_id;需要注意的是,此处必须添加column选项,才能表示删除的目标是一个列。此时,表student的结构已经修改如下:

    对于数据表的列,除了增、删、改操作之外,还可以进行重命名操作。重命名一个列,应该使用rename选项。例如,为了与其他数据表进行统一,需要将表student的列student_id重命名为id,则可以利用如下SQL语句。

    rename column student_id to id用于将列student_id重命名为id。此时,表student的结构如下所示。

    对于调整数据表结构来说,要特别注意严谨性。列的数据类型的修改,有可能会影响应用程序对数据库进行存取;而列的删除和重命名更需要检查应用程序是否会出现关联性错误。

    如果数据表创建时,选择了错误的表空间,那么可以利用alter table命令,结合move tablespace选项转移表空间,如下图所示。

    将表student转移至表空间users中。

    alter table student用于修改表student的属性;move tablespace users用于将表student从当前表空间转移至表空间users。可以通过查询视图user_tables获得表student转移之后的表空间信息,如下所示。

    分析查询结果可知,利用move tablespace选项已经成功实现了表空间的转移。

    删除数据表

    利用drop table命令删除数据表

    有时,由于某些约束的存在,例如,当前表的主键被其他表用作外键,会导致无法成功删除。利用cascade constraints选项可以将约束同时删除,从而保证drop table命令一定能够成功执行。

    特殊的数据表dual

    dual表实际属于系统用户sys,具有了数据库基本权限的用户,均可查询该表的内容,如下所示:

    或者

    分析查询结果可知,dual表仅含有一行一列。该表并非为了存储数据而创建的,其存在的意义在于提供强制的数据源。

    在oracle中,所有查询语句必须满足select column_name from table_name的格式。但是,在某些场景下,数据源table_name并不明确。例如,函数sysdate()用于返回当前日期,那么在SQL命令行下调用该函数时,很难有明确的数据源,此时即可使用dual表。

    利用dual表提供数据源,以获得当前日期。

    同样,对于各种数学运算,同样可以利用dual表作为数据源,来打印和查看输出结果。

    dual表提供了一行一列的数据格式,从而使各种表达式、函数运算在以其为数据源时,能够输出单行单列的形式。

    由于dual表的所有者为系统用户sys,因此,只有用户利用该身份登录数据库才可以修改该表。但是,修改该表的内容或者结构都应该被禁止。

     

     

    oracle create tablespace

     

     

    1. create tablespace ZGECM   
    2.  logging datafile 'G:\oracle\product\10.2.0\ZGECM.DBF'  
    3.  size 500M autoextend on  
    4.  next 10M maxsize 500M extent management local  
    5.   
    6.   
    7. create user sms2 identified by sms2 default tablespace ECM2   
    8. temporary tablespace temp profile default;  
    9.   
    10. --6 授权给新建用户  
    11. grant connect,resource to sms2;  
    12. grant dba to sms2;  
    13.   
    14.   
    15. exp xuner_ecm/xuner_ecm@192.168.1.139/SMS FILE=E:/xunerecm0910_server.DMP OWNeR=xuner_ecm  
    16.   
    17. imp scjt/scjt@SMS fromuser=ecm touser=sms2 file='G:\sms.dmp'   
    18.   
    19.   
    20. imp SMS/SMS@LOCAL_SMS fromuser=SMS touser=SMS file='G:\sms.dmp'    
    21.   
    22. select userenv('language') from dual;     //查询oracle服务器端的字符  
    23.   
    24. select nls_charset_name(to_number('0354','0354'))  
    25.  from dual;  
    26.   
    27.   
    28.   
    29. CREATE DATABASE LINK sms CONNECT TO sms IDENTIFIED BY sms  
    30. USING 'SMS';  
    31.   
    32.   
    33.   
    34. insert into XSJBXXB select * from sms.xsjbxxb@zhang2  
    35.   
    36. insert into XSJBXXB select * from sms.xsjbxxb@to_test  
    37.   
    38. --创建dblink  
    39.  create database link to_test  
    40.   connect to sms identified by sms  
    41.   using 'ZHANG';  
    42.   
    43. '(DESCRIPTION =(  
    44. ADDRESS_LIST =(  
    45. ADDRESS =(  
    46. PROTOCOL = TCP)(  
    47. HOST = 192.168.0.100)(PORT = 1521)))  
    48. (CONNECT_DATA =(SERVICE_NAME = AAA)))'  
    49.   
    50. --查询约束  
    51. select owner,constraint_name,table_name from user_constraints   
    52. where constraint_name='SYS_C00119759'  
    53.   
    54.   
    55.   
    56. -----------------------------------------------------  
    57.   
    58.   
    59. /*分为四步 */  
    60. /*第1步:创建临时表空间  */  
    61. create temporary tablespace user_temp    
    62. tempfile 'D:\oracle\oradata\Oracle9i\user_temp.dbf'   
    63. size 50m    
    64. autoextend on    
    65. next 50m maxsize 20480m    
    66. extent management local;    
    67.    
    68. /*第2步:创建数据表空间  */  
    69. create tablespace user_data    
    70. logging    
    71. datafile 'D:\oracle\oradata\Oracle9i\user_data.dbf'   
    72. size 50m    
    73. autoextend on    
    74. next 50m maxsize 20480m    
    75. extent management local;    
    76.    
    77. /*第3步:创建用户并指定表空间  */  
    78. create user username identified by password    
    79. default tablespace user_data    
    80. temporary tablespace user_temp;    
    81.    
    82. /*第4步:给用户授予权限  */  
    83. grant connect,resource,dba to username;  
    84.   
    85.   
    86. --Error dropping MEM_GENINF:  
    87. --ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源   
    88. --Record is locked by another user  
    89.   
    90. --1.查看锁  
    91. select t2.username,t2.sid,t2.serial#,t2.logon_time   
    92. from v$locked_object t1,v$session t2 where t1.session_id=t2.sid ;   
    93.   
    94. --2、Kill   
    95. alter system kill session 'sid,serial#';   
    96. alter system kill session '151,14678';  
    展开全文
  • MySQL表空间简介

    万次阅读 2018-11-13 11:02:47
    本文主要介绍一下MySQL中的几种表空间概念及相关操作。 基础材料: CentOS7.5 MySQL 5.7.24 ############################################### system tablespace(系统表空间) 相关定义 : 一般用来存放mysql...

    本文主要介绍一下MySQL中的几种表空间概念及相关操作。

    基础材料: CentOS7.5  MySQL 5.7.24

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

    system tablespace(系统表空间)

    相关定义 : 一般用来存放mysql系统相关信息的一个特殊的共享表空间

    存放路径 : 默认为MySQL初始化路径下的ibdata1文件

    存放内容 : InnoDB data dictionary(InnoDB元数据信息)、doublewrite buffer(双写缓冲区)、change buffer(改变缓冲区)、undo logs以及用户创建的表也可以指定在系统表空间(但一般不这么做)

    注:关于上述几项将另起一篇详细说明

    控制参数: 

    innodb_data_file_path   表空间大小及文件个数由该参数决定,该参数为全局参数,不可动态修改默认值为 ibdata1:12M:autoextend,默认的12M大小是根据innodb_page_size按最大值指定的,为了确保其空间可以容纳doublewrite buffer pages

    innodb_page_size为16K时(MySQL默认值) 最小值为3M

    innodb_page_size为32K时   最小值为6M

    innodb_page_size为64K时   最小值为12M

    指定多个文件该参数格式如下(my.cnf):

    [mysqld]下添加

    innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend[:max:maxfilesize]

    注:autoextend(自动扩展)及max(最大文件大小)两个参数只能指定在最后一个ibdata上

    autoextend默认每次自动扩展64M,指定其扩展大小参数为innodb_autoextend_increment=32M

    innodb_data_home_dir   表空间存放位置控制参数,该参数为全局参数,不可动态修改,默认值为空,即所有表空间建立在数据库初始化目录下

    指定自定义表空间位置如下:

    innodb_data_home_dir = /path of mysql data file

    注:=号两边需要有空格,Mysql不会主动创建目录,指定该位置时需提前创建目录,保证权限正确

    如果指定该参数为空,也可以为innodb_data_file_path指定绝对路径

    [mysqld]

    innodb_data_home_dir =

    innodb_data_file_path=/path/ibdata1:50M;ibdata2:/path/ibdata2:50M:autoextend[:max:maxfilesize]

    相关问题: 

    如果表空间所在文件系统满了怎么办?

    一是扩展文件系统

    二是在另外文件系统上新建系统表空间,步骤如下

    1.停止mysql

    2.修改my.cnf,innodb_data_file_path参数,将最后面文件的:autoextend[:max:maxfilesize]去掉,统计文件大小,将前面的50M修改为实际大小(统计大小进为1M的整数倍,例如统计大小不足200M,就写200M即可),写上新的文件系统的绝对路径,后面添加:autoextend[:max:maxfilesize],注意新建路径及相应权限

    原:

    [mysqld]            

    innodb_data_home_dir =

    innodb_data_file_path=/path of mysql data file/ibdata1:50M:autoextend[:max:maxfilesize]

    新:                   

    [mysqld]            

    innodb_data_home_dir =

    innodb_data_file_path=/path of old data file/ibdata1:200M;/path of new data file/ibdata2:50M:autoextend[:max:maxfilesize]

    3.启动mysql

    如何缩小系统表空间?

    不能直接删除文件,将mysql数据导出,重做数据库,再将数据导入

    指定裸设备存储系统表空间: 

    步骤如下:

    1.创建裸设备表空间

     [mysqld] 

     innodb_data_home_dir =

     innodb_data_file_path=/dev/sda1:10Gnewraw;/dev/sdb1:20Gnewraw

     注:10G为指定空间大小,后面的newraw为新建关键字                    

     2.重启mysql,此时系统会初始化裸设备表空间,期间不要有任何操作

     3.待初始化完成(系统启动完成),关闭停止数据库,修改配置文件为                

     [mysqld] 

     innodb_data_home_dir =

     innodb_data_file_path=/dev/sda1:10Graw;/dev/sdb1:20Graw

      4.启动数据库

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

    File-Per-Table tablespace (单表表空间)(默认表空间形式)

    相关定义 : 一般用来存放用户创建的表数据及索引的一个独立表空间,即一张表对应一个表空间文件

    存放路径 : 默认为MySQL初始化路径下对应数据库名称文件夹下的 .frm(表结构文件),.ibd(数据+索引),.opt(数据库默认字符集及排序方式)

    注:MyISAM引擎下由于其数据和索引是分开存放的,没有ibd文件,对应为.MYD(数据),.MYI(索引)

    存放内容 : 用户表数据及索引

    控制参数: 

    innodb_file_per_table    是否开启单表表空间,该参数为全局参数,可动动态修改,默认为ON,如果设置为OFF,在没有显式指定表空间情况下,数据及索引默认存放到系统表空间ibdata下

    相关问题:

    使用单表表空间的优势?

    1.使用单表表空间,在drop或者truncate时空间可以被收回至操作系统用做其他用途,如果使用系统表空间时,空间只能回收至表空间层级,只能用作mysql存储数据

    2. 执行truncate速度更快

    3. 在表级别指定不同表存放在不同的存储设备上,以提高性能

    4. 可以执行optimize table重组表空间内部数据排列(同时也是主键索引的重新排列),回收多余空间,相当于oracle的降高水位操作,过程一般为建立临时表空间排列实际数据,完成后,删除旧表空间,以新表空间代替旧表空间

    5. 进行单表空间在不同实例间移动,而不必处理整个数据库表空间。

    6. 单表表空间使用 Barracuda 文件格式,支持行压缩 (compressed row formats)及动态行格式( dynamic row formats),动态行格式可以存储BLOB及TEXT更有效率(这两种大字段类型的列,不走页面管理(innodb_page_size))

     7.  统计表的占用空间,可以在操作系统层面直接查看文件大小

    8. mysql表空间有最大值限制(innodb_page_size*4TB),默认16K对应最大值为64TB,使用单表表空间有助于分散容量,虽然一般情况下用不了这么多...

    使用单表表空间的劣势?

    1. 生产多个表空间可能存在空间碎片,需要对每个表空间执行optimize table,否则可能存在大量空间浪费   

    2. fsync刷盘操作需要对所有被打开的表单独执行,占用更多的I/O

    3. 对于每个打开的表都会产生句柄及文件描述符,数量较大的情况可能影响性能

    4. drop单表表空间时,buffer pool会有大概几秒的时间产生一个扫描,并施加全局内部锁,导致其他操作延迟执行对于系统表空间的表不受影响

    5. innodb_autoextend_increment参数对于单表表空间没有作用,单表表空间每次自动扩展大小为4MB

     如何在默认路径外创建File-Per-Table tablespace?

     使用关键字 DATA DIRECTORY = absolute_path_to_directory,注意目录权限问题

     例:

     mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) DATA DIRECTORY = '/absolute_path_to_directory';

     此时会在默认路径下生成.frm文件以及.isl文件,.isl相当于一个软链接,指向/absolute_path_to_directory外部路径

    单表表空间如何在其他instance中迁移?

    步骤如下:

    1.源实例执行,创建测试表

    mysql > CREATE TABLE test(a INT) ENGINE=InnoDB;

    mysql > insert into test value (1);

     2. 目的实例执行,创建测试表

    mysql > CREATE TABLE test(a INT) ENGINE=InnoDB;

     3. 目的实例执行, detached并删除原表空间,此时mysql为该表加排它锁,该操作会记录binlog如果是主从结构需要关注一下,可以暂停binlog记录

    mysql> ALTER TABLE test DISCARD TABLESPACE;

    4. 加共享锁锁表防止导出过程中数据不一致,此时当前session对该表可读不可写,对其他表不可读不可写。其他session对该表可读不可写,对其他表正常读写。将buffer中的脏页刷入磁盘,其表空间所在目录下生成.cfg文件,该文件主要作用是导入时进行schema验证,可用cat查看其内容。此操作不会记录binlog

     mysql> FLUSH TABLES test FOR EXPORT;

    5. 拷贝.cfg和.ibd文件到目的主机的对应表空间存放路径下,注意查看文件权限是否正确,否则导入时会提示找不倒表空间文件

    shell> scp /path of database/directory/test.{ibd,cfg} destination-server:/path of database directory

    6. 为源主机表释放锁,删除.cfg文件

    mysql> UNLOCK TABLES;

    7. 目标主机导入表空间,此过程会检查页面是否损坏,更新各页面LSN,并将脏页刷新至硬盘

    mysql> ALTER TABLE test IMPORT TABLESPACE;

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

    General  tablespace(通用表空间)

    相关定义 : 一般用来存放用户创建的表数据及索引的一个共享表空间,即多表数据存放在同一表空间内

    存放路径 : 手工创建时指定的绝对路径,如果只指定了文件名则创建在数据库默认路径下

    存放内容 : 用户创建表的数据及索引

    控制参数 : 无直接控制参数

    相关问题 :

    如何创建通用表空间?

    CREATE TABLESPACE tablespace_name ADD DATAFILE 'file_name'  [FILE_BLOCK_SIZE = value]  [ENGINE [=] engine_name]

    例:mysql> CREATE TABLESPACE `test` ADD DATAFILE 'test.ibd' Engine=InnoDB;

           mysql> CREATE TABLESPACE `test` ADD DATAFILE '/outside tablespace directory/test.ibd' Engine=InnoDB;

    说明:如果不指定文件的绝对路径时,表空间默认建立数据库目录下,如果指定绝对路径需要提前创建该路径并保证相应的读写权限,外部建立表空间时同样会在数据库所在目录下生成.isl的软连接文件。表空间文件名需要以ibd结尾。可选参数[FILE_BLOCK_SIZE = value],在启用压缩表时必须指定,[ENGINE [=] engine_name]在default_storage_engine全局参数未指定时(default_storage_engine=InnoDB是默认值)需要显式定义。

    通用表空间优势?

    通用表空间相比单表表空间占用内存少(产生文件句柄及描述符少)

    支持Antelope and Barracuda文件格式以至于可以支持所有行格式row_format=(redundant,compact,dynamic,compressed)

    通过alter table命令可将表在系统表空间,单表表空间及通用表空间中任意移动。

    注:通用表空间不支持创建临时表

    如何在通用表空间中创建表?

    新建表:

    mysql> CREATE TABLE test (c1 INT PRIMARY KEY) TABLESPACE test [ROW_FORMAT=COMPACT];

    修改表:     

    mysql> ALTER TABLE test TABLESPACE test;                

    ROW_FORMAT是可选项,如果不指定默认为dynamic。如果指定为compressed,创建表空间时需要指定FILE_BLOCK_SIZE项,建表时也要加入参数KEY_BLOCK_SIZE项,且KEY_BLOCK_SIZE与FILE_BLOCK_SIZE为等值,以innodb_page_size为16为例,KEY_BLOCK_SIZE取值可以为(8,4,2,1),对应FILE_BLOCK_SIZE取值也应为(8,4,2,1)

     如何将表在3种表空间中移动? 

     ALTER TABLE tbl_name TABLESPACE = tablespace_name  (通用表空间名字)

     ALTER TABLE tbl_name TABLESPACE = innodb_system   (系统表空间关键字)

     ALTER TABLE tbl_name TABLESPACE = innodb_file_per_table (单表表空间关键字)

     如何确认表与表空间的归属关系?

     方法1:

     mysql> show create table test;

     输出如果明确列出表空间信息为通用表空间,如果没有列出表空间信息则为单表表空间

     方法2:

     mysql> select * from information_schema.INNODB_SYS_TABLES;

     输出项SPACE显示了表空间的ID,SPACE_TYPE显示了表空间的类型。

     mysql> select * from information_schema.INNODB_SYS_TABLESPACES;

     跟据输出的SPACE ID进行关联,找到具体的NAME

    注:额外说一下 information_schema.INNODB_SYS_TABLESTATS里存储了表的统计行数,可以直接查找,当前版本count(*)时是否直接从该表取数,还是走全表扫描还需要确认一下,先写在这里留个记录

    如何删除通用表空间?

    需要先将其中的表drop掉之后,再drop表空间

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

    REDO LOG (重做日志表空间)

    相关定义 : 用来存放Innodb存储引擎的事务日志,用于在DB崩溃后进行数据恢复时保证数据完整性

    存放路径 : 数据库默认路径下ib_logfile0,ib_logfile1,50M,循环使用

    存放内容 : 数据被修改后的值,以物理页的形式存放在REDO LOG中

    控制参数 :

    innodb_log_file_size    定义每个redolog的大小,全局参数,不支持动态修改,默认值为50331648 bytes(48M)

    innodb_log_files_in_group  定义有多少个redolog, 全局参数,不支持动态修改,默认值为2

    注:innodb_log_file_size*innodb_log_files_in_group的总值不能大于512GB

    例:编辑my.cnf文件

    [mysqld]

    innodb_log_file_size=200MB
    innodb_log_files_in_group=4 

    innodb_flush_log_at_trx_commit  定义redolog的刷盘方式,全局参数,支持动态修改,可选值为0、1、2

    当innodb_flush_log_at_trx_commit=1时(默认值),在每个事务开始时,将log buffer(内存中)写入到log file buffer(物理文件系统缓存),同时调用fsync将log file buffer持久化到物理文件log file,由于每个事物都要产生持久化io,保证了数据安全性的同时(当数据库或者操作系统宕机时,最多丢失一个事务的数据),也造成了其效率在可选参数中是最低的

    当innodb_flush_log_at_trx_commit=0时,在每个事务开始时,先写log buffer(内存中),每隔一秒(默认值,每隔N秒由参数innodb_flush_log_at_timeout=N决定)(或缓冲区满等其他条件会使其提前刷新),将log buffer(内存中)写入到log file buffer(物理文件系统缓存),同时调用fsync将log file buffer持久化到物理文件log file,由于每N秒才产生持久化io,效率会较高,同时如果数据库或者操作系统宕机会丢失N秒的数据

    当innodb_flush_log_at_trx_commit=2时,在每个事务开始时,将log buffer(内存中)写入到log file buffer(物理文件系统缓存),  每隔一秒(默认值,每隔N秒由参数innodb_flush_log_at_timeout=N决定)(或缓冲区满等其他条件会使其提前刷新), 调用fsync将log file buffer持久化到物理文件log file,由于每N秒才产生持久化io,效率会较高。如果数据库宕机时不会丢失数据,因为此时数据已经保存在文件系统缓存中,如果操作系统宕机会丢失N秒的数据。

    相关问题 :

    redolog的作用?

    redolog属于innodb存储引擎层(区别于binlog的server层),主要用于数据库崩溃后的自动恢复工作(参与恢复工作的还有undolog以及binlog(如果开启))

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

    UNDO LOG (回滚日志表空间)

    相关定义 : 用来存放Innodb存储引擎的事务日志,用于在DB崩溃后进行数据恢复时保证数据完整性

    存放路径 : 数据库默认路径下ibdata1中,与系统表空间存放于同一文件中

    存放内容 : 数据被修改前的值,以逻辑语句的形式存放在UNDO LOG中

    控制参数 :

    innodb_undo_directory

    [mysqld]

    innodb_undo_directory=/path of undo tablespace

    指定undo表空间的存储路径,该参数只能在mysql初始化时指定

    innodb_undo_tablespaces

    [mysqld]

    innodb_undo_tablespaces=3

    指定UNDO表空间的数量,全局参数不支持动态修改,最大值95,默认值0,该参数只能在mysql初始化时指定

    innodb_undo_log_truncate

    [mysqld]

    innodb_undo_log_truncate=ON

    全局参数支持动态修改,默认值OFF,使用innodb_undo_log_truncate时,至少需要保证 innodb_undo_tablespaces参数为2,保证truncate其中之一时,另一个可以继续工作。

    innodb_max_undo_log_size

    [mysqld]

    innodb_max_undo_log_size=2G

    全局参数支持动态修改,默认值1G,配合innodb_undo_log_truncate参数使用,在undolog文件达到该限值时,会标记为截断,不会分配给其他事务,允许当前事务完成其操作后,回滚段不再被使用时,mysql将执行truncate,将文件大小恢复到初始化的大小(10MiB)

    innodb_rollback_segments

    [mysqld]

    innodb_rollback_segments=128

    全局参数支持动态修改,最大值128,默认值128,1个回滚段分配给系统表空间,32个回滚段分配给临时表空间,如果定义两个innodb_undo_tablespaces, innodb_rollback_segments值至少应为35个,一般保持默认值即可。

    相关问题 :

    undolog的作用?

    主要用于事务回滚及数据库崩溃后的自动恢复工作,以及MVCC(多版本控制的实现)

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

    Temporary Tablespace (临时表空间)

    相关定义 : 用于存储非压缩临时表的数据及相关对象

    存放路径 : 数据库默认路径下 ibtmp1中

    存放内容 : 临时表的数据及相关对象

    控制参数 :

    innodb_temp_data_file_path   

    [mysqld]

    innodb_temp_data_file_path=/path of data file

    全局参数不支持动态修改,默认值ibtmp1:12M:autoextend,如果不指定路径将建立在数据库初始化路径下

    相关问题:

    临时表空间的一些说明?  

    重启数据库后临时表空间会自动重建,重新分配表空间ID

    不支持裸设备

    元数据存储在 INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO 视图中

    展开全文
  • 创建表空间

    千次阅读 2018-04-15 11:15:23
     创建表空间要考虑的因素创建数据库完毕~ 创建所需的 非system表空间 ~创建表空间 ~ 空间数量 、对应数据文件大小 ~ 表空间存储管理方式、默认存储参数、块大小oracle本身 ~ 不限制表空间数目~ 限制于数据库...

    (四)、创建表空间

    1.  创建表空间要考虑的因素

    创建数据库完毕~ 创建所需的 非system表空间 ~

    创建表空间 ~ 空间数量 、对应数据文件大小 ~ 表空间存储管理方式、默认存储参数、块大小

    oracle本身 ~ 不限制表空间数目~ 限制于数据库所能拥有 数据文件数目 ~只能创建有限数的表空间

    表空间数据文件总和 ~ 不能超过 创建数据库时 ~指定的maxdatafiles参数的限制

    创建的表空间 ~默认下具有标准块大小 ~ 但也可创建具有非标准块大小的表空间


    datafile: 纸递给表空间所对应的数据文件

    size: 用于指定数据文件的尺寸

    extent management dictionary: 表空间中区的管理方式为字典管理凡是

    default storage: 用于指定默认存储参数设置。 当不设置默认存储参数时~ 系统自动使用system表空间的存储参数设置

    initial: 指定数据库对象所分配的第一个区的大小

    next: 指定数据库对象所分配的第二个区的大小

    minextents: 指定 数据库对象所分配的最少区个数

    maxentents: 指定数据库对象所分配的最多区个数

    pctincrease: 指定 从第三个区开始, 每个区比前一个区所增长的百分比

    size = next*(1+pctincrease/100)(n-2)

    n~ 表示第n个区, ~ 除第一个区和第二个区外,其他区尺寸会自动转变为db_block_size的整数倍


    2. 本地管理的表空间中的段空间管理

    create tablespace语句 ~创建一个 本地管理的表空间~

    可以使用 segment space management 子句 ~ 设定段内的可用/已用空间如何管理

    可选方式:

    2.1. auto

    这种设置下 ~ oracle使用位图管理段内可用空间 
    此处的位图 ~用于描述段内每个数据块 ~是否有足够的可用空间,来插入新数据。
    随着一个数据块中可用空间的变化,~ 及时在位图中反映她的状态。

    oracle使用位图~ 更加自动化的管理段内的可用空间。 ~自动段空间管理

    一个本地管理的 ~ 且自动段空间管理的表空间, ~ 可被创建为小文件表空间、 大文件表空间。

    创建本地管理表空间时, 自动段空间管理是默认值。


    2.2 manual

    该设置下, oracle使用可用块列表 free list ~管理段内的可用空间。

    可用块列表 ~ 记录了所有可以被用于插入新数据的 数据块


    (五)、 其他表空间操作

    1. 调整表空间大小

    查看表空间大小~ 数据占满了表空间 ~不能分配新的区,~用户不能插入数据记录

    dba改变表空间的尺寸 ~ 目前对象的大小、对象的增长速度、有规律的检查数据库对象的大小~

    快速增长的表上 ~ 经常查看表空间中的自由空间~主动增加表空间容量,~提高系统性能

    表空间 ~ 一个或多个数据文件
    表空间尺寸 ~表空间所有数据文件尺寸的总和

    表空间的大小 ~决定于数据文件的个数和大小


    调整表空间大小方法:

    重置数据文件大小: alter database datafile '' | fileno resize xx

    更改数据文件大小: 数据文件 ~ aotuextend (自动扩展)属性 ~自动调整数据文件的大小~

    也可以使用 alter tablespace 手动调整

    使用alter tablespace命令 ~ 添加新的数据文件给表空间


    1.1 数据文件的自动扩展属性(autoextend)

    激活数据文件的自动扩展选项 ~ 当数据占满数据文件所以空间 ~并且数据文件不能容纳新数据~
    系统自动扩展该数据文件。

    指定数据文件的 aotuextend子句 ~启用或禁用数据文件的自动扩展。

    文件按指定的增量增加 ~ 直到达到指定的最大值。


    使用autoextend子句优点:

    表空间的空间用尽时~无需过多的直接干预

    确保应用程序~不会由于未能分配区而暂停


    创建数据文件后,使用下列sql命令 ~启用数据文件的自动扩展:

    create tablespace

    alter tablespace


    autoextend off: 禁用
    autoextend on:启用

    next : 自动扩展是每次分配给数据文件的磁盘空间
    maxsize: 指定允许分配给该数据文件的最大磁盘空间

    unlimited: 数据文件磁盘空间设为不受限






    1.2 为表空间增加数据文件

    通过alter tablespace add datafile 命令 ~ 添加数据文件给表空间 ~增加分配给表空间的磁盘空间总量



    1.3 手工修改数据文件大小

    自动扩展选项 ~ 数据文件在数据写满时自动扩展 --》会导致递归空间操作,减低系统性能

    例: 使用sql*loader ~装载大批量数据给表emp ~数据写满数据文件 ~

    先扩展数据文件 ~才能装载数据 --》导致系统性能的降低。

    因此~ 执行批量数据装载操作前 ~ 先确定数据文件是否能够容纳足够的数据。

    如果不足,~应先扩展该数据文件~再装载数据。

    使用alter database命令 ~ 手动增加或减少 数据文件的大小

    而不必通过~ 添加数据文件、 更改自动扩展属性~ 来更改表空间的大小


    Integer: 字节为单位, 表示数据文件的绝对大小

    更改数据文件大小~ 如果比实际存储的数据库对象要小~ 大小只能减少到~
    数据文件内最后一个对象的最后一个块为止~

    保证缩减尺寸后的表空间~必须能容纳已存在的数据对象,否则提示出错信息




    2. 修改表空间读写属性

    表空间用于存放静态数据~ 不会对这些数据进行修改操作~将数据存放到只读设备上

    例:存放到光盘上

    表空间放到只读设备上~ 转变状态为只读状态。

    将表空间改为只读模式命令:


    执行命令时~ 自动回滚与表空间相关的所有事物 ~
    过度状态期间 ~ 不允许对表空间进行写入操作

    当所有事物处理提交 或者 回退后,~只读命令完成 ~表空间置于只读模式


    --》 执行命令后~ 表空间mytbs3 转变为只读状态。

    用户只能 执行查询操作select ~该表空间的对象上

    不能执行dml或ddl操作,~ 有一种ddl除外~

    可以执行 drop table 或drop index ~ 删除该表空间的表或索引

    因为这些命令 ~只影响数据字典(数据字典位于system表空间)

    drop命令只更新数据字典,~而不更新只读表空间上的物理文件


    对本地管理的表空间,~删除的段 将改为临时段 ~避免更新位图。

    将表空间设为只读状态前,~引发对表空间的数据文件 ~执行检查点操作

    表空间设为只读~可防止对表空间的数据文件进行任何写操作。

    因此,数据文件可~驻留在只读介质上,如cd-rom 或一次性写入(worm)驱动器

    使用只读表空间的好处~ 免去对数据库大量的静态数据执行备份


    要在只读表空间上~执行dml操作,~将表空间改为可写状态

    使用alter tablespace [tablespace] read|write命令~ 表空间内的所有数据文件必须联机




    3.修改表空间的online/offline属性

    通过表空间置于联机或脱机状态~来控制表空间可用性。

    表空间~联机状态~用户可访问其数据

    表空间~脱机状态,用户无法访问其数据,允许正常访问数据库~其余处于联机的表空间。


    dba让表空间脱机的几种情况

    使数据库的一部分表空间不可用,~但允许正常访问数据库的其余表空间

    执行脱机表空间备份~ (尽管表空间可以在~联机使用时备份)

    数据库打开时~ 恢复表空间或数据文件

    数据库打开时! 移动数据文件



    normal:将表空间所有数据文件内的所有块~从sga中写入数据文件~
    并将数据文件关闭。~缺省设置。

    在该表空间重新联机前~ 无须对其执行介质恢复。~尽可能使用normal子句

    temporary: 
    对表空间所有联机的数据文件~ 执行检查点操作~

    但是执行检查点时~并不检查数据文件的状态,~即使某些文件无法写入检查点~oracle也会忽略这些错误

    在使用此表空间重新联机之前,所有脱机文件可能都需要进行介质恢复


    immediate: 不保证表空间的文件可用,~而且不执行检查点操作

    表空间重新联机前,必须对其执行介质恢复操作


    for recover: 使表空间脱机~以进行表空间时间点恢复


    只要数据库打开,dba可以使任意一个表空间脱机~

    (system表空间和任何具有活动还原段或临时段的表空间除外)。

    当一个表空间脱机后,oracle服务器~ 将使与之相关联的所有数据文件脱机


    执行查询操作~用户将收到一条错误信息 ~ 

    因为表空间脱机后,~oracle不允许有任何sql语句引用该表空间含有的对象~即用户不能访问该表空间


    当表空间脱机或者重新联机后~ 该事件记录在数据字典和控制文件内。

    如果关闭数据库时表空间仍然脱机,-》当随后数据库装载并重新打开时~该表空间仍保持脱机状态且不会被检查。

    如果遇到某些错误,(例如~ 当数据库写入程序进程dbwn几次~

    试图向某表空间的数据文件写入都失败时)~ oracle实例自动~将表空间从联机状态切换为脱机状态

    不能设为脱机的表空间~ system表空间~具有活动的还原段的表空间,缺省临时表空间


    当希望访问表空间中的数据~ 如表、索引等对象时~表空间必须处于联机状态



    4.数据文件的脱机与联机

    类似于表空间~ 联机的数据文件也可以被设置为脱机状态。

    脱机的数据文件对于数据库~ 是不可用的~直至它们被恢复到联机状态为止

    数据文件发生损坏,~oracle自动将这个数据设置为脱机状态,~并记录于警告文件中

    如果损坏的文件恢复后,~需要手工方式重新将数据文件恢复为联机状态。


    数据文件设置为脱机状态,不会影响表空间的状态~

    相反,~将表空间设置为脱机状态~ 表空间的数据文件同时会进入脱机状态

    该表数据文件状态,~可使用alter database命令







    5. 数据文件的移动

    为防止数据丢失~和减少i/o冲突,提供i/o性能, ~尽可能将数据文件分布到不同磁盘上~

    并且尽可能均衡不同磁盘之间的i/o操作。


    移动数据文件 ~ 一方面出于性能方面的考虑,~另一方面出于安全考虑

    因此,在实际数据库应用中~ 可能会移动数据文件

    移动数据文件有两种方法 ~ 一种是使用alter tablespace命令,~
    另一种方法是使用alter database命令

    具体采用哪种方法取决于表空间类型

       5.1.使用alter tablespace命令


    它仅适用于~不含活动还原段或临时段的非system表空间中~数据文件的移动

    源文件名必须与存储在控制文件内的名称匹配~ 表空间必须脱机~
    并且to子句后的目标数据文件必须存在


    alter tablespace 命令重命名数据文件的步骤:

    使表空间脱机
    使用操作系统命令移动或复制文件
    执行alter tablespace rename datafile 命令
    使表空间联机

    必要时使用操作系统命令~删除原来的数据文件




    5.2 使用alter database命令

    alter database命令可用来~ 移动任意类型的数据文件,~但数据库必须处于已装载的状态~

    且目标数据文件必须存在。步骤如下:

    关闭数据库
    使用操作系统命令移动文件
    装载数据库

    执行alter database rename file命令

    打开数据库


    因为system表空间无法脱机~ 必须使用该方法移动system表空间内的数据文件。

    使用此命令重命名无法脱机的表空间内的文件。


    ----------------------------------------------------------
    (六)、删除表空间
    https://blog.csdn.net/u012596785/article/details/79951330

    展开全文
  • 1、创建表空间 CREATE TABLESPACE DB_DATA LOGGING DATAFILE 'D:app/Administrator/oradata/NewDB/DB_DATA.DBF' SIZE 32M AUTOEXTEND ON NEXT 32M MAXSIZE UNLIMITED ...
  • ORACLE查看表空间

    万次阅读 2018-05-08 10:38:29
    --1、查看表空间的名称及大小 SELECT t.tablespace_name, round(SUM(bytes / (1024 * 1024)), 0) ts_size FROM dba_tablespaces t, dba_data_files d WHERE t.tablespace_name = d.tablespace_name GROUP BY t....
  • Oracle表空间清理

    千次阅读 2020-04-29 18:37:38
    一、查看所占空间大小 --1、查看用户、索引、分区占用空间 select segment_name, sum(bytes)/1024/1024 as Mbytes from user_segments group by segment_name order by Mbytes desc; --2、占用空间: ...
  • 1.查看一个所占的空间大小: SELECT SEGMENT_NAME,  TABLESPACE_NAME,  BYTES B,  BYTES / 1024 KB,  BYTES / 1024 / 1024 MB  FROM USER_SEGMENTS  WHERE segment_name = 'T_RL_INTG_LOGALL'  AND ...
  • 数据库的表空间

    千次阅读 2018-04-07 17:00:49
    表空间的概述数据库的表空间,简而言之就是数据库存储数据的存储结构,是一种用来存储数据的逻辑空间,是数据库用来存储数据的最大逻辑单元,其下还有段、区、数据块等逻辑数据类型。表空间的存在就是为了用来存储...
  • oracle操作相关,数据库备份相关,常用到的函数
  • ORACLE 表空间操作和表的删除(一)

    千次阅读 2018-03-28 23:17:48
    最近在用IMP 命令导入dmp数据的时候,发现表空间无法扩展,一查,才发现表空间SYSTEM已经使用了31.2G。 经过查找资料,总结如下: 1.一般不在SYSTEM表空间存放业务数据; 2.SYSTEM表空间最大值是32G;-----所有...
  • Oracle 表空间和临时表空间

    千次阅读 2019-04-03 17:18:40
    表空间:此空间是用来进行数据存储的(表、function、存储过程等),所以是实际物理存储区域。 临时表空间:主要用途是在数据库进行排序运算[如创建索引、order by及group by、distinct、union/intersect/minus/、...
  • 达梦数据库的表空间及用户管理

    千次阅读 2019-09-18 13:55:09
    一、达梦数据库表空间的管理 1、达梦数据库表空间介绍 Select tablespace_name from dba_tablespace; 1)SYSTEM表空间--> 系统表空间有很多的数据字典等 2)ROLL表空间-->回滚表空间 MVCC(事务多版本机制...
  • oracle中创建表空间和表

    千次阅读 2019-02-20 18:14:12
    0.创建表空间 //datafile为自己安装oracle时的路径,下面代码为在那里新建了一个CSZXS的表空间(此路径可以为本电脑的任何地方) create tablespace CSZXS logging datafile 'E:\oracledatabase\oradata\orcl\...
  • PostgreSQL 表空间(TABLESPACE)

    千次阅读 2021-02-10 17:34:53
    1. 表空间介绍 表空间即PostgreSQL存储数据文件的位置,其中包括数据库对象。如,索引、表等。 PostgreSQL使用表空间映射逻辑名称和磁盘物理位置。默认提供了两个表空间: pg_default 表空间存储用户数据. pg_...
  • 表空间详细解析

    千次阅读 2018-08-01 14:03:45
    1.表空间概念 把oracle数据库看作一个实在房间,表空间可以看作这个房间的空间,是可以自由分配,在这空间里面可以堆放多个箱子(箱子可以看作数据库文件),箱子里面再装物件(物件看作表)。用户指定表空间也就是...
  • 查询表空间语句

    千次阅读 2019-06-20 09:27:05
    查询表空间语句: SELECT UPPER(F.TABLESPACE_NAME) "表空间名",  D.TOT_GROOTTE_MB "表空间大小(M)",  D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",  TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES)...
  • oracle创建表和表空间深入学习

    千次阅读 2018-07-20 15:04:59
    Oracle创建表空间和表 创建表空间和表 ORACLE物理上是由磁盘上的以下几种文件:数据文件和控制文件和LOGFILE构成的 oracle中的表就是一张存储数据的表。表空间是逻辑上的划分。方便管理的。 数据表空间 (Tablespace...
  • Oracle undo表空间管理

    千次阅读 2019-01-09 09:13:59
    为了解决undo表空间过大,可以考虑新建立一个undo表空间,对undo表空间进行一个切换,然后将之前大的undo表空间进行删除释放空间,注意不能立刻将之前的undo表空间删除,因为切换以后可能在原有的undo表空间上面记录...
  • 以system用户登录,查找需要删除的用户: –查找用户 select * from dba_users; –查找工作空间的路径 select * from dba_data_...drop tablespace 表空间名称 including contents and datafiles cascade const...
  • oracle扩展表空间

    千次阅读 2019-04-30 15:02:49
    在系统运行一段时间后,表空间已经耗尽,只有扩展表空间,才能继续在表空间上添加表数据。 一、手动添加表空间中数据文件的大小 alter database datafile '数据文件位置' resize 1000M 把表空间中数据文件的尺寸...
  • 深入理解DB2表空间(Tablespace)

    万次阅读 2018-07-30 16:34:31
    表空间是数据库系统中数据库逻辑结构与操作系统物理结构之间建立映射的重要存储结构,它作为数据库与实际存放数据的容器之间的中间层,用于指明数据库中数据的物理位置。任何数据库的创建都必须显式或隐式的为其指定...
  • oracle表空间offline的三种方式区别

    千次阅读 2019-04-30 17:07:51
    一 offline 表空间注意事项 不能离线如下表空间 system undo tablespace temporary tablespace 二、 alter tablespace …offline 后面可跟参数 normal/temporary/immediate normal: A tablespace can be taken ...
  • 查看表空间及增加表空间

    千次阅读 2019-02-16 17:30:26
    select t.TABLESPACE_NAME,t.FILE_ID,t.FILE_NAME,trunc(t.BYTES/1024/1024/1024),t.MAXBYTES,...t.AUTOEXTENSIBLE from dba_data_files t -------------查看表空间,autoextensible select * from dba_tablespaces ...
  • --查表空间使用率情况(含临时表空间) SELECT d.tablespace_name "Name", d.status "Status", TO_CHAR (NVL (a.BYTES / 1024 / 1024, 0), '99,999,990.90') "Size (M)", TO_CHAR (NVL (a.BYTES - NVL (f.BYTES, 0)....
  • 临时表空间 create temporary tablespace ebank_temp --表空间名字ebank_temp tempfile 'ebank_temp.dbf' --表空间文件物理路径 size 2G --表空间大小 extent management local; 表空间 create tablespace ...
  • Oracle19c 创建表空间

    千次阅读 2020-02-21 20:50:10
    昨天部署好oracle19c后,用以前oracle11g的笔记来创建表空间遇到了坑。这里写一下总结。 其实之所以遇到坑是因为相比于oracle11g,oracle19c多了一个CDB和PDB的概念(从12C开始出现)。 #确定要创建表空间的目录 ...
  • 为了合理管理业务数据、索引数据、临时信息以及回退信息,需要创建不同类型的表空间,为了便于实现数据的分区管理。在创建各个表空间的同时,需要合理的规划表空间的存储设置。 一、表空间介绍 表空间的类型: ...
  • oracle默认临时表空间

    千次阅读 2019-05-05 15:00:03
    如果没有给用户指定临时表空间,oracle会自动给这个用户指定一个临时表空间,这个临时表空间叫做默认临时表空间。 如果系统表空间是本地管理的,则必须定义一个默认的临时表空间,SYSTEM表空间不能作为默认临时...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,666,242
精华内容 666,496
关键字:

表空间