zoukankan      html  css  js  c++  java
  • 【Java EE 学习 30】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】

    一、闪回

      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;

        

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

    show parameters undo

        

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

    alter system set undo_retention=1200 scope=both

        

    二、闪回表

      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;

          

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

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

          

        (3)删除第二条记录

    delete from flashback_table where tid=2;
    commit;

          

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

    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                                                                                               *
     611 行出现错误:
     62 ORA-00923: 未找到要求的 FROM 关键字
     63 
     64 
     65 SQL> select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss*ff') 时间,timestamp_to_scn(systimestamp) SCN from dual;
     66 
     67 时间                                                              SCN
     68 ---------------------------------------------------------- ----------
     69 2015-08-25 11:01:03*597000                                    1569572
     70 
     71 SQL> delete from flashback_table where tid=2;
     72 
     73 已删除 1 行。
     74 SQL> commit
     75   2 ;
     76 
     77  提交完成。
     78 
     79 
     80 SQL> select * from flashback_table;
     81 
     82        TID TNAME
     83 ---------- --------------------
     84          1 小明
     85          3 小强
     86 
     87 SQL> flashback table flashback_table to scn 1569572;
     88 flashback table flashback_table to scn 1569572
     89                 *
     901 行出现错误:
     91 ORA-08189: 因为未启用行移动功能, 不能闪回表
     92 
     93 
     94 SQL> alter table flashback_table enabel row movement;
     95 alter table flashback_table enabel row movement
     96                             *
     971 行出现错误:
     98 ORA-01735: 无效的 ALTER TABLE 选项
     99 
    100 
    101 SQL> alter table flashback_table enable row movement;
    102 
    103 表已更改。
    104 
    105 SQL>
    106 SQL>
    107 SQL>
    108 SQL>
    109 SQL>
    110 SQL> flashback table flashback_table to scn 1569572;
    111 
    112 闪回完成。
    113 
    114 SQL> select * from flashback_table;
    115 
    116        TID TNAME
    117 ---------- --------------------
    118          1 小明
    119          2 小张
    120          3 小强
    121 
    122 SQL>
    屏幕录制

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

    二、闪回删除

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

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

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

        

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

        

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

      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)如果当前用户下已经有了一张和回收站中同名的表,则如果不采取重命名的手段,就不能闪回。

          

        (4)闪回重命名

    flashback table test to before drop rename to test1;

          

    三、闪回版本查询

      1.使用视图:flashback_transaction_query

        

      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;

          

        (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

          

        (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

          

        (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.怎样实现分布式数据库之间的通信

        

        (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
          
        (2)新建数据库链接:
     create database link remote_link connect to scott identified by tiger using 'remote_orcl';

              

        (3)查询操作

    select * from emp@remote_link ;

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

          

      4.可以为远程数据库中的表创建同义词,方便访问,而且更加安全。
    create synonym remoteEmp for emp@remote_link;

        

        下次我们便可以使用 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;

        

        (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对表、视图、索引、同义词、触发器、存储过程、存储函数、数据库链路等进行管理,包括增删改查操作。
     
  • 相关阅读:
    (uC/OS-II学习笔记) 事件标志……
    (uC/OS-II学习笔记) 消息邮箱&&消息队列
    (uC/OS-II学习笔记)关于共享资源与信号量
    (uC/OS-II学习笔记)uC/OS-II 时间管理
    (uC/OS-II学习笔记)uC/OS-II在kinetis K60上移植与任务建立
    (Kinetis K60)RTC实时时钟
    (Kinetis K60)flash读写
    JQuery官方学习资料(译):避免与其他库的冲突
    JQuery官方学习资料(译):$( document ).ready()
    JQuery官方学习资料(译):$ vs $()
  • 原文地址:https://www.cnblogs.com/kuangdaoyizhimei/p/4756674.html
Copyright © 2011-2022 走看看