ON THE FLY COMPRESSION/UNCOMPRESSION IS EASY ON UNIX, BUT ALSO ON WINDOWS

By jcarlossaez1@hotmail.com

 

ON THE FLY COMPRESSION IS EASY ON UNIX, BUT IT IS ALSO EASY ON WINDOWS

 

There are a number of situations where the output results of a program become the input data for other program (for example you may want to compress your backup file with gzip tool and the compressed file be encrypted with Rijndael algorithm using GNU aes tool)

 

When both programs support stdin and stdout as a mechanism for input output, you can easily pipe the output of the first program to the input of the second program at the command line. For example

 

gzip –c mybackupfile.bkp | aes –e -p mypass -o mybackupfile.bkp.gz.enc

 

Unfortunately, this is not always the case and some programs don’t accept stdin and stdout for data input output (this is the case of Oracle import/export tools or Microsoft bcp tool).

 

On Unix environments these cases have been typically solved using mknod tool to create an OS file pipe. Once the pipe is created, the first program is able to write its output results to the pipe as if it was a normal file and the second program is able to read data from that pipe as if it was a normal file.

 

As an example, here you can find a largely used script by Oracle DBA to perform on the fly compression of an export operation

 

# Make a pipe

mknod expdat.dmp p

# Start compress the pipe in background

gzip -c < expdat.dmp > expdat.dmp.gz &

# Wait start the export

sleep 5

# Start the export

exp scott/tiger file=expdat.dmp

 

As far as I know, there is no similar native way to perform this operation on Microsoft Windows operating system.

 

I started thinking on it and finally I got a simple solution using Microsoft Windows pipes, zlib library (http://www.zlib.net/zlib123-dll.zip ) and a couple of small tools (less than 100 lines of code each of them)  I wrote: ZipPipe.exe and UnZipPipe.exe.

 

In point 1, I will show several uses of these tools, basically how to perform on the fly compression using Oracle imp and exp tools.

To get the necessary bin files (ZipPipe.exe, UnZipPipe.exe and zlib1.dll I would suggest to read point 2 and 3 of this document, but if you have any problem to obtain these files, just drop me an e-mail at jcarlossaez1@hotmail.com

Note: You can obtain a compiled version of these tools from http://cid-b3378f057444b65c.skydrive.live.com/self.aspx/P%c3%bablico/ZipPipe/zippipe.zip You don´t need anything more than these to run the tools.

 

1 HOW TO USE ZipPipe AND UnZipPipe TOOLS

 

1.1 On the Fly compression with Oracle Exp and Imp tools

 

On Unix environments, it has been largely used scripts allowing on the fly compression of the dump file generated by exp utility.

In the same way, on the fly decompression can be achieved to perform import operations reading directly from a compressed file.

 

A typical script to perform on the fly compression for the data generated by exp utility is

 

# Make a pipe

mknod expdat.dmp p

# Start compress the pipe in background

gzip -c < expdat.dmp > expdat.dmp.gz &

# Wait start the export

sleep 5

# Start the export

exp scott/tiger file=expdat.dmp

 

A typical script to execute an import operation reading directly from a compressed file is 

 

# Make a pipe

mknod expdat.dmp p

# Start decompress to the pipe in background

gzip -c < expdat.dmp.gz > expdat.dmp > &

# Wait start the import

sleep 5

# Start the import

imp scott/tiger file=expdat.dmp

 

There is no way to accomplish this work in the same way on Windows platforms. When exporting you first export to a normal file and then, you can compress it (except using NTFS built-in compression capabilities, but this is not what we are looking for)

When importing, you need first decompress the file and then you can import the file.

 

However, whit the ZipPipe and UnZipPipe tools, you can achieve the same behaviour as you have on Unix.

 

How to perform on the fly compression while exporting on Windows platforms?

 

Until now, your bat scripts looks something similar to this

 

exp scott/tiger file=expdat.dmp

gzip  expdat.dmp expdat.dmp.gz

 

Only when exp tool finishes its job, you can start compressing the file. This way needs more disk space and in most of the cases more time.

 

Look how you can export and compress without any intermediate file

 

start /MIN ZipPipe EXPPIPE expdat.dmp.gz 9

exp scott/tiger file= \\.\pipe\EXPPIPE

 

The first line starts our “compressor engine” that listens on named pipe \\.\pipe\EXPPIPE and writes the compressed information to the file expdat.dmp.gz  with a compression level of 9 (compression level can be in the range 1 to 9)

When export tool completes the export operation, ZipPipe process detects it and ends

 

How to perform on the fly decompression while importing on Windows platforms?

 

Until now, your bat scripts looks something similar to this

 

gzip –d expdat.dmp.gz expdat.dmp

imp scott/tiger file=expdat.dmp

 

Only when decompressor tool finishes its job, you can start importing the file. This way needs more disk space and in most of the cases more time.

 

Look how you can import and decompress without any intermediate file

 

start /MIN UnZipPipe IMPPIPE expdat.dmp.gz

imp scott/tiger file= \\.\pipe\IMPIPE

 

The first line starts our “decompressor engine” that listens that reads from the compressed file expdat.dmp.gz and writes the decompressed information to named pipe \\.\pipe\IMPPIPE

When import tool completes the import operation, UnZipPipe process detects it and ends.

 

You can think on ZipPipe and UnZipPipe as the equivalent tool to mknod plus gzip in the Unix environment.

Of course, you can make many remarks to this solution, but it allows you to achieve the same functionality you have on Unix, saving lot of space in Disks and most of the times reducing import/export duration.

 

One more thing: it is a pity these tools don’t work with new expdp and impdp tools available in Oracle10g. But don’t blame to Microsoft Windows or to these tools themselves. You won’t be able to perform on the fly compression with these new tools on Unix environments too. It is due to a change in the design of these tools. (And don’t get wrong with the COMPRESS parameter of these new tools. This parameter only compresses metadata).

1.2 On the Fly compression with Microsoft bcp tool

What a terrible pity! I have been able to use these tools only to on the fly compress the output of the bcp in native format.

I can not use them for on the fly decompression when using bcp to import or even when downloading data in no native format.

Perhaps someone can make them work.

 

How do you use bcp to export pubs..authors table to an uncompressed file and then compress?

 

Typically, at the command prompt in the source SQL Server you only need to type:

 

            bcp  pubs..authors out  authors.txt -T –n

            gzip authors.txt authors.txt.gz

 

The first command exports the data and the second one compress the generated file using gzip tool

 

Note that during the process you need enough space to store authors.txt and authors.txt.gz simultaneously provided that at the end you can delete the uncompressed file.

 

How can you use bcp and ZipPipe to export pubs..authors table directly to a compressed file?

 

At the command prompt in the source SQL Server you only need to type:

 

            start /MIN ZipPipe authors_pipe authors.txt.gz 9

            bcp  pubs..authors out  \\.\pipe\authors_pipe -T -n

 

The first command starts our compressor tool (you can think this step is similar to create a pipe and start the background compressor in the Unix environment all in one step).

Second, you only need to start bcp tool, but giving the pipe \\.pipe\ authors_pipe  as the file name where bcp has to write.

 

Another  process is launched. This background process is our compressor tool that creates and listens on named pipe \\.pipe\ authors_pipe and saves the data once compressed in the file authors.txt.gz. This process automatically ends when bcp completes export operation.

 

And you can see how file authors.txt.gz is the only file generated in one step.

 

Rest of the article where you can find how to build these tools

 http://spaces.msn.com/members/jcarlossaez/Blog/cns!1phQKLZOcIUsN9Tj5QObzgdw!112.entry

 

About these ads
Esta entrada fue publicada en Informática e Internet. Guarda el enlace permanente.

Una respuesta a ON THE FLY COMPRESSION/UNCOMPRESSION IS EASY ON UNIX, BUT ALSO ON WINDOWS

  1. Unknown dijo:

    Thanks Buddy!You very help me.

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s