【问题标题】:Compressing data during spooling from oracle table在从 oracle 表假脱机期间压缩数据
【发布时间】:2017-04-29 20:24:11
【问题描述】:

我们正在从 Linux 服务器的 oracle 表中将数据假脱机到 CSV 文件中。

使用以下代码:

sqlplus -s Schema_User/Schema_Password@DB_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。

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

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

请提出一种我们可以在假脱机过程中压缩数据的方法。

我应该先从 oracle 表创建一个压缩的临时表,然后再进行假脱机吗?

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

【问题讨论】:

  • 如果您需要构建 CSV,压缩表如何帮助压缩生成的 CSV?一种方法是在某个表中构建您的 CSV,然后实施一些压缩算法来创建(例如)一个包含 CSV 的 ZIP 文件。另一种方法可能是将您的 CSV 拆分为更多文件,然后将它们连接起来。
  • 我已修改代码以在假脱机期间压缩数据: mknod ./Temp/ABC.csv p sqlplus -s Schema_User/Schema_Password@DB_Service /tmp/out1.gz \& spool ./Temp/ABC。 csv 从 ABC 中选择 COLUMN1,COLUMN2;假脱机 EOF 但我需要 tar.bz2 格式的压缩文件,而不是 gz 格式的压缩文件。另外我不确定上述过程是否会影响数据。
  • sqlcl 进行自动 CSV 格式化,它还允许您运行 javascript,因此您可以使用它的变体来压缩进入假脱机的数据github.com/oracle/oracle-db-tools/commit/…

标签: linux oracle csv scripting oracle-export-dump


【解决方案1】:

我已将我的代码修改如下,现在可以正常工作了:

mknod ../Temp/ABC.csv p
nohup gzip -c < ../Temp/ABC.csv > ../Files/ABC.gz &
sqlplus -s Schema_User/Schema_Password@DB_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

【讨论】:

  • 上面的代码对于 .gz 扩展非常有效,但是我们需要 .tar.bz2 中的压缩存档
【解决方案2】:

您的问题可能是因为您通过使用 set linesize 32000 而不是修剪来引入大量尾随空格。

将其添加到您的脚本中,就在 spool 命令之前:

set trimspool on

根据要提取的数据的列数和大小,这可以显着减小文件大小。

另外,您可能希望更改为设置 colsep '|' (不带双引号),请确保您提取的数据也不包含管道(或使用其他分隔符)

【讨论】:

    【解决方案3】:

    假设您的定义为sqlplus 的脚本称为script.sh。不是

    script.sh | gzip > data.csv.gz
    

    你在找什么?

    【讨论】:

    • 好的,那么 script.sh 将在压缩之前生成 ABC.csv 文件 gzip > data.csv.gz。 ABC.csv 的大小将超过 500GB,大于磁盘上的可用空间。
    • @Akatsuki 不是。据我了解gzipscript.sh 作为输入输出流,因此不应该有data.csv 的任何副本。这就是管道的工作原理。右侧命令将左侧命令的输出作为流而不保存或存储在任何地方。
    • @Akatsuki 看看那个:askubuntu.com/questions/744257/…
    猜你喜欢
    • 2017-04-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 2018-06-30
    • 2013-05-19
    相关资源
    最近更新 更多