Chinaunix首页 | 论坛 | 博客
  • 博客访问: 137191
  • 博文数量: 25
  • 博客积分: 460
  • 博客等级: 下士
  • 技术积分: 252
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-11 10:48
个人简介

努力学习,谦虚请教,不断提升!

文章分类

全部博文(25)

文章存档

2015年(3)

2014年(4)

2013年(3)

2012年(9)

2011年(6)

我的朋友

分类: DB2/Informix

2012-06-25 16:29:14

历史告警表分片步骤:
一、创建分片所用的库
----------分析目前的磁盘空间---------------------------
卷组名称                    /dev/vg_db
卷组写操作                  读/写       
卷组状态                    可用的, 专有的           
最大逻辑卷                  255      
当前逻辑卷                  50       
打开逻辑卷                  50       
最大物理卷                  16       
当前物理卷                  2        
活动物理卷                  2        
每个物理卷的最大物理区      65535                
卷组描述区                  4        
物理区大小 (Mbytes)         64                
物理区合计                  17597    
分配物理区                  15623    
空闲物理区                  1974     
物理卷组合计                0          
合计备用的物理卷            0              
合计使用的备用物理卷        0

从上面的信息可以看到,/dev/vg_db剩余空间为1974*64/1024=123G空间,
加上把之前已经创建的10/10g个逻辑卷重新划分就有223G的空间。
历史告警表每行为8K,山东的数据量每天50W,计划每个分片存储7天的告警数据,
则7天的数据量为:8K*500000*7/1024=26G左右,加上预留,准备每个dbs30G空间。
1、drop掉ems_event_history
drop table ems_event_history;
2、删除tnms_his01-5表空间,然后重新划分;
onspaces -d tnms_his01
onspaces -d tnms_his02
onspaces -d tnms_his03
onspaces -d tnms_his04
onspaces -d tnms_his05
onspaces -d tnms_his06
onspaces -d tnms_his07
onspaces -d tnms_his08
onspaces -d tnms_his09
onspaces -d tnms_his09
onspaces -d remainder
--删除裸设备
lvremove /dev/vg_db/tnms_his01
lvremove /dev/vg_db/tnms_his02
lvremove /dev/vg_db/tnms_his03
lvremove /dev/vg_db/tnms_his04
lvremove /dev/vg_db/tnms_his05
lvremove /dev/vg_db/tnms_his06
lvremove /dev/vg_db/tnms_his07
lvremove /dev/vg_db/tnms_his08
lvremove /dev/vg_db/tnms_his09
lvremove /dev/vg_db/remainder
3、使用vgdisplay /dev/vg_db查看空间是否增大为223G左右
4、创建逻辑卷
lvcreate -L 30720 -n tnms_his01 /dev/vg_db
lvcreate -L 30720 -n tnms_his02 /dev/vg_db
lvcreate -L 30720 -n tnms_his03 /dev/vg_db
lvcreate -L 30720 -n tnms_his04 /dev/vg_db
lvcreate -L 30720 -n tnms_his05 /dev/vg_db
lvcreate -L 30720 -n tnms_his06 /dev/vg_db
lvcreate -L 30720 -n remainder /dev/vg_db
5、设置权限和属性
cd /dev/vg_db
chown informix:informix tnms_his*
chown informix:informix remainder1
chmod 660 tnms_his*
chmod 660 remainder1
6、创建软连接
cd /opt/dbnm/chunks/
ln -s /dev/vg_db/rtnms_his01 tnms_his01
ln -s /dev/vg_db/rtnms_his01 tnms_his02
ln -s /dev/vg_db/rtnms_his01 tnms_his03
ln -s /dev/vg_db/rtnms_his01 tnms_his04
ln -s /dev/vg_db/rtnms_his01 tnms_his05
ln -s /dev/vg_db/rtnms_his01 tnms_his06
ln -s /dev/vg_db/rremainder remainder
7、创建表空间
onspaces -c -d tnms_his01 -k 8 -p /opt/dbnm/chunks/tnms_his01 -s 31457280 -o 0
onspaces -c -d tnms_his02 -k 8 -p /opt/dbnm/chunks/tnms_his02 -s 31457280 -o 0
onspaces -c -d tnms_his03 -k 8 -p /opt/dbnm/chunks/tnms_his03 -s 31457280 -o 0
onspaces -c -d tnms_his04 -k 8 -p /opt/dbnm/chunks/tnms_his04 -s 31457280 -o 0
onspaces -c -d tnms_his05 -k 8 -p /opt/dbnm/chunks/tnms_his05 -s 31457280 -o 0
onspaces -c -d tnms_his06 -k 8 -p /opt/dbnm/chunks/tnms_his06 -s 31457280 -o 0
onspaces -c -d remainder -k 8 -p /opt/dbnm/chunks/remainder -s 31457280 -o 0
二、开始创建分片
1、删除历史告警表索引
drop index index_name
1.1、如果有primary key主键,先删除主键(主键可以用unique索引代替);
select constrname from sysconstraints where constrtype='P' and tabid=(select tabid from systables where tabname='ems_event_history');
alter table yuyue drop constraint u153_31;
----创建主键(这一步不要做)
alter table ems_event_history add constraint primary key (event_id);
2、rename历史告警表
rename table ems_event_history to ems_event_history_old;
3、创建历史告警表分片(暂时不要创建索引)
create table "informix".ems_event_history
  (
    event_id decimal(32,0) not null ,
    severity decimal(16)
        default 0.0000000000000000,
    resource_name varchar(128),
    resource_class varchar(16),
    event_class varchar(16),
    event_type varchar(16),
    event_sub_type varchar(16),
    title varchar(64),
    first_occurrence_time datetime year to second
        default current year to second,
    last_occurrence_time datetime year to second,
    occurrence_times decimal(16),
    summary lvarchar,
    event_key varchar(32),
    is_derivative decimal(16)
        default 0.0000000000000000,
    is_acknowledged decimal(16)
        default 0.0000000000000000,
    ack_user varchar(64),
    ack_time datetime year to second,
    is_cleared decimal(16)
        default 0.0000000000000000,
    clear_time datetime year to second,
    clear_user varchar(64),
    clear_reason varchar(128),
    layer_rate varchar(64),
    vendor varchar(16),
    original_severity decimal(16),
    ems_time datetime year to second,
    ne_time datetime year to second,
    ems_clear_time datetime year to second,
    ne_clear_time datetime year to second,
    finish_time datetime year to second,
    to_eoms decimal(16)
        default 0.0000000000000000,
    eoms_no varchar(32),
    to_eoms_time datetime year to second,
    eoms_send_type decimal(16),
    city varchar(16),
    district varchar(16),
    site varchar(64),
    location varchar(255),
    native_object_name varchar(255),
    ems_alarm_id varchar(64),
    native_probable_cause varchar(64),
    additional_info lvarchar,
    ems_id varchar(64),
    ems_name varchar(64),
    me_id varchar(64),
    me_name varchar(64),
    card_id varchar(64),
    card_name varchar(64),
    ptp_id varchar(64),
    ptp_name varchar(64),
    ctp_id varchar(64),
    circuit_id varchar(64),
    circuit varchar(64),
    psn_id varchar(64),
    remark varchar(255),
    remark_update_time datetime year to second,
    remark_user varchar(64),
    port_rate varchar(16),
    system_level varchar(16),
    management_domain varchar(16),
    transmit_integrative_status varchar(16)
        default '0',
    transmit_integrative_time datetime year to second,
    transmit_huawu_status varchar(16)
        default '0',
    transmit_huawu_time datetime year to second,
    transmit_led_status varchar(16)
        default '0',
    transmit_led_time datetime year to second,
    additional_event_type varchar(32)
        default '普通告警',
    project_name varchar(64),
    device_type varchar(8),
    device_model varchar(32),
    system_alarm_id varchar(32),
    affect_device varchar(32),
    affect_business varchar(32),
    correlate_flag varchar(16),
    alarm_standard_name varchar(32),
    original_event_type varchar(32),
    service_level varchar(32),
    business varchar(16),
    customer varchar(32),
    vendor_alarm_id varchar(16),
    additional_info1 varchar(32),
    additional_info2 varchar(32),
    additional_info3 varchar(32),
    additional_info4 varchar(255),
    additional_time1 datetime year to second,
    additional_number1 decimal(32,0)
  )
  fragment by expression
    ((first_occurrence_time >= datetime(2012-05-20 00:00:00)
              year to second ) AND (first_occurrence_time < datetime(2012-05-20
              03:00:00) year to second ) ) in tnms_his01,
    ((first_occurrence_time >= datetime(2012-05-20 03:00:00)
              year to second ) AND (first_occurrence_time < datetime(2012-05-20
              06:00:00) year to second ) ) in tnms_his02,
    ((first_occurrence_time >= datetime(2012-05-20 06:00:00)
              year to second ) AND (first_occurrence_time < datetime(2012-05-20
              09:00:00) year to second ) ) in tnms_his03,
    ((first_occurrence_time >= datetime(2012-05-20 09:00:00)
              year to second ) AND (first_occurrence_time < datetime(2012-05-20
              12:00:00) year to second ) ) in tnms_his04,
    ((first_occurrence_time >= datetime(2012-05-20 12:00:00)
              year to second ) AND (first_occurrence_time < datetime(2012-05-20
              16:00:00) year to second ) ) in tnms_his05,
    ((first_occurrence_time >= datetime(2012-05-20 16:00:00)
              year to second ) AND (first_occurrence_time < datetime(2012-05-20
              20:00:00) year to second ) ) in tnms_his06,
    remainder in remainder;
   
4、将ems_event_history_old表作为新历史告警表的一个分片ATTACH
 (注:时间最好是能够包括没有分片之前的所有告警内容,如果时间和创建分片表里面的时间重复,数据就会发生迁移,ATTACH将非常慢。)
ALTER FRAGMENT ON TABLE ems_event_history ATTACH ems_event_history_old AS ((first_occurrence_time >= datetime(2012-05-22 20:00:00)year to second) AND (first_occurrence_time < datetime(2012-05-24 00:00:00) year to second));
5、检查分片是否创建
-bash-3.2$ dbschema -d tnmsdb2 -t ems_event_history -ss
  fragment by expression
    ((first_occurrence_time >= datetime(2012-05-20 00:00:00)
              year to second ) AND (first_occurrence_time < datetime(2012-05-20
              03:00:00) year to second ) ) in tnms_his01,
    ((first_occurrence_time >= datetime(2012-05-20 03:00:00)
              year to second ) AND (first_occurrence_time < datetime(2012-05-20
              06:00:00) year to second ) ) in tnms_his02,
    ((first_occurrence_time >= datetime(2012-05-20 06:00:00)
              year to second ) AND (first_occurrence_time < datetime(2012-05-20
              09:00:00) year to second ) ) in tnms_his03,
    ((first_occurrence_time >= datetime(2012-05-20 09:00:00)
              year to second ) AND (first_occurrence_time < datetime(2012-05-20
              12:00:00) year to second ) ) in tnms_his04,
    ((first_occurrence_time >= datetime(2012-05-20 12:00:00)
              year to second ) AND (first_occurrence_time < datetime(2012-05-20
              16:00:00) year to second ) ) in tnms_his05,
    ((first_occurrence_time >= datetime(2012-05-20 16:00:00)
              year to second ) AND (first_occurrence_time < datetime(2012-05-20
              20:00:00) year to second ) ) in tnms_his06,
    ((first_occurrence_time >= datetime(2012-05-22 20:00:00)
              year to second ) AND (first_occurrence_time < datetime(2012-05-24
              00:00:00) year to second ) ) in tnms_db01,
    remainder in remainder
  extent size 16 next size 16 lock mode page;
5、创建索引
 打开PDQ
set pdqpriority 50;
 开始创建索引
create unique index "informix".idx_ems_event_history001 on "informix"
    .ems_event_history (event_id) using btree  in tnms_idx01;
   
create index "informix".idx_ems_event_history111 on "informix"
    .ems_event_history (title,location) using btree  in tnms_idx01;
   
create index "informix".idx_ems_event_history1110 on "informix"
    .ems_event_history (ne_time desc) using btree  in tnms_idx01;
   
create index "informix".idx_ems_event_history1111 on "informix"
    .ems_event_history (ems_time desc) using btree  in tnms_idx01;
   
create index "informix".idx_ems_event_history1112 on "informix"
    .ems_event_history (eoms_no) using btree  in tnms_idx01;
create index "informix".idx_ems_event_history1113 on "informix"
    .ems_event_history (management_domain) using btree  in tnms_idx01;
   
create index "informix".idx_ems_event_history1114 on "informix"
    .ems_event_history (vendor) using btree  in tnms_idx01;
create index "informix".idx_ems_event_history1115 on "informix"
    .ems_event_history (clear_reason) using btree  in tnms_idx01;
   
create index "informix".idx_ems_event_history1116 on "informix"
    .ems_event_history (resource_name) using btree  in tnms_idx01;
   
create index "informix".idx_ems_event_history1117 on "informix"
    .ems_event_history (additional_event_type,last_occurrence_time)
    using btree  in tnms_idx01;
create index "informix".idx_ems_event_history1118 on "informix"
    .ems_event_history (finish_time) using btree  in tnms_idx01;
   
create index "informix".idx_ems_event_history1119 on "informix"
    .ems_event_history (ne_time,port_rate,severity,additional_event_type,
    management_domain) using btree  in tnms_idx01;
create index "informix".idx_ems_event_history112 on "informix"
    .ems_event_history (is_cleared,is_acknowledged) using btree
     in tnms_idx01;
create index "informix".idx_ems_event_history1120 on "informix"
    .ems_event_history (project_name) using btree  in tnms_idx01;
   
create index "informix".idx_ems_event_history113 on "informix"
    .ems_event_history (last_occurrence_time desc) using btree
     in tnms_idx01;
create index "informix".idx_ems_event_history114 on "informix"
    .ems_event_history (first_occurrence_time desc) using btree
     in tnms_idx01;
create index "informix".idx_ems_event_history115 on "informix"
    .ems_event_history (severity) using btree  in tnms_idx01;
   
create index "informix".idx_ems_event_history116 on "informix"
    .ems_event_history (ems_id) using btree  in tnms_idx01;
create index "informix".idx_ems_event_history117 on "informix"
    .ems_event_history (me_id) using btree  in tnms_idx01;
create index "informix".idx_ems_event_history118 on "informix"
    .ems_event_history (card_id) using btree  in tnms_idx01;
create index "informix".idx_ems_event_history119 on "informix"
    .ems_event_history (ptp_id) using btree  in tnms_idx01;
create index "informix".idx_ems_event_history120 on "informix"
    .ems_event_history (event_type,first_occurrence_time,management_domain)
    using btree  in tnms_idx01;
create index "informix".idx_ems_event_history1200 on "informix"
    .ems_event_history (title,first_occurrence_time,management_domain)
    using btree  in tnms_idx01;
create index "informix".idx_ems_event_history1201 on "informix"
    .ems_event_history (severity,first_occurrence_time,management_domain)
    using btree  in tnms_idx01;
create index "informix".idx_ems_event_history1202 on "informix"
    .ems_event_history (is_acknowledged,is_cleared,first_occurrence_time,
    management_domain) using btree  in tnms_idx01;
create index "informix".idx_ems_event_history1203 on "informix"
    .ems_event_history (management_domain,first_occurrence_time,
    severity) using btree  in tnms_idx01;
6、验证分片是否起作用
set explain on;
select * from ems_event_history e where (first_occurrence_time >= '2012-02-20 12:00:00' and first_occurrence_time < '2012-03-25 12:00:00');
-bash-3.2$ cat sqexplain.out
QUERY: (OPTIMIZATION TIMESTAMP: 05-25-2012 14:21:56)
------
select * from ems_event_history e where (first_occurrence_time >= '2012-02-20 12:00:00' and first_occurrence_time < '2012-03-25 12:00:00')
Estimated Cost: 34
Estimated # of Rows Returned: 33
  1) informix.e: SEQUENTIAL SCAN  (Serial, fragments: 6)
        Fragments Scanned: (6) remainder
        Filters: (informix.e.first_occurrence_time < datetime(2012-03-25 12:00:00) year to second AND informix.e.first_occurrence_time >= datetime(2012-02-20 12:00:00) year to second )

Query statistics:
-----------------
  Table map :
  ----------------------------
  Internal name     Table name
  ----------------------------
  t1                e
  type     table  rows_prod  est_rows  rows_scan  time       est_cost
  -------------------------------------------------------------------
  scan     t1     33         33        33         00:00.00   35     
 
 
针对山东历史告警分片维护所遇问题总结
在做山东informix分片维护时,detach一个分片时非常慢,发现表结构中出现了主键(primary key),删除主键后再对表detach时耗时在1秒中;
之后将detach下来的分片策略进行修改从新attach回去,发现非常非常慢,经过多次测试,发现是由于以下2种情况导致:
1、由于新增加的分片时间和remainder分片中的数据时间有重复的,导致数据进行迁移。。。这个过程将是非常漫长的,做分片维护时,尽量避免发生数据迁移;
2、remainder分片空间满了也会导致attach非常慢,这个做过测试的;
解决方法:
将remainder分片先detach掉,然后再对其他分片进行操作,速度非常快,但新的问题又出来了,由于之前分片都满了,
新到的数据都储存在了remainder分片中,而且数据量非常大如果进行导出导入的话就相当费时;
解决方法如下:
remainder分片detach下来,数据被存储到临时表remainder_1w中,我们主要是想要remainder分片中的数据,
创建一个与ems_event_history表结构完全相同的表ems_event_history_new(不用创建索引),然后将临时表remainder_1w中的数据insert到
ems_event_history_new表中,然后再将ems_event_history_new表挂载到ems_event_history下面的一个分片上,最后从新创建remainder分片分片;
具体步骤:
1、detach remainder分片
alter fragment on table ems_event_history detach partition remainder remainder_1w;
2、创建yuyue表,要和ems_event_history表结构相同
create table ems_event_history_new
  (
    event_id decimal(32,0) not null ,
    severity decimal(16)
        default 0.0000000000000000,
    resource_name varchar(128),
    resource_class varchar(16),
    event_class varchar(16),
    event_type varchar(16),
    event_sub_type varchar(16),
    title varchar(64),
    first_occurrence_time datetime year to second
        default current year to second,
    last_occurrence_time datetime year to second,
    occurrence_times decimal(16),
    summary lvarchar,
    event_key varchar(32),
    is_derivative decimal(16)
        default 0.0000000000000000,
    is_acknowledged decimal(16)
        default 0.0000000000000000,
    ack_user varchar(64),
    ack_time datetime year to second,
    is_cleared decimal(16)
        default 0.0000000000000000,
    clear_time datetime year to second,
    clear_user varchar(64),
    clear_reason varchar(128),
    layer_rate varchar(64),
    vendor varchar(16),
    original_severity decimal(16),
    ems_time datetime year to second,
    ne_time datetime year to second,
    ems_clear_time datetime year to second,
    ne_clear_time datetime year to second,
    finish_time datetime year to second,
    to_eoms decimal(16)
        default 0.0000000000000000,
    eoms_no varchar(32),
    to_eoms_time datetime year to second,
    eoms_send_type decimal(16),
    city varchar(16),
    district varchar(16),
    site varchar(64),
    location varchar(255),
    native_object_name varchar(255),
    ems_alarm_id varchar(64),
    native_probable_cause varchar(64),
    additional_info lvarchar,
    ems_id varchar(64),
    ems_name varchar(64),
    me_id varchar(64),
    me_name varchar(64),
    card_id varchar(64),
    card_name varchar(64),
    ptp_id varchar(64),
    ptp_name varchar(64),
    ctp_id varchar(64),
    circuit_id varchar(64),
    circuit varchar(64),
    psn_id varchar(64),
    remark varchar(255),
    remark_update_time datetime year to second,
    remark_user varchar(64),
    port_rate varchar(16),
    system_level varchar(16),
    management_domain varchar(16),
    transmit_integrative_status varchar(16)
        default '0',
    transmit_integrative_time datetime year to second,
    transmit_huawu_status varchar(16)
        default '0',
    transmit_huawu_time datetime year to second,
    transmit_led_status varchar(16)
        default '0',
    transmit_led_time datetime year to second,
    additional_event_type varchar(32)
        default '普通告警',
    project_name varchar(64),
    device_type varchar(8),
    device_model varchar(32),
    system_alarm_id varchar(32),
    affect_device varchar(32),
    affect_business varchar(32),
    correlate_flag varchar(16),
    alarm_standard_name varchar(32),
    original_event_type varchar(32),
    service_level varchar(32),
    business varchar(16),
    customer varchar(32),
    vendor_alarm_id varchar(16),
    additional_info1 varchar(32),
    additional_info2 varchar(32),
    additional_info3 varchar(32),
    additional_info4 varchar(255),
    additional_time1 datetime year to second,
    additional_number1 decimal(32,0),
  )
3、将临时remainder_1w中的数据insert到ems_event_history_new表中(临时表是无法作为分片进行挂载)
insert into yuyue select * from remainder_1w;
 
4、给ems_event_history表创建remainder分片(先创建remainder是为防止ems_event_history_new表中的数据不符合策略时间)
alter fragment on table ems_event_history add remainder in remainder;
5、如果有primary key主键,先删除主键(主键可以用unique索引代替);
select constrname from sysconstraints where constrtype='P' and tabid=(select tabid from systables where tabname='yuyue');
alter table yuyue drop constraint u153_31;
6、将ems_event_history_new表挂载到分片表ems_event_history中
ALTER FRAGMENT ON TABLE ems_event_history ATTACH ems_event_history_new AS ((first_occurrence_time >= datetime(2012-07-28 20:00:00)year to second) AND (first_occurrence_time < datetime(2012-07-29 00:00:00) year to second));
7、创建索引
阅读(3442) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~