Alterando as Tablespaces do Oracle dentro do Dump


Digamos que você tem um dump de Oracle, e que as tabelas estejam na tablespace USERS. E que suas tabelas, ou pelo menos algumas, tenham campos [CB]LOB.
E você quer importar tudo em um novo schema que tem acesso somente a uma outra tablespace, digamos “TS_DADOS”. Quando você for fazer o import com o “IMP” você vai receber um erro dizendo que o schema não tem permissão para gravar em USERS, isto porque os cambos binários não podem ser movimentados de tablespace dentro do banco.

Tah, mas o que isto tem a ver com Python ?

A resolução do problema tem a ver…

O que fazer: Ainda dentro do arquivo de dump do oracle, que é um arquivo com dados binários e strings, antes de efetuar a importação, agente troca o nome da tablespace atual das tabelas, no caso “USERS” para o nome da tablespace que onde queremos que sejam salvos os dados, no caso “TS_DADOS”. Então poderemos importar o dump corretamente.

Eu anteriormente tentei montar um script que alterasse isto para mim dentro do arquivo mais automaticamente, porém não consegui montar algo que prestasse. Tentei com bash, com C, e até Java.. mas quando eu ia importar o dump gerado sempre ocorria algum problema ! haehaehh

Porém por estes dias montei um script em Python que faz isto e simplesmente deu certo… Isto, creio eu, porque a linguagem não faz nada por “debaixo dos panos”, não converte dada, não faz tratamento algum. Faz somente o que eu realmente mando fazer. Lê, altera e grava no novo arquivo.

Simples assim…
Segue o código:

"""
Script que percorre um arquivo e troca as tablespaces erradas dos dumps do Oracle
"""
import sys

if len(sys.argv) < 3:
    print "Informe o arquivo de entrada e de saída!"
    exit()

print "Iniciando conversao do dump..."

f2 = open(sys.argv[2],'w+b')
    
#Estas são as TS que estão incorretas dentro do dump 
tss = ['"USERS"']

with open(sys.argv[1], "r+b") as f:
    for line in f:
        for ts in tss:
            if ts in line:
                line = line.replace(ts,'"TS_DADOS"') #Esta é a TS será utilizada no lugar das incorretas
        f2.write( line )

f2.close()

print "Dump Convertido!"
Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s