设为首页 收藏本站
查看: 532|回复: 0

[经验分享] Oracle Database 12c新特性 In

[复制链接]

尚未签到

发表于 2015-12-19 15:35:09 | 显示全部楼层 |阅读模式
  【Oracle Database 12c新特性】 In-Database Archiving数据库内归档
  Oracle Database 12c中引入了 In-Database Archiving的新特性, 该特性允许用户通过对表上的数据行标记为inactive不活跃的,以归档数据。
  这些inactive的数据行可以通过压缩进一部优化,且对应用来说默认不可见。    可以通过一个session级别的参数来控制数据的可见与否。
  
  通过In-DatabaseArchiving数据库内归档特性可以在单库中存放更长周期的数据, 而损耗很少的应用性能。 归档数据还可以通过压缩来进一步提升备份效能。
  
  要管理一张表的In-DatabaseArchiving,必须为表启用ROW ARCHIVAL  并操作ORA_ARCHIVE_STATE 这个隐藏字段 。 此外用户还可以指定session级别的 ROW ARCHIVAL VISIBILITY为ACTIVE  或者ALL。
  
  下面为演示示例:
  
  /* Setvisibility to ACTIVE to display only active rows of a table.*/
  ALTERSESSION SET ROW ARCHIVAL VISIBILITY = ACTIVE;
  
  CREATETABLE employees_indbarch
  (employee_id NUMBER(6) NOT NULL,
  first_name VARCHAR2(20), last_nameVARCHAR2(25) NOT NULL,
  email VARCHAR2(25) NOT NULL, phone_number VARCHAR2(20),
  hire_date DATE NOT NULL, job_id VARCHAR2(10)NOT NULL, salary  NUMBER(8,2),
  commission_pct NUMBER(2,2), manager_idNUMBER(6), department_id NUMBER(4)) ROW ARCHIVAL;
  
  INSERTINTO employees_indbarch(employee_id, first_name, last_name, email,
  hire_date, job_id, salary, manager_id,department_id)
  VALUES (251, 'Scott', 'Tiger','scott.tiger@example.com', '21-MAY-2009',
  'IT_PROG', 50000, 103, 60);
  
  INSERTINTO employees_indbarch(employee_id, first_name, last_name, email,
  hire_date, job_id, salary, manager_id,department_id)
  VALUES (252, 'Jane', 'Lion','jane.lion@example.com', '11-JUN-2009',
  'IT_PROG', 50000, 103, 60);
  
  commit;
  
  /* Show all the columns in the table,including hidden columns */
  SELECTSUBSTR(COLUMN_NAME,1,22), SUBSTR(DATA_TYPE,1,20), COLUMN_ID AS COL_ID,
  SEGMENT_COLUMN_ID AS SEG_COL_ID,INTERNAL_COLUMN_ID AS INT_COL_ID, HIDDEN_COLUMN, CHAR_LENGTH
  FROM USER_TAB_COLS WHERETABLE_NAME='EMPLOYEES_INDBARCH';
  
  SELECTSUBSTR(COLUMN_NAME,1,22) NAME, SUBSTR(DATA_TYPE,1,20) DATA_TYPE, COLUMN_ID ASCOL_ID,
  SEGMENT_COLUMN_ID AS SEG_COL_ID,INTERNAL_COLUMN_ID AS INT_COL_ID, HIDDEN_COLUMN, CHAR_LENGTH
  FROM USER_TAB_COLS WHERETABLE_NAME='EMPLOYEES_INDBARCH';
  
  NAME                   DATA_TYPE                COL_ID SEG_COL_ID INT_COL_ID HID CHAR_LENGTH
  ------------------------------------------ ---------- ---------- ---------- --- -----------
  ORA_ARCHIVE_STATE     VARCHAR2                                1          1 YES        4000
  EMPLOYEE_ID            NUMBER                        1          2          2 NO            0
  FIRST_NAME             VARCHAR2                      2          3          3 NO           20
  LAST_NAME              VARCHAR2                      3         4          4 NO           25
  EMAIL                  VARCHAR2                      4          5          5 NO           25
  PHONE_NUMBER           VARCHAR2                      5          6          6 NO           20
  HIRE_DATE              DATE                          6          7          7 NO            0
  JOB_ID                 VARCHAR2                      7          8          8 NO           10
  SALARY                 NUMBER                        8          9          9 NO            0
  COMMISSION_PCT         NUMBER                        9         10         10 NO            0
  MANAGER_ID             NUMBER                       10         11         11 NO            0
  DEPARTMENT_ID          NUMBER                       11         12        12 NO            0
  

  /*Decrease the ORA_ARCHIVE_STATE column>  COLUMNORA_ARCHIVE_STATE FORMAT a18;
  /* Thedefault value for ORA_ARCHIVE_STATE is '0', which means active */
  SELECTemployee_id, ORA_ARCHIVE_STATE FROM employees_indbarch;
  
  EMPLOYEE_IDORA_ARCHIVE_STATE
  -----------------------------
  251 0
  252 0
  
  /* Inserta value into ORA_ARCHIVE_STATE to set inactive */
  UPDATEemployees_indbarch SET ORA_ARCHIVE_STATE = '20' WHERE employee_id = 252;
  
  /* Onlyactive records are in the following query */
  SELECTemployee_id, ORA_ARCHIVE_STATE FROM employees_indbarch;
  
  EMPLOYEE_IDORA_ARCHIVE_STATE
  -----------------------------
  251 0
  
  /* Setvisibility to ALL to display all records */
  ALTERSESSION SET ROW ARCHIVAL VISIBILITY = ALL;
  
  SELECTemployee_id, ORA_ARCHIVE_STATE FROM employees_indbarch;
  
  EMPLOYEE_IDORA_ARCHIVE_STATE
  -----------------------------
  251 0
  252 20
  
  SQL>desc employees_indbarch
  Name                                     Null?    Type
  ------------------------------------------------- ----------------------------
  EMPLOYEE_ID                               NOT NULLNUMBER(6)
  FIRST_NAME                                         VARCHAR2(20)
  LAST_NAME                                 NOT NULLVARCHAR2(25)
  EMAIL                                     NOT NULLVARCHAR2(25)
  PHONE_NUMBER                                      VARCHAR2(20)
  HIRE_DATE                                 NOT NULL DATE
  JOB_ID                                    NOT NULLVARCHAR2(10)
  SALARY                                            NUMBER(8,2)
  COMMISSION_PCT                                    NUMBER(2,2)
  MANAGER_ID                                         NUMBER(6)
  DEPARTMENT_ID                                      NUMBER(4)
  
  1* select COLUMN_NAME,COLUMN_ID,DATA_TYPEfrom dba_tab_cols where table_name=upper('employees_indbarch')
  SQL> /
  
  COLUMN_NAME          COLUMN_ID DATA_TYPE
  ----------------------------- --------------------
  DEPARTMENT_ID               11 NUMBER
  MANAGER_ID                  10 NUMBER
  COMMISSION_PCT               9 NUMBER
  SALARY                       8 NUMBER
  JOB_ID                       7 VARCHAR2
  HIRE_DATE                    6 DATE
  PHONE_NUMBER                 5 VARCHAR2
  EMAIL                        4 VARCHAR2
  LAST_NAME                    3 VARCHAR2
  FIRST_NAME                   2 VARCHAR2
  EMPLOYEE_ID                  1 NUMBER
  ORA_ARCHIVE_STATE              VARCHAR2
  
  SQL>select dump(ORA_ARCHIVE_STATE,16),dump(EMPLOYEE_ID,16),dbms_rowid.rowid_block_number(rowid),dbms_rowid.rowid_relative_fno(rowid)  from employees_indbarch;
  
  DUMP(ORA_ARCHIVE_STADUMP(EMPLOYEE_ID,16) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID)
  ---------------------------------------- ------------------------------------------------------------------------
  Typ=1Len=1: 30      Typ=2 Len=3: c2,3,34                               109465                                    1
  Typ=1Len=2: 32,30   Typ=2Len=3: c2,3,35                              109465                                   1
  

  SQL>>  
  Systemaltered.
  
  SQL>alter system dump datafile 1 block 109465;
  
  Systemaltered.
  
  tl: 73fb: --H-FL-- lb: 0x0  cc: 12
  col  0: [ 1] 30
  col  1: [ 3] c2 03 34
  col  2: [ 5] 53 63 6f 74 74
  col  3: [ 5] 54 69 67 65 72
  col  4: [23]
  73 63 6f 74 74 2e 74 69 67 65 72 40 65 78 616d 70 6c 65 2e 63 6f 6d
  col  5: *NULL*
  col  6: [ 7] 78 6d 05 15 01 01 01
  col  7: [ 7] 49 54 5f 50 52 4f 47 
  col  8: [ 2] c3 06
  col  9: *NULL*
  col 10: [3]  c2 02 04
  col 11: [2]  c1 3d
  tab 0,row 1, @0x1ecc
  tl: 70fb: --H-FL-- lb: 0x2  cc: 12
  col  0: [ 2] 32 30
  col  1: [ 3] c2 03 35
  col  2: [ 4] 4a 61 6e 65
  col  3: [ 4] 4c 69 6f 6e
  col  4: [21]
  6a 61 6e 65 2e 6c 69 6f 6e 40 65 78 61 6d 706c 65 2e 63 6f 6d
  col  5: *NULL*
  col  6: [ 7] 78 6d 06 0b 01 01 01
  col  7: [ 7] 49 54 5f 50 52 4f 47
  col  8: [ 2] c3 06
  col  9: *NULL*
  col 10: [3]  c2 02 04 
  col 11: [2]  c1 3d
  
  
  
  可以看到这里 ORA_ARCHIVE_STATE是实际存放在块里的row piece上的第一个字段,类型为varchar2(4000);
  In-Database Archiving的限制:
  § ILM is not supported with OLTP table compression forin-database archiving. Segment-level ILM and compression is supported ifpartitioned on the ORA_ARCHIVE_STATE column.
  
  
  ORA_ARCHIVE_STATE相关:
  /* constants specifying ROW ARCHIVALstate */
  archive_state_active constant varchar2(1) := ‘0’;
  archive_state_archived constant varchar2(1) := ‘1’;
  /*
  * description – Given a value for the ORA_ARCHIVE_STATE column this
  * function returns the mapping for the value.
  *
  * value – “0”, “1” or other values from the ORA_ARCHIVE_STATE column of
  * a row archival enabled table
  * returns either “archive_state_active” or “archive_state_archived”
  */
   

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-153410-1-1.html 上篇帖子: ORACLE中impdp的总结 下篇帖子: ORACLE中的EXPDP总结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表