Ubuntu 上 Informix 数据压缩与解压实用指南
一 场景与方式概览
- 表级/分片级行数据压缩与解压:在数据库内部对表或分片启用压缩、评估压缩收益、执行压缩/解压,并可结合重组回收空间。适用于在线业务数据降本增效。
- 操作系统层面的备份压缩与解压:使用 dbexport/dbimport 导出为文本后,用 tar/gzip 等工具打包压缩,便于迁移与长期归档。适用于跨环境迁移、冷备份与离线保存。
二 表级与分片级压缩与解压
- 前提条件
- 连接 sysadmin 数据库(默认仅 informix 可连),并具备 DBSA 权限。
- 估算压缩收益
- 估算整表:EXECUTE FUNCTION task(“table estimate_compression”, “table_name”, “database_name”, “owner_name”);
- 估算分片:EXECUTE FUNCTION task(“fragment estimate_compression”, “partnum_list”);
- 输出包含:估算压缩率、当前压缩率、可节约百分比、分区号等,用于判断是否需要压缩或重压缩。
- 执行压缩
- 一键压缩并回收碎片:EXECUTE FUNCTION task(“table compress repack shrink”, “tabname”, “dbname”, “owner”);
- 仅压缩(不回收):EXECUTE FUNCTION task(“table compress”, “tabname”, “dbname”, “owner”);
- 解压
- 在线解压:EXECUTE FUNCTION task(“table uncompress”, “tabname”, “dbname”, “owner”);
- 离线解压(维护窗口):EXECUTE FUNCTION task(“fragment uncompress_offline”, “partnum”);
- 重组与空间回收
- 离线重组:EXECUTE FUNCTION task(“table repack_offline”, “tabname”, “dbname”, “owner”);
- 收缩空间:EXECUTE FUNCTION task(“table shrink”, “tabname”, “dbname”, “owner”);
- 按分片操作
- 获取分片号:
- SELECT a.tabname, b.dbspace, b.partn AS partnum, b.exprtext
FROM systables a, sysfragments b
WHERE a.tabid = b.tabid AND a.tabname = ‘your_table’;
- 压缩某分片:EXECUTE FUNCTION admin(“fragment compress”, “partnum”);
- 重组并收缩分片:EXECUTE FUNCTION task(“fragment repack shrink”, “partnum”);
- 使用提示
- 压缩/解压会消耗 CPU,建议在低峰期执行;压缩后建议执行 repack shrink 回收碎片。
- 对大表可先按分片评估与压缩,降低一次性资源占用。
三 操作系统层面的备份压缩与解压
- 导出与压缩
- 导出:dbexport -o /path/to/exp dbname
- 打包压缩:tar czvf dbname.tar.gz /path/to/exp
- 解压与导入
- 解压:tar zxvf dbname.tar.gz
- 导入:dbimport -c -i /path/to/exp dbname
- 说明
- 该方式便于跨平台迁移与长期归档;导入前确保目标环境 dbspace 与 日志模式 已准备就绪。
四 常用命令速查表
| 目标 |
命令示例 |
| 估算表压缩收益 |
EXECUTE FUNCTION task(“table estimate_compression”, “t1”, “db1”, “owner”); |
| 估算分片压缩收益 |
EXECUTE FUNCTION task(“fragment estimate_compression”, “0x00300002”); |
| 压缩并回收空间 |
EXECUTE FUNCTION task(“table compress repack shrink”, “t1”, “db1”, “owner”); |
| 仅压缩 |
EXECUTE FUNCTION task(“table compress”, “t1”, “db1”, “owner”); |
| 在线解压 |
EXECUTE FUNCTION task(“table uncompress”, “t1”, “db1”, “owner”); |
| 离线解压分片 |
EXECUTE FUNCTION task(“fragment uncompress_offline”, “14680071”); |
| 离线重组分片 |
EXECUTE FUNCTION task(“table repack_offline”, “t1”, “db1”, “owner”); |
| 收缩空间 |
EXECUTE FUNCTION task(“table shrink”, “t1”, “db1”, “owner”); |
| 导出与压缩备份 |
dbexport -o /exp/db1; tar czvf db1.tar.gz /exp/db1 |
| 解压与导入恢复 |
tar zxvf db1.tar.gz; dbimport -c -i /exp db1 |
五 实践建议
- 先做压缩收益评估(estimate_compression),再决定是否压缩或重压缩;对大表按分片逐步执行,降低峰值资源占用。
- 压缩/解压与重组均建议在维护窗口进行,并关注 CPU 与 I/O;压缩完成后执行 repack shrink 回收空间。
- 操作系统级备份压缩适合迁移与归档;导入前检查目标 dbspace 与 日志模式,避免创建到 rootdbs 或日志模式不符。