表是由行与列构成的,行与列中存放着数据。数据在存储的时候有自己的关系,存什么样的数据可以自由选择数据的类型。
想要在数据库中建表:
1、需要有建表的权限—create table
2、需要有存储空间使用权限—storage space
3、想要给其他用户建表也需要权限---create any table
4、表名的长度必读在30个字符之内
5、不能使用oracle中的一些保留字如(table、user)
6、在非中文的情况下表名必须由A到Z之间的字母开头,一般情况下不使用中文(如果不想用A到Z之间字母开头,应加上“” 如:
“地理位置”, 在表名中有空格与特殊的字符,也应该加“”)。
不是以字母A到Z开头的 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、也是必须使用字母A到Z之间开头。
创建表
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表结构并改变列名
创建以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'); 3 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_6000的object_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/