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_mb
  FROM information_schema.tables
  WHERE 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
BEGIN
    IF (SELECT 1 FROM information_schema.global_status WHERE variable_name = 'Innodb_data_pending_fsyncs' AND variable_value > 100) THEN
        INSERT INTO alerts (message) VALUES ('Disk space is running low');
    END IF;
END;

七、空间管理总结

MySQL的空间管理是一个多方面的任务,涉及表空间、索引、临时表、二进制日志等多个方面。

良好的空间管理可以帮助你:

  • 提高数据库的性能,减少磁盘I/O。
  • 节省存储成本,避免磁盘空间不足导致的服务中断。
  • 优化查询性能,减少不必要的索引和临时表。
  • 有效管理历史数据,避免数据膨胀。
    通过合理的配置、定期的维护和监控,可以确保MySQL数据库高效、稳定地运行。

乘风破浪会有时,直挂云帆济沧海!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32之LWIP网络通讯设计-下(十五)

STM32F407 系列文章 - ETH-LWIP&#xff08;十五&#xff09; 目录 前言 一、软件设计 二、CubeMX实现 1.配置前准备 2.CubeMX配置 1.ETH模块配置 2.时钟模块配置 3.中断模块配置 4.RCC及SYS配置 5.LWIP模块配置 3.生成代码 1.main文件 2.用户层源文件 3.用户层头…

Gateway 网关

1.Spring Cloud Gateway Spring cloud gateway是spring官方基于Spring 5.0、Spring Boot2.0和Project Reactor等技术开发的网关&#xff0c;Spring Cloud Gateway旨在为微服务架构提供简单、有效和统一的API路由管理方式&#xff0c;Spring Cloud Gateway作为Spring Cloud生态…

数据结构:栈(Stack)和队列(Queue)—面试题(二)

1. 用队列实现栈。 习题链接https://leetcode.cn/problems/implement-stack-using-queues/description/描述&#xff1a; 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&a…

在 .NET 9 中使用 Scalar 替代 Swagger

前言 在.NET 9发布以后ASP.NET Core官方团队发布公告已经将Swashbuckle.AspNetCore&#xff08;一个为ASP.NET Core API提供Swagger工具的项目&#xff09;从ASP.NET Core Web API模板中移除&#xff0c;这意味着以后我们创建Web API项目的时候不会再自动生成Swagger API文档了…

双模充电桩发展前景:解锁新能源汽车未来的金钥匙,市场潜力无限

随着全球能源转型的浪潮席卷而来&#xff0c;新能源汽车行业正以前所未有的速度蓬勃发展&#xff0c;而作为其坚实后盾的充电基础设施&#xff0c;特别是双模充电桩&#xff0c;正逐渐成为推动这一变革的关键力量。本文将从多维度深入剖析双模充电桩的市场现状、显著优势、驱动…

Notepad++上NppFTP插件的安装和使用教程

一、NppFTP插件下载 图示是已经安装好了插件。 在搜索框里面搜NppFTP&#xff0c;一般情况下&#xff0c;自带的下载地址容易下载失败。这里准备了一个下载连接&#xff1a;Release v0.29.10 ashkulz/NppFTP GitHub 这里我下载的是x86版本 下载好后在nodepad的插件里面选择打…

Mysql--运维篇--备份和恢复(逻辑备份,mysqldump,物理备份,热备份,温备份,冷备份,二进制文件备份和恢复等)

MySQL 提供了多种备份方式&#xff0c;每种方式适用于不同的场景和需求。根据备份的粒度、速度、恢复时间和对数据库的影响&#xff0c;可以选择合适的备份策略。主要备份方式有三大类&#xff1a;逻辑备份&#xff08;mysqldump&#xff09;&#xff0c;物理备份和二进制文件备…

在 Safari 浏览器中,快速将页面恢复到 100% 缩放(也就是默认尺寸)Command (⌘) + 0 (零)

在 Safari 浏览器中&#xff0c;没有一个专门的快捷键可以将页面恢复到默认的缩放比例。 但是&#xff0c;你可以使用以下两种方法快速将页面恢复到 100% 缩放&#xff08;也就是默认尺寸&#xff09;&#xff1a; 方法一&#xff1a;使用快捷键 (最常用) Command (⌘) 0 (零…

LLMs之RAG:《EdgeRAG: Online-Indexed RAG for Edge Devices》翻译与解读

LLMs之RAG&#xff1a;《EdgeRAG: Online-Indexed RAG for Edge Devices》翻译与解读 导读&#xff1a;这篇论文针对在资源受限的边缘设备上部署检索增强生成 (RAG) 系统的挑战&#xff0c;提出了一种名为 EdgeRAG 的高效方法。EdgeRAG 通过巧妙地结合预计算、在线生成和缓存策…

探索网络安全:浅析文件上传漏洞

前言 在数字化时代&#xff0c;网络安全已成为我们每个人都需要关注的重要议题。无论是个人隐私保护&#xff0c;还是企业数据安全&#xff0c;网络威胁无处不在。了解网络安全的基本知识和防护措施&#xff0c;对我们每个人来说都至关重要。 网络安全 网络安全并非只是对网…

Therabody 与Garmin联手,共同推进运动恢复与健康科技新突破

本次合作以数据整合、人工智能驱动的数字教练与科学研究为重点&#xff0c;旨在更好地了解科学恢复对运动表现的影响 &#xff08;2025年1月13日&#xff0c;中国上海&#xff09;全球健康领导者Therabody宣布与智能手表品牌Garmin佳明建立战略合作关系&#xff0c;共同致力于…

Cloudflare中转Gemini API,国内免费爽用,Gemini编程,音视频,多模态能力测试

视频版&#xff1a; Cloudflare中转顶级大模型API&#xff0c;国内免费爽用&#xff0c;Gemini编程&#xff0c;音视频&#xff0c;多模态能力测试 谷歌Gemini是所有一线顶级大模型当中唯一一个API可以免费白嫖的。本期视频&#xff0c;我们借助互联网大善人Cloudflare来中转一…

腾讯云AI代码助手编程挑战赛-算法小助手

作品简介 一个可以帮助学习计算机各种算法的AI小助手&#xff0c;提升工作效率。 技术架构 使用Html语言完成图形化页面的样式&#xff0c;使用JavaScript语言来操作对应的逻辑代码。 实现过程 1、创建一个界面 2、获取数据 3、添加按钮与功能 4、程序优化调试 开发环境…

网络安全实验之钓鱼网站的制作及技巧

在红队攻击中&#xff0c;除漏洞以外最简洁高效的攻击方式无疑是钓鱼攻击&#xff0c;通过不同的钓鱼方式可达到不同的攻击效果&#xff0c;本次我会分享最常见的钓鱼手段之一的网站钓鱼技术&#xff0c;同时对可实现的攻击操作进行演示。 更多网站钓鱼实验科普&#xff0c;可…

用户注册模块用户校验(头条项目-05)

1 用户注册后端逻辑 1.1 接收参数 username request.POST.get(username) password request.POST.get(password) phone request.POST.get(phone) 1.2 校验参数 前端校验过的后端也要校验&#xff0c;后端的校验和前端的校验是⼀致的 # 判断参数是否⻬全 # 判断⽤户名是否…

linux-28 文本管理(一)文本查看,cat,tac,more,less,head,tail

之前提到过linux的几个重要哲学思想&#xff0c;使用纯文本文件保存软件的配置信息是其中之一&#xff0c;所以大多数情况下&#xff0c;我们对整个系统的操作&#xff0c;都是通过编辑它的配置文件来完成&#xff0c;那也就意味着&#xff0c;处理文本文件是我们作为系统管理员…

JVM面试相关

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

【Unity3D】利用IJob、Burst优化处理切割物体

参考文章&#xff1a; 【Unity】切割网格 【Unity3D】ECS入门学习&#xff08;一&#xff09;导入及基础学习_unity ecs教程-CSDN博客 【Unity3D】ECS入门学习&#xff08;十二&#xff09;IJob、IJobFor、IJobParallelFor_unity ijobparallelfor-CSDN博客 工程资源地址&…

Armv8/Armv9架构从入门到精通-介绍

CSDN学院课程连接&#xff1a;https://edu.csdn.net/course/detail/39573 1 讲师介绍 拥有 12 年手机安全、汽车安全、芯片安全开发经验&#xff0c;擅长 Trustzone/TEE/ 安全的设计与开发&#xff0c;对 ARM 架构的安全领域有着深入的研究和丰富的实践经验&#xff0c;能够…

Cesium小知识:pointPrimitive collection 详解

Cesium.PointPrimitiveCollection 是 Cesium 中用于高效管理和渲染大量点(points)的一个类。它允许你创建和管理大量的 PointPrimitive 实例,这些实例可以用来表示地理空间中的点数据,如传感器位置、车辆位置、兴趣点等。与直接使用 Cesium.Entity 相比,PointPrimitiveCol…