当前位置: 首页 > news >正文

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的空间管理是指对数据库存储资源的管理和优化。确保数据库能够高效地使用磁盘空间、内存和其他系统资源。良好的空间管理不仅有助于提高数据库的性能&#xff0c;还能减少存储成本并防止因磁盘空间不足导致的服务中断。MySQL的空间管理涉及多个方面&#xff0c;包括表空间…...

JVM面试相关

JVM组成 什么是程序计数器 详细介绍Java堆 什么是虚拟机栈 能不能解释一下方法区&#xff1f; 直接内存相关 类加载器 什么是类加载器&#xff0c;类加载器有哪些 什么是双亲委派模型 类加载过程 垃圾回收 对象什么时候可以被垃圾回收器回收 JVM垃圾回收算法有那些 JVM的分代…...

【leetcode 13】哈希表 242.有效的字母异位词

原题链接 题解链接 一般哈希表都是用来快速判断一个元素是否出现集合里。 当我们想使用哈希法来解决问题的时候&#xff0c;我们一般会选择如下三种数据结构。 数组 set &#xff08;集合&#xff09; map(映射) 如果在做面试题目的时候遇到需要判断一个元素是否出现过的场景…...

Blazor开发复杂信息管理系统的优势

随着现代企业信息管理需求的不断提升&#xff0c;开发高效、易维护、可扩展的系统变得尤为重要。在这个过程中&#xff0c;Blazor作为一种新兴的Web开发框架&#xff0c;因其独特的优势&#xff0c;逐渐成为开发复杂信息管理系统的首选技术之一。本文将结合Blazor在开发复杂信息…...

ue5 1.平A,两段连击蒙太奇。鼠标点一下,就放2段动画。2,动画混合即融合,边跑边挥剑,3,动画通知,动画到某一帧,把控制权交给蓝图。就执行蓝图节点

新建文件夹 创建一个蒙太奇MA_Melee 找到c_slow 调节一下速度 把D_slow拖上去 中间加一个片段 哎呀呀&#xff0c;写错了&#xff0c;我想写2 把这个标记拖过来&#xff0c;点击默认default 弄第二个片段 就会自己变成这个样子 把2这个标记拖到中间 鼠标左键&a…...

2025,AI走向何方?暴雨技术专家为您展望

过去一年中&#xff0c;人工智能技术飞速发展&#xff0c;在各行各业都收获了巨大进展。面对即将到来的2025年&#xff0c;暴雨技术研发团队的专家对AI领域的发展趋势进行了展望&#xff0c;让我们来看看未来一年&#xff0c;有哪些重要趋势值得关注。 迈向关键转折的一步 20…...

Threejs实现 区块链网络效应

大家好&#xff01;我是 [数擎 AI]&#xff0c;一位热爱探索新技术的前端开发者&#xff0c;在这里分享前端和 Web3D、AI 技术的干货与实战经验。如果你对技术有热情&#xff0c;欢迎关注我的文章&#xff0c;我们一起成长、进步&#xff01; 开发领域&#xff1a;前端开发 | A…...

宁德时代C++后端开发面试题及参考答案

请阐述面向对象的三大特性。 面向对象编程有三大特性,分别是封装、继承和多态。 封装是指将数据和操作数据的方法绑定在一起,对数据的访问和操作进行限制。这样做的好处是可以隐藏对象的内部细节,只暴露必要的接口给外部。例如,我们可以把一个汽车类的内部引擎状态、速度等…...

【三维数域】三维数据调度-负载均衡和资源优化

在处理大规模三维数据时&#xff0c;负载均衡和资源优化是确保系统高效运行、提供流畅用户体验的关键。这两者不仅影响到系统的性能和稳定性&#xff0c;还直接决定了用户交互的质量。以下是关于如何在三维数据调度中实现有效的负载均衡和资源优化的详细探讨。 一、负载均衡 负…...

Linux服务器网络丢包场景及解决办法

一、Linux网络丢包概述 在数字化浪潮席卷的当下&#xff0c;网络已然成为我们生活、工作与娱乐不可或缺的基础设施&#xff0c;如同空气般&#xff0c;无孔不入地渗透到各个角落。对于 Linux 系统的用户而言&#xff0c;网络丢包问题却宛如挥之不去的 “噩梦”&#xff0c;频繁…...

【信息系统项目管理师】高分论文:论信息系统项目的采购管理(数据中台项目)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 1、规划采购管理。2、实施采购3、控制采购2022年3月,我以项目经理的身份参加了xx银行xx省分行的数据中台项目。该项目历时10个月,项目经费500万。通过该项目,我们搭建了数据中台,实现了实时的、灵活可配的数…...

AI语音机器人大模型是什么?

AI语音机器人的大模型通常是指具有庞大参数规模和复杂结构的深度学习模型&#xff0c;这些模型能够处理大量数据并从中学习复杂的模式和关系&#xff0c;从而在语音识别、自然语言处理、语音合成等任务上表现出色。以下是AI语音机器人中大模型的具体介绍&#xff1a; 1.大模型…...

极客说|Azure AI Agent Service 结合 AutoGen/Semantic Kernel 构建多智能体解决⽅案

作者&#xff1a;卢建晖 - 微软高级云技术布道师 「极客说」 是一档专注 AI 时代开发者分享的专栏&#xff0c;我们邀请来自微软以及技术社区专家&#xff0c;带来最前沿的技术干货与实践经验。在这里&#xff0c;您将看到深度教程、最佳实践和创新解决方案。关注「极客说」&am…...

SparrowRTOS系列:链表版本内核

前言 Sparrow RTOS是笔者之前写的一个极简性RTOS&#xff0c;初代版本只有400行&#xff0c;后面笔者又添加了消息队列、信号量、互斥锁三种IPC机制&#xff0c;使之成为一个较完整、堪用的内核&#xff0c;初代版本以简洁为主&#xff0c;使用数组和表作为任务挂载的抽象数据…...

Elasticsearch—索引库操作(增删查改)

Elasticsearch中Index就相当于MySQL中的数据库表 Mapping映射就类似表的结构。 因此我们想要向Elasticsearch中存储数据,必须先创建Index和Mapping 1. Mapping映射属性 Mapping是对索引库中文档的约束&#xff0c;常见的Mapping属性包括&#xff1a; type&#xff1a;字段数据类…...

RabbitMQ高级篇

目录 确保发送者的可靠 为什么需要确保发送者的可靠性 RabbitMQ 的发送者重连机制配置 springAMQP实现发送者确认 MQ的可靠性 为什么需要实现MQ的可靠性&#xff1f; 数据持久化 Lazy Queue 核心思想 总结RabbitMQ 如何保证消息的可靠性 持久化 Lazy Queue 消息…...

R4-LSTM学习笔记

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 LSTM-火灾温度预测 导入数据数据可视化设置X、y构建模型调用模型个人总结LSTM 的基本结构细胞状态&#xff08;Cell State&#xff09;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 游戏库&#xff0c;非常适合用来开发小型游戏。通过这个项目&#xff0c;我们可以学习到如何使用 Ebiten 处理输入、渲染图形以及管理游戏状态。 项目概述 井字棋是一个经典…...

嵌入式系统中的 OpenCV 与 OpenGLES 协同应用

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 一、OpenCV 在嵌入式中的基石地位二、OpenGLES 为嵌入式图形渲染赋能三、二者协同的精妙之处四、面临的挑战与应对策略 在嵌入式开…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)

第一篇&#xff1a;Liunx环境下搭建PaddlePaddle 3.0基础环境&#xff08;Liunx Centos8.5安装Python3.10pip3.10&#xff09; 一&#xff1a;前言二&#xff1a;安装编译依赖二&#xff1a;安装Python3.10三&#xff1a;安装PIP3.10四&#xff1a;安装Paddlepaddle基础框架4.1…...

Linux安全加固:从攻防视角构建系统免疫

Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...

【实施指南】Android客户端HTTPS双向认证实施指南

&#x1f510; 一、所需准备材料 证书文件&#xff08;6类核心文件&#xff09; 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...