Oracle:all

De Lowgeek wiki

Bdd.png

Astuces

Title2.png

Certaine table s ressembles

Il suffit de purger la corbeilles, ce sont des tables prévu pour re suprimmées

<syntaxhighlight lang="sql"> purge recyclebin </syntaxhighlight>


Title2.png

ORA-27101: shared memory realm does not exist

Verifiez votre variable ${ORACLE_SID}: attention c'est sensible à la casse en local!


{{Template:Title2|SP2-0027: Input is too long (> 2499 characters) - line ignored}

Chaque ligne d'un script ne doit pas dépasser 2499 caractère, il suffit d'ajouter un retour à la ligne pour ne pas être limité


Title2.png

ORA-01940: cannot drop a user that is currently connected

Solution:

<syntaxhighlight lang="sql"> select sid,serial#,osuser from v$session where username='schémas'; select sid,serial#,osuser,status from v$session where username='schémas'; alter system kill session 'SID,SERIAL'; </syntaxhighlight>


{{Template:Title2|Connaitre la place disponible dans un tablespace}

<syntaxhighlight lang="sql"> select sum(bytes) from dba_free_space where tablespace_name='TABLESPACE_DATA'; </syntaxhighlight>


Title2.png

Connaitre l'espace utilisé par un schéma dans un tablespace

<syntaxhighlight lang="sql"> Select owner,round(sum(bytes)/1024/1024, 2) Mo from sys.dba_segments group by owner order by owner </syntaxhighlight>


Title2.png

Connaitre la taille d'un schéma

<syntaxhighlight lang="sql"> select sum(bytes)/1024/1024 from dba_segments where owner='USER'; </syntaxhighlight>


Title2.png

Procédure d'import / Export

Export de la base

1.Définir les variables d'environnement

<syntaxhighlight lang="bash"> export ORACLE_SID= the oracle SID export ORACLE_HOME= the oracle Home export ORACLE_BIN= the oracle Binaries location export NLS_LANG= the language, territory and charset of the database </syntaxhighlight>

Vérifier le NLS_LANG:

<syntaxhighlight lang="sql"> select * from v$nls_parameters where PARAMETER in ('NLS_LANGUAGE','NLS_TERRITORY','NLS_CHARACTERSET'); </syntaxhighlight>

2.Lancer l'export

<syntaxhighlight lang="bash"> mknod exp_pipe p gzip < exp_pipe > filename.dump.gz& $ORACLE_BIN/exp schema_owner/schema_owner_password consistent=y grants=n statistics=estimate file=exp_pipe log=log_filename </syntaxhighlight>

Ou:

  • file= Nom du fichier dump
  • owner= Le schéma à exporter
  • log= Nom du fichier log

Exemple :

<syntaxhighlight lang="bash"> export ORACLE_SID=MYSID export ORACLE_HOME=/opt/oracle/Ora924 export ORACLE_BIN=/opt/oracle/Ora924/bin export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1 mknod exp_pipe p gzip < exp_pipe > dump.dmp.gz& exp OWNER/PASSWORD compress=n statistics=estimate consistent=y file=exp_pipe log=exp.log </syntaxhighlight>

Import de bases

Définir les variables

<syntaxhighlight lang="bash">

export ORACLE_SID= the oracle SID 
export ORACLE_HOME= the oracle Home 
export NLS_LANG= the language, territory and charset of the database

</syntaxhighlight>

Vérifier le NLS_LANG:

<syntaxhighlight lang="sql"> select * from v$nls_parameters where PARAMETER in ('NLS_LANGUAGE','NLS_TERRITORY','NLS_CHARACTERSET'); </syntaxhighlight>

Si l'import doit être réalisé sur un schéma existant

  • Vérifier les tablespace par défaut du schéma

<syntaxhighlight lang="sql"> select DEFAULT_TABLESPACE, TEMPORARY_TABLESPACE from dba_users where username='<schema_owner>'; </syntaxhighlight>

  • Vérifier les tablespace du schéma

<syntaxhighlight lang="sql"> select distinct tablespace_name from dba_segments where owner='<schema_owner>'; </syntaxhighlight>

  • Supprimer le schéma

<syntaxhighlight lang="sql"> drop user <schema_owner> cascade; </syntaxhighlight>

  • Si des utilisateurs sont connectés à la base:

<syntaxhighlight lang="sql"> select sid, serial# from v$session where schemaname='<schema_owner>'; alter system kill session '<sid>,<serial#>'; -- for each session id </syntaxhighlight>

  • Re créer le schéma:

<syntaxhighlight lang="sql"> create user <schema_owner> identified by <schema_owner_passwd> default tablespace <schema_owner_default_tablespace> temporary tablespace <schema_owner_temp_tablespace> quota unlimited on <schema_owner_tablespace> [quota unlimited on <schema_owner_tablespace2>]; </syntaxhighlight>


Si l'import ce fait sur un nouveau schéma

  • Créer le schéma:

<syntaxhighlight lang="sql"> create user <schema_owner> identified by <schema_owner_passwd> default tablespace <schema_owner_tablespace> temporary tablespace <schema_owner_temp_tablespace> quota unlimited on <schema_owner_tablespace> [quota unlimited on <schema_owner_tablespace2>]; </syntaxhighlight>

Donner les droits nécessaires au schéma

<syntaxhighlight lang="sql"> grant connect,imp_full_database to <schema_owner>; </syntaxhighlight>

Il est parfois nécessaire de faire un remap des tablespaces

Cette fonctionnalité n'étant pas gérée par imp/exp, voici comment faire

<syntaxhighlight lang="bash"> fgrep -a -i blob schema.dmp | fgrep -a -i create > blob_tables.sql fgrep -a -i clob schema.dmp | fgrep -a -i create > tables.sql </syntaxhighlight>

Puis, éditer les fichiers générés, et remplacer les nom des tablespaces. Ensuite exécuter ces fichiers sur le schéma ou sera remonté le dump.

Lancer l'import

  • Si le dump est gzippé, rediriger le dans un pipe:

<syntaxhighlight lang="bash"> mknod /tmp/imp_pipe p gunzip < export_dump_gzipped.dmp.gz > /tmp/imp_pipe & imp <schema_owner_import>/<schema_owner_import> buffer=40000000 commit=y statistics=always ignore=y grants=n resumable=Y resumable_timeout=36000 file=imp_pipe fromuser=<schema_owner_of_dump> touser=<schema_owner_import> log=<log_filename> </syntaxhighlight>

Ou:

  • file= Le nom du fichier pipe
  • fromuser= Le nom du schéma source du dump
  • touser= Le nom du schéma ou sera importé le dump
  • log= Le nom du fichier log

Jouer les statistiques sur le schéma

<syntaxhighlight lang="sql"> alter session set NLS_TERRITORY=AMERICA; exec dbms_stats.gather_schema_stats('<schema_owner_import>',granularity=>'ALL',cascade=>true); <syntaxhighlight>

Example :

<syntaxhighlight lang="bash"> export ORACLE_SID=MYSID export ORACLE_HOME=/opt/oracle/Ora924 export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1 </syntaxhighlight> <syntaxhighlight lang="sql"> select DEFAULT_TABLESPACE, TEMPORARY_TABLESPACE from dba_users where username='SCHEMA'; DEFAULT_TABLESPACE TEMPORARY_TABLESPACE


------------------------------

CNH_DATA TEMP select distinct tablespace_name from dba_segments where owner='SCHEMA'; TABLESPACE_NAME


CSH_DATA CSH_INDX

drop user SCHEMA cascade; drop user SCHEMA cascade ORA-01940: cannot drop a user that is currently connected select sid, serial# from v$session where SCHEMANAME='SCHEMA';

      SID    SERIAL#

----------
      41      21848
     149      65230

alter system kill session '41, 21848'; alter system kill session '149, 65230'; drop user SCHEMA cascade; create user SCHEMA identified by PASSWORD default tablespace TABLESPACE_DATA temporary tablespace temp quota unlimited on TABLESPACE_DATA quota unlimited on TABLESPACE_INDX; grant connect, imp_full_databases, resource to DATABASE_NAME; </syntaxhighlight> <syntaxhighlight lang="bash"> sqlplus SCHEMA/PASSWORD SQL> @/opt/oracle/admin/scripts/create.sql ls export_export_SHEMA_OWNER_SOURCE.dmp.gz mknod /tmp/imp_pipe p gunzip < export_SHEMA_OWNER_SOURCE.dmp.gz > /tmp/imp_pipe & imp system/password buffer=1000000 commit=y statistics=always ignore=y grants=n resumable=Y resumable_timeout=36000 file=/tmp/imp_pipe fromuser=SHEMA_OWNER_SOURCE touser=SHEMA_OWNER log=imp_SHEMA_OWNER.log sqlplus system/<system_pwd> </syntaxhighlight> <syntaxhighlight lang="sql"> alter session set NLS_TERRITORY=AMERICA; exec dbms_stats.gather_schema_stats('SHEMA_OWNER',granularity=>'ALL', cascade=>true); </syntaxhighlight>

Importer un Databump

L'instance ORACLE doit avoir un object "directory" de définie.

<syntaxhighlight lang="bash"> impdp SCHEMA/SCHEMA DIRECTORY=datadir SCHEMAS=SCHEMA_SOURCE DUMPFILE=file.dmp LOGFILE=import.log REMAP_SCHEMA=SCHEMA_SOURCE:SCHEMA REMAP_TABLESPACE=TAB_DATA:DATA REMAP_TABLESPACE=TAB_IDX:DATA </syntaxhighlight>

Ou:

REMAP_SCHEMA=SCHEMA_ORIGINE:SCHEMA_DESTINATION

REMAP_TABLESPACE=TABLESPACE_ORIGINE:TABLESPACE_DESTINATION

Title2.png

Migration Oracle 9i ISO vers Oracle 10 UTF-8

Pourquoi un process de migration ?

En encoding ISO, Le string "télé" par exemple utilise 5 octets, Mais 8 octets sont utilisé en UTF-8. Donc quand on veut importer un dump en ISO vers une instance en UTF-8, Un dépassement du nombre de caractère autorisés est fréquent. Ce process spécifique utilise ce script SQL byte_to_char.sql.

Voici les étapes de la migration :

  • Execution du script byte_to_char.sql
  • Export du schéma en UTF-8 sans les statistiques
  • Import du schéma en UTF-8 sans les statistiques
  • Passer les statistiques