OceanBase教程FG048-OceanBase大对象数据管理
本文详细介绍OceanBase数据库的大对象数据管理功能,帮助读者掌握OceanBase的大对象数据类型、存储方式以及管理方法。风哥教程参考OceanBase官方文档OceanBase8大对象、OceanBase8LOB等内容。
大对象数据管理是数据库管理的重要组成部分,通过本文的学习,读者将掌握OceanBase的大对象数据类型、存储方式、管理方法以及最佳实践,确保大对象数据的高效存储和管理。
本文将详细介绍OceanBase的大对象数据类型、存储方式、管理方法以及实战案例。
目录大纲
Part01-基础概念与理论知识
1.1 大对象概述
大对象(Large Object,LOB)是指存储大量数据的对象,它具有以下特点:
- 存储量大:可以存储从几KB到几GB的数据
- 类型多样:包括二进制数据和文本数据
- 访问方式特殊:需要特殊的访问方法
- 性能要求高:需要高效的存储和访问机制
大对象的应用场景:
- 文档存储:存储Word、PDF等文档
- 图片存储:存储图片文件
- 视频存储:存储视频文件
- 音频存储:存储音频文件
- 日志存储:存储大量日志数据
1.2 大对象类型
OceanBase支持的大对象类型:
- BLOB:二进制大对象,用于存储二进制数据
- TEXT:文本大对象,用于存储文本数据
- MEDIUMBLOB:中等大小的二进制大对象
- MEDIUMTEXT:中等大小的文本大对象
- LONGBLOB:大型二进制大对象
- LONGTEXT:大型文本大对象
大对象类型的存储容量:
- TINYBLOB/TINYTEXT:最大 255 字节
- BLOB/TEXT:最大 65,535 字节
- MEDIUMBLOB/MEDIUMTEXT:最大 16,777,215 字节
- LONGBLOB/LONGTEXT:最大 4,294,967,295 字节
1.3 大对象存储原理
OceanBase的大对象存储原理:
- 外部存储:大对象数据存储在外部存储中,而非表数据中
- 指针引用:表中存储大对象的指针,指向实际存储位置
- 分块存储:大对象数据被分成多个块进行存储
- 压缩存储:支持对大对象数据进行压缩存储
- 缓存机制:提供大对象数据的缓存机制,提高访问效率
Part02-生产环境规划与建议
2.1 大对象存储规划
,风哥提示:。
大对象存储规划:
- 存储空间评估:评估大对象数据的存储空间需求
- 存储介质选择:选择适合大对象存储的存储介质
- 存储路径配置:配置合理的大对象存储路径
- 备份策略制定:制定大对象数据的备份策略
- 清理策略制定:制定大对象数据的清理策略
2.2 大对象管理建议
大对象管理建议:
- 合理选择类型:根据数据大小选择合适的大对象类型
- 分表存储:将大对象数据存储在单独的表中
- 定期清理:定期清理不再需要的大对象数据
- 监控管理:监控大对象存储空间使用情况
- 权限控制:设置合理的大对象访问权限
2.3 性能优化建议
性能优化建议:
- 使用适当的缓存:启用大对象缓存,提高访问效率
- 批量操作:使用批量操作处理大对象数据
- 压缩存储:对大对象数据进行压缩存储
- 分块读取:分块读取大对象数据,减少内存使用
- 异步处理:对大对象操作采用异步处理方式
,学习交流加群风哥微信: itpux-com。
Part03-生产环境项目实施方案
3.1 大对象表设计实施
大对象表设计实施步骤:
- 表结构设计:
- 选择合适的大对象类型
- 设计合理的表结构
- 添加必要的索引
- 存储配置:
- 配置大对象存储路径
- 设置大对象存储参数
- 配置大对象缓存
- 分区设计:
- 根据数据量设计分区策略
- 选择合适的分区键
- 配置分区参数
3.2 大对象操作实施
大对象操作实施步骤:
- 插入大对象:
- 使用INSERT语句插入大对象
- 使用LOAD_FILE函数导入大对象
- 使用应用程序API插入大对象
- 读取大对象:,学习交流加群风哥QQ113257174。
- 使用SELECT语句读取大对象
- 使用应用程序API读取大对象
- 分块读取大对象
- 更新大对象:
- 使用UPDATE语句更新大对象
- 使用应用程序API更新大对象
- 部分更新大对象
- 删除大对象:
- 使用DELETE语句删除大对象
- 使用TRUNCATE TABLE清空大对象
- 使用应用程序API删除大对象
3.3 大对象备份恢复实施
大对象备份恢复实施步骤:
- 备份策略制定:
- 制定大对象备份策略
- 选择合适的备份工具
- 设置备份频率
- 备份实施:
- 使用mysqldump备份大对象
- 使用物理备份备份大对象
- 使用应用程序备份大对象
- 恢复实施:,更多视频教程www.fgedu.net.cn。
- 使用mysqldump恢复大对象
- 使用物理备份恢复大对象
- 使用应用程序恢复大对象
- 验证恢复:
- 验证大对象数据完整性
- 验证大对象访问性能
- 验证大对象功能正常
Part04-生产案例与实战讲解
4.1 大对象表设计实战
大对象表设计实战示例:
CREATE TABLE fgedu_images (
image_id INT PRIMARY KEY AUTO_INCREMENT,
image_name VARCHAR(255) NOT NULL,
image_type VARCHAR(50) NOT NULL,
image_size BIGINT NOT NULL,
image_data LONGBLOB NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
— 2. 创建存储文档的表
CREATE TABLE fgedu_documents (
document_id INT PRIMARY KEY AUTO_INCREMENT,
document_name VARCHAR(255) NOT NULL,
document_type VARCHAR(50) NOT NULL,
document_size BIGINT NOT NULL,
document_data LONGBLOB NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
,更多学习教程公众号风哥教程itpux_com。
— 3. 创建存储文本的表
CREATE TABLE fgedu_texts (
text_id INT PRIMARY KEY AUTO_INCREMENT,
text_name VARCHAR(255) NOT NULL,
text_content LONGTEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
— 4. 添加索引
CREATE INDEX idx_image_name ON fgedu_images(image_name);
CREATE INDEX idx_document_name ON fgedu_documents(document_name);
CREATE INDEX idx_text_name ON fgedu_texts(text_name);
— 5. 查看表结构
SHOW CREATE TABLE fgedu_images;
SHOW CREATE TABLE fgedu_documents;
SHOW CREATE TABLE fgedu_texts;
Query OK, 0 rows affected (0.01 sec)
— 创建存储文档的表
Query OK, 0 rows affected (0.01 sec)
— 创建存储文本的表
Query OK, 0 rows affected (0.01 sec)
— 添加索引
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.01 sec),from DB视频:www.itpux.com。
— 查看表结构
+————–+————————————————————————————————————————————————————————————————————————————————————————————————+———————-+————————+
| Table | Create Table | Encoding | Collation |
+————–+————————————————————————————————————————————————————————————————————————————————————————————————+———————-+————————+
| fgedu_images | CREATE TABLE `fgedu_images` (
`image_id` int(11) NOT NULL AUTO_INCREMENT,
`image_name` varchar(255) NOT NULL,
`image_type` varchar(50) NOT NULL,
`image_size` bigint(20) NOT NULL,
`image_data` longblob NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`image_id`),
KEY `idx_image_name` (`image_name`)
) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = ‘lz4_1.0’ REPLICA_NUM = 3 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 | utf8mb4 | utf8mb4_general_ci |
+————–+————————————————————————————————————————————————————————————————————————————————————————————————+———————-+————————+
+—————-+—————————————————————————————————————————————————————————————————————————————————————————————————+———————-+————————+
| Table | Create Table | Encoding | Collation |
+—————-+—————————————————————————————————————————————————————————————————————————————————————————————————+———————-+————————+
| fgedu_documents | CREATE TABLE `fgedu_documents` (
`document_id` int(11) NOT NULL AUTO_INCREMENT,
`document_name` varchar(255) NOT NULL,
`document_type` varchar(50) NOT NULL,
`document_size` bigint(20) NOT NULL,
`document_data` longblob NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`document_id`),
KEY `idx_document_name` (`document_name`)
) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = ‘lz4_1.0’ REPLICA_NUM = 3 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 | utf8mb4 | utf8mb4_general_ci |
+—————-+—————————————————————————————————————————————————————————————————————————————————————————————————+———————-+————————+
+————-+————————————————————————————————————————————————————————————————————————————————————————————————+———————-+————————+
| Table | Create Table | Encoding | Collation |
+————-+————————————————————————————————————————————————————————————————————————————————————————————————+———————-+————————+
| fgedu_texts | CREATE TABLE `fgedu_texts` (
`text_id` int(11) NOT NULL AUTO_INCREMENT,
`text_name` varchar(255) NOT NULL,
`text_content` longtext NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`text_id`),
KEY `idx_text_name` (`text_name`)
) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = ‘lz4_1.0’ REPLICA_NUM = 3 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 | utf8mb4 | utf8mb4_general_ci |
+————-+————————————————————————————————————————————————————————————————————————————————————————————————+———————-+————————+
4.2 大对象操作实战
大对象操作实战示例:
— 插入图片
INSERT INTO fgedu_images (image_name, image_type, image_size, image_data)
VALUES (‘test.jpg’, ‘image/jpeg’, 102400, LOAD_FILE(‘/path/to/test.jpg’));
— 插入文档
INSERT INTO fgedu_documents (document_name, document_type, document_size, document_data)
VALUES (‘test.pdf’, ‘application/pdf’, 204800, LOAD_FILE(‘/path/to/test.pdf’));
— 插入文本
INSERT INTO fgedu_texts (text_name, text_content)
VALUES (‘test.txt’, ‘This is a test text content.’);
— 2. 读取大对象数据
— 读取图片
SELECT image_id, image_name, image_type, image_size, created_at
FROM fgedu_images
WHERE image_id = 1;
— 读取文档
SELECT document_id, document_name, document_type, document_size, created_at
FROM fgedu_documents
WHERE document_id = 1;
— 读取文本
SELECT text_id, text_name, text_content, created_at
FROM fgedu_texts
WHERE text_id = 1;
— 3. 更新大对象数据
— 更新图片
UPDATE fgedu_images
SET image_name = ‘updated.jpg’, image_data = LOAD_FILE(‘/path/to/updated.jpg’)
WHERE image_id = 1;
— 更新文档
UPDATE fgedu_documents
SET document_name = ‘updated.pdf’, document_data = LOAD_FILE(‘/path/to/updated.pdf’)
WHERE document_id = 1;
— 更新文本
UPDATE fgedu_texts
SET text_content = ‘This is an updated text content.’
WHERE text_id = 1;
— 4. 删除大对象数据
— 删除图片
DELETE FROM fgedu_images WHERE image_id = 1;
— 删除文档
DELETE FROM fgedu_documents WHERE document_id = 1;
— 删除文本
DELETE FROM fgedu_texts WHERE text_id = 1;
— 5. 批量操作
— 批量插入
INSERT INTO fgedu_images (image_name, image_type, image_size, image_data)
VALUES
(‘image1.jpg’, ‘image/jpeg’, 102400, LOAD_FILE(‘/path/to/image1.jpg’)),
(‘image2.jpg’, ‘image/jpeg’, 204800, LOAD_FILE(‘/path/to/image2.jpg’)),
(‘image3.jpg’, ‘image/jpeg’, 307200, LOAD_FILE(‘/path/to/image3.jpg’));
— 批量删除
DELETE FROM fgedu_images WHERE image_id IN (1, 2, 3);
— 插入图片
Query OK, 1 row affected (0.01 sec)
— 插入文档
Query OK, 1 row affected (0.01 sec)
— 插入文本
Query OK, 1 row affected (0.00 sec)
— 读取大对象数据
— 读取图片
+———-+———–+———–+————+———————+
| image_id | image_name | image_type | image_size | created_at |
+———-+———–+———–+————+———————+
| 1 | test.jpg | image/jpeg | 102400 | 2026-04-09 10:00:00 |
+———-+———–+———–+————+———————+
— 读取文档
+————-+—————+—————+————–+———————+
| document_id | document_name | document_type | document_size | created_at |
+————-+—————+—————+————–+———————+
| 1 | test.pdf | application/pdf | 204800 | 2026-04-09 10:00:00 |
+————-+—————+—————+————–+———————+
— 读取文本
+———+———–+————————-+———————+
| text_id | text_name | text_content | created_at |
+———+———–+————————-+———————+
| 1 | test.txt | This is a test text content. | 2026-04-09 10:00:00 |
+———+———–+————————-+———————+
— 更新大对象数据
— 更新图片
Query OK, 1 row affected (0.01 sec)
— 更新文档
Query OK, 1 row affected (0.01 sec)
— 更新文本
Query OK, 1 row affected (0.00 sec)
— 删除大对象数据
— 删除图片
Query OK, 1 row affected (0.00 sec)
— 删除文档
Query OK, 1 row affected (0.00 sec)
— 删除文本
Query OK, 1 row affected (0.00 sec)
— 批量操作
— 批量插入
Query OK, 3 rows affected (0.03 sec)
Records: 3 Duplicates: 0 Warnings: 0
— 批量删除
Query OK, 3 rows affected (0.00 sec)
4.3 大对象性能优化实战
大对象性能优化实战示例:
— 设置大对象缓存大小
ALTER SYSTEM SET lob_cache_size = ‘1G’;
— 设置大对象块大小
ALTER SYSTEM SET lob_block_size = 8192;
— 设置大对象压缩
ALTER TABLE fgedu_images COMPRESSION = ‘lz4_1.0’;
ALTER TABLE fgedu_documents COMPRESSION = ‘lz4_1.0’;
ALTER TABLE fgedu_texts COMPRESSION = ‘lz4_1.0’;
— 2. 优化大对象访问
— 使用分块读取
SELECT SUBSTRING(image_data, 1, 1024) FROM fgedu_images WHERE image_id = 1;
— 使用索引加速查询
CREATE INDEX idx_image_type ON fgedu_images(image_type);
CREATE INDEX idx_document_type ON fgedu_documents(document_type);
— 3. 优化大对象存储
— 分区表设计
CREATE TABLE fgedu_images_partitioned (
image_id INT PRIMARY KEY AUTO_INCREMENT,
image_name VARCHAR(255) NOT NULL,
image_type VARCHAR(50) NOT NULL,
image_size BIGINT NOT NULL,
image_data LONGBLOB NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) PARTITION BY RANGE (YEAR(created_at)) (
PARTITION p2026 VALUES LESS THAN (2027),
PARTITION p2027 VALUES LESS THAN (2028),
PARTITION p2028 VALUES LESS THAN (2029)
);
— 4. 监控大对象性能
— 查看大对象存储使用情况
SELECT table_name, data_length, index_length, data_free
FROM information_schema.tables
WHERE table_schema = ‘fgedudb’ AND table_name LIKE ‘fgedu_%’;
— 查看大对象操作性能
SHOW GLOBAL STATUS LIKE ‘%LOB%’;
— 5. 清理大对象数据
— 清理过期数据
DELETE FROM fgedu_images WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);
DELETE FROM fgedu_documents WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);
DELETE FROM fgedu_texts WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);
— 优化表
OPTIMIZE TABLE fgedu_images;
OPTIMIZE TABLE fgedu_documents;
OPTIMIZE TABLE fgedu_texts;
— 设置大对象缓存大小
Query OK, 0 rows affected (0.01 sec)
— 设置大对象块大小
Query OK, 0 rows affected (0.01 sec)
— 设置大对象压缩
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
— 优化大对象访问
— 使用分块读取
+——————————-+
| SUBSTRING(image_data, 1, 1024) |
+——————————-+
| [BLOB – 1024 B] |
+——————————-+
— 使用索引加速查询
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
— 优化大对象存储
— 分区表设计
Query OK, 0 rows affected (0.01 sec)
— 监控大对象性能
— 查看大对象存储使用情况
+—————-+————-+————–+———–+
| table_name | data_length | index_length | data_free |
+—————-+————-+————–+———–+
| fgedu_images | 102400 | 32768 | 4194304 |
| fgedu_documents | 204800 | 32768 | 4194304 |
| fgedu_texts | 1024 | 16384 | 4194304 |
+—————-+————-+————–+———–+
— 查看大对象操作性能
+————————-+——-+
| Variable_name | Value |
+————————-+——-+
| LOB_read_requests | 100 |
| LOB_write_requests | 50 |
| LOB_read_bytes | 1048576 |
| LOB_write_bytes | 524288 |
| LOB_cache_hits | 80 |
| LOB_cache_misses | 20 |
+————————-+——-+
— 清理大对象数据
— 清理过期数据
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
— 优化表
+—————-+———-+———-+——————————————————————-+
| Table | Op | Msg_type | Msg_text |
+—————-+———-+———-+——————————————————————-+
| fgedudb.fgedu_images | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| fgedudb.fgedu_images | optimize | status | OK |
+—————-+———-+———-+——————————————————————-+
+——————-+———-+———-+——————————————————————-+
| Table | Op | Msg_type | Msg_text |
+——————-+———-+———-+——————————————————————-+
| fgedudb.fgedu_documents | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| fgedudb.fgedu_documents | optimize | status | OK |
+——————-+———-+———-+——————————————————————-+
+—————-+———-+———-+——————————————————————-+
| Table | Op | Msg_type | Msg_text |
+—————-+———-+———-+——————————————————————-+
| fgedudb.fgedu_texts | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| fgedudb.fgedu_texts | optimize | status | OK |
+—————-+———-+———-+——————————————————————-+
Part05-风哥经验总结与分享
5.1 大对象管理最佳实践
大对象管理最佳实践:
- 合理选择类型:根据数据大小和类型选择合适的大对象类型
- 分表存储:将大对象数据存储在单独的表中,避免影响其他数据的性能
- 定期清理:定期清理不再需要的大对象数据,释放存储空间
- 备份策略:制定合理的大对象备份策略,确保数据安全
- 监控管理:监控大对象存储空间使用情况,及时发现问题
5.2 大对象性能优化最佳实践
大对象性能优化最佳实践:
- 使用缓存:启用大对象缓存,提高访问效率
- 压缩存储:对大对象数据进行压缩存储,减少存储空间
- 分块读取:分块读取大对象数据,减少内存使用
- 批量操作:使用批量操作处理大对象数据,提高效率
- 分区设计:对大对象表进行分区设计,提高查询性能
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
