Oracle提供了表级、分区级、表空间级的压缩功能,通过SQL命令直接实现数据压缩,适用于OLTP、DSS等不同场景,且对应用程序透明。
Oracle支持多种压缩方法,可通过CREATE TABLE
或ALTER TABLE
命令设置:
CREATE TABLE t_basic (id NUMBER, name VARCHAR2(10)) COMPRESS; -- 等同于COMPRESS BASIC
CREATE TABLE t_oltp (id NUMBER, name VARCHAR2(10)) COMPRESS FOR OLTP;
QUERY LOW/HIGH
(低/高压缩比,中等CPU开销)和ARCHIVE LOW/HIGH
(最高压缩比,高CPU开销)。CREATE TABLE t_warehouse (id NUMBER, name VARCHAR2(10)) COMPRESS FOR QUERY HIGH;
CREATE TABLE t_archive (id NUMBER, name VARCHAR2(10)) COMPRESS FOR ARCHIVE HIGH;
分区表可对不同分区设置不同压缩方法,灵活适配业务需求:
-- 创建分区表
CREATE TABLE sales (id NUMBER, sale_date DATE, amount NUMBER)
PARTITION BY RANGE (sale_date) (
PARTITION p_2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD')),
PARTITION p_2024 VALUES LESS THAN (TO_DATE('2025-01-01', 'YYYY-MM-DD'))
);
-- 修改分区压缩方法(仅对新数据有效)
ALTER TABLE sales MODIFY PARTITION p_2023 COMPRESS FOR OLTP;
ALTER TABLE sales MOVE PARTITION p_2024 COMPRESS FOR ARCHIVE HIGH; -- 移动分区(重写数据,压缩已有数据)
ALTER INDEX idx_name REBUILD
);ALTER TABLE ... MOVE
重新压缩。通过压缩表空间,可默认压缩该表空间下所有新创建的表,简化管理:
ALTER TABLESPACE users COMPRESS FOR OLTP; -- 将USERS表空间设为OLTP压缩
注:已有表需通过
ALTER TABLE ... MOVE
迁移至压缩表空间,才能应用压缩。
Oracle备份文件(如数据泵导出文件.dmp
、RMAN备份集)体积较大,可通过Linux系统工具(如gzip
、bzip2
)压缩,节省存储空间。
# 压缩文件(生成.gz格式)
gzip /u01/backup/exp_full_20250929.dmp
# 解压文件
gunzip /u01/backup/exp_full_20250929.dmp.gz
# 压缩文件(生成.bz2格式)
bzip2 /u01/backup/exp_full_20250929.dmp
# 解压文件
bunzip2 /u01/backup/exp_full_20250929.dmp.bz2
# 压缩文件(生成.zip格式)
zip /u01/backup/exp_full_20250929.zip /u01/backup/exp_full_20250929.dmp
# 解压文件
unzip /u01/backup/exp_full_20250929.zip
通常在Oracle备份(如数据泵导出)后,立即压缩备份文件:
# 1. 导出数据库(全库导出)
exp system/password@orcl file=/u01/backup/exp_full_20250929.dmp full=y
# 2. 压缩备份文件
gzip /u01/backup/exp_full_20250929.dmp
# 3. 备份控制文件(可选)
cp $ORACLE_HOME/dbs/spfileorcl.ora /u01/backup/
cp $ORACLE_HOME/dbs/orapworcl /u01/backup/
# 4. 压制控制文件
gzip /u01/backup/spfileorcl.ora
gzip /u01/backup/orapworcl
通过Shell脚本实现定时备份与压缩,减少人工干预:
#!/bin/bash
# 定义变量
BACKUP_DIR="/u01/backup"
DATE=$(date +%Y%m%d_%H%M%S)
DUMP_FILE="$BACKUP_DIR/exp_full_$DATE.dmp"
GZ_FILE="$DUMP_FILE.gz"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 导出数据库
exp system/password@orcl file=$DUMP_FILE full=y
# 压缩备份文件
gzip $DUMP_FILE
# 删除超过7天的备份文件(可选)
find $BACKUP_DIR -name "exp_full_*.gz" -mtime +7 -exec rm {} \;
echo "备份完成:$GZ_FILE"
将脚本保存为backup_compress.sh
,赋予执行权限(chmod +x backup_compress.sh
),并通过crontab
设置定时任务(如每天凌晨2点执行)。
若使用Oracle RMAN进行备份,可直接开启压缩功能,减少备份文件大小:
-- 启用RMAN压缩(需在RMAN配置中设置)
CONFIGURE COMPRESSION ALGORITHM 'HIGH' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD TRUE;
-- 执行备份(带压缩)
RUN {
BACKUP DATABASE PLUS ARCHIVELOG COMPRESS;
}
RMAN压缩适用于数据库全备、增量备份等场景,与Linux系统工具压缩互补(可先RMAN压缩,再用gzip
二次压缩)。
以上方法覆盖了Oracle在Linux上的主要数据压缩场景,可根据业务需求选择合适的方式(如数据库内部压缩用于日常数据存储,系统工具压缩用于备份文件归档)。