大对象 (Large object)
一种特殊的数据类型,它提供流式访问数据的方式,这些数据太大而无法作为一个整体进行操作。
一种大对象是一种特殊的数据类型,它提供流式访问数据的方式,这些数据太大而无法作为一个整体进行操作。
一个大对象最多可以包含4TB的数据,而通过TOAST机制的传统数据类型的最大容量为1GB。
用法
大对象与普通数据库对象不同之处在于,它们不能通过SQL命令进行操作(所有权和权限元数据除外)。相反,可以通过基于libpq的API进行上传、下载、修改和删除,该API也通过系统函数公开。
WAL 和复制
大对象被写入WAL,因此也通过流复制进行复制。
SQL命令
系统函数
psql 命令
\lo_exportLOBOID FILE\lo_importFILE [COMMENT]\lo_list(也实现为\dl)\lo_unlinkLOBOID
Contrib模块
系统目录关系
配置参数
变更历史
- PostgreSQL 18
- 添加了函数
has_largeobject_privilege()(提交 4eada203)
- 添加了函数
- PostgreSQL 9.4
- PostgreSQL 9.0
- 添加了
ALTER LARGE OBJECT命令 (提交 f1325ce2) - 添加了
pg_largeobject_metadata系统目录表 (提交 f1325ce2) - 添加了
lo_compat_privileges(提交 f1325ce2)
- 添加了
- PostgreSQL 8.4
- PostgreSQL 8.0
- 添加了对
COMMENT ON LARGE OBJECT的支持 (提交 42ce74bf)
- 添加了对
- PostgreSQL 6.5
- PostgreSQL 6.4
PostgreSQL 一直支持大对象。
示例
使用 psql 的大对象 斜杠命令 对大对象进行基本创建和操作。
postgres=# \lo_import /tmp/random-meme.jpg 'Some meme' lo_import 16458
postgres=# \dl Large objects ID | Owner | Description -------+----------+------------- 16458 | postgres | Some meme (1 row) postgres=# ALTER LARGE OBJECT 16458 OWNER TO lo_usr; ALTER LARGE OBJECT postgres=# \dl Large objects ID | Owner | Description -------+--------+------------- 16458 | lo_usr | Some meme (1 row) postgres=# \lo_unlink 16458 lo_unlink 16458 postgres=# \dl Large objects ID | Owner | Description ----+-------+------------- (0 rows)
参考资料
- PostgreSQL 文档: 大对象
有用链接
- 快速基准测试:Postgres 17 中大对象转储的改进 - 2024 年 12 月 Michael Banck / Credativ 的博客文章
- PostgreSQL 中的大对象 - 2023 年 1 月 David Zhang / HighGo 的博客文章
- PostgreSQL 中的 BLOB 清理 - 2020 年 12 月 CyberTec 的博客文章
- PostgreSQL TOAST 和处理 BLOB/CLOB 的解释 - 2019 年 11 月 EnterpriseDB 的教程
- 在 Postgres 中玩转大对象 - 2013 年 9 月 Michael Paquier 的博客文章
