mysql重建表分区并保留数据的方法

2023-05-16

本文介绍mysql重建表分区并保留数据的方法,mysql的表分区(partition)可以把一个表的记录分开多个区去存储,查询时可根据查询的条件在对应的分区搜寻,而不需要整表查询,提高查询效率。

有分区的表与没有分区的表使用上没有太大的区别,但如果要对表进行重新分区,删除分区重建会删除数据,因此不可直接进行操作,需要使用一些特别的处理实现。

mysql重建表分区并保留数据的方法:

1.创建与原始表一样结构的新表,新分区。
2.将原始表中数据复制到新表。
3.删除原始表。
4.将新表名称改为原始表名称。

实例:

日志表原始结构如下,按id分区。

CREATE DATABASE `test`;

use `test`;

CREATE TABLE `log` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `content` text NOT NULL COMMENT '内容',
 `status` tinyint(3) unsigned NOT NULL COMMENT '记录状态',
 `addtime` int(11) unsigned NOT NULL COMMENT '添加时间',
 `lastmodify` int(11) unsigned NOT NULL COMMENT '最后修改时间',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
/*!50100 PARTITION BY RANGE (id)
(PARTITION p10w VALUES LESS THAN (100000) ENGINE = InnoDB,
PARTITION p20w VALUES LESS THAN (200000) ENGINE = InnoDB,
PARTITION p50w VALUES LESS THAN (500000) ENGINE = InnoDB,
PARTITION p100w VALUES LESS THAN (1000000) ENGINE = InnoDB,
PARTITION pmax VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */;

insert into `log`(content,status,addtime,lastmodify) 
values('content1',1, unix_timestamp('2018-01-11 00:00:00'), unix_timestamp('2018-01-11 00:00:00')),
('content2',1, unix_timestamp('2018-02-22 00:00:00'), unix_timestamp('2018-02-22 00:00:00')),
('content3',1, unix_timestamp('2018-03-31 00:00:00'), unix_timestamp('2018-03-31 00:00:00'));

查看数据分区分布

SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA='test' AND TABLE_NAME = 'log';

+----------------+------------+
| PARTITION_NAME | TABLE_ROWS |
+----------------+------------+
| p10w           |          3 |
| p20w           |          0 |
| p50w           |          0 |
| p100w          |          0 |
| pmax           |          0 |
+----------------+------------+

 
日志数据需要按时间进行搜寻,因此需要按日志时间重建分区

1.创建log2,按时间分区(每月1个分区)

CREATE TABLE `log2` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `content` text NOT NULL COMMENT '内容',
 `status` tinyint(3) unsigned NOT NULL COMMENT '记录状态',
 `addtime` int(11) unsigned NOT NULL COMMENT '添加时间',
 `lastmodify` int(11) unsigned NOT NULL COMMENT '最后修改时间',
 PRIMARY KEY (`id`,`addtime`),
 KEY `id`(`id`),
 KEY `addtime`(`addtime`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
/*!50100 PARTITION BY RANGE (addtime)
(PARTITION p201801 VALUES LESS THAN (unix_timestamp('2018-02-01 00:00:00')) ENGINE = InnoDB,
PARTITION p201802 VALUES LESS THAN (unix_timestamp('2018-03-01 00:00:00')) ENGINE = InnoDB,
PARTITION p201803 VALUES LESS THAN (unix_timestamp('2018-04-01 00:00:00')) ENGINE = InnoDB,
PARTITION p201804 VALUES LESS THAN (unix_timestamp('2018-05-01 00:00:00')) ENGINE = InnoDB,
PARTITION pmax VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */;

 
2.将log的数据复制到log2

insert into `log2` select * from `log`;

 
3.删除log表

drop table `log`;

 
4.将log2表改名为log

rename table `log2` to `log`;

 
执行后查看数据分区分布

SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA='test' AND TABLE_NAME = 'log';

+----------------+------------+
| PARTITION_NAME | TABLE_ROWS |
+----------------+------------+
| p201801        |          1 |
| p201802        |          1 |
| p201803        |          1 |
| p201804        |          0 |
| pmax           |          0 |
+----------------+------------+

可以看到log表的数据已经按新分区存储。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql重建表分区并保留数据的方法 的相关文章

  • 如何将行变成列?

    我有一个数据库 其中存储分组到项目中的关键字以及与每个关键字相关的数据 然后我显示每个项目的数据网格 每个关键字一行和几列 全部从同一个表 数据 中检索 我有 4 个表 关键字 项目 group keywords 和数据 keywords
  • PHP使用auto_increment生成短唯一ID?

    我想生成一个简短的 唯一的 ID 而不必检查冲突 我目前正在做类似的事情 但是我当前生成的 ID 是随机的 并且在循环中检查冲突很烦人 并且如果记录数量显着增加 将会变得昂贵 通常担心冲突不是问题 但我想要生成的唯一 ID 是一个由 5 8
  • 无法在 .net core 2 中从 MySQL 构建“日期”类型列

    我已经开始了一个新的 net core 2 项目 我正在尝试将 MySQL 数据库导入实体框架 我使用此命令来搭建数据库 Scaffold DbContext server localhost port 3306 user id user
  • 从 Grib 天气模型中提取数据

    我已经下载了grib1模型数据来自GFS http en wikipedia org wiki Global Forecast System 我使用的是 Mac OS X 并且能够构建wgrib2文件来自NOAA http en wikip
  • MySQL 将表从 Latin1 转换为 utf8

    我需要将包含大量数据的表从 Latin1 转换为 utf8 以便它可以接受韩语字符 如何更改该表而不损坏其中的数据 我的 SQL 语句是什么 最好的方法是什么 ALTER TABLE database name table name CON
  • 无法在 mysql-apt-config [Ubuntu 14.04] 中选择“确定”

    我使用的是 Ubuntu 14 04 sudo apt get update总是给我这个选项来配置 mysql apt config 我尝试选择版本 按 tab gt 在 确定 上突出显示的键 按 Enter 但没有任何反应 它再次返回并突
  • 无法在 Zend Framework 中回滚事务

    我在 Zend Framework 中使用以下代码进行事务 但回滚功能不起作用 数据通过 insertSome data 插入数据库 怎么了 db gt beginTransaction try model gt insertSome da
  • meta_query,如何使用关系 OR 和 AND 进行搜索?

    已解决 请参阅下面的答案 我有一个名为的自定义帖子类型BOOKS 它有几个自定义字段 名称为 TITLE AUTHOR GENRE RATING 我该如何修复我的meta query下面的代码以便仅books在自定义字段中包含搜索词 tit
  • MySQL - 从数字列表中选择在表的 id 字段中没有对应项的数字

    我有一个数字列表 例如 2 4 5 6 7 我有一个表 foos 带有 foos ID 包括 1 2 3 4 8 9 我想获取我的号码列表 并在我的表的 ID 字段中找到那些没有对应项的号码 实现此目的的一种方法是创建一个表格栏 在 ID
  • “修改列”与“更改列”

    我知道 我们不能使用重命名列MODIFY COLUMN语法 但我们可以使用CHANGE COLUMN syntax 我的问题是 主要用途是什么modify syntax 例如 ALATER TABLE tablename CHANGE co
  • jdbc4.MySQLSyntaxErrorException:数据库中不存在表

    我正在使用 SpringBoot 开发一个网络应用程序 这是我的application properties文件来指定访问数据库的凭据 spring datasource driverClassName com mysql jdbc Dri
  • MySQL“列计数与第 1 行的值计数不匹配”是什么意思

    这是我收到的消息 ER WRONG VALUE COUNT ON ROW 列计数与第 1 行的值计数不匹配 这是我的全部代码 我的错误在哪里 DROP TABLE student CREATE TABLE employee emp id I
  • MySQL:如何仅获取正值的平均值?

    假设我有 INT 列 并且我使用 1 来表示插入时没有可用数据 我想获得该列中所有 0 或更大值的平均值 这可能吗 Thanks 我忘了提及 我正在与其他 AVG 一起执行此操作 因此从选项卡中选择 avg a avg b avg d 所以
  • 针对约 225 万行的单表选择查询的优化技术?

    我有一个在 InnoDB 引擎上运行的 MySQL 表 名为squares大约有 2 250 000 行 表结构如下 squares square id int 7 unsigned NOT NULL ref coord lat doubl
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • mysql 不带空字符串和 NULL 的不同值

    如何检索没有空字符串值和NULL值的mysql不同值 SELECT DISTINCT CON EMAILADDRESS AS E MAIL FROM STUDENT INNER JOIN CONTACT CON ON STUDENT CON
  • mysql 如何将 varchar(10) 转换为 TIMESTAMP?

    我已将所有日期存储到数据库中varchar 10 现在我想将它们转换为 TIMESTAMP 当我运行sql时 ALTER TABLE demo3 CHANGE date date TIMESTAMP NOT NULL 它提醒 1292 In
  • 如何对 SQL 进行多次查询

    我正在尝试创建一个表 并在 PHP 脚本的帮助下在数据库中插入一些值 虽然只插入 1 行 但效果很好 当我尝试输入更多行数时 出现错误 我需要为每个查询编写完整的插入语句 因为我正在使用在线 Excel 到 SQL 查询转换器
  • 条件触发器的Django迁移sql

    我想创建一个触发器 仅在满足条件时插入表 我尝试过使用 IF BEGIN END 和 WHERE 的各种组合 但 Django 每次都会返回 SQL 语法错误 这里 type user id指的是触发该事件的人 user id指的是接收到通
  • phpActiveRecord 日期时间格式不正确

    当尝试使用 phpActiveRecord 在表中创建记录时 出现以下错误 Invalid datetime format 1292 Incorrect datetime value 2013 06 20 11 59 08 PDT for

随机推荐

  • Linux 删除文件中空行的方法

    开发过程中 xff0c 源数据文件内可能存在空行 xff0c 为了能更好地使用 xff0c 需要把文件中的空行删除掉 xff0c 对于行中只含有空格或tab的内容 xff0c 可根据需求确定是否作为空行处理 1 文件空行不含空格与tab的处
  • php 基于redis计数器类

    Redis是一个开源的使用ANSI C语言编写 支持网络 可基于内存亦可持久化的日志型 Key Value数据库 xff0c 并提供多种语言的API 本文将使用其incr 自增 xff0c get 获取 xff0c delete 清除 方法
  • (入门)python的基本输入和输出

    今天主要为大家详细介绍了python的基本输入和输出 xff0c 文中示例代码介绍的非常详细 xff0c 具有一定的参考价值 xff0c 这也是我们学习python最基本的一步 想要了解更多关于python知识的 xff0c 请点击这个 目
  • MongoDB 集合字段匹配查询方法

    MongoDB是基于分布式文件存储的数据库 xff0c 本文将介绍如何对MongoDB记录中集合字段进行匹配查询 1 创建测试数据库 use testdb db span class hljs preprocessor createUser
  • JS获取访问设备信息的方法

    本文将介绍获取访问网页设备的基本信息的方法 xff0c 提供完整代码及例子 xff0c 方便大家使用 1 获取访问者IP及所在地 span class hljs doctype lt DOCTYPE HTML PUBLIC 34 W3C D
  • mysql在终端执行sql并把结果写入文件的方法

    在终端使用mysql执行语句时 xff0c 我们一般先进入mysql xff0c 然后再在里面执行sql语句 例如 xff1a mysql uroot mysql gt use mydb mysql gt select from user
  • curl使用实例

    本文将介绍curl的使用 xff0c 根据常用的场景 xff0c 提供调用curl实现请求的演示代码及服务端代码 xff0c 方便大家学习使用 1 查看网页源码 curl命令后加网址 xff0c 就可以看到网页源码 curl www spa
  • mysql比对两个数据库表结构的方法

    在开发及调试的过程中 xff0c 需要比对新旧代码的差异 xff0c 我们可以使用git svn等版本控制工具进行比对 而不同版本的数据库表结构也存在差异 xff0c 我们同样需要比对差异及获取更新结构的sql语句 例如同一套代码 xff0
  • shell 去除utf8文件中bom头的方法

    本文介绍使用shell命令 xff0c 批量去除utf8文件中bom头的方法 utf8的bom头由 xEF xBB xBF组成 xff0c 带bom的文件在使用过程中 xff0c 某些软件打开会出现乱码等异常 xff0c 而要把文件重新另存
  • mysql binlog的使用

    本文介绍mysql binlog的使用 xff0c 包括开启 xff0c 关闭 xff0c 查看状态 xff0c 刷新 xff0c 清空 xff0c 查看执行的sql语句等操作 并对5 7及旧版本的设置加以说明 xff0c 方便大家学习 m
  • 阿里云RDS导出数据库结构整理工具

    本文使用shell实现一个小工具 xff0c 可以整理阿里云RDS导出数据库结构的zip文件 xff0c 整理为可直接使用的sql文件 阿里云RDS导出的数据库结构sql需要整理的地方 1 解压后sql文件名称缺少数据库名称标识 阿里云RD
  • 几种极其隐蔽的XSS注入的防护

    XSS注入的本质就是 某网页中根据用户的输入 不期待地生成了可执行的js代码 并且js得到了浏览器的执行 意思是说 发给浏览器的字符串中 包含了一段非法的js代码 而这段代码跟用户的输入有关 常见的XSS注入防护 可以通过简单的 htmls
  • CSS和JS标签style属性对照表

    盒子标签和属性对照 CSS语法 xff08 不区分大小写 xff09 JavaS cript语法 xff08 区分大小写 xff09 border border border bottom borderBottom border botto
  • 反复安装anaconda3始终出现kernel error连接错误

    jupyter notebook添加kernel 转 xff1a https blog csdn net u012151283 article details 54565467 pip install 参数 安装指定源pip install
  • php 基于redis使用令牌桶算法实现流量控制

    本文介绍php基于redis xff0c 使用令牌桶算法 xff0c 实现访问流量的控制 xff0c 提供完整算法说明及演示实例 xff0c 方便大家学习使用 每当国内长假期或重要节日时 xff0c 国内的景区或地铁都会人山人海 xff0c
  • Redis主从同步,读写分离设置

    本文介绍使用Redis的主从同步功能 master slave xff0c 使程序实现读写分离 xff0c 避免io瓶颈 xff0c 提高数据读写效率 Redis支持一个master服务器对多个slave服务器同步 xff0c 同步使用发布
  • 终端出现 You have new mail.的解决方法

    打开一个新的终端窗口 xff0c 第一句会出现You have new mail 提示 出现这种情况的原因 xff0c 因为系统出现错误 xff08 例如cron出现权限问题等 xff09 需要邮件通知用户 系统会将检查的各种状态汇总 xf
  • php 创建带logo二维码类

    本文介绍php实现创建二维码类 xff0c 支持设置尺寸 xff0c 加入LOGO xff0c 描边 圆角 透明度 xff0c 等处理 提供完整代码 xff0c 演示实例及详细参数说明 xff0c 方便大家学习使用 实现功能如下 xff1a
  • Mac ssh使用pem文件登录远程服务器

    登录远程服务器我们可以使用ssh命令 xff0c 部分远程服务器访问需要授权 xff0c ssh命令支持使用pem文件进行授权访问 命令如下 xff1a ssh i identity file user span class hljs va
  • mysql重建表分区并保留数据的方法

    本文介绍mysql重建表分区并保留数据的方法 xff0c mysql的表分区 partition 可以把一个表的记录分开多个区去存储 xff0c 查询时可根据查询的条件在对应的分区搜寻 xff0c 而不需要整表查询 xff0c 提高查询效率