2016-12-14 90 views
0

我们正在Linux服务器的oracle表中将数据后台处理为CSV文件。在从oracle表中假脱机过程中压缩数据

使用下面的代码:

sqlplus -s Schema_User/[email protected]_Service <<EOF 
set termout off 
set heading off 
set underline "_" 
set pagesize 0 embedded on 
set linesize 32000 
set LONG 50000 
set colsep '"|"' 
set feedback off 
spool ./Temp/ABC.csv 
Select COLUMN1,COLUMN2 from ABC; 
spool off 
EOF 

在Linux服务器上的可用空间(DF-H)是500GB。

假脱机文件ABC.csv的生成在达到500GB大小后终止。

我们怀疑ABC.csv的最终大小将远远超过500GB。

请建议我们可以在假脱机过程中压缩数据的方式。

我应该首先从oracle表创建一个压缩的临时表,然后将其假脱机?

CREATE TABLE XXX COMPRESS FOR QUERY AS SELECT * FROM ABC; 
+0

如果您需要构建CSV,压缩表如何帮助压缩生成的CSV?一种方法可能是在某个表中构建CSV,然后实施一些压缩算法来创建(例如)包含CSV的ZIP文件。另一种方法可能是将您的CSV分成多个文件,然后将它们连接起来。 – Aleksej

+0

我已修改代码的假脱机期间压缩数据: mknod的./Temp/ABC.csv p SQLPLUS -s Schema_User/Schema_Password @ DB_Service << EOF 组TERMOUT关闭 集标题关闭 组下划线 “_” 集合页大小0嵌入 组LINESIZE 32000 设置LONG 50000 组COLSEP ' “|”' 组反馈关闭 主机的nohup gzip的-c <./Temp/ABC.csv> /tmp/out1.gz \& 卷轴./Temp/ABC.csv 从ABC中选择COLUMN1,COLUMN2; 假脱机 EOF 但我需要tar.bz2格式的压缩文件,而不是gz。 另外我不确定上述过程不会影响数据。 – Akatsuki

+0

sqlcl自动进行CSV格式化,它也可以让你运行javascript,所以你可以使用这种变化来压缩数据,因为它进入假脱机https://github.com/oracle/oracle-db-tools/commit/ e82d6cd2c0585a52dda6523d179a1417652b7cc6 – thatjeffsmith

回答

0

比方说,与sqlplus定义你的脚本被称为script.sh。是不是

script.sh | gzip > data.csv.gz 

你在找什么?

+0

好吧,script.sh会在压缩gzip> data.csv.gz之前生成ABC.csv文件。 ABC.csv的大小将超过500GB,大于磁盘上的可用空间。 – Akatsuki

+1

@Akatsuki不是。据我了解''gzip'作为'script.sh'的输入输出流,所以不应该有'data.csv'的任何副本。这就是管道的工作原理。右侧命令将左侧命令的输出作为流进行传输,而不保存或存储到任何位置。 – Kacper

+1

@Akatsuki看看这个:http://askubuntu.com/questions/744257/is-it-possible-to-pipe-from-stdin-to-gzip – Kacper

1

您的问题可能是因为您正在使用set linesize 32000引入TON的尾部空格而不是修剪。

只是阀芯命令之前给你的脚本添加:

set trimspool on 

根据被提取多少列和数据的大小,这样可以减少显著文件大小。

此外,您可能需要更改为设置colsep'|' (不含双引号),只是确保你提取数据不包含管道以及(或使用其他分隔符)

0

我已经修改我的代码如下所示,工作现在罚款:

mknod ../Temp/ABC.csv p 
nohup gzip -c <../Temp/ABC.csv> ../Files/ABC.gz & 
sqlplus -s Schema_User/[email protected]_Service <<EOF 
set termout off 
set heading off 
set underline "_" 
set pagesize 0 embedded on 
set linesize 32000 
set LONG 50000 
set colsep '"|"' 
set feedback off 
set trimspool on 
spool ./Temp/ABC.csv 
Select COLUMN1,COLUMN2 from ABC; 
spool off 
EOF 
+0

上述代码完美适用于.gz扩展,但我们需要.tar.bz2中的压缩存档 – Akatsuki