【Java EE 学习 30】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】

时间:2022-10-22 16:44:58

一、闪回

  1.可能的误操作

    (1)错误的删除了记录

    (2)错误的删除了表

    (3)查询历史记录

    (4)撤销已经提交了的事务。

  2.对应着以上四种类型的误操作,有四种闪回类型

    (1)闪回表:将表回退到过去的一个时间上

    (2)闪回删除:还原Oracle回收站

    (3)闪回版本查询:所有历史记录

    (4)闪回事务查询:通过一个select 语句得到一个undo_sql,通过该undo_sql闪回

  3.事实上oracle数据库还有另外两种闪回类型

    (5)闪回数据库

    (6)闪回归档日志

  4.系统改变号:由时间戳通过某种算法得到的一个整数,该整数唯一的确认了某个时间,通常通过该整数进行闪回操作。使用的函数:timestamp_to_scn

select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss*ff') 时间,timestamp_to_scn(systimestamp) SCN from dual;

    【Java EE 学习 30】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】

  5.闪回是有空间限制的,比如系统缓冲区大小为2GB,如果超出了这个大小,如果在15分钟之内还是可以进行闪回的,查看该参数命令(管理员才有权限查看)

show parameters undo

    【Java EE 学习 30】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】

    其中900的单位是S,所以为15分钟,该值能够修改(管理员):

alter system set undo_retention=1200 scope=both

    【Java EE 学习 30】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】

二、闪回表

  1.普通用户闪回表需要拥有的权限

   拥有flashback any table的权限:管理员授予权限

grant flashback any table to scott;

  2.表需要开启的功能:行移动

alter table flashback_table enable row movement;

  3.闪回表步骤:

    (1)准备测试:创建表flashback_table,准备数据,注意最后提交。

create table flashback_table (
tid number,
tname varchar(10)
);
insert into flashback_table values(&tid,'&tname');
--插入三条数据
commit;

      【Java EE 学习 30】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】

    (2)查询当前的时间和SCN号

select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss*ff') 时间,timestamp_to_scn(systimestamp) SCN from dual;

      【Java EE 学习 30】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】

    (3)删除第二条记录

delete from flashback_table where tid=2;
commit;

      【Java EE 学习 30】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】

    (4)闪回表到(2)中的SCN处

flashback table flashback_table to scn 1569572;

    (5)验证闪回

      【Java EE 学习 30】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】

    (6)屏幕录制

 SQL> create table flashback_table (
2 tid number,tname varchar(10)); 表已创建。 SQL> edit
已写入 file afiedt.buf 1 create table flashback_table (
2* tid number,tname varchar(10))
SQL>
SQL>
SQL> insert into flashback_table values(&tid,'&tname');
输入 tid 的值: 1
输入 tname 的值: 小明
原值 1: insert into flashback_table values(&tid,'&tname')
新值 1: insert into flashback_table values(1,'小明') 已创建 1 行。 SQL> 、
SP2-0042: 未知命令 "、" - 其余行忽略。
SQL> /
输入 tid 的值: 2
输入 tname 的值: 小张
原值 1: insert into flashback_table values(&tid,'&tname')
新值 1: insert into flashback_table values(2,'小张') 已创建 1 行。 SQL> /
输入 tid 的值: 3
输入 tname 的值: 小强
原值 1: insert into flashback_table values(&tid,'&tname')
新值 1: insert into flashback_table values(3,'小强') 已创建 1 行。 SQL> edit
已写入 file afiedt.buf 1* insert into flashback_table values(&tid,'&tname')
SQL>
SQL>
SQL> select * from flashback_table; TID TNAME
---------- --------------------
1 小明
2 小张
3 小强 SQL> commit
2 ; 提交完成。 SQL> select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss*ff') 时间,timestamp_to_scn(systimestamp) SCN;
select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss*ff') 时间,timestamp_to_scn(systimestamp) SCN
*
第 1 行出现错误:
ORA-00923: 未找到要求的 FROM 关键字 SQL> select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss*ff') 时间,timestamp_to_scn(systimestamp) SCN from dual; 时间 SCN
---------------------------------------------------------- ----------
2015-08-25 11:01:03*597000 1569572 SQL> delete from flashback_table where tid=2; 已删除 1 行。
SQL> commit
  2 ;  提交完成。 SQL> select * from flashback_table; TID TNAME
---------- --------------------
1 小明
3 小强 SQL> flashback table flashback_table to scn 1569572;
flashback table flashback_table to scn 1569572
*
第 1 行出现错误:
ORA-08189: 因为未启用行移动功能, 不能闪回表 SQL> alter table flashback_table enabel row movement;
alter table flashback_table enabel row movement
*
第 1 行出现错误:
ORA-01735: 无效的 ALTER TABLE 选项 SQL> alter table flashback_table enable row movement; 表已更改。 SQL>
SQL>
SQL>
SQL>
SQL>
SQL> flashback table flashback_table to scn 1569572; 闪回完成。 SQL> select * from flashback_table; TID TNAME
---------- --------------------
1 小明
2 小张
3 小强 SQL>

屏幕录制

  4.疑问:怎样获取历史记录(以上演示方法在现实生产环境中不可能被使用)

二、闪回删除

  1.普通用户有回收站,但是管理员并没有回收站,所以不要使用管理员账户对表进行增删查该操作。管理员只用于管理。

  2.普通用户删除表之后(不使用purge命令),表会进入回收站,闪回删除的目的就是将回收站中的表恢复到删除之前的状态。

  3.进入到回收站中的表名可以相同,但是回收站会为每个表进行唯一的标识,即recyclebin name

    【Java EE 学习 30】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】

  4.普通用户通过select * from tab可以看到回收站中的表。

    【Java EE 学习 30】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】

    可以查看每个表中的内容,但是表名要加上双引号。

  5.如果回收站中的两个表在删除前表名相同,则如果闪回成功,先闪回先进入回收站中的表。

  6.模板代码

            flashback table [schema.]table_name[,...n] to {[scn] | [timestamp] [[enable | disable] triggers]};

  如果想要闪回触发器,则使用enable triggers,默认不闪回触发器。

  7.闪回删除的步骤

    (1)如果没有表名冲突,则使用下面的命令就可以了。

 flashback table test to before drop;

    (2)如果有表名冲突,先闪回先进入回收站中的表。

    (3)如果当前用户下已经有了一张和回收站中同名的表,则如果不采取重命名的手段,就不能闪回。

      【Java EE 学习 30】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】

    (4)闪回重命名

flashback table test to before drop rename to test1;

      【Java EE 学习 30】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】

三、闪回版本查询

  1.使用视图:flashback_transaction_query

    【Java EE 学习 30】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】

  2.查询一张表的历史记录版本模板代码

select column_name[,column_name,...]
from table_name
versions between [SCN|TIMESTAMP] [expr|MINVALUE]
and [epxr|MAXVALUE] as of [SCN|TIMESTAMP] expr;

  3.示例

    (1)创建表versions_table,并对其进行DML操作

create table version_table(
tid number,
tname varchar(10)
);
insert into version_table values(1,'小张');
commit;
insert into version_table values(2,'小明');
commit;
insert into version_table values(3,'小强');
commit;
update version_table set tname='小红' where tid=1;
commit;

      【Java EE 学习 30】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】

    (2)对该表进行闪回版本查询

col tid for 999;
col tname for a10;
col 开始时间 for a30;
col 结束时间 for a30;
col 操作 for a2;
col 事务号 for a16;
 select tid,tname,versions_starttime 开始时间,versions_endtime 结束时间,versions_operation 操作,versions_xid 事务号 from version_table versions between scn minvalue and maxvalue order by 1,4

      【Java EE 学习 30】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】

    (3)通过事务号进行闪回事务查询。

四、闪回事务查询

  1.闪回事务查询实际上是闪回版本查询的一个扩充,通过它可以审计某个事务甚至撤销某个事务。

  2.需要使用flashback_transaction_query视图。

  3.查询flashback_transaction_query视图需要有select any transaction的权限。

--管理员授予权限
grant select any transaction to scott;

  4.以三中的事务为例,撤销修改成小红的操作。

    (1)从闪回版本查询中,获取xid号(事务号)

select tid,tname,versions_starttime 开始时间,versions_endtime 结束时间,versions_operation 操作,versions_xid 事务号 from version_table versions between scn minvalue and maxvalue order by 1,4

      【Java EE 学习 30】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】

    (2)基于xid,在flashback_transaction_query视图中获取响应的事务信息。

select undo_sql from flashback_transaction_query where xid='04000B00DA030000'

    (3)使用查询到的sql语句撤销提交的操作。

    (4)疑问:最后一步失败了?11g需要命令?alter database add supplemental log data;错误,闪回版本查询为空!


五、导入导出

  1.导出:使用exp命令。

    (1)表方式,例:

exp scott/tiger@localhost:1521/orcl file=d:/temp/1.dmp log=d:/temp/log.log tables=emp,dept

    (2)用户方式,例:

exp scott/tiger@localhost:1521/orcl file=d:/temp/1.dmp log=d:/temp/log.log 

    (3)全库方式,例:

exp sys/密码@localhost:1521/orcl file=D:/temp/temp.dmp log=D:/temp/log.log full=y

  2.导入

    (1)导入一张或者几张表

imp hr/hr@localhost:1521/orcl file=d:/temp/temp.dmp log=d:/temp/temp.log tables=emp,dept fromuser=scott touser=hr commit=y ignore=n

    (2)导入用户下的表

imp hr/hr@localhost:1521/orcl file=d:/temp/temp.dmp log=d:/temp/temp.log  fromuser=scott touser=hr commit=y ignore=n

    (3)导入数据库

imp sys/密码@localhost:1521 file=D:/temp/temp.dmp log=D:/temp/temp.log full=y imgnore=y destroy=y

六、管理用户安全。

  1.创建用户

    (1)创建用户

create user kdyzm identified by root

    (2)为用户分配系统权限create session,否则不能登录数据库

grant create session to kdyzm;

    (3)为用户分配users表空间并允许用户无限制使用该表空间(不分配表空间无法创建表)。

 alter user kdyzm quota unlimited on users;

  2.授权

    (1)with admin option:不能级联撤销权限

      A授予B权限,B再授予C权限,当A从B中将权限撤销的时候,C的权限仍然保留。

    (2)with grant option:能够级联撤销权限

      A授予B权限,B再授予C权限,当A从B中将权限撤销的时候,C的权限也会被撤销。

  3.撤销权限:使用revoke命令

  4.角色

    (1)创建角色

create role kdyzm_role

    (2)为角色赋权限

 grant create session to kdyzm_role;

    (3)为角色赋予角色的权限

create role general_role ;
grant create table,kdyzm_role to general_role;

    (4)将角色赋予新用户

create user newuser identified by new;
grant general_role to newuser;

    (5)一般来说,在创建新用户的时候会将connect、resource两个角色赋予新用户。


七、分布式数据库

  1.分布式数据库物理上被存放在网络上的多个节点,逻辑上是一个整体。

  2.怎样实现分布式数据库之间的通信

    【Java EE 学习 30】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】

    (1)利用Net Manager配置本地命名。    

    (2)在本地定义数据库链路。

CREATE DATABASE LINK [db_link_name] CONNECT TO
[user_name] IDENTIFIED BY [password] USING '[tns_name]';

    参数说明:

      [DB_LINK_NAME]:是所要连接的数据库的服务名,也就是该数据库的真实名称(通常就是SID)。
      [USRE_NAME]:是所要连接的用户名称。
      [PASSWORD]:是所要连接的用户的密码。
      [TNS_NAME]:是所要连接的数据库的服务命名。
  3.分布式数据库使用示例。
    (1)新建数据库服务命名。使用Net Manager的方法略。新建的服务命名为:remote_orcl
      【Java EE 学习 30】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】
    (2)新建数据库链接:
 create database link remote_link connect to scott identified by tiger using 'remote_orcl';

      【Java EE 学习 30】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】    

    (3)查询操作

select * from emp@remote_link ;

      该操作查询远程数据库emp表中的数据。

      【Java EE 学习 30】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】

  4.可以为远程数据库中的表创建同义词,方便访问,而且更加安全。

create synonym remoteEmp for emp@remote_link;

    【Java EE 学习 30】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】

    下次我们便可以使用 from remoteEmp的方式来访问该远程表了。

  5.触发器应用场景三:同步数据

    目标:同步远程数据库emp表和本地emp表的的薪水字段。    

    (1)创建触发器

create or replace trigger synsal
after update
on emp
for each row
begin
update remoteEmp set sal=:new.sal where empno=:new.empno;
end;
/

    (2)将7369号的员工薪水设置为-9999

 update emp set sal=-9999 where empno=7369;
commit;

    【Java EE 学习 30】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】

    (3)查看本地数据库中的emp表和远程数据库中的emp表中的薪水是否已经同步了。

    【Java EE 学习 30】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】


八、数据字典
  1.Oracle数据库中的表分为两种
    (1)基本表:描述数据库信息,只能由数据库服务器进行修改
    (2)用户表:用户自定义的表。
  2.数据字典前缀命名规则
    user:用户自己的
    all:用户可以访问到的
    dba:管理员视图
    v$性能相关的数据
  3.如何使用数据字典
    从Dictionary开始,这个表中包含了所有数据字典的表名和说明。
  4.user_objects视图和all_objects视图。
    (1)通过前者可以查看用户自己创建的所有对象,包括表、视图、触发器、存储过程、同义词、序列、数据库链路等。
    (2)通过后者可以查看用户在权限之内能够访问的对象。
  5.user_sequences:通过该视图查询序列信息。
  6.使用comment语句给表添加注释。
    (1)comment on table employees is '注释内容';
    (2)查询表注释:select * from user_tab_comments where table_name='表名';
  7.user_tables:通过该视图查询所有用户表。
  8.user_views:通过该视图查询用户创建的所有视图。
  9.user_constraints:查询用户表上的约束。
  10.总结:
      DICTIONARY
      USER_OBJECTS
      USER_TABLES
      USER_TAB_COLUMNS
      USER_CONSTRAINTS
      USER_CONS_COLUMNS
      USER_VIEWS
      USER_SEQUENCES
      USER_TAB_SYNONYMS
      表注释

九、方案
  1.方案,即schema,一个用户对应着一个方案,一个方案对应着用户下面的所有数据库对象。
  2.使用EM管理方案,即使用EM对表、视图、索引、同义词、触发器、存储过程、存储函数、数据库链路等进行管理,包括增删改查操作。
 

【Java EE 学习 30】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】的更多相关文章

  1. Java基础学习总结(49)——Excel导入导出工具类

    在项目的pom文件中引入 <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifac ...

  2. 【Java EE 学习 29 下】【JDBC编程中操作Oracle数据库】【调用存储过程的方法】

    疑问:怎样判断存储过程执行之后返回值是否为空. 一.连接oracle数据库 1.需要的jar包:在安装的oracle中就有,所以不需要到官网下载,我的oracle11g下:D:\app\kdyzm\p ...

  3. Oracle导入&sol;导出某个用户下的数据库

    导出 exp用户名/密码@数据库实例owner=用户名file=文件存储路径 例如:exp MM/123456@ORCL owner=MM file=F\abcd.dmp 导入 imp用户名/密码@数 ...

  4. Java EE学习——Quartz的Cron表达式

    经历过低谷后,还是要好好学习,越失落会越来越落后. 今天写一下Cron表达式的用法,虽然是之前自己写的,也过了挺长一段时间,这次就拿出来作为回顾吧. Cron表达式是Quartz的精髓(个人觉得),比 ...

  5. Java EE 学习(8):IDEA &plus; maven &plus; spring 搭建 web(4)- 用户管理

    转载:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) ava E ...

  6. Java EE 学习(7):IDEA &plus; maven &plus; spring 搭建 web(3)- 配置数据库

    参考: https://my.oschina.net/gaussik/blog/513444 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 ...

  7. Java EE 学习(6):IDEA &plus; maven &plus; spring 搭建 web(2)- 配置 Spring

    参考:https://my.oschina.net/gaussik/blog/513353 注:此文承接上一文:Java EE 学习(5):IDEA + maven + spring 搭建 web(1 ...

  8. Java EE 学习(5):IDEA &plus; maven &plus; spring 搭建 web(1)

    参考:http://www.cnblogs.com/lonelyxmas/p/5397422.html http://www.ctolib.com/docs-IntelliJ-IDEA-c--1590 ...

  9. Java EE 学习(9):IDEA &plus; maven &plus; spring 搭建 web(5)- 博客文章管理

    转载:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) . 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) Jav ...

随机推荐

  1. java&colon;StringBuffer字符处理对象

    1.添加字符 public class StringBufferDemo { public static void main(String args[]) { StringBuffer sbf = n ...

  2. hdu 4061 福州赛区网络赛A 数学 &ast;&ast;&ast;

    a1/sum #include<cstdio> #include<iostream> #include<algorithm> #include<cstring ...

  3. HDU3977&lpar;斐波那契数列模n的循环节长度&rpar;

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3977 题意:求斐波那契数列模p的循环节长度,注意p最大是2*10^9,但是它的素因子小于10^6. 分析过 ...

  4. &period;NET简单企业应用

    <.NET简单企业应用>项目开发环境 项目开始,开发团队需要构建一套开发环境,主要包含:开发工具.代码管理/版本控制系统.任务和Bug管理系统和持续集成(CI)系统.本文主要列举项目开发中 ...

  5. ReactiveCocoa学习总结&lpar;1&rpar;

    1. 它是什么? 官方解释: [RACSignal] is a push-driven stream with a focus on asynchronous event delivery throu ...

  6. HTML5可以省略结束标记的元素

    HTML5可以省略结束标记的元素 1.dd 2.dt 3.li 4.p 5.optgroup 6.option 7.rt 8.rp 9.thread 10.tfoot 11.tr 12.td 13.t ...

  7. 关于CSS定位属性 position 的使用

    CSS中一般通过浮动和定位来对标签进行位置操作.下面我们来讨论一下定位的用法和需要注意的地方. 1.首先,说一下position的几个属性值 (1)none属性值,这个是定义不进行定位,默认为不定位, ...

  8. Win10下windows mobile设备中心连接不上的方法无法启动

    微软Win10自动更细补丁后windows mobile设备中心就无法启动了 需要重新启动相关的服务并授予 本机登录用户 权限 1.点击屏幕左下角“开始”图标,点击“运行”,在弹出的输入框中输入“se ...

  9. Calling Matlab function from python&colon; &OpenCurlyDoubleQuote;initializer must be a rectangular nested sequence”

    I am writing a python script from which I hope to call the Matlab anovan function. I have attempted ...

  10. python 正则匹配时间格式转换方法

    import re from datetime import datetime a = '2018年8月9日 10:10' s = re.findall('\d+',a) print(s) d = ' ...