`

MYSQL-- 每半月一个分区,自动维护

 
阅读更多
建表语句

drop table if exists terminal_parameter;
CREATE TABLE `terminal_parameter` (
  `terminal_parameter_id` int(11) NOT NULL AUTO_INCREMENT,
  `serial` int(11) DEFAULT NULL,
  `network_type` char(1) DEFAULT NULL,
  `mcc` int(8) DEFAULT NULL,
  `mnc` int(8) DEFAULT NULL,
  `lac` int(8) DEFAULT NULL,
  `cellid` int(8) DEFAULT NULL,
  `bsic_psc` int(8) DEFAULT NULL,
  `ta_ec_io` int(8) DEFAULT NULL,
  `bcch_rxlev_rscp` int(8) DEFAULT NULL,
  `arfcn_uarfcn` int(8) DEFAULT NULL,
  `rxq` int(8) DEFAULT NULL,
  `c1` int(8) DEFAULT NULL,
  `c2` int(8) DEFAULT NULL,
  `signal_intensity` int(8) DEFAULT NULL,
  `error_rate` int(8) DEFAULT NULL,
  `alarm_type` varchar(16) DEFAULT NULL,
  `txpower` int(8) DEFAULT NULL,
  `small_running_number` int(8) DEFAULT NULL,
  `createtime` datetime NOT NULL,
  `userid` int(8) NOT NULL,
  `terminal_id` int(8) DEFAULT NULL,
  `state` char(1) DEFAULT '0',
  `order_definition_id` int(8) DEFAULT NULL,
  `order_code` varchar(20) DEFAULT NULL,
  `charg_voltage` float(8,2) DEFAULT NULL,
  `battery_voltage` float(8,2) DEFAULT NULL,
  `temprad` float(8,2) DEFAULT NULL,
  `run_state` int(8) DEFAULT NULL,
  `switching_value1` int(8) DEFAULT NULL,
  `switching_value2` int(8) DEFAULT NULL,
  `bcch_freq` int(8) DEFAULT NULL,
  `rxlev` int(8) DEFAULT NULL,
  `rxlev_full` int(8) DEFAULT NULL,
  `rxlev_sub` int(8) DEFAULT NULL,
  `rxqual` int(8) DEFAULT NULL,
  `rxqual_full` int(8) DEFAULT NULL,
  `rxqual_sub` int(8) DEFAULT NULL,
  `idle_ts` int(8) DEFAULT NULL,
  `timing_advance` int(8) DEFAULT NULL,
  `tch_efr_out` int(8) DEFAULT NULL,
  `tch_efr_in` int(8) DEFAULT NULL,
  `dtx` int(8) DEFAULT NULL,
  `major_cycle_frequency` int(8) DEFAULT NULL,
  PRIMARY KEY (`terminal_parameter_id`,`createtime`),
  KEY `idx_createtime` (`createtime`),
  KEY `idx_terminal_id` (`terminal_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY RANGE(TO_DAYS (createtime))
(
PARTITION p20101115 VALUES LESS THAN (TO_DAYS('2010-11-15')),
PARTITION p20101130 VALUES LESS THAN (TO_DAYS('2010-11-30')),
PARTITION p20101215 VALUES LESS THAN (TO_DAYS('2010-12-15')),
PARTITION p20101231 VALUES LESS THAN (TO_DAYS('2010-12-31')),
PARTITION p20110115 VALUES LESS THAN (TO_DAYS('2011-01-15')),
PARTITION p20110131 VALUES LESS THAN (TO_DAYS('2011-01-31')),
PARTITION p20110215 VALUES LESS THAN (TO_DAYS('2011-02-15')),
PARTITION p20110228 VALUES LESS THAN (TO_DAYS('2011-02-28')),
PARTITION p20110315 VALUES LESS THAN (TO_DAYS('2011-03-15')),
PARTITION p20110331 VALUES LESS THAN (TO_DAYS('2011-03-31')),
PARTITION p20110415 VALUES LESS THAN (TO_DAYS('2011-04-15')),
PARTITION p20110430 VALUES LESS THAN (TO_DAYS('2011-04-30'))
);


存储过程代码:

* 每隔15天执行一次
/* 程序功能:循环使用分区,每半个月一个分区,保留6个月的数据
时间:2010-11-09 */
drop procedure if exists Set_Partition;
create procedure Set_Partition()
begin
/* 事务回滚,其实放这里没什么作用,ALTER TABLE是隐式提交,回滚不了的。*/
    declare exit handler for sqlexception rollback;
    start TRANSACTION;

/* 到系统表查出这个表的最大分区,得到最大分区的日期。在创建分区的时候,名称就以日期格式存放,方便后面维护 */
    select REPLACE(partition_name,'p','') into @P12_Name from INFORMATION_SCHEMA.PARTITIONS where TABLE_SCHEMA='mydb_1' and table_name='terminal_parameter' order by partition_ordinal_position DESC limit 1;

/* 判断最大分区的时间段,如果是前半个月的,那么根据情况需要加13,14,15,16天
   如果是后半个月的,那么直接加15天。 +0 是为了把日期都格式化成YYYYMMDD这样的格式*/
    IF (DAY(@P12_Name)<=15) THEN
       CASE day(LAST_DAY(@P12_name))
          WHEN 31 THEN set @Max_date= date(DATE_ADD(@P12_Name+0,INTERVAL 16 DAY))+0 ;
          WHEN 30 THEN set @Max_date= date(DATE_ADD(@P12_Name+0,INTERVAL 15 DAY))+0 ;
          WHEN 29 THEN set @Max_date= date(DATE_ADD(@P12_Name+0,INTERVAL 14 DAY))+0 ;
          WHEN 28 THEN set @Max_date= date(DATE_ADD(@P12_Name+0,INTERVAL 13 DAY))+0 ;
       END CASE;
    ELSE
       set @Max_date= date(DATE_ADD(@P12_Name+0, INTERVAL 15 DAY))+0;
    END IF;

/* 修改表,在最大分区的后面增加一个分区,时间范围加半个月 */
    SET @s1=concat('ALTER TABLE terminal_parameter ADD PARTITION (PARTITION p',@Max_date,' VALUES LESS THAN (TO_DAYS (''',date(@Max_date),''')))');
    PREPARE stmt2 FROM @s1;
    EXECUTE stmt2;
    DEALLOCATE PREPARE stmt2;

/* 取出最小的分区的名称,并删除掉 。
    注意:删除分区会同时删除分区内的数据,慎重 */
    select partition_name into @P0_Name from INFORMATION_SCHEMA.PARTITIONS where TABLE_SCHEMA='mydb_1' and table_name='terminal_parameter' order by partition_ordinal_position limit 1;
    SET @s=concat('ALTER TABLE terminal_parameter DROP PARTITION ',@P0_Name);
    PREPARE stmt1 FROM @s;
    EXECUTE stmt1;
    DEALLOCATE PREPARE stmt1;

/* 提交 */
    COMMIT ;
end;



计划任务代码:

CREATE EVENT e_Set_Partition
          ON SCHEDULE
          EVERY 15 day STARTS '2011-04-30 23:59:59'
          DO
          call Set_Partition();



建表语句:
drop table if exists ods_sys_visit_log;
CREATE TABLE `ods_sys_visit_log` (
  `accesstime` timestamp,
  `etltime` datetime DEFAULT NULL,
  KEY `idx_ods_sys_visit_log_lookup` (`accesstime`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
PARTITION BY RANGE(UNIX_TIMESTAMP(accesstime))
(
PARTITION p20140501 VALUES LESS THAN (UNIX_TIMESTAMP('2014-05-02')),
PARTITION p20140502 VALUES LESS THAN (UNIX_TIMESTAMP('2014-05-03'))
);
自己的业务需要写了个存储过程,这里记录下:

DROP PROCEDURE IF EXISTS set_table_partition;

delimiter $$

CREATE DEFINER=`push_user`@`%` PROCEDURE `set_table_partition`(tableSchema VARCHAR(100), tableName VARCHAR(100))
BEGIN
/* 事务回滚,其实放这里没什么作用,ALTER TABLE是隐式提交,回滚不了的。*/
    DECLARE i INT;
    DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
    START TRANSACTION;

/* 到系统表查出这个表的最大分区,得到最大分区的日期。在创建分区的时候,名称就以日期格式存放,方便后面维护 */
SELECT
REPLACE(partition_name, 'p', '')
INTO @P12_NAME FROM
INFORMATION_SCHEMA.PARTITIONS
WHERE
TABLE_SCHEMA = tableSchema
AND table_name = tableName
ORDER BY partition_ordinal_position DESC
LIMIT 1;

    SET i=DATE_FORMAT(NOW(), '%Y%m%d');
    WHILE i>@P12_NAME DO
SET @MAX_DATE= DATE(DATE_ADD(@P12_NAME+0, INTERVAL 1 DAY))+0;

/* 修改表,在最大分区的后面增加一个分区,时间为一天 */
SET @TEMP=CONCAT('ALTER TABLE ',tableName,' ADD PARTITION (PARTITION p',@MAX_DATE,' VALUES LESS THAN (UNIX_TIMESTAMP (''',DATE(@MAX_DATE+1),''')))');
PREPARE stmt FROM @TEMP;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SELECT
REPLACE(partition_name, 'p', '')
INTO @P12_NAME FROM
INFORMATION_SCHEMA.PARTITIONS
WHERE
TABLE_SCHEMA = tableSchema
AND table_name = tableName
ORDER BY partition_ordinal_position DESC
LIMIT 1;

END WHILE;


/* 提交 */
    COMMIT ;
END$$
分享到:
评论

相关推荐

    mysql-connector-java-5.1.40.zip和mysql-connector-java-5.1.10.jar

    `mysql-connector-java-5.1.10.jar` 是一个JAR(Java Archive)文件,是MySQL Connector/J的一个特定版本,即5.1.10。JAR文件是Java平台特有的归档格式,用于封装类文件、资源文件等,便于在Java环境中运行和分发。...

    mysql-shell:mysql-shell-8.4.0-windows-x86-64bit.zip

    MySQL Shell 是一个强大的交互式工具,用于管理MySQL和MariaDB数据库系统。它是MySQL开发团队推出的一个多模式JavaScript接口,支持SQL、JavaScript和Python语言,旨在提供一个统一的平台来执行数据库管理和开发任务...

    Go-mysql-schema-sync是一款使用Go开发跨平台的MySQL表结构自动同步工具

    6. **易于集成**:Go-mysql-schema-sync可以方便地与持续集成/持续部署(CI/CD)流程集成,实现数据库结构版本控制,确保每一次代码部署时数据库结构都能及时更新。 在实际使用中,通过解压名为`mysql-schema-sync-...

    mysql-connector-java-8.0.22.jar

    包含mysql-connector-java-8.0.22.jar包含mysql-connector-java-8.0.22.jar包含mysql-connector-java-8.0.22.jar包含mysql-connector-java-8.0.22.jar包含mysql-connector-java-8.0.22.jar包含mysql-connector-java-...

    mysql-server-mysql-8.3.0.tar.gz

    `mysql-server-mysql-8.3.0.tar.gz` 文件是一个包含MySQL服务器的源代码压缩包,版本为8.3.0。这个版本可能包含了最新的特性和性能优化,使得数据库的运行更高效,功能更强大。 MySQL 8.x系列是一个重要的里程碑,...

    mha4mysql-manager-0.57-0.el7.noarch.rpm和mha4mysql-node-0.57-0.el7.noarch.rpm

    `mha4mysql-manager` 是MHA的主控节点,负责监控MySQL集群的状态,当检测到主服务器故障时,它会自动将一个从服务器提升为主服务器,以确保服务的连续性和数据的一致性。该组件执行故障切换策略,并协调节点之间的...

    mysql-server-mysql-5.7.36.tar.gz

    `mysql-server-mysql-5.7.36.tar.gz` 是MySQL服务器的一个特定版本,版本号为5.7.36,它以tar.gz格式打包,这是一种在Linux和Unix-like操作系统中常见的归档和压缩方法。 MySQL 5.7版本是MySQL发展中的一个重要里程...

    mysql-5.5.27-win32

    本文将详述“mysql-5.5.27-win32”版本,这是专为Windows操作系统设计的一个版本,适用于那些在Windows环境下运行MySQL服务器的用户。 **MySQL 5.5.27 版本详解** MySQL 5.5系列是MySQL的一个重大更新,引入了许多...

    mysql-front 6.1

    总的来说,MySQL-Front 6.1是一个强大的MySQL客户端,它通过图形化界面降低了数据库管理的复杂性,适合数据库管理员、开发者以及对MySQL有一定基础的用户使用。通过熟悉并掌握这些功能,用户可以更加高效地管理和...

    mysql-connector-java-5.1.49.jar

    "mysql-connector-java-5.1.49.jar"是这个驱动程序的一个特定版本,版本号为5.1.49,它是MySQL官方提供的开源组件,适用于Java开发环境。 在Java应用中,如JIRA(一个流行的项目管理和问题跟踪工具),MySQL ...

    MySQL-client-5.6.29-1.linux_glibc2.5.x86_64,MySQL-server-5.6.29-1.linux_glibc

    Hive通常会将元数据(例如表结构和分区信息)存储在关系数据库中,MySQL是一个常见的选择。集成MySQL可以提供高可用性和可扩展性,确保Hive的数据管理层面上的稳定性。 `Linux下的Mysql安装.doc`可能提供了在Linux...

    mysql连接包mysql-connector-java-5.1.27.jar

    `mysql-connector-java-5.1.27.jar`是这个驱动的一个特定版本,它允许Java开发者在他们的应用中无缝地访问和操作MySQL数据库。 MySQL连接器(JDBC驱动)是Java Database Connectivity (JDBC)的一部分,JDBC是Java ...

    mysql-installer-community-8.0.28.0 MySql数据库安装包

    这个“mysql-installer-community-8.0.28.0”压缩包包含的是MySQL数据库的安装程序,专为用户提供了一个方便的方式来安装和配置MySQL服务器。 **MySQL 8.0的主要特性:** 1. **性能提升**:MySQL 8.0通过优化查询...

    mysql-connector-j-8.0.33.zip

    "mysql-connector-j-8.0.33.zip" 是MySQL Connector/J的一个特定版本,版本号为8.0.33。这个压缩包包含了驱动的所有必要文件,使得开发者能够在Java环境中建立与MySQL 8.x数据库的连接。解压后的主要文件通常包括...

    MySQL-connector-java-8.0.28

    MySQL-connector-java-8.0.28 是MySQL数据库与Java应用程序之间通信的重要组件,它是一个JDBC(Java Database Connectivity)驱动程序,使得Java开发者能够通过编写Java代码来访问和操作MySQL数据库。在这个版本中,...

    mysql-connector-odbc-3.51.26-win32支持MYSQL5.0以上版本

    在描述中提到的“mysql-connector-odbc-3.51.26-win32”是针对Windows平台的一个特定版本,它特别之处在于对MySQL 5.0及以上版本的支持。这意味着即使您的MySQL服务器升级到5.0或更高版本,此驱动仍然能够正常工作,...

    mysql-connector-java-8.0.13.jar mysql数据库驱动下载

    当你下载并解压此压缩包后,你会得到一个名为`mysql-connector-java-8.0.13.jar`的文件,这就是我们需要引入到Java项目的库文件。 要使用这个驱动包,首先需要将其添加到Java项目的类路径中。这可以通过以下几种...

    mysql-connector-java-5.1.7 jar包

    MySQL是世界上最流行的开源关系型数据库管理系统之一,而`mysql-connector-java-5.1.7.jar`是MySQL官方为了使得Java应用程序能够连接到MySQL数据库而提供的JDBC(Java Database Connectivity)驱动程序。JDBC是Java...

    mysql-connector-java-5.1.7-bin.jar

    "mysql-connector-java-5.1.7-bin.jar" 文件就是这个桥梁,它是一个Java归档(JAR)文件,包含了MySQL JDBC驱动的所有必要组件。 MySQL JDBC驱动,也被称为MySQL Connector/J,允许Java应用程序通过遵循JDBC API来...

    mysql-cluster-8.0.20-winx64.zip

    在“mysql-cluster-8.0.20-winx64.zip”这个压缩包中,我们找到了MySQL Cluster的Windows 64位版本。下面将详细解释MySQL Cluster的相关知识点。 1. **MySQL Cluster架构**:MySQL Cluster由三个主要组件构成:SQL...

Global site tag (gtag.js) - Google Analytics