Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Débuter
Débuter Forum d'entraide pour débuter avec Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/02/2008, 19h41   #1
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 22
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 22
Points : 10
Points : 10
Par défaut Structure ORACLE / Import

Bonjour à tous !

Chouette, une section [débutant]

Ce que j'aime dans Oracle, c'est que lorsque que je pense avoir compris, il me suffit d'attendre 5mn pour me rendre compte que ce n'est pas le cas ^^

Voilà ce qui m'amène.
Nous n'avons pas de pro-ORACLE chez nous mais pourtant de nombreuses "appliquettes" à tourner dessus. Le serveur (vieux, très vieux...) va être migré et nous faisons donc quelques test pour préparer çà au mieux.

L'ancienne mouture est un peu hasardeuse... il y a une instance PROD et une instance DEV qui comporte toutes les 2 des applis en production
Parfois les DATA et les INDEX sont séparés dans des tablespaces différents, parfois non... on a même des tables stockées dans le tbs system, bref c'est un peu le bazard...

On a donc décidé de créer plusieurs instances propres, des tablespaces avec des noms explicites, les DATA sur une partition (APPLI1_TBS.dbf), les INDEX sur une autre (APPLI1_INDX.dbf), les archives sur une 3ème.
Je pense que c'est un peu la philosophie d'oracle ?

Chose que je ne saisis pas, lorsque nous migrerons les données une dernière fois de l'ancien serveur, après tests, on s'est rendu compte que l'on devait supprimer les tables pour que le dump ne renvoie pas d'erreur (avec du coup le travail sur les index à refaire). On a aussi essayé avec l'option ignore=y mais là, tout les tuples sont en doublons J'ai aussi essayé un truncate des tables mais j'ai plein de problème de contraintes qui m'empêche de les vider...
Dois-je comprendre que lorsque que nous ferons le dernier import, il faudra de nouveau changer les tbs des index ?
Pourquoi est-ce aussi compliqué d'importer uniquement les rows ?
Pourquoi ne peux-t-on pas déclarer pour un schémas un tbs d'index par défaut, de façon à ce que l'index créé dynamiquement se stocke directement dedans...

Enfin, pardonnez mon ignorance ^^
Thamior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2008, 20h57   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Citation:
Envoyé par Thamior Voir le message
Je pense que c'est un peu la philosophie d'oracle ?
complétement

Citation:
Envoyé par Thamior Voir le message
Dois-je comprendre que lorsque que nous ferons le dernier import, il faudra de nouveau changer les tbs des index ?
Si tu droppes les tables, les indexes sont droppés aussi

Citation:
Envoyé par Thamior Voir le message
Pourquoi est-ce aussi compliqué d'importer uniquement les rows ?
Pour comprendre le problème il suffit de regarder le log, tu verras qu'un import se compose de la création de la table (avec ignore=y l'erreur est ignorée si la table existe), insert des données (donc si la table existait t'as des doublons), création des indexes et contraintes, attribution des droits.


Citation:
Envoyé par Thamior Voir le message
Pourquoi ne peux-t-on pas déclarer pour un schémas un tbs d'index par défaut, de façon à ce que l'index créé dynamiquement se stocke directement dedans...
parce que l'import est assez basique comme outil... datapump (en 10g) permet des choses bien plus intéressante notamment la création des indexes dans un autre tablespace

Citation:
Envoyé par Thamior Voir le message
Enfin, pardonnez mon ignorance ^^
aucun problème, t'es dans la bonne section
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2008, 21h56   #3
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 22
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 22
Points : 10
Points : 10
Merci pour ces renseignements

Donc, si je comprends bien et pour pas ne me prendre trop la tête, nos phases de tests ont démontré que çà fonctionnait. Lorsqu' arrivera le jour J de la bascule vers le nouveau serveur, on fait un dump des schémas applicatifs de l'ancien serveur (les DATA doivent arrivées dans les tbs déclarés par défaut lors de la création de nos nouveaux users) et on exécute un petit script dynamique (alter index....) pour basculer les INDEX sur les tbs dédiés à çà.

En réfléchissant un peu plus, la manip n'est pas si compliquée que çà, étant normalement faite pour la dernière fois...

Si je pousse un peu plus loin la réflexion, nous avons décidé d'investir dans un serveur de référence, identique donc (matériel et pile logiciel) à la production, sur lequel nous exécuterons et testerons les correctifs ou autres patchs d'applications.

Nous pensons mettre en place une réplication faite la nuit entre la prod et le ref, mais si on réplique par le biais des fichiers (sauvegarde à froid, copie des fichiers via le rso), logiquement le problème d'emplacement des INDEX ne se pose plus non ? Nous aurons vraiment un clone de la base, sans aucune manip particulière ?
Thamior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 09h02   #4
Membre Expert
 
Avatar de scheu
 
Inscription : juin 2007
Messages : 1 497
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 1 497
Points : 1 483
Points : 1 483
Tu peux aussi faire la méthode bourrin :
1) désactiver toutes les contraintes sur la base cible
2) truncate de toutes les tables
3) import avec ignore=y
4) réactiver les contraintes
Si la base cible est en 9i, il faudra ensuite faire un rebuild de chaque index pour le changer de tablespace, sinon comme dit Orafrance en 10g tu as le datapump (mieux que export/import)

Pour répliquer, soit des exports/imports réguliers, ou bien regarde du côté de STREAMS
scheu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 10h15   #5
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Citation:
Envoyé par Thamior Voir le message
Nous pensons mettre en place une réplication faite la nuit entre la prod et le ref, mais si on réplique par le biais des fichiers (sauvegarde à froid, copie des fichiers via le rso), logiquement le problème d'emplacement des INDEX ne se pose plus non ? Nous aurons vraiment un clone de la base, sans aucune manip particulière ?
Oui, aucun problème avec les indexes. Et pas de manip pourvu que le SID soit le même et les fichiers avec exactement le même chemin qu'en prod Sinon, il faudra recréer les control files ce qui n'est pas compliqué : http://orafrance.developpez.com/dbahelp/#L2
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 10h43   #6
Membre régulier
 
Inscription : septembre 2005
Messages : 71
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 71
Points : 72
Points : 72
Bonjour,

Visiblement il y en a qui aime bien ce compliquer la vie... !?

Ton user à un tablespace par defaut on vas dire DATA pour simplifier les choses... Comme tu es un bon DBA... Tu veux répartir les data dans le tablespace DATA et les index dans le tablespace INDX.

Ben c'est tout simple...

Tu lances ton export :
Code :
exp file=./monbordelamoi.dmp log=./monbordelamoi.log owner=monschemabordelique
tu "drop"/"create" ton schéma
Puis tu verifie que ton user a bien comme tablespace par defaut DATA

Code :
1
2
3
ALTER user monschemabordelique quota unlimited ON DATA;
ALTER user monschemabordelique quota 0K ON INDX;
REVOKE unlimited tablespace FROM monschemabordelique;
-- le grant resource donne souvent unlimited tablespace ici on en veut surtout pas...

Tu lances l'import :
Citation:
imp file=./monbordelamoi.dmp log=./imp_monbordelamoi_data.log fromuser=monschemabordelique touser=monschemabordelique indexes=n constraints=n
Tu "switch" le user avec comme tablespace par defaut INDX

Code :
1
2
3
ALTER user monschemabordelique DEFAULT tablespace INDX;
ALTER user monschemabordelique quota 0K ON DATA;
ALTER user monschemabordelique quota unlimited ON INDX;
Tu lances l'import (Pour les indexes) :
Citation:
imp file=./monbordelamoi.dmp log=./imp_monbordelamoi_data.log fromuser=monschemabordelique touser=monschemabordelique rows=n ignore=y
Voila voili qu'il est beau mon schéma...


Donc en gros ça donne : il te faut un DATA et un INDX comme tablespace...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
SET linesize 1024
DROP user TEST cascade;
CREATE user TEST IDENTIFIED BY TEST123;
ALTER user TEST DEFAULT tablespace DATA;
GRANT connect,resource TO TEST;
REVOKE unlimited tablespace FROM TEST;
ALTER user TEST quota unlimited ON DATA;
ALTER user TEST quota unlimited ON INDX;
connect test/test123
CREATE TABLE t1data (a varchar2(1)) tablespace DATA;
CREATE INDEX t1data_n1 ON t1data (a) tablespace DATA; 
CREATE TABLE t1index (a varchar2(1)) tablespace INDX;
CREATE INDEX t1index_n1 ON t1index  (a) tablespace INDX;
SELECT owner,segment_name, tablespace_name FROM dba_segments WHERE owner = 'TEST';
! exp file=./TEST.dmp log=./TEST.log owner=TEST
connect / AS sysdba
DROP user TEST cascade;
CREATE user TEST IDENTIFIED BY TEST123;
ALTER user TEST DEFAULT tablespace DATA;
GRANT connect,resource TO TEST;
ALTER user TEST quota unlimited ON DATA;
REVOKE unlimited tablespace FROM TEST;
! imp file=./TEST.dmp log=./imp_TEST.log fromuser=TEST touser=TEST indexes=n constraints=n
SELECT owner,segment_name, tablespace_name FROM dba_segments WHERE owner = 'TEST';
ALTER user TEST DEFAULT tablespace INDX;
ALTER user TEST quota unlimited ON INDX;
ALTER user TEST quota 0K ON DATA;
! imp file=./TEST.dmp log=./imp_TEST.log fromuser=TEST touser=TEST rows=n IGNORE=y
SELECT owner,segment_name, tablespace_name FROM dba_segments WHERE owner = 'TEST';
Tracnac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 10h45   #7
Membre régulier
 
Inscription : septembre 2005
Messages : 71
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 71
Points : 72
Points : 72
Ah oui je suis parti du principe que tu n'avais pas de LOBs sinon les choses se complique un peu (Pas beaucoup plus...)

Cordialement.
Tracnac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 11h17   #8
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 22
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 22
Points : 10
Points : 10
Citation:
Envoyé par scheu Voir le message
Tu peux aussi faire la méthode bourrin :
1) désactiver toutes les contraintes sur la base cible
On peut désactiver et réactiver toutes les contraintes d'un schémas en une seule requête (dynamique) ?

@Tracnac,
c'est vraiment censé être moins compliqué ta démonstration ?

Je me rends compte que je n'ai pas précisé les versions, donc win2k3 et Oracle 9.2.0.3 (donc pas de datapump pour l'instant).
Thamior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 11h42   #9
Membre régulier
 
Inscription : septembre 2005
Messages : 71
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 71
Points : 72
Points : 72
Thamior c'est la plus propre car tu ne fragmente pas ton tablespace DATA avec des "move" indexes...

Sinon pour l'os ça change rien...

Cordialement.
Tracnac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 14h53   #10
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 22
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 22
Points : 10
Points : 10
J'ai regardé ta méthode Tracnac et il y a quelques points ou j'ai besoin de lumière.

Citation:
Envoyé par Tracnac Voir le message
Code :
ALTER user monschemabordelique quota 0K ON INDX;
Je ne comprends pas l'utilité de cette requête. Pourquoi mettre le quota à zéro sur INDX puisque le user ne va pas écrire dessus (à moins que...).

Citation:
Envoyé par Tracnac Voir le message
Code :
REVOKE unlimited tablespace FROM monschemabordelique;
-- le grant resource donne souvent unlimited tablespace ici on en veut surtout pas...
Encore une subtilité qui m'échappe... pourquoi est ce que l'on en veut surtout pas, de l'unlimited tablespace. A quoi sert ce privilège ?

Citation:
Envoyé par Tracnac Voir le message
Code :
ALTER user monschemabordelique quota 0K ON DATA;
Idem que pour la première question

Merci pour l'intérêt porté à mes demandes.
Thamior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 15h09   #11
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
le but du quota à 0 c'est de mettre une erreur sur chaque tentative de copie de data dans le tablespace à 0... dans le 1° cas tu peux pas écrire les indexes dans le 2° c'est les datas.

Ceci dit, INDEXFILE me parait plus judicieux qu'un log farci d'erreurs
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 15h13   #12
Membre Expert
 
Avatar de scheu
 
Inscription : juin 2007
Messages : 1 497
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 1 497
Points : 1 483
Points : 1 483
Citation:
Envoyé par Thamior Voir le message
On peut désactiver et réactiver toutes les contraintes d'un schémas en une seule requête (dynamique) ?
Avec du SQL Dynamique oui, par exemple (je ne l'ai pas testé)
Code :
1
2
3
4
5
6
7
8
9
begin
FOR cur IN (
SELECT owner,constraint_name,table_name FROM all_constraints
WHERE owner = 'MON_SCHEMA'
)
loop
 execute immediate 'ALTER TABLE '||cur.owner||'.'||cur.table_name||' MODIFY CONSTRAINT '||cur.constraint_name||' DISABLE';
end loop;
/
Et pour réactiver idem en mettant ENABLE au lieu de DISABLE
Il se peut que tu ais quelques soucis si tu désactives des PK avant les FK associées, au pire lancer le script en plusieurs fois avec d'abord un filtre sur " WHERE constraint_type = 'R' "(pour d'abord désactiver les FK), et ensuite avec " WHERE constraint_type <> 'R' ", et l'inverse pour réactiver
scheu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 15h22   #13
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
rappellons la page sources : http://oracle.developpez.com/sources...active_fk_user
http://oracle.developpez.com/sources...active_fk_user
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 15h51   #14
Membre régulier
 
Inscription : septembre 2005
Messages : 71
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 71
Points : 72
Points : 72
Citation:
Envoyé par orafrance Voir le message
le but du quota à 0 c'est de mettre une erreur sur chaque tentative de copie de data dans le tablespace à 0... dans le 1° cas tu peux pas écrire les indexes dans le 2° c'est les datas.
Excuse moi j'ai rien compris !? il n'y a aucune erreur !!


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
Import: Release 10.2.0.1.0 - Production ON Fri Feb 15 15:50:24 2008
 
Copyright (c) 1982, 2005, Oracle.  ALL rights reserved.
 
Username: / AS sysdba
 
Connected TO: Oracle DATABASE 10g Express Edition Release 10.2.0.1.0 - Production
 
Export file created BY EXPORT:V10.02.01 via conventional path
import done IN WE8ISO8859P1 character SET AND AL16UTF16 NCHAR character SET
import server uses WE8MSWIN1252 character SET (possible charset conversion)
. importing TEST's objects into TEST
. . importing table                      "T1INDEX"          0 rows imported
. . importing table                      "T1USERS"          0 rows imported
Import terminated successfully without warnings.
 
 
 
Import: Release 10.2.0.1.0 - Production on Fri Feb 15 15:50:48 2008
 
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
 
Username: / as sysdba
 
Connected to: Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
 
Export file created by EXPORT:V10.02.01 via conventional path
import done in WE8ISO8859P1 character set and AL16UTF16 NCHAR character set
import server uses WE8MSWIN1252 character set (possible charset conversion)
. importing TEST's objects INTO TEST
Import terminated successfully without warnings.
Tracnac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 16h02   #15
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Il manque les commandes

T'as des données exportées ? Parce que pas d'erreur mais 0 ligne importée c'est étrange
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 16h06   #16
Membre régulier
 
Inscription : septembre 2005
Messages : 71
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 71
Points : 72
Points : 72
Citation:
Envoyé par Thamior Voir le message
J'ai regardé ta méthode Tracnac et il y a quelques points ou j'ai besoin de lumière.
Je ne comprends pas l'utilité de cette requête. Pourquoi mettre le quota à zéro sur INDX puisque le user ne va pas écrire dessus (à moins que...).
Désolé, bon je recommence (L'exemple etait la representation logique de mon explication)
Je pars du principe que c'est le bordel absolu... donc tu ne sais pas ou sont tes datas, des indexes... donc en virtuel ça donne :

TABLESPACE DATA = DATA + INDEX
TABLESPACE INDEX = DATA + INDEX

Le but est d'interdire a l'outil "import" la creation de data dans des tablespaces que tu ne veux pas... d'ou le quota à 0 sur INDEX. Tu es sur que tout est créé dans le tablespace DATA.

Donc imp avec indexes=n constraints=n tu n'importe que les datas...

Après tu switch pour faire l'inverse tu ne veux plus de data mais tu veux les indexes donc quota à 0 sur DATA et unlimited sur INDEX

Donc imp avec rows=n ignore=y tu n'import que les indexes

Citation:

Encore une subtilité qui m'échappe... pourquoi est ce que l'on en veut surtout pas, de l'unlimited tablespace. A quoi sert ce privilège ?

Idem que pour la première question

Merci pour l'intérêt porté à mes demandes.
Unlimited tablespace est un privilège qui te permets de crée des objets dans n'importent quel tablespaces...
Ce que tu NE veux surtout PAS ici lors de ta réorg...
Tracnac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 16h09   #17
Membre régulier
 
Inscription : septembre 2005
Messages : 71
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 71
Points : 72
Points : 72
Citation:
Envoyé par orafrance Voir le message
Il manque les commandes

T'as des données exportées ? Parce que pas d'erreur mais 0 ligne importée c'est étrange
Reprends mon example il n'y a pas de lignes... c'est normal j'ai pas fait d'insert... les commandes sont dans l'exemple aussi...
Tracnac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 16h17   #18
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
ha ok, c'est juste pour créer les objets, j'avais pas vu

Enfin, y'a l'option indexfile, autant l'utiliser non ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 16h19   #19
Membre régulier
 
Inscription : septembre 2005
Messages : 71
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 71
Points : 72
Points : 72
Citation:
Envoyé par orafrance Voir le message
ha ok, c'est juste pour créer les objets, j'avais pas vu

Enfin, y'a l'option indexfile, autant l'utiliser non ?

En fait indexfile et show=y je l'utilise quand cela ce complique (LOB et TABLE PARTITIONNEES) sinon la méthode sus cité est valable dans 99 % des cas...
Tracnac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 18h28   #20
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 22
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 22
Points : 10
Points : 10
Un grand merci pour cet éclaircissement. Je n'ai plus qu'à retenir çà plus de 5mn dans ma cervelle de moineau

@+
Thamior est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h18.


 
 
 
 
Partenaires

Hébergement Web