oracle 表的管理

表是由行与列构成的,行与列中存放着数据。数据在存储的时候有自己的关系,存什么样的数据可以自由选择数据的类型。

 

 

想要在数据库中建表:

1、需要有建表的权限—create table

2、需要有存储空间使用权限—storage space

3、想要给其他用户建表也需要权限---create any table

4、表名的长度必读在30个字符之内

5、不能使用oracle中的一些保留字如(tableuser

6、在非中文的情况下表名必须由AZ之间的字母开头,一般情况下不使用中文(如果不想用AZ之间字母开头,应加上“”     如:

“地理位置”, 在表名中有空格与特殊的字符,也应该加“”)。

 

不是以字母AZ开头的

SQL> create table 5yd(id number,name varchar2(10));

create table 5yd(id number,name varchar2(10))

             *

ERROR at line 1:

ORA-00903: invalid table name

SQL>

加上“”创建表

SQL> create table "5yd"(id number,name varchar2(10));

 

Table created.

 

SQL>

SQL> create table "地理位置"(id number,name varchar2(10));

 

Table created.

 

SQL>

   

表的列名:

1、列的长度必须在30个字符之内

2、也是必须使用字母AZ之间开头。

 

创建表

 

Create table schema.table_name

(列名1 类型(长度) 列约束,

列名2 类型(长度) 列约束……表约束)

创建表的一些定义

Pctfree  n  -----指定表的每一个数据库为update操作所保留的空间百分比,默认为10

Pctused  n  ------指定在数据库上可以重新插入数据的已用空间最低百分比

Initrans  n

Maxtrans n -------指定可以同时对表所有块进行更新操作的最小和最大的事务数

Tablespace tbname -----将所创建的表部署到规定的表空间中

 

Storage

Initial  n ------指定表第一个区的大小

Next  n-------指定初始扩展区大小

Minextents  n

Maxextents  n -----指定为表的段分配的区数的最大值和最小值

Pctincrease  n ----指定扩展区递增的百分比

Buffer_pool  ---指定默认使用哪个数据缓冲区

 

登录用户查看所具备权限

SQL> conn u1/u1

Connected.

SQL> select * from session_privs;

 

PRIVILEGE

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

CREATE SESSION

UNLIMITED TABLESPACE

CREATE TABLE

CREATE ANY TABLE

ALTER ANY TABLE

DROP ANY TABLE

SELECT ANY TABLE

CREATE CLUSTER

CREATE SEQUENCE

CREATE PROCEDURE

CREATE TRIGGER

 

PRIVILEGE

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

CREATE TYPE

CREATE OPERATOR

CREATE INDEXTYPE

 

14 rows selected.

 

SQL>

 

SQL> create table tt1(id number,name varchar2(10));

 

Table created.

 

SQL>

建立表tt2 使用keep池缓存表tt2的数据

SQL> create table tt2(id number) storage(buffer_pool keep);

 

Table created.

 

SQL>

为了避免SGA抖动,设置 keep池大小

SQL> conn / as sysdba

Connected.

SQL> show parameter  db_keep_cache_size

 

NAME                                 TYPE        VALUE

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

db_keep_cache_size                   big integer 0

SQL> alter system set db_keep_cache_size=30m;

 

估算表占用空间大小

 

[oracle@dongyang ~]$ vi /tmp/essize.sql

set serveroutput on

 

DECLARE

 ub NUMBER;

 ab NUMBER;

 cl sys.create_table_cost_columns;

BEGIN

  cl := sys.create_table_cost_columns( sys.create_table_cost_colinfo('NUMBER',10),

        sys.create_table_cost_colinfo('VARCHAR2',30),

        sys.create_table_cost_colinfo('VARCHAR2',30),

        sys.create_table_cost_colinfo('DATE',NULL));

 

  DBMS_SPACE.CREATE_TABLE_COST('SYSTEM',cl,1000000,0,ub,ab);   --根据情况设置数据量

 

  DBMS_OUTPUT.PUT_LINE('Used MB: ' || TO_CHAR(ub/1024/1024));

  DBMS_OUTPUT.PUT_LINE('Alloc MB: ' || TO_CHAR(ab/1024/1024));

END;

/

 

SQL> @/tmp/essize.sql

Used MB: 50.40625

Alloc MB: 51

 

PL/SQL procedure successfully completed.

 

SQL>

 

修改表的列名

10g之后推出的功能

 

SQL> desc tt1

Name                                      Null?    Type

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

 ID                                                 NUMBER

 NAME                                               VARCHAR2(10)

 

SQL>

 

SQL> alter table tt1 rename column id to tpid;     (未执行结束前,会影响到对表的DML语句)

 

Table altered.

 

SQL>

SQL> desc tt1

 Name                                      Null?    Type

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

 TPID                                               NUMBER

 NAME                                               VARCHAR2(10)

 

SQL>

通过联机重定义来修改将tpid改为eid

先授予普通用户相应权限

SQL> conn / as sysdba

Connected.

SQL> grant execute on dbms_redefinition to u1;

 

Grant succeeded.

 

SQL> grant create any table to u1;

 

Grant succeeded.

 

SQL> grant lock any table to u1;

 

Grant succeeded.

 

SQL> grant create any index to u1;

 

Grant succeeded.

 

SQL> grant create any trigger to u1;

 

Grant succeeded.

 

SQL>

进入普通用户,做表的统计信息

SQL> desc tt1;

 Name                                      Null?    Type

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

 TPID                                               NUMBER

 NAME                                               VARCHAR2(10)

 

SQL> select count(*) from tt1;

 

  COUNT(*)

----------

     32768

 

 

SQL>

SQL> exec dbms_stats.gather_table_stats('U1','TT1');

 

PL/SQL procedure successfully completed.

 

SQL>

创建tt1_n表得到tt1表结构并改变列名

SQL> create table tt1_n as  select tpid eid,name from tt1 where 0=1;

 

Table created.

 

SQL>

SQL> exec dbms_redefinition.can_redef_table('U1','TT1');

BEGIN dbms_redefinition.can_redef_table('U1','TT1'); END;

 

*

ERROR at line 1:

ORA-12089: cannot online redefine table "U1"."TT1" with no primary key

ORA-06512: at "SYS.DBMS_REDEFINITION", line 137

ORA-06512: at "SYS.DBMS_REDEFINITION", line 1478

ORA-06512: at line 1

                    (我建的表内容有重复的,并且没有主键)

SQL>

 

 

创建以rownum为主键 的表

SQL> create table tt11 as select rownum id, tpid,name from tt1;

 

Table created.

 

SQL>

删除原表

SQL> drop table tt1 purge;

 

Table dropped.

 

SQL>

重命名为原表

SQL> rename tt11 to tt1;

 

Table renamed.

创建主键

SQL> alter table tt1 modify(id primary key);

 

Table altered.

 

SQL>

SQL> desc tt1;

Name                                      Null?    Type

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

 ID                                        NOT NULL NUMBER

 TPID                                               NUMBER

 NAME                                               VARCHAR2(10)

 

SQL>

删除表tt1_n创建tt1_n表得到tt1表结构并改变列名

SQL> drop table tt1_n purge;

 

Table dropped.

 

SQL>

 

SQL> create table tt1_n as  select id,name,tpid eid from tt1 where 0=1;

 

 

Table created.

 

SQL>

重新获取统计信息与扫描

SQL> exec dbms_stats.gather_table_stats('U1','TT1');

 

PL/SQL procedure successfully completed.

 

SQL> exec dbms_redefinition.can_redef_table('U1','TT1');

 

 

PL/SQL procedure successfully completed.

 

SQL>

使用START_REDEF_TABLE过程转换列名

SQL> begin

  2  dbms_redefinition.start_redef_table('U1','TT1','TT1_N','id id,tpid eid,name name');

end;

  4  /

/

 

PL/SQL procedure successfully completed.

 

SQL>

使用COPY_TABLE_DEPENDENTS过程同步表tt1_n

 

http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_redefi.htm#i999656  COPY_TABLE_DEPENDENTS过程官方详解)

 

SQL> var num number

SQL> begin

  2dbms_redefinition.copy_table_dependents('U1','TT1','TT1_N',dbms_redefinition.cons_orig_params,true,true,true,true,:num,true);

  3  end;

  4  /

/

 

PL/SQL procedure successfully completed.

 

SQL>

打印下函数,看是否有错误

SQL> print num

 

       NUM

----------

         1

 

SQL>

统计两表的行

SQL> select count(*) from tt1;

 

  COUNT(*)

----------

     32768

 

SQL> select count(*) from tt1_n;

 

  COUNT(*)

----------

     32768  (已同步)

 

SQL>

使用FINISH_REDEF_TABLE过程tt1表的结构转换为tt1_n 表的结构

http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_redefi.htm#i998731

 

SQL> exec dbms_redefinition.finish_redef_table('U1','TT1','TT1_N');

 

PL/SQL procedure successfully completed.

 

SQL> desc tt1;

 Name                                      Null?    Type

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

 ID                                                 NUMBER

 NAME                                               VARCHAR2(10)

 EID                                                NUMBER

发现已变更

SQL>

删除同步表

SQL> drop table tt1_n purge;

Table dropped.

SQL>

 

 

 

 

 

 

 

使普通用户可以查询别的用户的表

 

U2用户可以查询u1用户的表tt1并且可以赋予另外用户查询u1用户tt1表的权限

SQL> conn / as sysdba

SQL> grant select on u1.tt1 to u2 with grant option;

 

Grant succeeded.

 

SQL>

 

 

赋予更新列的权限

SQL> grant update(name) on u1.tt1 to u2 ;   (只能更新name列,需要更新别的列在赋予别的列的权限)

 

查看用户对象权限

SQL> select owner,table_name,column_name,privilege from user_col_privs;

 

 

OWNER                          TABLE_NAME

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

COLUMN_NAME                    PRIVILEGE

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

U1                             TT1

NAME                           UPDATE

 

 

SQL>

分区表

分区表的定义和类型

   分区是一种方法,它将一个大表从逻辑上根据某些条件把数据分成若干个较小的且更容易管理的区---分区段(表)。

   分区表是一种特殊的常规表。

 

 按照分区的方式可将常用分区表分为:

  ---范围分区

------散列分区

------列表分区

------复合分区

        ---复合范围-散列分区

        ---复合范围-列表分区

 

 

http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_7002.htm#i2095331 (可以到官网查看)

 

创建范围分区表

 

 

 

首先建立应用表空间

create tablespace d1 datafile '/u01/app/oracle/oradata/d1.dbf' size 50M default storage (initial 100k next 100k minextents 1 maxextents unlimited pctincrease 1);

create tablespace d2 datafile '/u01/app/oracle/oradata/d2.dbf ' size 50M default storage (initial 100k next 100k minextents 1 maxextents unlimited pctincrease 1);

create tablespace d3 datafile '/u01/app/oracle/oradata/d3.dbf ' size 50M default storage (initial 100k next 100k minextents 1 maxextents unlimited pctincrease 1);

create tablespace d4 datafile '/u01/app/oracle/oradata/d4.dbf ' size 50M default storage (initial 100k next 100k minextents 1 maxextents unlimited pctincrease 1);

create tablespace d5 datafile '/u01/app/oracle/oradata/d5.dbf ' size 50M default storage (initial 100k next 100k minextents 1 maxextents unlimited pctincrease 1);

 

把原来的fengzi表改名

alter table fengzi rename to fengziold;

fengzi表所有者身份创建分区的表

 

create table fengzi(

         id               number(16) primary key,

         username                  varchar2(64),

         sex            varchar2(2),

         email                  varchar2(256),

         expression        varchar2(128),

         content             varchar2(4000),

         time          date,

         ip               varchar2(64)

)

  partition by range (time)

  (

partition g_2010 values less than (to_date('2010-01-01','yyyy-mm-dd'))

    tablespace d1

      storage(initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0),

   partition g_2011 values less than (to_date('2011-01-01','yyyy-mm-dd'))

    tablespace d2

      storage(initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0),

   partition g_2012 values less than (to_date('2012-01-01','yyyy-mm-dd'))

    tablespace d3

      storage(initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0),

partition g_2013 values less than (to_date('2013-01-01','yyyy-mm-dd'))

    tablespace d4

      storage(initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0),

partition g_0000 values less than (maxvalue)

    tablespace d5

      storage(initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0)

   );

将原表记录插入到新建分区表中

Insert into fengzi  select * from fengziold;

查询表的所有分区

SQL> select table_name,partition_name,tablespace_name  from user_tab_partitions where table_name='FENGZI';

查看分区中的数据

SQL>select to_char(time, 'yyyy-mm-dd') time  from fengzi  partition(g_2010);

SQL>select to_char(time, 'yyyy-mm-dd') time  from fengzi  partition(g_2011);

SQL>select to_char(time, 'yyyy-mm-dd') time  from fengzi  partition(g_2012);

SQL>select to_char(time, 'yyyy-mm-dd') time  from fengzi  partition(g_2013);

SQL>select to_char(time, 'yyyy-mm-dd') time  from fengzi  partition(g_0000);

 

分区表的维护

这是在网上看到的一篇分区表的维护的文章感觉很详细就摘来了

以数据库对象表为例

SQL>  Create Table t(owner, object_name, subobject_name, object_id, data_object_id, object_type, created,

  2        last_ddl_time, timestamp, status, temporary, generated, secondary)

  3        Partition By Range(object_id)

  4        (Partition p_3000 Values Less Than(3000) Tablespace users,

  5         Partition p_6000 Values Less than(6000) Tablespace users,

  6         Partition p_max Values less than(maxvalue) tablespace users

  7         )

  8     As

  9     Select owner, object_name, subobject_name, object_id, data_object_id, object_type, created,

 10                    last_ddl_time, timestamp, status, temporary, generated, secondary

 11       From dba_objects

 12  ;

SQL> create index idx_global_t_object_id on t(owner) global;

SQL> create index idx_local_t_object_id on t(object_id) local;

 

主要的分区维护操作

 

1.         新增分区

如果分区边界不是maxvalue,那么可以直接add一个新的分区,如果边界是maxvalue,则需要先drop掉原有分区,然后再add,或者采用分区的拆分split

SQL> alter table t drop partition p_max;

Table altered

SQL> alter table t add partition p_9000 values less than(9000) tablespace users;

对于局部索引,oracle会自动增加一个局部分区索引。

 

2.         移动分区

SQL> alter table t move partition  p_6000  tablespace system;

Table altered

SQL> Select  index_name,status From user_indexes Where table_name='T';

INDEX_NAME                     STATUS

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

IDX_GLOBAL_T_OBJECT_ID         UNUSABLE

IDX_LOCAL_T_OBJECT_ID          N/A

分区移动会自动维护局部分区索引,oracle不会自动维护全局索引,所以需要我们重新rebuild 分区索引,具体需要rebuild哪些索引,可以通过dba_part_indexes,dba_ind_partitions去判断。

 

3.         截断分区

SQL> alter table t truncate partition  p_3000 ;

Table truncated

SQL> Select  index_name,status From user_indexes Where table_name='T';

 

INDEX_NAME                     STATUS

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

IDX_GLOBAL_T_OBJECT_ID         UNUSABLE

IDX_LOCAL_T_OBJECT_ID          N/A

Truncate相对delete操作很快,数据仓库中的大量数据的批量数据加载可能会有用到;截断分区同样会自动维护局部分区索引,同时会使全局索引unusable,需要重建

 

4.          Drop分区

SQL> alter table t drop partition p_6000;

Table altered

同样会自动维护局部分区索引,同时会使全局索引unusable,需要重建

 

5.          分区拆分split

通过user_tab_partitions 视图来看table有哪些分区

SQL> Select table_name,partition_name From user_tab_partitions Where table_name='T';

TABLE_NAME                     PARTITION_NAME

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

T                              P_3000

T                              P_9000

T                              P_MAX

现在想要p_9000分区分成p_6000,用户存放object_id >=3000 and object_id<6000,p_9000 用户存放object_id>=6000 and object_id<9000的记录,利用split技术,就可以实现

SQL> alter table t split partition p_9000 at (6000) into (partition p_6000 tablespace users,partition p_9000 tablespace system);

SQL>

SQL> Select table_name,partition_name From user_tab_partitions Where table_name='T';

 

TABLE_NAME                     PARTITION_NAME

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

T                              P_3000

T                              P_6000

T                              P_9000

T                              P_MAX

 

SQL> Select Max(object_id) ,Min(object_id)  From t Partition (p_6000);

MAX(OBJECT_ID) MIN(OBJECT_ID)

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

          5999           3000

SQL> Select Max(object_id) ,Min(object_id)  From t Partition (p_9000);

MAX(OBJECT_ID) MIN(OBJECT_ID)

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

          8999           6000

对于剧本索引IDX_LOCAL_T_OBJECT_ID,通过查看user_ind_partitions ,可以看到split后会自动一个局部分区索引,索引名字等同于新增分区的名字,全局索引会失效,需要rebuild

 

6.          分区合并merge

相邻的分区可以merge为一个分区,新分区的下边界为原来边界值较低的分区,上边界为原来边界值较高的分区,原先的局部索引相应也会合并,全局索引会失效,需要rebuild

SQL> alter table t merge partition p_6000,p_9000 into partition p_9000;

alter table t merge partition p_6000,p_9000 into partition p_9000

ORA-00905: 缺少关键字

SQL> alter table t merge partitions p_6000,p_9000 into partition p_9000;

Table altered

SQL> Select table_name,partition_name From user_tab_partitions Where table_name='T';

TABLE_NAME                     PARTITION_NAME

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

T                              P_3000

T                              P_9000

T                              P_MAX

 

SQL> Select Max(object_id) ,Min(object_id)  From t Partition (p_9000);

MAX(OBJECT_ID) MIN(OBJECT_ID)

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

8999      3000      原(8999  6000

 

7.    分区交换 exchange

分区的交换可以把一个表和分区表中的一个分区中的数据进行对换,分区的交换只是一个数据字典的操作,因此操作速度很快,对于数据仓库中的load阶段,因为已经做了数据的清洗动作,还可以用without validation来避免对表中数据的验证(需要全表扫描)

SQL> select count(*) from t partition(p_6000);

  COUNT(*)

----------

         0

SQL> create table t_6000 as select * from dba_objects where object_id>=3000 and object_id<6000;

SQL> alter table t exchange partition p_6000 with table t_6000;

SQL> select count(*) from t partition(p_6000);

  COUNT(*)

----------

      2955

SQL> select count(*) from t_6000;

 

  COUNT(*)

----------

         0

如果交换的表中包含的记录不符合分区的规定,那么可以用without validation 子句跳过检查。

SQL> create table t_6000 as select * from dba_objects where object_id>=3000 and object_id<6000;

 

Table created

 

SQL> alter table t exchange partition p_6000 with table t_6000;

 

alter table t exchange partition p_6000 with table t_6000

ORA-14099: 未对指定分区限定表中的所有行

SQL> alter table t exchange partition p_6000 with table t_6000 without validation;

 

Table altered

 

Exchange 还有一个子句 including indexes ,指分区和表的索引相互交换,索引也可以交换,采用前面的例子,分区表有2个索引,一个在object_id列上的局部索引,一个是owner上的全局索引,实验在t_6000object_id 上建立所以,exchange可以完成,但在owner上,还是报错奥

alter table t exchange partition p_6000 with table t_6000 including indexes without validation

 

ORA-14098: ALTER TABLE EXCHANGE PARTITION 中的表索引不匹配

SQL> create index t_idx_object_owner on t_6000(owner);

建立索引后,交换成功。

 

SQL> drop index  t_idx_object_id;

SQL> create index t_idx_object_owner on t_6000(owner);

SQL> alter table t exchange partition p_6000 with table t_6000 including indexes without validation ;

ORA-14098: ALTER TABLE EXCHANGE PARTITION 中的表索引不匹配

 

 

创建列表分区表

列表分区也就是以一个列的不同值进行区分,下面例子是以一个列的值男、女分区。

 

 

create table fengzil(

         id               number(16) primary key,

         username                  varchar2(64),

         sex            varchar2(2),

         email                  varchar2(256),

         expression        varchar2(128),

         content             varchar2(4000),

         time          date,

         ip               varchar2(64)

)

  partition by list (sex)

  (

partition g_l_1 values(‘M’)  tablespace d1

      storage(initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0),

   partition g_l_2 values(‘F’)  tablespace d2

      storage(initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0)

);

将原表记录插入到新建分区表中

Insert into fengzil  select * from fengziold;

查询表的所有分区

SQL> select table_name,partition_name,tablespace_name  from user_tab_partitions where table_name='FENGZIL';

查看分区中的数据

SQL>select sex  from fengzil  partition(g_l_1);

SQL>select sex  from fengzil  partition(g_l_2);

 

 

创建散列分区表

哈希分区是以哈希运算的方式进行分区没有什么规律,所以不需要插入values

 

create table fengzih(

         id               number(16) primary key,

         username                  varchar2(64),

         sex            varchar2(2),

         email                  varchar2(256),

         expression        varchar2(128),

         content             varchar2(4000),

         time          date,

         ip               varchar2(64)

)

  partition by hash (username)

  (

partition g_h_1  tablespace d1

      storage(initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0),

   partition g_h_2  tablespace d2

      storage(initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0),

   partition g_h_3   tablespace d3

      storage(initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0),

   );

将原表记录插入到新建分区表中

Insert into fengzih  select * from fengziold;

查询表的所有分区

SQL> select table_name,partition_name,tablespace_name  from user_tab_partitions where table_name='FENGZIH';

查看分区中的数据

SQL>select  username    from fengzih  partition(g_h_1);

SQL>select  username    from fengzih  partition(g_h_2);

SQL>select  username    from fengzih  partition(g_h_3);

 

 

创建复合分区表

 

create table fengzic(

         id               number(16) primary key,

         username                  varchar2(64),

         sex            varchar2(2),

         email                  varchar2(256),

         expression        varchar2(128),

         content             varchar2(4000),

         time          date,

         ip               varchar2(64)

)

partition by range(time)

subpartition by list(sex)

(

partition g_2010 values less than(to_date('2010-01-01','yyyy-mm-dd')) tablespace d1

(

    subpartition g_l1_1 values('M'),

subpartition g_l1_2 values('F')

),

partition g_2011 values less than(to_date('2011-01-01','yyyy-mm-dd')) tablespace d2

(

    subpartition g_l2_1 values('M'),

subpartition g_l2_2 values('F')

),

partition g_2012 values less than(to_date('2012-01-01','yyyy-mm-dd')) tablespace d3

(

    subpartition g_l3_1 values('M'),

subpartition g_l3_2 values('F')

),

partition g_2013 values less than(to_date('2013-01-01','yyyy-mm-dd')) tablespace d4

(

    subpartition g_l4_1 values('M'),

subpartition g_l4_2 values('F')

),

partition g_0000 values less than(maxvalue) tablespace d5

(

 subpartition g_l5_1 values('M'),

 subpartition g_l5_2 values('F')

)

);

 

 

 

 

创建对象表

 

自定义一个type变量

SQL> create type enamet as  object (name varchar2(20),sex varchar2(10))

  2  /

 

Type created.

创建表empty ename字段使用变量enamet

SQL> create table empty(empno number,ename enamet,job varchar2(20));

 

Table created.

 

SQL>

向表中插入数据

SQL> insert into empty values('100',enamet('张三',''),'经理');

 

1 row created.

 

查询

SQL> select * from empty;

 

     EMPNO      ENAME(NAME, SEX)       JOB

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

       100       ENAMET('张三', '')      经理

 

 

SQL>

SQL> select e.empno,e.ename.name,e.ename.sex,e.job from empty e;

 

     EMPNO ENAME.NAME           ENAME.SEX  JOB

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

       100      张三                         经理

 

SQL>

SQL> desc empty;

Name                                      Null?    Type

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

 EMPNO                                              NUMBER

 ENAME                                              ENAMET

 JOB                                                VARCHAR2(20)

 

SQL>

索引组织表

 

主键约束列的内容会放入到索引段中

SQL> create table temp(empno number primary key,ename varchar2(10),sal number)

  2  organization index tablespace d1;

 

Table created.

 

SQL>

 

 

数据恢复

对于表的恢复

 

db_flashback_retention_target 参数决定删除表以及表中数据保留时间

 

SQL> conn / as sysdba

Connected.

SQL> alter system set db_flashback_retention_target=3600;

 

System altered.

 

SQL>

 

 

 

确认处于归档模式

SQL> conn / as sysdba

Connected.

SQL> select dbid,name,log_mode from v$database;

 

      DBID NAME      LOG_MODE

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

1573521836 FENGZI    ARCHIVELOG

 

SQL>

查询所有表删除其中一个表

SQL> conn u2/u2            

Connected.

SQL> select * from tab;

 

TNAME                          TABTYPE  CLUSTERID

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

BB2                            TABLE

EMPTY                          TABLE

TEMP                           TABLE

 

SQL> drop table bb2;

 

Table dropped.

 

SQL>

查询回收站

SQL> show recyclebin

ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME

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

BB2              BIN$98CBLGsSLR/gQKjACjgQQQ==$0 TABLE        2014-04-24:09:09:44

SQL>

恢复表

SQL> flashback table bb2 to before drop;

 

Flashback complete.

 

SQL> select * from bb2;

 

        ID

----------

         1

         1

         1

         1

         1

         1

         1

         1

         1

         1

12 rows selected.

 

SQL>

 

如果删除期间创建了原表名的表在删除 在回收站会有两个选项

 

SQL> drop table bb2;

 

Table dropped.

 

SQL> create table bb2 as select * from temp;

 

Table created.

 

SQL> show recyclebin

ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME

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

BB2              BIN$98Cx0ajtOxDgQKjACjgQYg==$0 TABLE        2014-04-24:09:23:20

SQL>

SQL> drop table bb2;

 

Table dropped.

 

SQL> show recyclebin

ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME

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

BB2              BIN$98Cx0ajuOxDgQKjACjgQYg==$0 TABLE        2014-04-24:09:24:59

BB2              BIN$98Cx0ajtOxDgQKjACjgQYg==$0 TABLE        2014-04-24:09:23:20

SQL>

如果还使用BB2名称恢复表的话,得到的表为最后一次删除的表内容。

想要恢复之前的表需要

SQL> show recyclebin

ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME

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

BB2              BIN$98Cx0ajuOxDgQKjACjgQYg==$0 TABLE        2014-04-24:09:24:59

BB2              BIN$98Cx0ajtOxDgQKjACjgQYg==$0 TABLE        2014-04-24:09:23:20

SQL>

SQL> flashback table "BIN$98Cx0ajtOxDgQKjACjgQYg==$0" to before drop;

 

Flashback complete.

 

SQL> select * from bb2;

 

        ID

----------

         1

         1

         1

         1

         1

         1

         1

         1

         1

         1

         1

12 rows selected.

 

SQL>

对于表中行的恢复

这种方法有点时候是不实用的

 

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

 

TO_CHAR(SYSDATE,'YY

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

2014-04-24 09:38:05

 

SQL> update bb2 set id=id+1 where id=1;

 

12 rows updated.

 

SQL> commit;

 

Commit complete.

 

SQL> alter table bb2 enable row movement;

 

Table altered.

 

SQL> flashback table bb2 to timestamp to_timestamp('2014-04-24 09:38:05','yyyy-mm-dd hh24:mi:ss');

 

Flashback complete.

 

SQL> alter table bb2 disable row movement;

 

Table altered.

 

SQL> select * from bb2;

 

        ID

----------

         1

         1

         1

         1

         1

         1

         1

         1

         1

         1

         1

 

        ID

----------

         1

 

12 rows selected.

 

SQL>

 

 

比较实用的方法

 

SQL> select * from bb2;

 

        ID

----------

         1

         1

         1

         1

         1

         1

         1

         1

         1

         1

         1

 

        ID

----------

         1

         2

         2

 

14 rows selected.

 

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

 

TO_CHAR(SYSDATE,'YY

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

2014-04-24 09:55:07

 

SQL> delete bb2 where id=2;

 

2 rows deleted.

 

SQL> commit;

Commit complete.

 

SQL> select * from bb2 as  of timestamp to_timestamp('2014-04-24 09:55:07','yyyy-mm-dd hh24:mi:ss');

 

        ID

----------

         1

         1

         1

         1

         1

         1

         1

         1

         1

         1

         1

 

        ID

----------

         1

         2

         2

 

14 rows selected.

 

SQL> select * from bb2 as  of timestamp to_timestamp('2014-04-24 09:55:07','yyyy-mm-dd hh24:mi:ss')where id=2;

 

        ID

----------

         2

         2

 

SQL> select * from bb2 where id=2;

 

no rows selected

 

SQL>

 

 

SQL> insert into bb2  select * from bb2 as  of timestamp to_timestamp('2014-04-24 09:55:07','yyyy-mm-dd hh24:mi:ss')where id=2;

 

2 rows created.

 

SQL>

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29532781/viewspace-1174679/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29532781/viewspace-1174679/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值