大表数据如何在OceanBase中进行表分区管理的实践

背景

将Zabbix的数据库迁移至OceanBase后,以其中的几个大表作为案例,本文将分享如何利用ODC(OceanBase 开发者工具),来进行自动管理OB数据库中的表分区的方案。

因为原始表里已经有大量的数据,如果贸然对原始表去创建表分区的话,可能会造成长时间的缩影,所以,当前的整体思路是:

  1. 为每个要操作的表创建一个 [tb_name]---->临时表[tb_name_tmp],表结构语原始表保持一致;
  2. 通过代码为每个临时表 [tb_name_tmp]生成表分区创建语句;
  3. 为每个临时表 [tb_name_tmp]创建表分区;
  4. 将操作日前一天的数据通过 insert into select 写入到临时表 [tb_name_tmp]中,并校验
  5. 停止应用,并将剩余数据写入到临时表 [tb_name_tmp]中
  6. 将原始表[tb_name]重名为[tb_name_bak],并将临时表 [tb_name_tmp]重命名为[tb_name]
  7. 启动服务,并检查服务是否正常,如果服务异常,检查数据是否正确;
  8. 如果服务正常,在odc中为相关表创建表分区维护计划;
  9. 一段时间后,将原始表[tb_name_bak]进行归档或者移除;

操作对象

首先,明确需要操作的表对象是哪些:

表名作用保留时长清理间隔数据类型
history存储原始的历史数据90天每天数字(浮点数)
history_uint存储原始的历史数据90天每天数字(无符号)
history_str存储原始的短字符串数据90天每天字符型
history_text存储原始的长字符串数据90天每天文本
history_log存储原始的日志字符串数据90天每天日志
trends存储每小时统计数据(趋势)12个月每月数字(浮点数)
trends_uint保持每小时统计数据(趋势)12个月每月数字(无符号)
auditlog审计日志表

准备操作

查找各个表中的最早记录

如果记录最早时间早于保留时间,那就从保留日开始导入,如果晚于保留开始日期,则用最早记录的日期开始建立分区

SELECT FROM_UNIXTIME(MIN(clock)) FROM history;SELECT FROM_UNIXTIME(MIN(clock)) FROM history_uint;SELECT FROM_UNIXTIME(MIN(clock)) FROM history_str;SELECT FROM_UNIXTIME(MIN(clock)) FROM history_text;SELECT FROM_UNIXTIME(MIN(clock)) FROM history_log;SELECT FROM_UNIXTIME(MIN(clock)) FROM trends;SELECT FROM_UNIXTIME(MIN(clock)) FROM trends_uint;

创建分区表结构

SHOW CREATE TABLE history;
SHOW CREATE TABLE history_uint;
SHOW CREATE TABLE history_str;
SHOW CREATE TABLE history_text;
SHOW CREATE TABLE history_log;
SHOW CREATE TABLE trends;
SHOW CREATE TABLE trends_uint;

使用以下脚本来生成表分区

使用python生成创建表分区的SQL语句

by day

# -*- coding: utf-8 -*-            
# @Time     : 2023/6/8 10:17
# @Author   : YoKing Ma
# @FileName : create_tp_day.py
# @Software : PyCharmimport datetimetb_name = input("Please input data table name:")print(f"""
Please get the first day, use like this command:
SELECT FROM_UNIXTIME(MIN(clock)) FROM {tb_name}
""")
start_day = input("Please input the first day (2023-03-03): ")# tb_name="history"
# start_day="2023-03-03"try:first_date = datetime.datetime.strptime(start_day, "%Y-%m-%d")print(f"Your input date is [{first_date}]")
except ValueError:print("date format is error!")pt_create=[]period = 0
while period <= 90:curr_date = first_date + datetime.timedelta(days=period)curr_date_title = curr_date.strftime("%Y_%m_%d")tommow_date = curr_date + datetime.timedelta(days=1)period += 1sql_str=f'PARTITION p{curr_date_title} VALUES LESS THAN (UNIX_TIMESTAMP("{tommow_date}"))'pt_create.append(sql_str)pt_sql_str = f"""ALTER TABLE {tb_name} PARTITION BY RANGE (clock)
("""
for sql in pt_create:pt_sql_str += '\n'pt_sql_str += sqlpt_sql_str += ','pt_sql_str += "\b\n);"print(pt_sql_str)

by mouth

# -*- coding: utf-8 -*-            
# @Time     : 2023/6/8 11:27
# @Author   : YoKing Ma
# @FileName : create_tp_month.py
# @Software : PyCharm## pip install python-dateutilimport datetime
from dateutil.relativedelta import relativedeltatb_name = input("Please input data table name:")print(f"""
Please get the first day, use like this command:
SELECT FROM_UNIXTIME(MIN(clock)) FROM {tb_name}
""")
start_month = input("Please input the first day (2023-03): ")# tb_name="history"
# start_month="2022-02"try:tmp_date = start_month.split('-')fyear = int(tmp_date[0])fmonth = int(tmp_date[1])fdate = datetime.datetime(fyear, fmonth, 1)
except ValueError:print("date format is error!")pt_create=[]period = 12
cdate = fdate
for i in range(0,13):title = f"{cdate.year}_{cdate.month}"ndate = cdate + relativedelta(months=+1)sql = f'PARTITION p{title} VALUES LESS THAN (UNIX_TIMESTAMP("{ndate}"))'pt_create.append(sql)cdate = ndatept_sql_str = f"""ALTER TABLE {tb_name} PARTITION BY RANGE (clock)
("""
for sql in pt_create:pt_sql_str += '\n'pt_sql_str += sqlpt_sql_str += ','pt_sql_str += "\b\n);"print(pt_sql_str)

案例演示

如生成了 `history` 表的临时表 `history_tmp`

CREATE TABLE `history_tmp` (`itemid` bigint(20) unsigned NOT NULL,`clock` int(11) NOT NULL DEFAULT '0',`value` double NOT NULL DEFAULT '0',`ns` int(11) NOT NULL DEFAULT '0',PRIMARY KEY (`itemid`, `clock`, `ns`)
) DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin;

用上面的脚本,为`history_tmp`表创建表分区语句

ALTER TABLE history_tmp PARTITION BY RANGE ( clock)
(
PARTITION p2024_04_04 VALUES LESS THAN (UNIX_TIMESTAMP("2024-04-05 00:00:00")) ENGINE = InnoDB,
PARTITION p2024_04_05 VALUES LESS THAN (UNIX_TIMESTAMP("2024-04-06 00:00:00")) ENGINE = InnoDB,
……
PARTITION p2024_07_01 VALUES LESS THAN (UNIX_TIMESTAMP("2024-07-02 00:00:00")) ENGINE = InnoDB,
PARTITION p2024_07_02 VALUES LESS THAN (UNIX_TIMESTAMP("2024-07-03 00:00:00")) ENGINE = InnoDB,
PARTITION p2024_07_03 VALUES LESS THAN (UNIX_TIMESTAMP("2024-07-04 00:00:00")) ENGINE = InnoDB
);

迁移数据

分2次迁移数据,这样可以减少业务停机的时长

数据导入

第一次迁移可以把变更日前的数据全部导入,比如变更日为2024年的7月3日,那将2024年7月3日 00:00:00之前90天的数据全部导入到分区表中

INSERT /*+ append enable_parallel_dml parallel(8) */ INTO `history_tmp`(`itemid`, `clock`, `value`, `ns`)
SELECT `itemid`, `clock`, `value`, `ns`
FROM `history`
WHERE `clock` >= 1712160000 and `clock` < 1719936000;

数据校验

对比临时表中的最早和最晚的记录是否和原表一致,并检查行数是否一致。

因为zabbix有housekeeper服务,这个服务会不定时的删除表中过期的数据,所以,在导入数据的过程中会造成数据不一致的情况。可以先把zabbix的管家服务停止;
SELECT FROM_UNIXTIME(MIN(clock)) FROM history_tmp;
SELECT FROM_UNIXTIME(MAX(clock)) FROM history_tmp;
SELECT COUNT(1) FROM history WHERE `clock` >= 1712160000 and `clock` < 1719936000;      -- 402789803
SELECT COUNT(1) FROM history_tmp;   -- 402789803

校验通过后,可以停止zabbix服务,并进行剩余数据的导入。操作与上文类似就不再赘述。

修改表名

rename table history to history_bak;
rename table history_tmp to history;

修改完表名后,就启动zabbix服务,看服务日志是否有报错,报错的话需要解决报错,直至服务正常。

在ODC中创建表分区管理计划

为已经分区表创建分区计划(在odc中每个数据库只允许有1个分区计划,新的分区计划生效后,旧的就失效了)

1720061551

我这边history相关表是每日一个表分区,trends相关表是1个月做一次表分区的维护。

所以【分区策略】我就以2中类型展示:【日】和【月】

分区策略--日

1720061781

这里产生的SQL语句类似于:

ALTER TABLE `zabbix`.`history` DROP PARTITION (`p2024_04_04`);ALTER TABLE `zabbix`.`history` ADD PARTITION (PARTITION `p2024_07_04` VALUES LESS THAN (1720108800));

策略中用到的表达式

分区创建表达式:unix_timestamp(DATE(NOW() - INTERVAL DAY(NOW())
表分区命名表达式:DATE_FORMAT(DATE(NOW() - INTERVAL DAY(NOW()) DAY + INTERVAL 1 DAY + INTERVAL 1 MONTH), 'p%Y_%m')

分区策略-月

1720061955

ALTER TABLE `zabbix`.`trends` DROP PARTITION (`p2023_7`);ALTER TABLE `zabbix`.`trends` ADD PARTITION (PARTITION `p2024_08` VALUES LESS THAN (1725120000));

策略中用到的表达式

分区创建表达式:unix_timestamp(DATE(NOW() - INTERVAL DAY(NOW())
表分区命名表达式:DATE_FORMAT(DATE(NOW() - INTERVAL DAY(NOW()) DAY + INTERVAL 1 DAY + INTERVAL 1 MONTH), 'p%Y_%m')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1539067.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

项目管理系统的期限提醒功能如何确保项目按时推进?

在竞争激烈的项目申报垂直领域&#xff0c;时间就是效率&#xff0c;效率关乎成败。每一个申报项目的截止日期都是一道不容错过的关卡&#xff0c;错过即意味着失去了宝贵的机会。为了确保项目能够按时推进&#xff0c;避免因时间管理不当而导致的延误&#xff0c;项目管理系统…

盘点BDC/ZCU方案常用的芯片

文章目录 1.前言2.方案概述3.主控芯片3.1 RH850/U2A3.2 TC39x3.3 E34303.4 CCFC3007、CCFC3012 4.电源芯片4.1 混合方案4.2 分立方案 5.电机驱动芯片5.1 多路半桥驱动5.2 多路预驱5.3 步进电机驱动5.4 H桥驱动5.4.1 TI的H桥驱动5.4.2 ST的H桥驱动 6.高边驱动芯片/低边驱动芯片6…

LINUX网络编程:理解绑定和分装解包

目录 1.理解绑定 2.理解封装和解包 封装&#xff08;添加报头&#xff09; 1.理解绑定 当数据报文到达的时候&#xff0c;会一层一层的解包分用给目的端口号的进程。 在程序启动的时候都需要绑定端口号&#xff0c;数据报文才能通过端口号交给对应的进程&#xff0c;那这是…

Give azure openai an encyclopedia of information

题意&#xff1a;给 Azure OpenAI 提供一部百科全书式的信息 问题背景&#xff1a; I am currently dabbling in the Azure OpenAI service. I want to take the default model and knowledge base and now add on to it my own unique information. So, for example, for mak…

云服务新战局:AI应用之争悬念丛生

科技圈的迭代总是让人应接不暇&#xff0c;眼下云服务行业又在进入新变局。 从去年的“大模型之战”&#xff0c;到今年的“AI应用之争”&#xff0c;推动着云服务进入了新的阶段&#xff0c;开启了云计算持续多年的新技术变革。一众云服务巨头领略到了新技术的魅力&#xff0…

H5白色大方图形ui设计公司网站HTML模板源码

源码名称&#xff1a;白色大方图形ui设计公司网站模板源码 源码介绍&#xff1a;一款H5自适应白色大方图形ui设计公司官网网站模板源码。源码含有七个页面&#xff0c;可用于各种设计公司官网。 需求环境&#xff1a;H5 下载地址&#xff1a; https://www.51888w.com/369.ht…

5G 扬帆新质跃,技术蝶变开新篇-第七届“绽放杯”5G应用征集大赛 5G应用融合技术专题赛圆满收官

2024年9月13日,由中国信息通信研究院、中国电信集团有限公司、中国移动通信集团有限公司、中国联合网络通信集团有限公司主办,5G应用产业方阵承办的第七届“绽放杯”5G应用征集大赛  5G应用融合技术专题赛决赛在深圳成功举办。 本次专题赛以“5G扬帆新质跃,技术蝶变开新篇”为…

局域网桌面控制软件有哪些?这4个局域网桌面控制app真的有被惊艳到!

在数字化办公日益普及的今天&#xff0c;局域网桌面控制软件成为了企业管理和个人工作不可或缺的工具。 这些软件不仅提高了工作效率&#xff0c;还极大地便利了远程协作和远程管理。 1. 安企神 此软件是一款支持跨系统、跨设备相互远程控制的软件&#xff0c;覆盖了Windows、…

【STL】stack,deque,queue 基础,应用与操作

stack 1.stack相关介绍 stack&#xff08;栈&#xff09; 栈是一种后进先出&#xff08;LIFO, Last In First Out&#xff09;的数据结构&#xff0c;意味着最后插入的数据最先被移除。C 中的栈是通过容器适配器实现的&#xff0c;底层默认使用 deque&#xff08;双端队列&am…

计算机专业毕设-校园新闻网站

1 项目介绍 基于SSMVue的校园新闻网站&#xff1a;后端 SpringBoot、Mybatis-Plus&#xff0c;前端VueElementUI&#xff0c;具体功能如下&#xff1a; 管理端 个人中心&#xff1a;查看和修改个人信息用户管理新闻类型管理校园新闻管理留言板管理论坛交流管理轮播图管理 用…

自闭症寄宿学校还分能力吗?了解个性化教育模式

在自闭症教育的广阔领域里&#xff0c;寄宿学校作为一种特殊的教育形式&#xff0c;正逐步展现出其独特的价值与魅力。这些学校不仅为自闭症儿童提供了一个安全、稳定的学习与生活环境&#xff0c;更通过个性化的教育模式&#xff0c;深入挖掘并培养他们的潜能。其中&#xff0…

详细分享AI数字人带货玩法全流程!附工具教程

这两天美诚月饼事件在网络上闹得沸沸扬扬&#xff0c; 本该是合家团圆的日子里&#xff0c;可能无心赏月了&#xff0c; 当然&#xff0c;这一切都跟我们是没有什么关系的&#xff0c; 然而我想表达的是&#xff0c;尽管美诚并不是所谓的HK品牌&#xff0c; 却依然不影响它…

网络通信失败-关闭网络防火墙

0、报错描述1、分析2、解决办法 0、报错描述 在进行树莓派和PC端的网络通信的时候&#xff0c; 使用树莓派作为服务端&#xff0c;PC端作为客户端的时候&#xff0c;能成功通讯。 使用树莓派作为客户端&#xff0c;PC端作为服务端的时候&#xff0c;却发现通信失败。 体现在没…

数据中台建设(十一)—— 数据安全管理

数据安全管理 在数据中台中所说的数据安全管理&#xff0c;侧重于企业内部的数据安全管理&#xff0c;是狭义的数据安全管理&#xff0c;重点放在大数据平台的安全管理技术手段上。 在大数据时代&#xff0c;数据的整个生命周期包含&#xff1a;数据产生、数据存储、数据传输、…

【线性回归模型】

线性回归模型 创建一些带标签的数据集&#x1d437; {(&#x1d499;1, &#x1d466;1) , (&#x1d499;2, &#x1d466;2 ), … , (&#x1d499;&#x1d45a;, &#x1d466;&#x1d45a;) } x为特征&#xff0c;映射到对应的标签y&#xff0c;再引入偏置b 线性回归模…

CAD图1

文章目录 选择直线工具选择圆形选中圆形 选择直线工具 画一条十字中心线 选择圆形 以十字中心为起点画一个半径为 53 的圆形 选中圆形 选中圆形&#xff0c;捕捉右侧圆形焦点

前端vue压缩静态图片,压缩gif动态图片

一、压缩静态图片 /*** 压缩图片方法* param {file} file 文件* param {Number} quality 图片质量(取值 0-1 之间默认 0.52)*/ export function compressImg(file, quality) {let qualitys 0.52if (parseInt((file.size / 1024).toFixed(2)) < 1024) {qualitys 0.85}if (…

SSC338D/SSC338Q CA7*2+IPU5M/Multi-sensorISP: HDR/3DNR

SSC338D/SSC338Q系列产品是高度集成的多媒体片上系统&#xff08;SoC&#xff09;产品&#xff0c;适用于IP摄像机、车载摄像机和USB摄像机等高分辨率智能视频录制应用。该芯片包括32位双核RISC处理器、高级图像信号处理器&#xff08;ISP&#xff09;、高性能MJPEG/H.264/H.26…

高端论坛报告分享 | 李维森:中国地理信息产业发展报告(2024)

本报告为中国地理信息产业协会会长李维森在“2024中国地理信息产业大会”所作报告《中国地理信息产业发展报告&#xff08;2024&#xff09;》。转载请注明来源于中国地理信息产业协会。 本报告为中国地理信息产业协会会长李维森在“2024中国地理信息产业大会”所作报告《中国地…

线程池的执行流程是什么?(核心参数、执行流程、拒绝策略)

一、线程池的执行流程 1. 首先&#xff0c;向线程池提交一个线程任务&#xff0c;线程池会分配空闲线程去处理该线程任务。 2. 如果没有空闲线程就判断当前存活线程数是否超过核心线程数&#xff1a; &#xff08;1&#xff09;没有超过就创建一个核心线程&#xff0c;处理线程…