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数据库高效、稳定地运行。

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Compose 的集成与导航

首先我们来看如何在 View 体系中集成 Compose。 1、迁移策略 Codelab 给出了从 View 迁移到 Compose 的策略&#xff0c;以下内容基本上来自该 Codelab。 Jetpack Compose 从设计之初就考虑到了 View 互操作性。如需迁移到 Compose&#xff0c;我们建议您执行增量迁移&#…

蓝桥杯备考:数据结构之栈 和 stack

目录 栈的概念以及栈的实现 STL 的stack 栈和stack的算法题 栈的模板题 栈的算法题之有效的括号 验证栈序列 后缀表达式 括号匹配 栈的概念以及栈的实现 栈是一种只允许在一端进行插入和删除的线性表 空栈&#xff1a;没有任何元素 入栈&#xff1a;插入元素消息 出…

gesp(C++五级)(1)洛谷:B3941:[GESP样题 五级] 小杨的锻炼

gesp(C五级)&#xff08;1&#xff09;洛谷&#xff1a;B3941&#xff1a;[GESP样题 五级] 小杨的锻炼 题目描述 小杨的班级里共有 n n n 名同学&#xff0c;每位同学都有各自的锻炼习惯。具体来说&#xff0c;第 i i i 位同学每隔 a i a_i ai​ 天就会进行一次锻炼&#x…

MIUI显示/隐藏5G开关的方法,信号弱时开启手机Wifi通话方法

5G网速虽快&#xff0c;手机功耗也大。 1.取消MIUI强制的5G&#xff0c;手动设置4G的方法&#xff01; 【小米澎湃OS, Xiaomi HyperOS显示/隐藏5G开关的方法】 1.1.小米MIUI系统升级后&#xff0c;被强制连5G&#xff0c;手动设置开关被隐藏&#xff0c;如下图&#xff1a; 1…

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生态…

python 轮廓 获取环形区域

目录 效果图&#xff1a; 代码&#xff1a; 效果图&#xff1a; 代码&#xff1a; import cv2 import numpy as np# 读取图像 image cv2.imread(rE:\project\jijia\tools_jijia\img_tools\ground_mask.jpg, cv2.IMREAD_GRAYSCALE) # 二值化图像 # 二值化图像 _, binary cv…

MySQL主从复制

文章目录 1.主从复制1.1 概念和原理1.2 案例&#xff1a;一主一从1&#xff09;准备工作2&#xff09;master3&#xff09;slave4&#xff09;测试 1.主从复制 1.1 概念和原理 1.2 案例&#xff1a;一主一从 1&#xff09;准备工作 同步时间 # 安装 ntpdate yum -y install…

网络应用技术 实验七:实现无线局域网

一、实验简介 在 eNSP 中构建无线局域网&#xff0c;并实现全网移动终端互相通信。 二、实验目的 1 、理解无线局域网的工作原理&#xff1b; 2 、熟悉无线局域网的规划与构建过程&#xff1b; 3 、掌握无线局域网的配置方法&#xff1b; 三、实验学时 2 学时 四、实…

51c大模型~合集104

我自己的原文哦~ https://blog.51cto.com/whaosoft/13076849 #Deepfake Detection ACM Computing Surveys | 港大等基于可靠性视角的深度伪造检测综述&#xff0c;覆盖主流基准库、模型 本文作者包括香港大学的王天一、Kam Pui Chow&#xff0c;湖南大学的廖鑫 (共同通讯…

人工智能实验(四)-A*算法求解迷宫寻路问题实验

零、A*算法学习参考资料 1.讲解视频 A*寻路算法详解 #A星 #启发式搜索_哔哩哔哩_bilibili 2.A*算法学习网站 A* 算法简介 一、实验目的 熟悉和掌握A*算法实现迷宫寻路功能&#xff0c;要求掌握启发式函数的编写以及各类启发式函数效果的比较。 二、实验要求 同课本 附录…

Web开发(一)HTML5

Web开发&#xff08;一&#xff09;HTML5 写在前面 参考黑马程序员前端Web教程做的笔记&#xff0c;主要是想后面自己搭建网页玩。 这部分是前端HTML5CSS3移动web视频教程的HTML5部分。主要涉及到HTML的基础语法。 HTML基础 标签定义 HTML定义 HTML(HyperText Markup Lan…

LabVIEW水位监控系统

LabVIEW开发智能水位监控系统通过集成先进的传感技术与控制算法&#xff0c;为工业液体存储提供精确的水位调控&#xff0c;保证了生产过程的连续性与安全性。 项目背景 在化工和饮料生产等行业中&#xff0c;水位控制的准确性对保证生产安全和提高产品质量至关重要。传统的水…

【Rust】结构体定义域实例化

目录 思维导图 1. 结构体的定义与实例化 1.1 结构体的基本概念 1.2 定义结构体 1.3 创建结构体实例 1.4 结构体的定义与实例化示例 2. 访问与修改结构体字段 2.1 访问字段 2.2 修改字段 3. 结构体实例的构造函数 3.1 构造函数的定义 3.2 使用字段初始化简写 4. 结…

013:深度学习之神经网络

本文为合集收录&#xff0c;欢迎查看合集/专栏链接进行全部合集的系统学习。 合集完整版请参考这里。 深度学习是机器学习中重要的一个学科分支&#xff0c;它的特点就在于需要构建多层且“深度”的神经网络。 人们在探索人工智能初期&#xff0c;就曾设想构建一个用数学方式…

Java 将RTF文档转换为Word、PDF、HTML、图片

RTF文档因其跨平台兼容性而广泛使用&#xff0c;但有时在不同的应用场景可能需要特定的文档格式。例如&#xff0c;Word文档适合编辑和协作&#xff0c;PDF文档适合打印和分发&#xff0c;HTML文档适合在线展示&#xff0c;图片格式则适合社交媒体分享。因此我们可能会需要将RT…

【2024年华为OD机试】(C卷,100分)- 攀登者1 (Java JS PythonC/C++)

一、问题描述 题目描述 攀登者喜欢寻找各种地图&#xff0c;并且尝试攀登到最高的山峰。 地图表示为一维数组&#xff0c;数组的索引代表水平位置&#xff0c;数组的元素代表相对海拔高度。其中数组元素0代表地面。 例如&#xff1a;[0,1,2,4,3,1,0,0,1,2,3,1,2,1,0]&…

day06_Spark SQL

文章目录 day06_Spark SQL课程笔记一、今日课程内容二、DataFrame详解&#xff08;掌握&#xff09;5.清洗相关的API6.Spark SQL的Shuffle分区设置7.数据写出操作写出到文件写出到数据库 三、Spark SQL的综合案例&#xff08;掌握&#xff09;1、常见DSL代码整理2、电影分析案例…

Copula算法原理和R语言股市收益率相依性可视化分析

阅读全文&#xff1a;http://tecdat.cn/?p6193 copula是将多变量分布函数与其边缘分布函数耦合的函数&#xff0c;通常称为边缘。在本视频中&#xff0c;我们通过可视化的方式直观地介绍了Copula函数&#xff0c;并通过R软件应用于金融时间序列数据来理解它&#xff08;点击文…

Spring Boot 支持哪些日志框架

Spring Boot 支持多种日志框架&#xff0c;主要包括以下几种&#xff1a; SLF4J (Simple Logging Facade for Java) Logback&#xff08;默认&#xff09;Log4j 2Java Util Logging (JUL) 其中&#xff0c;Spring Boot 默认使用 SLF4J 和 Logback 作为日志框架。如果你需要使…

OpenCV基础:视频的采集、读取与录制

从摄像头采集视频 相关接口 - VideoCapture VideoCapture 用于从视频文件、摄像头或其他视频流设备中读取视频帧。它可以捕捉来自多种源的视频。 主要参数&#xff1a; cv2.VideoCapture(source): source: 这是一个整数或字符串&#xff0c;表示视频的来源。 如果是整数&a…