浅谈Oracle数据库中大数据量表的管理(2)_Oracle数据库_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

浅谈Oracle中大数据量表的管理(2)

作者:黑客防线网安Oracle维护基地 来源:黑客防线网安Oracle维护基地 浏览次数:0

本篇关键词:Oracle数据库Oracle教程
黑客防线网安网讯:    PARTITION BY RANGE (DATATIME)  (PARTITION Test_060101 VALUES LESS THAN (TO_DATE('2006-01-02','YYYY-MM-DD')),  (PARTITION Test_060102 VALUES LESS THAN ...
    PARTITION BY RANGE (DATATIME)
  (PARTITION Test_060101 VALUES LESS THAN (TO_DATE('2006-01-02','YYYY-MM-DD')),
  (PARTITION Test_060102 VALUES LESS THAN (TO_DATE('2006-01-03','YYYY-MM-DD')),
  ……
  );
  对于按时间分区仍然不能满足性能需求的表 还可以根据应用需求使用子分区对表进一步细化
  应用设计中,要充分利用分区表的特性,对大表的访问要完全避免全表访问,缩小访问范围在查询条件中,尽量使用分区的列。
  3 维护
  大表的维护工作比较繁琐,索引的维护,存储空间的维护,历史数据的清理等等,使用分区表可以简化大表的维护工作,但是如果表很多的话,手动的创建、删除分区也是一件很繁琐,而且容易出错的事情。
  此章节以按天分区的分区表为例讨论大表的自动维护。
  3.1 分区表的命名规则
  分区表分区的命名应当按照一定的规则命名,以利于自动维护的实现。本例采用按天分区的分区表,分区的命名方式为TABLENAME_YYMMDD,例如:TEST表的2006年6月1日的分区命名为TEST _060601。
  3.2 维护字典
  在数据库中创建维护字典表,存放需要自动维护的分区表的信息,包括表名,schema,表的类型,数据在数据库中的保留时间等信息。
  Table Name: H_RETENTION
  Column Type Null? Description
  tablename Varchar2(30) Not null 表名
  schemaname Varchar2(30) Not null Schema
  typeid Varchar2(20) Not null 表类型1. PARTITION2. NORMAL3. …。。
  retention Number(3) Not null 该表的保存天数。
  
   3.3 自动创建分区
  对于按时间分区的分区表,若不能及时创建新的数据分区,会导致数据无法插入到分区表的严重后果,数据库会产生报错信息ORA-14400: inserted partition key does not map to any partition,插入失败。
  创建分区可以手工创建,也可以根据维护字典,通过系统的任务调度来创建分区。通常是在月底创建下个月的分区。
  自动创建分区实现如下:
  /**************************************************************************
  Program Name:Add_Partition
  Description:
  创建某个用户下个月的所有分区
  ***************************************************************************/
  PROCEDURE add_partition (v_schema IN VARCHAR2)
  IS
  CURSOR c_td_table
  IS
  SELECT   tablename
  FROM  h_retention
  WHERE typeid = 'PARTITION'
  AND schemaname = UPPER (v_schema)
  ORDER BY tablename;
  v_cur         BINARY_INTEGER;
  v_int         BINARY_INTEGER;
  v_partition   VARCHAR2 (30);
  v_date        DATE;
  v_days        NUMBER;
  sql_stmt      VARCHAR2 (1000);      -- String used to save sql statement
  err_msg       VARCHAR2 (300);
  BEGIN
  v_date := TRUNC (ADD_MONTHS (SYSDATE, 1), 'MM');
  v_days :=
  TO_NUMBER (TO_CHAR (LAST_DAY (ADD_MONTHS (SYSDATE, 1)), 'DD'));
  v_cur := DBMS_SQL.open_cursor;
  FOR v_table IN c_td_table
  LOOP
  v_date := TRUNC (ADD_MONTHS (SYSDATE, 1), 'MM');
  v_partition := v_table.tablename;
  FOR i IN 1 .. v_days
  LOOP
  BEGIN
  sql_stmt :=
  'ALTER TABLE '
  || v_schema
  || '.'
  || v_table.tablename
  || ' ADD PARTITION '
  || v_partition
  || '_'
  || TO_CHAR (v_date, 'YYMMDD')
  || ' '
  || 'VALUES LESS THAN (TO_DATE('''
  || TO_CHAR (v_date + 1, 'YYYY-MM-DD')
  || ''',''YYYY-MM-DD'')) ';
  DBMS_SQL.parse (v_cur, sql_stmt, DBMS_SQL.native);
  v_int := DBMS_SQL.EXECUTE (v_cur);
  EXCEPTION
  WHEN OTHERS
  THEN
  err_msg :=
  v_partition
  || ': Create '
  || TO_CHAR (v_date, 'YYMMDD')
  || ' partition unsuccessfully! Error Information:'
  || SQLERRM;
  log_insert (err_msg);  --You can define your own log_insert function
  COMMIT;
  END;
  v_date := v_date + 1;
  END LOOP;
  END LOOP;
  DBMS_SQL.close_cursor (v_cur);
  END;
  3.4 自动删除过期分区
  为了释放存储空间并提高大表的性能,要从数据库中删除大表中过期的历史数据。删除操作可以手工执行,也可以通过系统的任务调度来自动删除。分区表数据删除只需要删除相应的数据分区,与delete相比,有如下好处:
  u 速度快
  u 占用回滚表空间少
  u 产生日志量少
  u 释放空间
  如果有global的索引,删除分区后需要重建索引。
  自动删除分区实现如下:
  当前分区表的分区情况可以通过Oracle的数据字典dba_tab_partitions获得, 然后与维护字典中的数据保留天数进行比较,删除过期的数据分区
    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-13145-1.html
网站维护教程更新时间:2012-03-23 00:51:05  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer