Carry の Blog Carry の Blog
首页
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • Python
  • Shell
  • MySQL8-SOP手册
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Carry の Blog

好记性不如烂键盘
首页
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • Python
  • Shell
  • MySQL8-SOP手册
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • MySQL

  • Redis

  • Keydb

  • TiDB

    • TiCDC同步数据到Kafka
    • 对TiDB中算子的深入理解
    • TiDB使用 TTL (Time to Live) 定期删除过期数据
    • 如何移除TiDB中的表分区
      • 背景
      • 找出分区表
      • 单表移除分区的实现步骤
      • 多表批量处理的实现步骤
        • 脚本内容
        • 使用方法
      • 注意事项
    • TiDB配置文件调优
    • 深入解析TiFlash:原理、适用场景与调优实践
    • tidb fast ddl
  • MongoDB

  • Elasticsearch

  • Kafka

  • victoriametrics

  • BigData

  • Sqlserver

  • 数据库
  • TiDB
Carry の Blog
2025-04-03
目录

如何移除TiDB中的表分区原创

# 背景

在实际的数据库使用中,分区表是一种非常有效的性能优化手段。然而,当分区表的数据量较小或分区策略不再适合当前业务需求时,移除分区并使用索引替代可能是更好的选择。在本文中,我们将详细讲解如何在 TiDB 中移除表分区,包括找出所有分区表的表名、单表的实现步骤以及多表的批量处理方式。


# 找出分区表

首先,我们需要确定哪些表是分区表。TiDB 的 INFORMATION_SCHEMA.TABLES 提供了丰富的表结构信息,我们可以通过查询 CREATE_OPTIONS 字段来找出所有分区表。

执行以下 SQL 查询:

SELECT 
    TABLE_SCHEMA, 
    TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE CREATE_OPTIONS = 'partitioned';
1
2
3
4
5

该查询会返回所有分区表的表名和所在的数据库。例如,查询结果可能如下:

TABLE_SCHEMA TABLE_NAME
test_db user_activity_p
test_db order_data_p
test_db product_info_p

这些表都是分区表,接下来我们将对它们进行移除分区的操作。


# 单表移除分区的实现步骤

移除分区的过程包括以下几个步骤:

  1. 创建一个新表:新表的结构与原表一致,但没有分区。
  2. 移除分区:通过 ALTER TABLE 删除分区配置。
  3. 添加索引:为新表添加适当的索引以替代分区的性能优化。
  4. 迁移数据:将原表的数据插入到新表中。
  5. 删除原表:删除旧的分区表。
  6. 重命名新表:将新表重命名为原表的名称。

以下是针对单个表 test_db.user_activity_p 的完整操作 SQL:

-- 创建新表
CREATE TABLE test_db.user_activity_new LIKE test_db.user_activity_p;

-- 移除分区
ALTER TABLE test_db.user_activity_new REMOVE PARTITIONING;

-- 添加索引
ALTER TABLE test_db.user_activity_new ADD INDEX idx_activity_date (activity_date);

-- 迁移数据
INSERT INTO test_db.user_activity_new SELECT * FROM test_db.user_activity_p;

-- 删除原表
DROP TABLE test_db.user_activity_p;

-- 重命名新表为原表
RENAME TABLE test_db.user_activity_new TO test_db.user_activity_p;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

通过以上步骤,我们成功移除了 user_activity_p 表的分区,同时保留了原表的数据和结构。


# 多表批量处理的实现步骤

如果需要处理多个分区表,手动执行上述步骤显然效率较低。我们可以通过 Shell 脚本自动生成移除分区的 SQL 文件,并批量执行。

# 脚本内容

以下是一个 Shell 脚本,可以自动生成针对所有分区表的 SQL 文件:

#!/bin/bash

# 输出 SQL 文件名
output_file="remove_partition.sql"

# 表名列表
tables=(
    "user_activity_p"
    "order_data_p"
    "product_info_p"
    # 在此添加更多分区表名...
)

# 数据库名
database="test_db"

# 初始化 SQL 文件
echo "-- SQL 脚本:移除分区并添加索引" > $output_file

# 循环生成每张表的 SQL
for table in "${tables[@]}"; do
    echo "-- 开始处理表 $database.$table" >> $output_file
    echo "CREATE TABLE $database.${table}_new LIKE $database.$table;" >> $output_file
    echo "ALTER TABLE $database.${table}_new REMOVE PARTITIONING;" >> $output_file
    echo "ALTER TABLE $database.${table}_new ADD INDEX idx_report_date (report_date);" >> $output_file
    echo "INSERT INTO $database.${table}_new SELECT * FROM $database.$table;" >> $output_file
    echo "DROP TABLE $database.$table;" >> $output_file
    echo "RENAME TABLE $database.${table}_new TO $database.$table;" >> $output_file
    echo "" >> $output_file
done

# 提示生成完成
echo "SQL 文件已生成:$output_file"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

# 使用方法

  1. 保存脚本为 generate_remove_partition_sql.sh。
  2. 修改 tables 数组,添加所有需要移除分区的表名。
  3. 赋予脚本执行权限:
    chmod +x generate_remove_partition_sql.sh
    
    1
  4. 执行脚本生成 SQL 文件:
    ./generate_remove_partition_sql.sh
    
    1
  5. 打开生成的 remove_partition.sql 文件,批量执行其中的 SQL。

# 注意事项

在移除分区时,需要注意以下几点:

  1. 停机操作:移除分区涉及到表的删除和重命名,建议在停机状态下进行,避免对业务产生影响。
  2. 备份数据:虽然分区表可能是测试环境的数据,但仍建议在操作前进行备份,以防数据丢失。
  3. 索引优化:移除分区后,可能需要根据业务需求调整索引策略,以确保查询性能。
#SQL优化#分区管理#数据库运维
上次更新: 4/24/2025

← TiDB使用 TTL (Time to Live) 定期删除过期数据 TiDB配置文件调优→

最近更新
01
tidb fast ddl
04-04
02
TiDB配置文件调优 原创
04-03
03
深入解析TiFlash:原理、适用场景与调优实践 原创
04-02
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式