Import in Oracle 10.2

martedì 2 ottobre 2007 alle 02:53 | Pubblicato su Installation and Configuration | Lascia un commento

In questi giorni sono stato un po’ impegnato, ho traslocato di ufficio spostandomi  a UDINE. Il primo lavoro che ho dovuto fare nel nuovo ufficio, dopo aver verificato la piena operatività è stato il cambio del database server utilizzato dagli sviluppatori. Fino ad ora vi era un PC con installato Oracle 9.2 su cui vi erano tutti gli schemi necessari. Sul nuovo server (sempre un PC ma un po’ più serio) ho installato sia la versione 9.2 che la la versione 10.2 in quanto lo sviluppo porta avanti progetti vecchi che girano stabilmente su 9.2 e procetti più recenti che stanno su 10.2. Oltre alla versione i due database differiscono per il Charset usato, su 9.2 abbiamo sempre usato WE8MSWIN1252, su 10.2, salvo casi particolari lavoriamo con AL32UTF8.

Gia tempo fa mi sono scontrato con i problemi di migrazione di charset, il problema che avevo incontrato era dovuto al fatto che UFT8 può usare più di un byte per codificare un carattere (a seconda del tipo di carattere) e che per default su un database Oracle la lunghezza di un tipo VARCHAR2 o CHAR è in byte (comportamento stabilito dal settaggio del parametetro NLS_LENGHT_SEMANTICS=BYTE, piuttosto che NLS_SEMANTICS=CHAR). In questo modo se esporto una tabella da un database con charset monobyte, quale ad esempio WE8MSWIN1252, tale tabella ha un campo, ad esempio chiamiamolo NOME, di tipo VARCHAR2(40) e in tale campo per un record è salvata una stringa lunga 40 caratteri dei quali uno è un carattere particolare che in UTF8 viene codificato con più di  un byte, allora quando cerco di importare tale tabella su un database con charset AL32UTF8 ho un errore in quanto Oracle mi dice che il valore è troppo grande per la colonna.

Per ovviare a tale problema in passato ho utilizzato la seguente strategia:

  1. import dello schema senza dati (parametro ROW=N di imp)
  2. ALTER TABLE X MODIFY COLONNAY VARCHAR2(Z CHAR); per tutti i campi di tipo VARCHAR2 e analogamente per i campi di tipo CHAR
  3. import dello schema con i dati e con parametro IGNORE=Y, così anche se trova gia le tabelle create va avanti.

Dicevo appunto che tale strategia nei miei test aveva funzionato, ma avevo scordato qualcosa: le statistiche dell’ottimizzatore.

Si tratta di un problema che non avevo mai avuto perchè noi su Oracle 9.2 non abbiamo mai usato CBO e perciò non abbiamo mai avuto statistiche sulle tabelle e sugli indici. Ieri però ho incontrato uno schema su cui erano state calcolate le statistiche, erano state esportate e durante l’import avevo questo errore:

ORA-20005: object statistics are locked (stattype = ALL)

Al che sono rimasto un po’ contrariato, dopo un attimo di stupore e fastidio ho iniziato la ricerca su Metalink che mi ha portato a questo documento che non riporta la mia stessa identica situzione ma il problema pare lo stesso. Ho dovuto un attimo arrangiarmi per trovare su quale vista di sistema Oracle mi dice se le statistiche su una tabella sono lockate: la tabella è ALL_TAB_STATISTICS, con il campo STATTYPE_LOCKED che da manuale può assumere tre valori: DATA, CACHE, ALL il cui significato lo ignoro, però ho verificato che facendo un import con il parametro ROW=N il campo assume valore ALL. Usando la procedura DBMS_STATS.UNLOCK_TABLE_STATS il campo assume valore NULL.

Quindi, siccome poi è possibile che si voglia aggiornare le statistiche, visto che quelle importate comunque non è detto abbiano molto senso, è bene, prima di fare l’import usare la procedura sopracitata per sbloccare le statistiche ad esempio:

SQL>EXEC DBMS_STATS.UNLOCK_SCHEMA_STATS(‘SCHEMA_SVILUPPO’);

Lascia un commento »

RSS feed for comments on this post. TrackBack URI

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: