一、闪回

  1.可能的误操作

    (1)错误的删除了记录

    (2)错误的删除了表

    (3)查询历史记录

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

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

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

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

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

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

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

    (5)闪回数据库

    (6)闪回归档日志

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

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

    

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

  1. show parameters undo

    

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

  1. alter system set undo_retention=1200 scope=both

    

二、闪回表

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

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

  1. grant flashback any table to scott;

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

  1. alter table flashback_table enable row movement;

  3.闪回表步骤:

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

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

      

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

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

      

    (3)删除第二条记录

  1. delete from flashback_table where tid=2;
  2. commit;

      

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

  1. flashback table flashback_table to scn 1569572;

    (5)验证闪回

      

    (6)屏幕录制

  1. SQL> create table flashback_table (
  2. 2 tid number,tname varchar(10));
  3.  
  4. 表已创建。
  5.  
  6. SQL> edit
  7. 已写入 file afiedt.buf
  8.  
  9. 1 create table flashback_table (
  10. 2* tid number,tname varchar(10))
  11. SQL>
  12. SQL>
  13. SQL> insert into flashback_table values(&tid,'&tname');
  14. 输入 tid 的值: 1
  15. 输入 tname 的值: 小明
  16. 原值 1: insert into flashback_table values(&tid,'&tname')
  17. 新值 1: insert into flashback_table values(1,'小明')
  18.  
  19. 已创建 1 行。
  20.  
  21. SQL>
  22. SP2-0042: 未知命令 "、" - 其余行忽略。
  23. SQL> /
  24. 输入 tid 的值: 2
  25. 输入 tname 的值: 小张
  26. 原值 1: insert into flashback_table values(&tid,'&tname')
  27. 新值 1: insert into flashback_table values(2,'小张')
  28.  
  29. 已创建 1 行。
  30.  
  31. SQL> /
  32. 输入 tid 的值: 3
  33. 输入 tname 的值: 小强
  34. 原值 1: insert into flashback_table values(&tid,'&tname')
  35. 新值 1: insert into flashback_table values(3,'小强')
  36.  
  37. 已创建 1 行。
  38.  
  39. SQL> edit
  40. 已写入 file afiedt.buf
  41.  
  42. 1* insert into flashback_table values(&tid,'&tname')
  43. SQL>
  44. SQL>
  45. SQL> select * from flashback_table;
  46.  
  47. TID TNAME
  48. ---------- --------------------
  49. 1 小明
  50. 2 小张
  51. 3 小强
  52.  
  53. SQL> commit
  54. 2 ;
  55.  
  56. 提交完成。
  57.  
  58. SQL> select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss*ff') 时间,timestamp_to_scn(systimestamp) SCN;
  59. select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss*ff') 时间,timestamp_to_scn(systimestamp) SCN
  60. *
  61. 1 行出现错误:
  62. ORA-00923: 未找到要求的 FROM 关键字
  63.  
  64. SQL> select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss*ff') 时间,timestamp_to_scn(systimestamp) SCN from dual;
  65.  
  66. 时间 SCN
  67. ---------------------------------------------------------- ----------
  68. 2015-08-25 11:01:03*597000 1569572
  69.  
  70. SQL> delete from flashback_table where tid=2;
  71.  
  72. 已删除 1 行。
  73. SQL> commit
  74.   2 ;
  75.  
  76.  提交完成。
  77.  
  78. SQL> select * from flashback_table;
  79.  
  80. TID TNAME
  81. ---------- --------------------
  82. 1 小明
  83. 3 小强
  84.  
  85. SQL> flashback table flashback_table to scn 1569572;
  86. flashback table flashback_table to scn 1569572
  87. *
  88. 1 行出现错误:
  89. ORA-08189: 因为未启用行移动功能, 不能闪回表
  90.  
  91. SQL> alter table flashback_table enabel row movement;
  92. alter table flashback_table enabel row movement
  93. *
  94. 1 行出现错误:
  95. ORA-01735: 无效的 ALTER TABLE 选项
  96.  
  97. SQL> alter table flashback_table enable row movement;
  98.  
  99. 表已更改。
  100.  
  101. SQL>
  102. SQL>
  103. SQL>
  104. SQL>
  105. SQL>
  106. SQL> flashback table flashback_table to scn 1569572;
  107.  
  108. 闪回完成。
  109.  
  110. SQL> select * from flashback_table;
  111.  
  112. TID TNAME
  113. ---------- --------------------
  114. 1 小明
  115. 2 小张
  116. 3 小强
  117.  
  118. SQL>

屏幕录制

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

二、闪回删除

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

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

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

    

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

    

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

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

  6.模板代码

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

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

  7.闪回删除的步骤

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

  1. flashback table test to before drop;

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

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

      

    (4)闪回重命名

  1. flashback table test to before drop rename to test1;

      

三、闪回版本查询

  1.使用视图:flashback_transaction_query

    

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

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

  3.示例

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

  1. create table version_table(
  2. tid number,
  3. tname varchar(10)
  4. );
  5. insert into version_table values(1,'小张');
  6. commit;
  7. insert into version_table values(2,'小明');
  8. commit;
  9. insert into version_table values(3,'小强');
  10. commit;
  11. update version_table set tname='小红' where tid=1;
  12. commit;

      

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

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

      

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

四、闪回事务查询

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

  2.需要使用flashback_transaction_query视图。

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

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

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

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

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

      

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

  1. select undo_sql from flashback_transaction_query where xid='04000B00DA030000'

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

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


五、导入导出

  1.导出:使用exp命令。

    (1)表方式,例:

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

    (2)用户方式,例:

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

    (3)全库方式,例:

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

  2.导入

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

  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)导入用户下的表

  1. 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)导入数据库

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

六、管理用户安全。

  1.创建用户

    (1)创建用户

  1. create user kdyzm identified by root

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

  1. grant create session to kdyzm;

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

  1. 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)创建角色

  1. create role kdyzm_role

    (2)为角色赋权限

  1. grant create session to kdyzm_role;

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

  1. create role general_role ;
  2. grant create table,kdyzm_role to general_role;

    (4)将角色赋予新用户

  1. create user newuser identified by new;
  2. grant general_role to newuser;

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


七、分布式数据库

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

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

    

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

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

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

    参数说明:

      [DB_LINK_NAME]:是所要连接的数据库的服务名,也就是该数据库的真实名称(通常就是SID)。
      [USRE_NAME]:是所要连接的用户名称。
      [PASSWORD]:是所要连接的用户的密码。
      [TNS_NAME]:是所要连接的数据库的服务命名。
  3.分布式数据库使用示例。
    (1)新建数据库服务命名。使用Net Manager的方法略。新建的服务命名为:remote_orcl
      
    (2)新建数据库链接:

  1. create database link remote_link connect to scott identified by tiger using 'remote_orcl';

          

    (3)查询操作

  1. select * from emp@remote_link ;

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

      

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

  1. create synonym remoteEmp for emp@remote_link;

    

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

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

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

    (1)创建触发器

  1. create or replace trigger synsal
  2. after update
  3. on emp
  4. for each row
  5. begin
  6. update remoteEmp set sal=:new.sal where empno=:new.empno;
  7. end;
  8. /

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

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

    

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

    


八、数据字典
  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导入/导出某个用户下的数据库

    导出 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 + maven + spring 搭建 web(4)- 用户管理

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

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

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

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

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

  8. Java EE 学习(5):IDEA + maven + 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 + maven + spring 搭建 web(5)- 博客文章管理

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

随机推荐

  1. Function构造函数

    使用Function构造函数, 也能够创建函数, 和使用关键字function定义函数有几点区别: 使用function关键字这样定义函数: var f = function(x,y) {return ...

  2. WebView·开发指南

    WebView·开车指南 作者:凌俊琦链接:https://zhuanlan.zhihu.com/p/22247021来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. T ...

  3. 狼人杀BETA阶段计划简介

    狼人杀beta阶段任务与目标 简介 一.前言 狼人杀alpha阶段终于在组团刷夜中结束了,我们取得了一些成绩,同时也暴露了团队的一些问题.但不管怎样,有了在alpha版本中收获的经验,我们将在beta ...

  4. Crontab命令格式

    第1列分钟1-59第2列小时1-23(0表示子夜)第3列日1-31第4列月1-12第5列星期0-6(0表示星期天)第6列要运行的命令 下面是crontab的格式: 分 时 日 月 星期 要运行的命令 ...

  5. [创业中, 寻求合作] 业务方向:车联网智能终端;APP蓝牙控制汽车;APP网络远程控制汽车 (联系电话:18503086002)

    擅长领域 手机APP蓝牙控制汽车方案 手机APP网络远程控制汽车方案 手机APP与汽车车机的文件极速传输技术 车载OBD终端 (后装) 智能TBOX终端,Base on Linux,使用车规级硬件加密 ...

  6. 加载未安装APK中的类

    一.前提 目的:动态加载SD卡中Apk的类. 注意:被加载的APK是未安装的. 相关:本文是本博另外一篇文章:Android动态加载jar/dex的升级版. 截图: 成功截图: 二.准备 准备被调用A ...

  7. Win7普通版-X86-SP1-ios-旗舰版安装

    ------------------------------- 自己的电脑是X64Win7系统.Acer电脑----->>现在改装成  Win7普通版-X86-SP1-ios-旗舰版安装 ...

  8. 转-ArcGIS Engine许可初始化

    关于初始化Engine许可的,其实原理都很简单,大家一般都没有问题,但又往往会因为不够细心加上Engine的“小脾气”,让不少程序员都要在这里犯错. 以Engine9.2为例,应用程序是强制初始化许可 ...

  9. margin双边距的问题

    margin:20px;height:20px;float:left margin:20px;height:20px;float:left

  10. [转] 64位windows下添加postgreSQL odbc数据源

    系统环境:windows7 64位 postgreSQL9.0(64bit)   ps:安装postgreSQL时确定安装了odbc驱动.   问题:点击“开始->控制面板->管理工具-& ...