| 
                         分区表的另一个好处是对于应用程序来说不用修改代码,通过对后端数据库进行设置,以表的时间字段做分区字段,就可以轻松实现表的拆分,需要注意的是查询字段必须是分区键,否则会遍历所有的分区表,下面看一下具体的实施过程: 
Step  1:首先,创建分区表。在这里我们就以perf_biz_vm表为例,创建相同表结构的新表,并把它命名为perf_biz_vm_new,利用create_time索引字段做分区字段,按天做分区并与主键一起创建联合索引,创建语句: 
代码如下: 
- CREATE TABLE `perf_biz_vm_new` ( 
 -  
 - `CREATE_TIME` datetime NOT COMMENT '性能采集时间', 
 -  
 - `VM_ID` varchar(80) NOT COMMENT '虚拟机ID', 
 -  
 - `PROCESSOR_USED` varchar(100) DEFAULT COMMENT 'CPU利用率(%)', 
 -  
 - `MEM_USED` varchar(100) DEFAULT COMMENT '内存的使用率(%)', 
 -  
 - `MEM_UTILITY` varchar(100) DEFAULT COMMENT '可用内存量(bytes)', 
 -  
 - `BYTES_IN` varchar(100) DEFAULT COMMENT '流入流量速率(Mbps)', 
 -  
 - `BYTES_OUT` varchar(100) DEFAULT COMMENT '流出流量速率(Mbps)', 
 -  
 - `PROC_RUN` varchar(100) DEFAULT COMMENT 'CPU运行队列中进程个数', 
 -  
 - `WRITE_IO` varchar(100) DEFAULT COMMENT '虚拟磁盘写入速率(Mb/s)', 
 -  
 - `READ_IO` varchar(100) DEFAULT COMMENT '虚拟磁盘读取速率(Mb/s)', 
 -  
 - `PID` varchar(36) NOT , 
 -  
 - PRIMARY KEY (`PID`,`CREATE_TIME`), 
 -  
 - KEY `mytable_categoryid` (`CREATE_TIME`) USING BTREE, 
 -  
 - KEY `perf_biz_vm_vm_id_create_time` (`VM_ID`,`CREATE_TIME`) 
 -  
 - ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='虚拟机性能采集表' 
 -  
 - /*!50500 PARTITION BY RANGE COLUMNS(CREATE_TIME) 
 -  
 - (PARTITION p20180225 VALUES LESS THAN ('20180226') ENGINE = InnoDB, 
 -  
 - PARTITION p20180226 VALUES LESS THAN ('20180227') ENGINE = InnoDB, 
 -  
 - PARTITION p20180227 VALUES LESS THAN ('20180228') ENGINE = InnoDB, 
 -  
 - PARTITION p20180228 VALUES LESS THAN ('20180229') ENGINE = InnoDB, 
 -  
 - PARTITION p20180229 VALUES LESS THAN ('20180230') ENGINE = InnoDB) */ 
 
  
Step  2:用新的分区表替换原有旧表。这里需要注意的是,执行rename操作会对perf_biz_vm表的元数据进行修改,需提前检查有无对此表的Delete、Update、Insert事务与DDL操作,否则冲突会产生元数据锁(Metadata  Lock)。 
我们的做法是提前将业务侧的定时器停掉,并在业务低谷时执行如下语句,将旧表和新表通过rename的方式互换,让新表纳入使用。期间若有业务调用,则会短暂断开业务。 
- rename table perf_biz_vm to perf_biz_vm_old; 
 - rename table perf_biz_vm_new to perf_biz_vm; 
 
  
Step  3:查看到新表有数据写入,云监控页面数据显示正常,说明业务恢复。云主机监控数据的保存周期是两天,因此需要将旧表两天前的数据拷贝到新表,该步骤通过脚本来完成,可参考以下脚本: 
代码如下: 
- #!/bin/bash  
 - function insert{  
 - end_time="$1 $2"  
 - start_time="$3 $4"  
 - mysql -u'user' -p'passwd' << !  
 - use monitor_alarm_openstack;  
 - set innodb_flush_log_at_trx_commit=0;  
 - start transaction;  
 - insert into perf_biz_vm select * from perf_biz_vm_old where create_time < '$end_time' and create_time > '$start_time';  
 - commit;  
 - select TABLE_ROWS from information_schema.tables where TABLE_SCHEMA ="monitor_alarm" and TABLE_NAME="perf_biz_vm";  
 - !  
 - }  
 - base_time="2018-02-27 2:00:00"  
 - while true  
 - do  
 - #end_time=$(date -d "-1hour $base_time" +%Y-%m-%d" "%H:%M:%S)  
 - end_time=$base_time  
 - start_time=$(date -d "-1hour $end_time" +%Y-%m-%d" "%H:%M:%S)  
 - #base_time=$end_time  
 - base_time=$start_time  
 - echo "Cur_time: $(date +%Y%m%d" "%H%M%S)" | tee -a 1.log  
 - echo "Range: $end_time $start_time" | tee -a 1.log  
 - insert ${end_time} ${start_time} | tee -a 1.log  
 - sleep 2  
 - done 
 
  
Step 4:编写存储过程用于定期创建新的分区,并删除几天前旧的分区:                         (编辑:滁州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |