Privilegi per Data Pump

venerdì 5 dicembre 2008 alle 05:00 | Pubblicato su Installation and Configuration | 8 commenti
Tag: ,

Alcuni giorni fa ho avuto richiesta/necessità di sviluppare una procedura per sincronizzare due database su due macchine. In sostanza il concetto è quello di mettere in piedi un sistema ad alta affidabilità (HA) ovvero con un database attivo ed uno in stand-by da utilizzare in caso di problemi al primo.  Il tutto con versione standard edition, su due macchine sulla stessa rete ma senza storage condiviso e senza necessità di sincronizzazione continua. Quindi, trattandosi del database della nostra applicazione, che si basa su un unico schema l’idea più semplice era quella di un export dello schema sulla prima macchina e di un import sulla seconda. Non è un’idea sofisticata, ma sufficente a coprire l’esigenza del cliente.

Oracle Data Pump

Con la versione 10g Oracle ha introdotto questo nuovo strumento di esportazione dei dati, molto più veloce e flessibile del vecchio “export”, questo strumento si chiama appunto Data Pump ed ha sia un interfaccia tramite eseguibili da linea di comando (expdp/impdp) che una API PL/SQL. Fino a un paio d’anni fa però la maggior parte dei database che avevo in gestione era 9iR2 e quindi non ho mai utilizzato seriamente Data Pump.  Nell’ultimo anno ho cominciato ad utilizzarlo un po’ di più ed ora sta diventando lo strumento privilegiato per le operazioni che facevo con exp/imp.

Nel caso della procedura che dovevo realizzare c’erano due caratteristiche interessanti di Data Pump: l’API PL/SQL e la possibilità di fare direttamente l’import in un database via Database Link, quindi senza necessità di esportare su file da una parte e importare dall’altra; sul database dove si vuole importare si fa un database link che punta al database “sorgente” e poi si può importare usando il parametro NETWORK_LINK invece che DUMPFILE.

La mia procedura quindi doveva fare due passi:

  1. spianare lo schema
  2. reimportarlo

Per poter spianare lo schema almeno parte della procedura doveva eseguire una operazione privilegiata, quindi ho pensato di crearla direttamente da utente SYSTEM.  Questo crea un problema, infatti alla chiamata di dbms_datapump.open( la mia procedura mi dava un errore di privilegi. Le mie ricerche non mi hanno aiutato, fino a quando per fortuna mi è venuta l’idea di provare con il comando impdp, il quale mi ha dato un’informazione in più:

ORA-39149: cannot link privileged user to non-privileged user

Questa mi ha condotto fortunatamente alla nota metalink 351598.1, la quale dice che in pratica l’utente a cui si collega il database link deve avere il privilegio EXP_FULL_DATABASE. Già, perchè il mio database link invece si collegava con l’utente proprietario dello schema che “copiavo”.  Sempre senza farmi troppi problemi ho usato anche li l’utente SYSTEM.

Quindi, come promemoria riporto il testo della procedura:

create or replace procedure reloadUserSchema AUTHID CURRENT_USER is
v_handle number;
BEGIN
EXECUTE IMMEDIATE ‘DROP USER USERX CASCADE’;
v_handle := DBMS_DATAPUMP.OPEN(‘IMPORT’, ‘SCHEMA’, ‘MYDBLINK_SYSTEM’, ‘USERX_IMPORT’);
DBMS_DATAPUMP.METADATA_FILTER(handle=>v_handle, name=>’SCHEMA_LIST’,
value=>’USERX’, object_path=>NULL);
DBMS_DATAPUMP.METADATA_REMAP(handle=>v_handle, name=>’REMAP_SCHEMA’,
ld_value=>’USERX’, value=>’USERX’);
DBMS_DATAPUMP.ADD_FILE(handle=>v_handle, filename=>’importgeocall.log’,
directory=>’LOG_IMPDP’, filetype=>DBMS_ DATAPUMP.KU$_FILE_TYPE_LOG_FILE);
DBMS_DATAPUMP.START_JOB(handle=>v_handle);
END;
/

Nota

Nelle mie ricerche sono ripassato in un post di Diego di qualche tempo fa. Io al tempo (neanche tanto tempo fa) non mi interessavo molto di data pump e non mi ricordavo più di tale post. Però ho notato un problema con gli apici.  Ho cercato di aggiungere un commento e non ci sono riuscito allora scrivo qui. Lui, utilizza il triplice apice singolo, come nell’articolo che ha trovato,  e non gli funziona. La documentazione in effetti è vaga. Io distrattamente ho usato l’apice singolo in maniera semplice ed ho appurato che funziona. In effetti ho visto che anche alcune procedure del package DBMS_SCHEDULER accettano come parametri stringhe con nomi di oggetti separati da virgole semplicemente. Evidentemente queste procedure sono in grado poi di fare un semplice “parsing” dei parametri. Quindi in sintesi facendo:

DBMS_DATAPUMP.METADATA_FILTER(handle=>v_handle, name=>’SCHEMA_LIST’,
value=>’USERX,USERY’, object_path=>NULL);

La procedura funziona correttamente “filtrando” gli schemi USERX e USERY.

8 commenti »

RSS feed for comments on this post. TrackBack URI

  1. Ciao Cristian,
    non se se ti è mai capitato di dare un’occhiata a questo non si sa mai possa servire, è per 9i ma non credo cambi molto per 10G:

    http://www.niall.litchfield.dial.pipex.com/scripts/dr/DR.zip

  2. caspita! grazie Alessandro! Io ho sempre creduto che dataguard fosse utilizzabile sono con Enterprise Edition, qui invece mi pare di capire che se gestito manualmente posso farlo con SE. L’unico punto dubbio (ma questo nel mio caso non è un problema) è come deve essere licenziata l’istanza di standby

  3. in realtà è così, cioè dataguard non c’è quindi devi istruire il tutto manualmente creandoti i tuoi scripts che sostanzialmente emulano ciò che dataguard farebbe, ovviamente la cosa per ovvie ragioni non è supportata da Oracle ma ho sentito di persone che lo hanno implementato in produzione con ottimi risultati in diversi forum oracle, ero certo anche di aver scaricato un paper oltre a questo di Niall (comunque sottolineo oaktable member che già rappresenta una certa garanzia😉 ) ma non riesco piu a trovarlo;
    certamente in questo caso la parte da affinare e codificare molto bene è tutta la parte custom di scripts sulla gestione della cosa ma comunque non mi sembra una cosa di difficilissima implementazione con i dovuti accorgimenti

    molto giusto l’appunto sulla licenza, credo di aver letto anche di questo aspetto in quei forums, certo bisognerebbe poi fare anche due conti se conviene tutto sommato, comunque se li ribecco te li posto qua assolutamente

  4. […] Pubblicato il Mercoledì 17 Dicembre 2008 di Cristian Cudizio Alcuni giorni fa ho scritto un post in cui descrivevo un’implementazione artigianale ed ingenua di una soluzione di “alta […]

  5. Ciao,
    mi risulta che x la questione licenza le cose stiano in questi termini: Oracle richiede che siano pagate le licenze x ogni installazione di SW. Anche un cluster attivo passivo richiederebbe 2 licenze xché 2 sono le installazioni.

  6. Ciao Sandro,
    il discorso delle licenze è complesso, io non seguo le trattative al riguardo per la mia azienda, cerco solo di capire qualcosa. Sicuramente c’è un margine di trattativa individuale. Stando poi alla “Software Investment Guide” che è un documento informale di spiegazione della politica di licenze, vi è un paragrafo che spiega esplicitamente i casi di backup, standby, failover e remote mirrorin. Nel caso di failover, quindi di cluster attivo passivo si dice che l’istanza “passiva” può essere usata per massimo di dieci giorni “separati” per anno “di calendario” senza dover pagare licenze. Nel caso di standby invece dice che deve essere licenziata normalmente. Poi è chiaro che vi sono tante sfumature e casi particolari che probabilmente vanno trattati direttamente con la parte commerciale di Oracle.

  7. […] 15 Gennaio 2009 di Cristian Cudizio Circa un mese fa ho scritto un post intitolato “Privilegi per Data Pump” in cui parlavo di un piccolo problema che ho avuto con i privilegi necessari per fare una […]

  8. Grazie per tutto questo buon lavoro di condivisione!
    Io sono uno sviluppatore SW e da poco tempo ho l’esigenza di interfacciarmi ad Oracle per un sistema che mantengo da diversi anni.
    Per farla breve, questo sistema deve raccogliere dati statistici da un database Oracle che viene usato per immagazzinare dati provenienti da un sito web di front-office per poi renderli disponibili ad un altro sito web di back-office.
    Per l’importazione di questi dati, visto che è qualcosa che deve accadere periodicamente ed in modo automatizzato, ho pensato di utilizzare possibilmente gli strumenti che offre il DBMS, senza costruire altro software sopra. Non conosco bene Oracle ma so che da’ la possibilità di schedulazione e importazione/esportazione automatizzata, avendo letto velocemente alcuni articoli su DBMS_SCEDULER e DBMS_DATAPUMP.
    Da dove mi consiglia di iniziare a studiare per affrontare questa esigenza?

    Ripeto, la necessità è di estrappolare dati da un database Oracle 10g, riorganizzarli e inserirli in un altro database Oracle 10g sullo stesso server. Tutto questo deve avvenire periodicamente e in modo automatizzato.

    Grazie


Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Crea un sito o un blog gratuitamente presso WordPress.com.
Entries e commenti feeds.

%d blogger cliccano Mi Piace per questo: