MYSQL 分区自动管理

一、 MYSQL的分区表简介

1. 什么是表分区?

是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分。从逻辑上看,只有一张表,但是底层却是由多个物理分区组成。

例如:
CREATE TABLE `rangeyear_t1_kafka_consume_log` (
`id` int(11) NOT NULL COMMENT 'id',
`create_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '消息接收时间',
PRIMARY KEY (`id`,`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY RANGE (YEAR(create_time))
(PARTITION p2012 VALUES LESS THAN (2012) ENGINE = InnoDB,
PARTITION p2013 VALUES LESS THAN (2013) ENGINE = InnoDB,
PARTITION p2014 VALUES LESS THAN (2014) ENGINE = InnoDB);

cnsz22pl0015:cmdpsit > ll|grep rangeyear_t1_kafka_consume_log
-rw-rw---- 1 mysql mysql   8889 Jun 18 13:55 rangeyear_t1_kafka_consume_log.frm
-rw-rw---- 1 mysql mysql    128 Jun 18 13:55 rangeyear_t1_kafka_consume_log.par
-rw-rw---- 1 mysql mysql  98304 Jun 18 11:27 rangeyear_t1_kafka_consume_log#P#p2012.ibd
-rw-rw---- 1 mysql mysql  98304 Jun 18 11:27 rangeyear_t1_kafka_consume_log#P#p2013.ibd
-rw-rw---- 1 mysql mysql  98304 Jun 18 11:27 rangeyear_t1_kafka_consume_log#P#p2014.ibd

2. 表分区有什么好处?

 1)分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备。 
 2)和单个磁盘或者文件系统相比,可以存储更多数据 
 3) 优化查询。在where语句中包含分区条件时,可以只扫描一个或多个分区表来提高查询效率;涉及sum和count语句时,也可以在多个分区上并行处理,最后汇总结果,类似oracle库中的分区修剪技术。
 4)分区表更容易维护。例如:想批量删除大量数据可以truncate或者drop整个分区。
 5)可以使用分区表来避免某些特殊的瓶颈,例如InnoDB的单个索引的互斥访问。
例如:
CREATE TABLE users (
uid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30) NOT NULL DEFAULT ,
email VARCHAR(30) NOT NULL DEFAULT 
)
PARTITION BY RANGE (uid) (
PARTITION p0 VALUES LESS THAN (3000000)
DATA DIRECTORY = '/data0/data'
INDEX DIRECTORY = '/data1/idx',

PARTITION p1 VALUES LESS THAN (6000000)
DATA DIRECTORY = '/data2/data'
INDEX DIRECTORY = '/data3/idx',

PARTITION p2 VALUES LESS THAN MAXVALUE
DATA DIRECTORY = '/data6/data'
INDEX DIRECTORY = '/data7/idx'
);

3. 分区表的限制因素

 1)一个表最多只能有1024个分区 
 2)MySQL5.1中,分区表达式必须是整数,或者返回整数的表达式。在MySQL5.5中提供了非整数表达式分区的支持。MYSQL5.5之后支持整数、日期时间、字符串。 
 3)如果分区表有唯一索引(主键),所有分区表达式中的列必须包含在唯一索引(主键)中
 4)分区表中无法使用外键约束 
 5)MySQL的分区适用于一个表的所有数据和索引,不能只对表数据分区而不对索引分区,也不能只对索引分区而不对表分区,也不能只对表的一部分数据分区;即只有局部索引,没有全局索引。

4. 分区表的分类

1)range分区, 按照数据的区间范围分区(连续递增)
partition by range(exp)( //exp可以为列名或者表达式,比如to_date(created_date)
partition p0 values less than(num)
)
# range范围覆盖问题:当插入的记录中对应的分区键的值不在分区定义的范围中的时候,插入失败
#分区键的值如果是NULL,将被作为一个最小值来处理
2)LIST分区:按照List中的值分区(枚举)
partition by list(exp)( //exp为列名或者表达式
partition p0 values in (3,5)  //值为3和5的在p0分区
)
#不适合分区经常变动的需求
3)HASH分区 :主要用来分散热点读,使用取模算法
partition by hash(store_id) partitions 4;
#数据尽可能的均匀分布。 缺点:不适合分区经常变动的需求
#mysql提供了线性hash分区,与普通hash分区相比起对分区变更处理更迅速,但数据分布不大均衡
partition by LINER hash(store_id) partitions 4;
4)Key分区,类似Hash分区,Hash分区允许使用用户自定义的表达式,但Key分区不允许使用用户自定义的表达式。Hash仅支持整数分区,而Key分区支持除了Blob和text的其他类型的列作为分区键。
partition by key(exp) partitions 4;//exp是零个或多个字段名的列表
5) Composite(复合模式)
6) Columns分区,MySQL5.5中引入的分区类型,解决了5.5版本之前range分区和list分区只支持整数分区的问题。 Columns分区可以细分为 range columns分区和 list columns分区,他们都支持整数,日期时间,字符串三大数据类型。(不支持text和blob类型作为分区键) columns分区还支持多列分区。
PARTITION BY RANGE  COLUMNS(create_time)
(PARTITION p2015 VALUES LESS THAN ('2015-01-01') ENGINE = InnoDB,
 PARTITION p20180211 VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB) 

二、 MYSQL分区管理procedure的架构

1. 分区管理的架构逻辑

根据对总部所有mysql库中的分区表的汇总和分析,主要的分区类型为range、range columns、hash;其中range分区占到62%,range columns分区占到23%;而这两种分区类型中99%的分区键是按照时间字段作为分区的依据。所以针对SF分区表的使用情况,编写了一套统一的分区管理工具。
由上一节分区表的基础知识介绍可得知range和range columns的区别,首先,两种分区的关键字不同;其次range分区的依据可以是一个表达式range(exp),并且该表达式的值必须是一个整数,而range columns的分区依据不支持表达式,但可以是多个列RANGE  COLUMNS(create_time),其中列的类型也不限于整数,可支持时间,字符串。
根据以上信息,mysql分区管理工具的架构逻辑如下图所示
 
上图中红色小字标识得为存储过程的名字,首先,整个管理工具是由proc_main_partition发起调用,其次,proc_main_partition会读取配置表main_partition_table_config中的表名、策略等信息,最后,根据配置信息调用指定的子存储过程执行添加和删除分区的操作。

2. 各存储过程的功能介绍

 proc_main_partition_config
 #该存储过程的执行权限会授权给用户,供用户把业务表加入的分区管理策略当中,实现自动维护
 proc_main_partition
 #该procedure会根据配置表中的信息调用下面一系列的存储过程
 proc_main_partition_range_nofunc
 #如为range类型的分区,且其分区键为递增的数字时,该procedure完成其增删分区的具体行为
 #如:PARTITION BY RANGE (store_id)
 proc_main_partition_range_day
 #如为range类型的分区,且其分区策略为按天分区,或者按周分区,该procedure完成其增删分区的具体行为
 proc_main_partition_range_period
 #对于有些数据需要按照上旬、中旬、下旬的策略进行分区,比如6月,6.1-6.11之前为一个分区,6.11-6.21为一个分区,,6.21-7.01为一个分区
 #如为range类型的分区,且其分区策略为按上旬、中旬、下旬分区,该procedure完成其增删分区的具体行为
 proc_main_partition_range_month
 #如为range类型的分区,且其分区策略为按月分区,该procedure完成其增删分区的具体行为
 proc_main_partition_range_year
 #如为range类型的分区,且其分区策略为按年分区,该procedure完成其增删分区的具体行为
 proc_main_part_rangecolumn_day
 #如为range columns类型的分区,且其分区策略为按天分区,或者按周分区,该procedure完成其增删分区的具体行为
 proc_main_part_rangecolumn_period
 #对于有些数据需要按照上旬、中旬、下旬的策略进行分区,比如6月,6.1-6.11之前为一个分区,6.11-6.21为一个分区,,6.21-7.01为一个分区
 #如为range columns类型的分区,且其分区策略为按上旬、中旬、下旬分区,该procedure完成其增删分区的具体行为
 proc_main_part_range
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
mysql管理之道:性能调优、高可用与监控》由资深mysql专家撰写,以最新的mysql版本为基础,以构建高性能mysql服务器为核心,从故障诊断、表设计、sql优化、性能参数调优、mydumper逻辑、xtrabackup热备份与恢复、mysql高可用集群搭建与管理mysql服务器性能和服务监控等方面多角度深入讲解了如何去管理与维护mysql服务器。 书中内容以实战为导向,所有内容均来自于笔者多年实践经验的总结和对新知识的拓展,同时也针对运维人员、dba等相关工作者会遇到的有代表性的疑难问题给出了实用的情景模拟,并给出了解决方案。不论你目前有没有遇到过此类问题,相信对你以后处理相关问题都会有所借鉴。本书适合所有希望构建和管理高性能、高可用性的mysql数据库系统的开发者和dba阅读。 目录 · · · · · · 前言 第一部分 mysql5.5 新特性篇 第1章 mysql5.5介绍 2 1.1 性能上的显著改变 2 1.1.1 mysql5.5默认存储引擎的调整 2 1.1.2 充分利用cpu多核的处理能力 7 1.1.3 提高刷新脏页数量和合并插入数量,改善磁盘i/o处理能力 8 1.1.4 增加自适应刷新脏页功能 9 1.1.5 让innodb_buffer_pool缓冲池中的热数据存活更久 9 1.1.6 innodb的数据恢复时间加快 11 1.1.7 innodb同时支持多个bufferpool实例 15 1.1.8 可关闭自适应哈希索引 17 1.1.9 在innodb中可选择使用内存分配程序 18 1.1.10 提高默认innodb线程并发数 21 1.1.11 预读算法的变化 22 1.1.12 首次在linux上实现了异步i/o 23 1.1.13 恢复组提交 24 1.1.14 innodb使用多个回滚段提升性能 26 1.1.15 改善清除程序进度 26 .1.1.16 添加删除缓冲和清除缓冲 27 1.1.17 控制自旋锁spin lock轮训间隔 28 1.1.18 快速创建、删除、更改索引 29 1.1.19 innodb支持创建压缩数据页 30 1.1.20 可动态关闭innodb更新元数据的统计功能 37 1.2 安全性、稳定性的显著改变 38 1.2.1 复制功能加强 38 1.2.2 中继日志relay-log可自我修复 39 1.2.3 开启innodb严格检查模式 39 1.3 动态更改系统配置参数 39 1.3.1 支持动态更改独立表空间 39 1.3.2 支持动态更改innodb锁超时时间 40 1.4 innodb新参数汇总 40 1.5 同步复制新参数汇总 48 1.6 sql语句写法的改变 53 1.6.1 delete表连接语法改变 53 1.6.2 mysql5.5存储过程支持limit变量 54 1.7 mysql5.1升级为mysql5.5 55 1.7.1 采用mysql_upgrade升级授权表方式升级 55 1.7.2 直接安装mysql5.5,采用数据导出/导入方式升级 59 1.8 性能测试:mysql5.5与mysql5.1 60 第2章 半同步复制 62 2.1 半同步复制简介 62 2.2 半同步复制安装配置 63 2.3 参数说明 63 2.4 功能测试 64 2.4.1 如何验证半同步复制是否正常工作 64 2.4.2 半同步复制与异步复制的切换 65 2.5 性能测试 68 2.6 小结 70 第二部分 故障诊断与性能优化篇 第3章 故障诊断 72 3.1 影响mysql性能的因素 72 3.2 系统性能评估标准 73 3.2.1 影响linux服务器性能的因素 73 3.2.2 系统性能评估指标 74 3.2.3 开源监控和评估工具介绍 76 3.3 故障与处理 79 3.3.1 连接数过多导致程序连接报错的原因 79 3.3.2 记录子查询引起的宕机 84 3.3.3 诊断事务量突高的原因 87 3.3.4 谨慎设置binlog_format=mixed 90 3.3.5 未设置swap分区导致内存耗尽,主机死机 94 3.3.6 mysql故障切换之事件调度器注意事项 95 3.3.7 人工误删除innodb ibdata数据文件,如何恢复 97 3.3.8 update忘加where条件误操作恢复(模拟oracle闪回功能) 99 3.3.9 delete忘加where条件误操作恢复(模拟oracle闪回功能) 108 第4章 同步复制报错故障处理 112 4.1 最常见的3种故障 112 4.1.1 在master上删除一条记录时出现的故障 112 4.1.2 主键重复 114 4.1.3 在master上更新一条记录,而slave上却找不到 115 4.2 特殊情况:slave的中继日志relay-log损坏 116 4.3 人为失误 118 4.4 避免在master上执行大事务 119 4.5 slave_exec_mode参数可自动处理同步复制错误 120 4.6 如何验证主从数据一致 121 4.7 binlog_ignore_db引起的同步复制故障 123 4.8 mysql5.5.19/20同步一个bug 124 4.9 恢复slave从机上的某几张表的简要方法  126 4.10 如何干净地清除slave同步信息 127 第5章 性能调优 129 5.1 表设计 129 5.2 字段类型的选取 133 5.2.1 数值类型 134 5.2.2 字符类型 139 5.2.3 时间类型 141 5.2.4 小技巧:快速修改表结构 148 5.2.5 pt-online-schema-change在线更改表结构 152 5.2.6 mysql5.6在线ddl更改表测试 158 5.3 采用合适的锁机制 161 5.3.1 表锁的演示 161 5.3.2 行锁的演示 164 5.3.3 innodb引擎与myisam引擎的性能对比 166 5.4 选择合适的事务隔离级别 168 5.4.1 事务的概念 168 5.4.2 事务的实现 169 5.4.3 事务隔离级别介绍 171 5.5 sql优化与合理利用索引 177 5.5.1 如何定位执行很慢的sql语句 177 5.5.2 sql优化案例分析 178 5.5.3 合理使用索引 188 5.6 my.cnf配置文件调优 198 5.6.1 per_thread_buffers优化 198 5.6.2 global_buffers优化 200 5.6.3 query cache在不同环境下的使用 201 5.6.4 tuning-primer.sh性能调试工具的使用 205 5.6.5 72 gb内存的my.cnf配置文件 208 5.6.6 谨慎使用分区表功能 211 5.7 mysql5.6同步复制新特性详解 213 第6章 备份与恢复 223 6.1 冷备份 224 6.2 逻辑备份 224 6.2.1 mysqldump增加了一个重要参数 225 6.2.2 取代mysqldump的新工具mydumper 226 6.2.3 逻辑备份全量、增量备份脚本 229 6.3 热备份与恢复 230 第三部分 高可用集群管理篇 第7章 目前流行的4种高可用架构 236 7.1 采用mysql自带的replication架构 237 7.1.1 keepalived+mysql replication架构的搭建演示 237 7.1.2 mmm+mysql replication架构的搭建演示 241 7.2 heartbeat+drbd+mysql架构的搭建演示 249 7.3 红帽rhcs共享存储架构的搭建演示 254 7.3.1 安装过程 257 7.3.2 红帽rhcs集群的维护 265 7.4 mysql高可用集群ha解决方案的测试评估 267 第8章 批量管理服务器 270 8.1 开源工具pssh的使用方法 270 8.2 自己编写的ssh服务器批量管理工具 273 第四部分 监控篇 第9章 性能监控 278 第10章 服务监控 283 10.1 nagios搭建与维护 283 10.2 mysql数据库的监控脚本 288 第五部分 项目案例 第11章 项目案例讲解 292 11.1 数据碎片整理方案 292 11.2 用户信息表水平拆表方案 296 11.3 阿里巴巴中间件cobar水平拆表方案 299

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值