Mysql--运维篇--空间管理(表空间,索引空间,临时表空间,二进制日志,数据归档等)
MySQL的空间管理是指对数据库存储资源的管理和优化。确保数据库能够高效地使用磁盘空间、内存和其他系统资源。良好的空间管理不仅有助于提高数据库的性能,还能减少存储成本并防止因磁盘空间不足导致的服务中断。MySQL的空间管理涉及多个方面,包括表空间管理、索引管理、临时表管理、二进制日志管理等。
一、表空间管理
表空间是MySQL中用于存储数据的逻辑区域。不同的存储引擎有不同的表空间管理方式。
1、InnoDB表空间
InnoDB是MySQL的默认存储引擎,它使用表空间来存储数据和索引以及回滚段等。
InnoDB支持两种类型的表空间:
- 系统表空间(System Table Space):也称为共享表空间,默认情况下位于ibdata1文件中。包含了系统相关数据,回滚日志,共享区域,双写缓存区等。
- 独立表空间(File-per-Table Table Space):每个InnoDB表都有一个独立的.ibd文件,用于存储该表的数据和索引。这种方式可以更好地管理单个表的空间,并且支持在线备份和恢复。
配置启用独立表空间:
[mysqld]
innodb_file_per_table=1
优点:
- 每个表都有自己独立的.ibd文件,便于管理和备份。
- 可以单独收缩或删除单个表的空间。
- 支持在线备份和恢复单个表。
缺点:
- 占用更多的磁盘空间(因为每个表都有自己的表空间)。
- 如果表被删除,表空间不会自动回收到系统表空间中。
2、表空间优化方法
(1)、收缩表空间
随着数据的插入、更新和删除,表空间可能会出现碎片,导致空间浪费。
可以通过以下方式收缩表空间:
- OPTIMIZE TABLE:对于InnoDB表,OPTIMIZE TABLE会重建表并重新分配空间,消除碎片。
OPTIMIZE TABLE mytable;
- ALTER TABLE … ENGINE=InnoDB:通过改变表的存储引擎为InnoDB,可以重建表并优化空间。
ALTER TABLE mytable ENGINE=InnoDB;
- TRUNCATE TABLE:如果需要清空整个表,TRUNCATE TABLE会快速删除表中的所有数据,并释放表空间。
TRUNCATE TABLE mytable;
(2)、回收未使用的表空间
对于InnoDB的系统表空间(ibdata1),一旦空间被分配,即使数据被删除,空间也不会自动回收。
回收未使用的空间方法:
- 重建数据库:
将数据库导出并重新导入,可以清理ibdata1中的未使用空间。
导出数据库
mysqldump -u root -p --all-databases > all_databases.sql停止MySQL服务
sudo systemctl stop mysql删除ibdata1文件
rm /var/lib/mysql/ibdata1重启MySQL服务
sudo systemctl start mysql重新导入数据库
mysql -u root -p < all_databases.sql
说明:
建议还是以追加服务器内存为优先手段,不建议直接删除系统表空间文件。
- 启用独立表空间:
启用innodb_file_per_table后,每个表都有自己独立的.ibd文件,删除表时会自动回收空间。
二、索引管理
索引是提高查询性能的重要工具,但过多或不必要的索引会占用大量磁盘空间,并影响写入性能。因此,合理的索引管理也是空间管理的一部分。
1、评估索引的有效性
定期评估索引的有效性,删除不再使用的索引。
可以通过以下方式检查索引的使用情况:
- SHOW INDEX:
查看表的索引信息。
SHOW INDEX FROM mytable;
- EXPLAIN:
分析查询执行计划,了解哪些索引被使用。
EXPLAIN SELECT * FROM mytable WHERE column = 'value';
- performance_schema:
使用performance_schema监控索引的使用情况。
SELECT * FROM performance_schema.table_io_waits_summary_by_index_usage;
运行结果:

2、删除不必要的索引
如果某些索引很少被使用,或者有冗余的索引,可以考虑删除它们以节省空间。
示例:
ALTER TABLE mytable DROP INDEX index_name;
3、合并重复索引
有时可能会存在重复的索引,例如两个索引覆盖了相同的列。可以通过合并这些索引来减少空间占用。
示例:
ALTER TABLE mytable DROP INDEX index1, ADD INDEX combined_index (column1, column2);
三、临时表管理
MySQL在执行复杂查询时可能会创建临时表,尤其是在排序、分组和连接操作中。临时表可以存储在内存中(MEMORY引擎)或磁盘上(MyISAM或InnoDB引擎)。临时表的管理不当可能会导致内存或磁盘空间耗尽。
1、配置临时表
- tmpdir:
指定临时表的存储目录。
[mysqld]
tmpdir=/path/to/tmp
- tmp_table_size和max_heap_table_size:
设置临时表的最大内存大小。超过这个大小的临时表将被存储在磁盘上。
[mysqld]
tmp_table_size=64M
max_heap_table_size=64M
2、监控临时表的使用情况
可以通过以下查询监控临时表的使用情况:
sql示例:
SHOW GLOBAL STATUS LIKE 'Created_tmp%';
运行结果:

解释:
- Created_tmp_disk_tables:表示在磁盘上创建的临时表数量。
- Created_tmp_tables:表示创建的临时表总数(包括内存和磁盘上的临时表)。
如果发现大量临时表被创建在磁盘上,可能需要优化查询或增加tmp_table_size和max_heap_table_size。
四、二进制日志管理
二进制日志(binary log)记录了所有对数据库的更改操作(如INSERT、UPDATE、DELETE等)。二进制日志用于主从复制和时间点恢复,但如果管理不当,可能会占用大量磁盘空间。
1、配置二进制日志
可以通过以下参数配置二进制日志的行为:
- log_bin:
启用二进制日志。
[mysqld]
log_bin=mysql-bin
- expire_logs_days:
设置二进制日志的保留天数。超过这个天数的日志将被自动删除。
[mysqld]
expire_logs_days=7
- binlog_format:
设置二进制日志的格式(STATEMENT、ROW 或 MIXED)。
[mysqld]
binlog_format=ROW
2、手动清理二进制日志
可以通过以下命令手动清理二进制日志:
- PURGE BINARY LOGS:
删除二进制文件和删除指定日期之前的二进制日志。
PURGE BINARY LOGS TO 'mysql-bin.000010';
PURGE BINARY LOGS BEFORE '2023-10-01 00:00:00';
运行结果:

- RESET MASTER:
删除所有二进制日志并重置日志编号。请注意,这会影响主从复制,谨慎使用。
RESET MASTER;
五、归档旧数据
随着时间的推移,数据库中的历史数据可能会变得庞大,占用大量磁盘空间。为了节省空间,可以考虑将旧数据归档到外部存储系统或专门的归档库中。
1、创建归档表
可以创建一个归档表,用于存储历史数据。归档表可以使用ARCHIVE存储引擎,它专为只读数据设计,占用较少的空间。
sql示例:
CREATE TABLE archived_orders (id INT NOT NULL AUTO_INCREMENT,order_id INT NOT NULL,order_date DATE NOT NULL,PRIMARY KEY (id)
) ENGINE=ARCHIVE;
2、归档数据
可以定期将旧数据从生产表中转移到归档表中。例如,将一年前的订单数据归档:
sql示例:
迁移数据到归档表
INSERT INTO archived_orders (order_id, order_date)
SELECT order_id, order_date
FROM orders
WHERE order_date < DATE_SUB(CURDATE(), INTERVAL 1 YEAR);
删除主业务表数据
DELETE FROM orders
WHERE order_date < DATE_SUB(CURDATE(), INTERVAL 1 YEAR);
3、使用分区表
对于大表,可以使用分区表(Partitioning)来管理数据。分区表可以根据特定的条件(如日期、范围、列表等)将数据分成多个物理部分,便于管理和归档。
sql示例:
CREATE TABLE orders (id INT NOT NULL AUTO_INCREMENT,order_id INT NOT NULL,order_date DATE NOT NULL,PRIMARY KEY (id, order_date)
)
PARTITION BY RANGE (TO_DAYS(order_date)) (PARTITION p2022 VALUES LESS THAN (TO_DAYS('2023-01-01')),PARTITION p2023 VALUES LESS THAN (TO_DAYS('2024-01-01')),PARTITION p_future VALUES LESS THAN MAXVALUE
);
运行结果:

说明一下:
本例中,我们再创建表的同时,根据时间的范围定义了3个分区。
在Innodb存储引擎中,每一张表就会创建一个.ibd的表空间文件。在表空间中按照逻辑大小划分为(表空间>段>区>页>行)。回到本例来看,即order1表还是仅有一个表空间文件,只不过这一个表空间的物理分区会按照我们定义字段的范围自动在对应分区内保存数据。
总的来说,对于用户的操作是不变的,就是一张order1表,增删改查该怎么用就怎么用,没有任何变化。但是由于分区的存在,针对不同分区内的查询性能会有优化,这是Innodb自动实现的优化。对于存在大数据量的表可以采用这一种方式进行查询优化。

六、监控和报警
为了确保数据库的空间管理得当,建议设置监控和报警机制,及时发现并处理空间不足的问题。
1、监控磁盘空间
可以通过操作系统级别的工具(如df)或MySQL内部的状态变量监控磁盘空间的使用情况。
- df:
查看磁盘空间使用情况。
df -h /var/lib/mysql
- INFORMATION_SCHEMA:
查询表的空间使用情况。
SELECT table_schema, table_name, ROUND(data_length / 1024 / 1024, 2) AS data_mb,ROUND(index_length / 1024 / 1024, 2) AS index_mb,ROUND((data_length + index_length) / 1024 / 1024, 2) AS total_mbFROM information_schema.tablesWHERE table_schema = 'mydatabase'ORDER BY total_mb DESC;
运行结果:

解释:
data_mb:为数据使用的内存大小
Index_mb:为索引使用的内存大小
total_mb:为数据和索引一起使用的内存大小
2、设置报警
可以通过监控工具(如Prometheus、Zabbix、Nagios等)设置报警规则,当磁盘空间低于某个阈值时发出警报。你还可以使用MySQL的事件调度器(Event Scheduler)定期检查磁盘空间并发送通知。
sql示例:
CREATE EVENT check_disk_space
ON SCHEDULE EVERY 1 DAY
DO
BEGINIF (SELECT 1 FROM information_schema.global_status WHERE variable_name = 'Innodb_data_pending_fsyncs' AND variable_value > 100) THENINSERT INTO alerts (message) VALUES ('Disk space is running low');END IF;
END;
七、空间管理总结
MySQL的空间管理是一个多方面的任务,涉及表空间、索引、临时表、二进制日志等多个方面。
良好的空间管理可以帮助你:
- 提高数据库的性能,减少磁盘I/O。
- 节省存储成本,避免磁盘空间不足导致的服务中断。
- 优化查询性能,减少不必要的索引和临时表。
- 有效管理历史数据,避免数据膨胀。
通过合理的配置、定期的维护和监控,可以确保MySQL数据库高效、稳定地运行。
乘风破浪会有时,直挂云帆济沧海!!!
相关文章:
Mysql--运维篇--空间管理(表空间,索引空间,临时表空间,二进制日志,数据归档等)
MySQL的空间管理是指对数据库存储资源的管理和优化。确保数据库能够高效地使用磁盘空间、内存和其他系统资源。良好的空间管理不仅有助于提高数据库的性能,还能减少存储成本并防止因磁盘空间不足导致的服务中断。MySQL的空间管理涉及多个方面,包括表空间…...
JVM面试相关
JVM组成 什么是程序计数器 详细介绍Java堆 什么是虚拟机栈 能不能解释一下方法区? 直接内存相关 类加载器 什么是类加载器,类加载器有哪些 什么是双亲委派模型 类加载过程 垃圾回收 对象什么时候可以被垃圾回收器回收 JVM垃圾回收算法有那些 JVM的分代…...
【leetcode 13】哈希表 242.有效的字母异位词
原题链接 题解链接 一般哈希表都是用来快速判断一个元素是否出现集合里。 当我们想使用哈希法来解决问题的时候,我们一般会选择如下三种数据结构。 数组 set (集合) map(映射) 如果在做面试题目的时候遇到需要判断一个元素是否出现过的场景…...
Blazor开发复杂信息管理系统的优势
随着现代企业信息管理需求的不断提升,开发高效、易维护、可扩展的系统变得尤为重要。在这个过程中,Blazor作为一种新兴的Web开发框架,因其独特的优势,逐渐成为开发复杂信息管理系统的首选技术之一。本文将结合Blazor在开发复杂信息…...
ue5 1.平A,两段连击蒙太奇。鼠标点一下,就放2段动画。2,动画混合即融合,边跑边挥剑,3,动画通知,动画到某一帧,把控制权交给蓝图。就执行蓝图节点
新建文件夹 创建一个蒙太奇MA_Melee 找到c_slow 调节一下速度 把D_slow拖上去 中间加一个片段 哎呀呀,写错了,我想写2 把这个标记拖过来,点击默认default 弄第二个片段 就会自己变成这个样子 把2这个标记拖到中间 鼠标左键&a…...
2025,AI走向何方?暴雨技术专家为您展望
过去一年中,人工智能技术飞速发展,在各行各业都收获了巨大进展。面对即将到来的2025年,暴雨技术研发团队的专家对AI领域的发展趋势进行了展望,让我们来看看未来一年,有哪些重要趋势值得关注。 迈向关键转折的一步 20…...
Threejs实现 区块链网络效应
大家好!我是 [数擎 AI],一位热爱探索新技术的前端开发者,在这里分享前端和 Web3D、AI 技术的干货与实战经验。如果你对技术有热情,欢迎关注我的文章,我们一起成长、进步! 开发领域:前端开发 | A…...
宁德时代C++后端开发面试题及参考答案
请阐述面向对象的三大特性。 面向对象编程有三大特性,分别是封装、继承和多态。 封装是指将数据和操作数据的方法绑定在一起,对数据的访问和操作进行限制。这样做的好处是可以隐藏对象的内部细节,只暴露必要的接口给外部。例如,我们可以把一个汽车类的内部引擎状态、速度等…...
【三维数域】三维数据调度-负载均衡和资源优化
在处理大规模三维数据时,负载均衡和资源优化是确保系统高效运行、提供流畅用户体验的关键。这两者不仅影响到系统的性能和稳定性,还直接决定了用户交互的质量。以下是关于如何在三维数据调度中实现有效的负载均衡和资源优化的详细探讨。 一、负载均衡 负…...
Linux服务器网络丢包场景及解决办法
一、Linux网络丢包概述 在数字化浪潮席卷的当下,网络已然成为我们生活、工作与娱乐不可或缺的基础设施,如同空气般,无孔不入地渗透到各个角落。对于 Linux 系统的用户而言,网络丢包问题却宛如挥之不去的 “噩梦”,频繁…...
【信息系统项目管理师】高分论文:论信息系统项目的采购管理(数据中台项目)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 1、规划采购管理。2、实施采购3、控制采购2022年3月,我以项目经理的身份参加了xx银行xx省分行的数据中台项目。该项目历时10个月,项目经费500万。通过该项目,我们搭建了数据中台,实现了实时的、灵活可配的数…...
AI语音机器人大模型是什么?
AI语音机器人的大模型通常是指具有庞大参数规模和复杂结构的深度学习模型,这些模型能够处理大量数据并从中学习复杂的模式和关系,从而在语音识别、自然语言处理、语音合成等任务上表现出色。以下是AI语音机器人中大模型的具体介绍: 1.大模型…...
极客说|Azure AI Agent Service 结合 AutoGen/Semantic Kernel 构建多智能体解决⽅案
作者:卢建晖 - 微软高级云技术布道师 「极客说」 是一档专注 AI 时代开发者分享的专栏,我们邀请来自微软以及技术社区专家,带来最前沿的技术干货与实践经验。在这里,您将看到深度教程、最佳实践和创新解决方案。关注「极客说」&am…...
SparrowRTOS系列:链表版本内核
前言 Sparrow RTOS是笔者之前写的一个极简性RTOS,初代版本只有400行,后面笔者又添加了消息队列、信号量、互斥锁三种IPC机制,使之成为一个较完整、堪用的内核,初代版本以简洁为主,使用数组和表作为任务挂载的抽象数据…...
Elasticsearch—索引库操作(增删查改)
Elasticsearch中Index就相当于MySQL中的数据库表 Mapping映射就类似表的结构。 因此我们想要向Elasticsearch中存储数据,必须先创建Index和Mapping 1. Mapping映射属性 Mapping是对索引库中文档的约束,常见的Mapping属性包括: type:字段数据类…...
RabbitMQ高级篇
目录 确保发送者的可靠 为什么需要确保发送者的可靠性 RabbitMQ 的发送者重连机制配置 springAMQP实现发送者确认 MQ的可靠性 为什么需要实现MQ的可靠性? 数据持久化 Lazy Queue 核心思想 总结RabbitMQ 如何保证消息的可靠性 持久化 Lazy Queue 消息…...
R4-LSTM学习笔记
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 LSTM-火灾温度预测 导入数据数据可视化设置X、y构建模型调用模型个人总结LSTM 的基本结构细胞状态(Cell State)LSTM 的优点 导入数据 i…...
Unity搭配VS Code使用
1.Unity编辑器中设置External Tools为VS Code Edit->Preferces->External Tools->Visual Studio Code 2.VS Code安装Unity插件 快捷键“CtrlShiftX”输入“Unity”点击“Install” 3.下载安装.Net 下载 .NET 8.0 (Linux、macOS 和 Windows) 下载完成后安装.Net输…...
Go Ebiten小游戏开发:井字棋
今天我将分享如何使用 Go 语言和 Ebiten 游戏库开发一个简单的井字棋游戏。Ebiten 是一个轻量级的 2D 游戏库,非常适合用来开发小型游戏。通过这个项目,我们可以学习到如何使用 Ebiten 处理输入、渲染图形以及管理游戏状态。 项目概述 井字棋是一个经典…...
嵌入式系统中的 OpenCV 与 OpenGLES 协同应用
🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 一、OpenCV 在嵌入式中的基石地位二、OpenGLES 为嵌入式图形渲染赋能三、二者协同的精妙之处四、面临的挑战与应对策略 在嵌入式开…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...
Mac flutter环境搭建
一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...
