Oracle DB 10g - Aide informatique n°1
Transcription
Oracle DB 10g - Aide informatique n°1
2016 Oracle DB 10g ADMINISTRATION UNIX OLIVIER DEHECQ Olivier DEHECQ – http://aide.informatique1.fr Page 1 Table des matières Signalétique .................................................................................................................................................... 3 1 Généralités (RAPPELS) .......................................................................................................................... 4 2 La création d’une BD en utilisant les scripts ........................................................................................ 5 3 Les imports/exports .............................................................................................................................. 7 4 Optimisation .........................................................................................................................................11 5 Oracle sous Linux.................................................................................................................................17 6 Vues Matérialisées ...............................................................................................................................19 7 Le monitoring Index ............................................................................................................................21 8 Le partitionnement ..............................................................................................................................23 9 Datapump (export/import)..................................................................................................................25 10 La Haute Disponibilité sur Oracle .......................................................................................................30 11 Déroulé complet de l’installation d’une Oracle 11g sur Linux ..........................................................31 12 Sauvegarde / restauration (p288) ......................................................................................................32 DEHECQ Olivier – http://aide.informatique1.fr 2 Signalétique Nota, astuce : Contient une partie serveur web qui traite les réponses statiques. Important, à retenir : Ceci est une chose importante Commande MS-DOS C:\> c:\tomcat5.5\bin\startup.bat Commande UNIX # /tomcat5.5/bin/startup.sh Commande SQL # /tomcat5.5/bin/startup.sh Chemin de fichier, dossier, emplacement sur le disque Fichier web.xml Exemple de contenu de document <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" /> Contenu du fichier web.xml <welcome-file>index.html</welcome-file> Contenu du fichier server.xml port "8080" port d’écoute du connecteur Autre contenu de fichier : <role rolename="RUserHelloWorld"/> Spécifique aux documents xml : Balise Nom de propriété Valeur Commentaire DEHECQ Olivier – http://aide.informatique1.fr 3 1 Généralités (RAPPELS) Oracle est un produit multiplateforme Mode standard (max 4proc) ; Edition entreprise (de tout) ; Personnel (mono licence, utile pour le développement) Liberté de paramétrages, sécurité, stratégie de sauvegarde, import/export, administration centralisée, serveur apache intégré. Rôle de l’administrateur Oracle : Organiser techniquement, création de BD, redimensionnement des objets, sécurité des accès, cohérence de la base de données (procédures reprises) Outils d’administration : SQL*Plus est un outil en ligne de commande austère Sous Windows sqltools est mieux et gratuit toad est une usine à gaz et payant Oracle Entreprise Manager (web) : instances, schéma, security manager, storage manager Oracle Management Server : programmation de travaux, remontée d’évènements SQL*Plus worksheet SQL Developer : outil graphique fourni par Oracle Architecture interne d’Oracle : Fichiers : données et index (tablespace, datafile) ; journaux ; contrôle (cohérence du SGBDR) Mémoire : SGA ; PGA Processus : processus serveur ; processus d’arrière plan Notion d’instance : Ensemble constitué de zones mémoires et des processus d’une BD. Fichier d’initialisation d’instance (init.ora) L’instance est plus proche du moteur sous SQLServer Conseil : 1 base / instance La database : Regroupement de l’ensemble des objets SQL Les fichiers de données : datafiles, regroupés dans un ensemble appelé tablespace Fichiers journaux de reprise, au moins deux fichiers Fichiers de contrôles : infos sur les fichiers et les états de la BD Le dictionnaire de données : Ensemble de tables contenant les informations des différents objets. Ces infos sont liées à l’utilisateur SYS. Infos non explicites et non accessibles. Ne doivent pas être modifiés (uniquement par le noyau oracle) Les vues : Vues créées par l’utilisateur : USER_XXX Vues accessibles à l’utilisateur connecté : ALL_XXX Vue des objets de la base : DBA_XXX Vues de données de l’instance : V$XXX (renseignements sur l’activité de la BD) DEHECQ Olivier – http://aide.informatique1.fr 4 2 La création d’une BD en utilisant les scripts On ne créé pas la base une fois l’assistant de création de base de données terminé : on génère les scripts, qui vont être exécutés et vont permettre de générer la BD Utilisation de l’assistance Oracle de Création de BD : Créer une BD, usage général Fichier FORM.bat : mkdir C:\oracle\product\10.2.0\admin\FORM\adump mkdir C:\oracle\product\10.2.0\admin\FORM\bdump mkdir C:\oracle\product\10.2.0\admin\FORM\cdump mkdir C:\oracle\product\10.2.0\admin\FORM\dpdump mkdir C:\oracle\product\10.2.0\admin\FORM\pfile mkdir C:\oracle\product\10.2.0\admin\FORM\udump mkdir C:\oracle\product\10.2.0\db_1\cfgtoollogs\dbca\FORM mkdir C:\oracle\product\10.2.0\db_1\dbs mkdir C:\oracle\product\10.2.0\flash_recovery_area mkdir C:\oracle\product\10.2.0\oradata\FORM set ORACLE_SID=FORM C:\oracle\product\10.2.0\db_1\bin\oradim.exe -new -sid FORM -startmode manual -spfile C:\oracle\product\10.2.0\db_1\bin\oradim.exe -edit -sid FORM -startmode auto -srvcstart system C:\oracle\product\10.2.0\db_1\bin\sqlplus /nolog @C:\TEMP\formation\FORM.sql Création des répertoires, création du service (=instance), connexion à sqlplus Fichier FORM.sql : set verify off PROMPT specify a password for sys as parameter 1; DEFINE sysPassword = &1 PROMPT specify a password for system as parameter 2; DEFINE systemPassword = &2 PROMPT specify a password for sysman as parameter 3; DEFINE sysmanPassword = &3 PROMPT specify a password for dbsnmp as parameter 4; DEFINE dbsnmpPassword = &4 host C:\oracle\product\10.2.0\db_1\bin\orapwd.exe file=C:\oracle\product\10.2.0\db_1\database\PWDFORM.ora password=&&sysPassword force=y @C:\TEMP\formation\CloneRmanRestore.sql @C:\TEMP\formation\cloneDBCreation.sql @C:\TEMP\formation\postScripts.sql host "echo SPFILE='C:\oracle\product\10.2.0\db_1/dbs/spfileFORM.ora' > C:\oracle\product\10.2.0\db_1\database\initFORM.ora" @C:\TEMP\formation\postDBCreation.sql Génération des mots de passe Le fichier init.ora a aussi été défini. Il est facile de le modifier. On peut modifier les fichiers à la main Une fois que les scripts sont prêts, on lance FORM.bat Cependant, le script ne crée pas le LISTENER. Il faut donc le créer à la main. DEHECQ Olivier – http://aide.informatique1.fr 5 Création du listener : Configuration Oracle Net Configuration d’un nom de service de réseau local ; Ajouter ; « FORM » ; Utiliser un numéro de port différent (conseillé) 2.1 Ouverture et fermeture d’une BD Ouverture d’une BD : STARTUP [FORCE][RESTRICT][PFILE=fichier] [OPEN[RECOVER]|MOUNT|NOMOUNT] Fermeture d’une BD: SHUTDOWN [ABORT|IMMEDIATE|NORMAL|TRASACTIONNAL] 2.2 Lister les paramètres d’une instance SQL> SHOW PARAMETERS 2.3 Best practice Optimiser le script pour le rendre autosuffisant pour la création d’une base de données puis le sauvegarder à un emplacement sûr. Lors d’une restauration d’un serveur défaillant, ce script pourra être réutilisé pour créer une instance. Il ne restera alors plus qu’à plaquer la sauvegarde. DEHECQ Olivier – http://aide.informatique1.fr 6 3 Les imports/exports 3.1 L’utilitaire exp (pour sauvegarder) Aide en ligne : C:\> EXP HELP=Y C:\> EXP utilisateur/password [paramètres] Exemple : C:\> EXP system/oracle file=c:\sauv.dmp owner=user1 C:\> EXP system/oracle full=Y file=c:\sauv.dmp C:\sauv.dmp Nom du fichier tel qu’il sera sauvegardé owner=user1 Seul le schéma user1 sera sauvegardé full=Y (yes) Tous les schémas seront sauvegardés Export d’une base 3.2 L’utilitaire imp (pour restaurer) C:\> IMP utilisateur/password [paramètres] Exemple : C:\> IMP system/oracle file=c:\sauv.dmp log=c:\log.txt fromuser=user1 touser=user2 C:\> IMP system/oracle file=c:\sauv.dmp log=c:\log.txt full=Y ignore=Y fromuser=user1 touser=user2 Les données dans User1 sont copiées vers User2 full=Y On importe tout Import d’un fichier DEHECQ Olivier – http://aide.informatique1.fr 7 3.3 Exemple : export de la base HR La base de l’utilisateur HR = le schéma HR Méthode : un fichier .bat qui s’exécute, stockant les paramètres de ce qu’on veut exporter Il faut créer les deux fichiers suivants : export.bat + export.dat Le but est de sauvegarder le schéma ORCL.HR Le fichier export.bat : set oracle_sid=ORCL set NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252 REM ceci afin d’éviter bug C:\oracle\product\10.2.0\Db_1\BIN\EXP system/oracle PARFILE=C:\Documents\export.dat On peut avoir à remplacer system/oracle par system/oracle@ORCL (accès distant) Le fichier C:\Documents\export.dat : Buffer=65536 File=C:\Documents\export_HR.dmp OWNER=HR ou FULL=Y CONSISTENT=Y STATISTICS=NONE Log=C:\Documents\export_HR.log -- emplacement de la sauvegarde -- je ne prends que les données sures (commitées) -- fichier de log d’export Il est possible de ne sélectionner que certaines tables, etc. http://download.oracle.com/docs/cd/B19306_01/server.102/b14215/exp_imp.htm#CEGFIAGE Ne JAMAIS zipper les fichiers DUMP ! 3.4 Exemple : import de la base HR Le but est de restaurer la sauvegarde du schéma HR Si on fait un fromuser… touser…, cela implique que l’utilisateur de touser existe ! Créer un schéma : C:\> SET ORACLE_SID=ORCL C:\> SQLPLUS SYS/oracle AS SYSDBA SQL> CREATE USER RHFORM IDENTIFIED BY password DEFAULT TABLESPACE EXAMPLE TEMPORARY TABLESPACE TEMP PROFILE DEFAULT; -- on accorde les privilèges à l'utilisateur RHFORM SQL> GRANT CONNECT TO RHFORM; SQL> GRANT RESOURCE TO RHFORM; SQL> GRANT SELECT_CATALOG_ROLE TO RHFORM; SQL> GRANT UNLIMITED TABLESPACE TO RHFORM; SQL> GRANT CREATE ANY TABLE TO RHFORM; SQL> GRANT CREATE ANY INDEX TO RHFORM; SQL> GRANT CREATE ANY VIEW TO RHFORM; SQL> GRANT EXECUTE ANY PROCEDURE TO RHFORM; On peut maintenant se connecter avec RHFORM/password pour tester la création de l’utilisateur. Le fichier import.bat : DEHECQ Olivier – http://aide.informatique1.fr 8 C:\> set oracle_sid=ORCL set NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252 C:\oracle\product\10.2.0\Db_1\BIN\IMP system/oracle@ORCL PARFILE=C:\Documents\import.dat On peut avoir à remplacer system/oracle par system/oracle@ORCL (accès distant) Le fichier C:\Documents\import.dat : Buffer=65536 File=C:\Documents\export_HR.dmpemplacement de la sauvegarde fromuser=HR nom du schéma à restaurer tosuer=RHFORM ou FULL=Y si export en FULL=Y aussi #tables=JOBS,JOB_HISTORY STATISTICS=NONE Log=C:\Documents\import_HR.log fichier de log d’import fromuser… touser… est OBLIGATOIRE quand on ne fait pas un export FULL=Y Résolution des erreurs : En cas de plantage de l’import, avant de le relancer, il faut faire : SQL> DROP USER RHFORM CASCADE; Puis recréer l’utilisateur et réimporter 3.5 Exercice pratique imports/exports Créer une instance Oracle avec une base de données EXAMPLE : Créer le script, et modifier le fichier cloneDBCreation.sql @...mkplug.sql Connect sys/... ALTER TABLESPACE EXAMPLE RENAME TO FORMATION; Shutdown ... insérer cette ligne ici Création du listener et du tnsnames : Modifier le fichier listener.ora puis démarrer le service listener. C:\> lsnrctl start LISTENER4 Modifier le fichier Tsnnames.ora afin d’ajouter l’entrée de l’instance créée Lancer le script de création de Base de données clonedbcreation.sql Faire les modifications suivantes dans la base de données « Exemple » : Ajouter 3 lignes dans la table EMPLOYEES (departement IT) : SQL>INSERT INTO HR.EMPLOYEES VALUES (hr.employees_seq.nextval, 'Olivier','Dehecq','ODEHECQ','01.02.03.04.05',SYSDATE,'IT_PROG',6000,NULL,NULL,60); SQL>INSERT INTO HR.EMPLOYEES VALUES (hr.employees_seq.nextval, 'Eric','Olliver','EOLLIVIER','01.02.03.04.06',SYSDATE,'IT_PROG',6000,NULL,NULL,60); SQL>INSERT INTO HR.EMPLOYEES VALUES (hr.employees_seq.nextval, 'Fabienne','Lenoir','FLENOIR','01.02.03.04.07',SYSDATE,'IT_PROG',6000,NULL,NULL,60); SQL>COMMIT; Faire une sauvegarde (EXP) de la base de données : Utiliser les fichiers export.bat + export.dat (cf. détails page précédente) OWNER=HR Mettre les 3 employés dans le département IT HelpDesk : SQL> UPDATE HR.EMPLOYEES SET DEPARTMENT_ID=230 WHERE EMPLOYEE_ID=208 OR EMPLOYEE_ID=209 OR EMPLOYEE_ID=210; SQL> COMMIT; Simulation d'un crash Serveur : Exploser tout dans le schéma HR DEHECQ Olivier – http://aide.informatique1.fr 9 Restauration de la base de données (Remise en Condition Opérationnelle) : Supprimer l’utilisateur HR : SQL> DROP USER HR CASCADE; Créer un nouvel utilisateur HR dans le tablespace FORMATION : C:\> SET ORACLE_SID=ORACLE C:\> SQLPLUS SYS/oracle AS SYSDBA SQL> CREATE USER RHORACLEIDENTIFIED BY password DEFAULT TABLESPACE FORMATION TEMPORARY TABLESPACE TEMP PROFILE DEFAULT; -- on accorde les privilèges à l'utilisateur HR SQL> GRANT CONNECT TO HR; SQL> GRANT RESOURCE TO HR; SQL> GRANT SELECT_CATALOG_ROLE TO HR; SQL> GRANT UNLIMITED TABLESPACE TO HR; SQL> GRANT CREATE ANY TABLE TO HR; SQL> GRANT CREATE ANY INDEX TO HR; SQL> GRANT CREATE ANY VIEW TO HR; SQL> GRANT EXECUTE ANY PROCEDURE TO HR; Importer les données HR : fromuser=HR … touser=HR puis utiliser le script import.bat + import.dat Faire une sauvegarde complète et partielle de la base de données. Modifier le fichier export.dat pour FULL=Y (complète) ou OWNER=HR (partielle) Programmer une sauvegarde complète tous les samedis à 02h00 : Créer une tache dans le planificateur de tâches, pour exécuter le script export_FULL.bat Programmer une sauvegarde partielle tous les jours de la semaine à 02h00 Créer une tache dans le planificateur de tâches, pour exécuter le script export_HR.bat DEHECQ Olivier – http://aide.informatique1.fr 10 4 Optimisation 4.1 Gestion de la mémoire Oracle 9g et inférieur : N paramètres pour les zones mémoire Oracle 10g : 1 paramètre SGA (utilisation d’ASMM) + 1 paramètre PGA Automatic Shared Memory Management (ASMM) : on définit juste le SGA Target (taille du SGA). Exemple : 1Go. Oracle distribue la mémoire entre les différents caches. Paramètre de SGA : SGA_TARGET Paramètre de PGA : PGA_AGGREGATE_TARGET Oracle 11g : 1 paramètre pour PGA+SGA : MEMORY_TARGET Processus dédié : à 1 processus client correspond 1 processus serveur. Accès distant Pour tester que le client accède au listener : tnsping Toujours vérifier qu’on est VRAIMENT sur la base à laquelle on veut accéder ! SELECT * FROM V$INSTANCE Oracle nécessite un client lourd : il faut installer l’application Client Oracle sur chaque client ! OFA : règles de nommages Oracle : Les répertoires Admin, Product, Oradata doivent donc être au même niveau ! DEHECQ Olivier – http://aide.informatique1.fr 11 4.2 Mise à jour de Oracle 1. Sauvegarder la base 2. Arrêter la base Gestion des services ou shutdown 3. Mise à Jour du produit Utilisation d’Oracle Universal Installer (Setup ou runInstaller ou runInstaller.sh) Attention à bien choisir le bon répertoire Oracle que l’on veut upgrader : sélectionner le bon home dans la comboBox 4. Upgrade de la base C:\> dbua Ne pas déplacer la BD : la recompiler (utlrp.sql) Il se charge de redémarrer les services à l’issue 5. Tester le bon fonctionnement de l’installation SELECT comp_name, version, status FROM DBA_REGISTRY; Démarrer le listener (C:\>lsnrctl start …) Démarrer le service dbconsole 4.3 Gestion des utilisateurs (rappels) Ajouter des utilisateurs (p217) : CREATE User … Ajouter des privilèges système (p225) : GRANT create session TO User;GRANT connect to User;(connect = Role système) Ajouter des privilèges objets (p227) : GRANT [SELECT|UPDATE] ON toto.table1 TO user GRANT connect, ressource TO User; : on crée des rôles pour simplifier Par rapport à Oracle10g, Oracle11g accorde beaucoup moins de droits au rôle connect on peut se retrouver avec des problèmes de privilèges ! GRANT connect to … n’est pas recommandé ! Il vaut mieux un GRANT create session to … Quotas tablespace (p219) : La plupart du temps, pour ne pas se prendre la tête, on met un QUOTAS UNLIMITED Profil (p221) : Pour la gestion des mots de passe surtout Ne jamais modifier les paramètres du profil DEFAULT Audit : On peut tracer tout ce que fait un utilisateur (même SYS) 4.4 Gestion des Tablespaces (p169) C’est l’espace qui permet d’enregistrer les différents objets Oracle. DEHECQ Olivier – http://aide.informatique1.fr 12 Gestion des tablespaces La lecture séquentielle implique une perte de performance, mais on ne perd pas nécessairement de performances. 4.4.1 La High Water Mark Un SELECT * FROM Matable; (séquentiel), va lire du début jusqu’au bloc HWM On peut faire des opérations de SHRINK pour diminuer la HWM 4.4.2 La fragmentation Solution : il faut augmenter la taille des blocs DEHECQ Olivier – http://aide.informatique1.fr 13 Solution : il faut augmenter le PCTFREE Taille des blocs 4.5 Connexion en SQL Developer A la place de localhost, mettre l’adresse IP (pas 127.0.0.1) Lister les tablespaces : SELECT tablespace FROM dba_tablespaces; Lister les utilisateurs : SELECT username FROM all_users; 4.6 Test des requêtes stockées dans le SHARED POOL /* vidage du shared_pool */ ALTER SYSTEM flush SHARED_POOL; /* lancement des requetes, attention à l'orthographe */ SELECT sysdate from dual; SELECT sysdate FROM dual; SELECT value from v$parameter WHERE type='1'; /* vérification du contenu du cache shared pool */ SELECT sql_text,hash_value,executions FROM v$sqlarea WHERE sql_text LIKE ('SELECT sysdate%') OR sql_text LIKE ('%v$parameter%'); /* lancement des requêtes, attention à l'orthographe */ SELECT sysdate FROM dual; SELECT value from v$parameter WHERE type='2'; /* vérification du contenu du cache shared pool */ -- il y a bien incrémentation du nombre d'exécution des requêtes SELECT sql_text,hash_value,executions FROM v$sqlarea WHERE sql_text LIKE ('SELECT sysdate%') OR sql_text LIKE ('%v$parameter%'); Cela montre que le shared pool va stocker des requêtes différentes selon l’écriture Il faut minimiser les différences de casse et maximiser l’utilisation des host variable et bind variable (parsing) “CURSOR_SHARING=EXACT” doit devenir “CURSOR_SHARING=SIMILAR” (Permet de ne pas différencier la casse) DEHECQ Olivier – http://aide.informatique1.fr 14 4.7 Les tables externes Permet d’accéder à un fichier extérieur à la base comme si c’était une table Principe de table externe Créer un fichier texte C:\temp\table_externe.txt : 10|ligne1 11|ligne2 12|ligne3 5|ligne5 Création de l’objet directory : CREATE DIRECTORY data_externe AS 'C:\temp' ; Attribution des privilèges de lecture /écriture : GRANT READ, WRITE ON DIRECTORY data_externe TO <user>; Création de table : CREATE TABLE tb_externe (champ1 VARCHAR2(10), champ2 VARCHAR2(20)) ORGANIZATION EXTERNAL( TYPE ORACLE_LOADER DEFAULT DIRECTORY data_externe ACCESS PARAMETERS ( RECORDS DELIMITED BY NEWLINE BADFILE 'table_externe.bad' FIELDS TERMINATED BY '|') LOCATION (data_externe:'table_externe.txt')); création de la table driver Oracle répertoire du fichier délimiteur de ligne délimiteur de champ emplacement Tester : Se connecter avec <User> Faire un select * from tb_externe; 4.8 La table temporaire CREATE GLOBAL TEMPORARY TABLE tempo (…) ON COMMIT {PRESERVE|DELETE} ROWS; Traitements batch : 4.8.1 agrégation des données d’autres tables pour créer une table de travail. Traitement séquentiel de la table : lecture de la table temporaire En fin de traitement, la table temporaire est supprimée automatiquement (pas d’utilisation du tablespace d’undo) Exemple Session utilisateur1 : SQL> CREATE GLOBAL TEMPORARY TABLE tempo (owner varchar2(20), tablename varchar2(36)) ON COMMIT PRESERVE ROWS; DEHECQ Olivier – http://aide.informatique1.fr 15 ON COMMIT PRESERVE ROWS --garde les lignes lors du commit ON COMMIT DELETE ROWS --supprime les lignes lors du commit Intérêt de preserve rows : garder les lignes dans les tables temporaires lorsqu’on update les autres tables (non temporaires) Intérêt de delete rows : supprimer les lignes lors d’un commit, pour pouvoir charger d’autres données dans la table temporaire On évite absolument les opérations de DDL dans les scripts SQL> INSERT INTO tempo SELECT owner,table_name from dba_tables; SQL> select count(*) from tempo; 1600 rows Session utilisateur2 : SQL> select count(*) from tempo; 0 rows (même après un COMMIT sur la session 1) La table temporaire n’est visible que le temps de la session. Donc visible que pour 1 utilisateur/batch 4.9 IOT (Indexed Organization Table) Tables organisées en index. Maintenant, les données sont stockées dans l’index et non pas dans la table contenant les données. Schéma logique IOT CREATE TABLE iot1 (Nom varchar2(30), Prenom varchar2(30), Id Number, CONTRAINT pk_iot PRIMARY KEY(Id)) ORGANIZATION INDEX; DEHECQ Olivier – http://aide.informatique1.fr 16 5 Oracle sous Linux 5.1 Connexion X11 à un Linux Sur le client : Installer xming-fonts, xming, putty Sur le serveur : $ dhclient $ ifconfig Sur le client : Ouvrir putty Options : SSH > X11 > allow X11 forwarding Se connecter au serveur Dans putty : Se connecter en utilisateur oracle (mot de passe par défaut : oracle) # export DISPLAY=localhost:10.0 # xclock (pour tester l’interface graphique) 5.2 Installation d’Oracle $ cd /tmp/ora…/ (aller dans le répertoire de l’installeur du moteur Oracle DB 10gR2) $ ./runInstaller Installer Oracle 10.2.0 en mode graphique, installation personnalisée Décocher : OLAP, Partitioning, Spatial, Advanced security, Oracle Entreprise Manager Console Exécuter les scripts demandés en tant que root 5.2.1 Installation du patch de mise à jour $ cd /tmp/ora…/ (aller dans le répertoire de l’installeur du patch de mise à jour) $ ./runInstaller Installer le patch Oracle 10.2.0.4 en mode graphique Exécuter les scripts demandés en tant que root 5.2.2 Vérification de la version $ cd $ORACLE_HOME $ cd Opatch $ ./opatchlsinventory 5.3 Création de la base de données En général on utilise ses propres scripts ou ses templates $ cd $ORACLE_HOME/bin $ ./dbca Base de données personnalisée. On la nomme ORA10. On décoche Spatial. $ export ORACLE_SID=ORA10 $ ./sqlplus system/oracle $ env Doit renvoyer ORACLE_SID='ORA10' DEHECQ Olivier – http://aide.informatique1.fr 17 5.3.1 Assistant réseau $ ./netca Configuration d’un processus d’écoute + configuration d’un nom de service de réseau local Assistant création de BD + options : Assistant upgrade de BD : Assistant màj listener + tnsnames : dbca dbua netca DEHECQ Olivier – http://aide.informatique1.fr 18 6 Vues Matérialisées Materialized View (MV) : vue contenant des données (contrairement aux vues classiques) Au moment de la création de la vue, elle récupère les données et les stocke dans une structure (tablespace). 6.1 rapide car ne reconstruit pas les données. il faut faire des refresh de cette vue (attention à l’obsolescence des données) Opérations à réaliser Accès distant à la base Oracle sur SRV Windows 6.2 Exemple de mise en place 1 - Sur le serveur maitre (Serveur Windows) : SQL> connect olivier/password@ORCL SQL> CREATE TABLE mv_tb_maitre ( id number, code varchar2(5), libelle varchar2(30), valeur number, flag char(1)); SQL>ALTER TABLE mv_tb_maitre ADD CONSTRAINT pk_mv_tb_maitre PRIMARY KEY (id); SQL> @c:\procInsert_MV.sql script d’insertion de données 2 - Lien entre deux bases : Peut relier 2 bases distantes, ou 2 bases hébergées localement Depuis la base ORA10 : SQL> CREATE PUBLIC DATABASE LINK lk_mv CONNECT TO <userBaseDistante> IDENTIFIED BY <passwordBaseDistante> USING '<aliasDeServiceTNSCrééEtTesté>'; Par défaut le DB_LINK est PRIVATE (donc visible seulement par celui qui le crée) Tester : SQL > SELECT * from sysdate@lk_mv; 3 - Créer la vue matérialisée : SQL> CREATE MATERIALIZED VIEW mv_test TABLESPACE USERS emplacement de stockage BUILD IMMEDIATE construction immediate REFRESH COMPLETE reconstruit intégralement la table à chaque màj NEXT sysdate + 10/1440 mise à jour toutes les 10 minutes (1440 : nb minutes dans 24h) -- Si on veut toutes les 1h : 1/24 (24 : nb heures dans 24h) AS SELECT code, sum(valeur) from mv_tb_maitre@lk_mv WHERE flag='1' GROUP BY code; 4 - Tester : SQL> SELECT * FROM mv_test; Sur le serveur maître (Serveur Windows) : SQL> UPDATE mv_tb_maitre SET valeur=valeur+100 SQL> COMMIT; WHERE flag='1'; DEHECQ Olivier – http://aide.informatique1.fr 19 SQL> SELECT * FROM mv_tb_maitre; Sur le serveur Esclave (Serveur Linux) : SQL> ALTER SESSION SET NLS_DATE_FORMAT='MM/DD/YYYY HH24:MI:SS'; SQL> SELECT * FROM user_mview_refresh_times; SQL> SELECT * FROM mv_test; DEHECQ Olivier – http://aide.informatique1.fr 20 7 Le monitoring Index Accélère la recherche. Un index est très couteux en performances. De plus, il faut vérifier que les index créés sont bien utilisés. 7.1 Exemple Création d’une table et tests : SQL> CREATE TABLE liste_tables AS SELECT * FROM dba_tables; C’est un ordre DDL, il n’y a donc pas besoin de commiter SQL> SELECT COUNT(*) FROM liste_tables; Tests (dans SQL Developer): SELECT * FROM liste_tables WHERE OWNER='DBSNMP'; [F10] donne le raisonnement logique. On voit que la table est parcourue en FULL_SCAN : ( TABLE_ACCESS + OPTION=FULL) En dessous de 20% de lignes ramenées, il est intéressant de créer un index. Sauf si la requête est exécutée très rarement (1 fois par an). SELECT * FROM V$object_usage; 0 ligne vue système sur l’utilisation des index Création d’un index : CREATE INDEX idx1_liste_tables ON liste_tables (owner); On doit normalement mettre les index dans des tablespaces spécifiques Mise sous surveillance de l’index : ALTER INDEX idx1_liste_table monitoring usage; On refait SELECT * FROM V$object_usage; 1 ligne, used = no SELECT * FROM liste_tables WHERE OWNER='DBSNMP'; Avec [F10], on voit bien que la requête utilise l’index SELECT * FROM V$object_usage; 1 ligne, used = yes 7.2 Modes d’optimisation Paramètre OPTIMIZER_MODE={ALL_ROWS|FIRST_ROWS} Mode rule : ne pas utiliser : trop vieux ! Obsolète Mode basé sur les coûts : statistiques sur chaque objet il faut que les statistiques soient à jour quand on est en mode all_rows ou first_rows Pour mettre à jour les statistiques : Manuellement : Utilisation du paquet : @dbms_stats.sql (p275) ou ANALYZE TABLE nomTable COMPUTE STATISTICS; Automatiquement : Toutes les nuits, Oracle recalcule les statistiques Pour vérifier que les statistiques sont à jour : SELECT COUNT(*) FROM la_table_a_vérifier; SELECT table_name, last_analyzed FROM user_tables WHERE table_name='LISTE_TABLES'; On peut aussi utiliser dba_tables au lieu de user_tables DEHECQ Olivier – http://aide.informatique1.fr 21 Exemple : SELECT * FROM liste_tables WHERE OWNER='DBSNMP'; SELECT * FROM liste_tables WHERE UPPER(OWNER)='DBSNMP'; [F10] montre que toute la table est parcourue, l’index n’est plus utilisé L’utilisation de la fonction dans la clause WHERE fait en sorte que l’index ne soit plus utilisé Il faut donc créer des index sur fonctions. Les index de fonction CREATE INDEX monIndex ON liste_tables (UPPER(owner)); Ne fonctionne qu’avec la fonction UPPER Il faut un index différent par fonction DEHECQ Olivier – http://aide.informatique1.fr 22 8 Le partitionnement Gestion des accès aux grosses tables Les morceaux sont plus petits, les performances sont donc normalement meilleures. La clé de partitionnement : La clé de partitionnement va permettre un partitionnement optimum ou non. Dans chaque requête, pour la clause : WHERE les colonnes de la clé de partitionnement = valeur Si on définit bien la clé de partitionnement, les recherches seront plus rapides. Prérequis : A partir d’une table de 2Go, on peut étudier les clés de partitionnement. Standard Edition : pas toutes les options Enterprise Edition : toutes les options (dont le partitionnement !) Types de partitionnement : De v8.0 à v10g : De v8i à v10g : De v9i à v10g : De v9i à v10g : Depuis v11g : (entre des valeurs) (Oracle calcule une clé hash) list partitioning (Selon une liste de valeurs) composite partitioning (Une liste, et dans cette liste on partitionne) Ajout de 5 méthodes range partitioning hash partitioning Partition By Range / fourchette de valeurs DROP TABLE TB_RANGE_PARTITION; CREATE TABLE TB_RANGE_PARTITION ( CODE NUMBER, LIBELLE VARCHAR2(80), TYPE VARCHAR2(10), ADRESSE_1 VARCHAR2(80), VILLE VARCHAR2(20), DATE_CREATION DATE) PARTITION BY RANGE (DATE_CREATION) clé de partitionnement (PARTITION P_2003 VALUES LESS THAN (TO_DATE('31/12/2003','DD/MM/YYYY') TABLESPACE ts_data03, PARTITION P_2004 VALUES LESS THAN (TO_DATE('31/12/2004','DD/MM/YYYY')) TABLESPACE ts_data04, PARTITION P_2005 VALUES LESS THAN (TO_DATE('31/12/2005','DD/MM/YYYY')) TABLESPACE ts_data05, PARTITION P_2006 VALUES LESS THAN (MAXVALUE) TABLESPACE ts_data06 ); partition “poubelle” ALTER TABLE TB_RANGE_PARTITION ADD ( CONSTRAINT PK_TB_RANGE_PARTITION PRIMARY KEY (CODE) USING INDEX TABLESPACE ts_INDEX); Insertion dans la table partitionnée à partir table source Les données doivent être réparties par année INSERT INTO tb_range_partition SELECT * from tb_source; DEHECQ Olivier – http://aide.informatique1.fr 23 Partition By Liste / dispatch en fonction d'une liste de valeurs : DROP TABLE TB_LIST_PARTITION; CREATE TABLE TB_LIST_PARTITION( CODE NUMBER, LIBELLE VARCHAR2(80), TYPE VARCHAR2(10), ADRESSE_1 VARCHAR2(80), VILLE VARCHAR2(20), DATE_CREATION DATE ) PARTITION BY LIST (ville) STORAGE (INITIAL 100K NEXT 10K PCTINCREASE 0) TABLESPACE Data0 ( PARTITION Part_Maine_et_Loire VALUES ('ANGERS') TABLESPACE Data1, PARTITION Part_Loire_Atlantique VALUES ('NANTES','ANCENIS') TABLESPACE Data2, PARTITION Part_Paris VALUES ('PARIS') TABLESPACE Data3, PARTITION Part_Autres VALUES (DEFAULT)); partition poubelle : utilise le tablespace par default (Data0) ALTER TABLE TB_LIST_PARTITION ADD (CONSTRAINT PK_TB_LIST_PARTITION PRIMARY KEY (CODE) USING INDEX TABLESPACE I_TEST); Insertion dans la table partitionnée à partir table source Les données doivent être réparties par Département INSERT INTO tb_list_partition Partition Composite Range + liste : SELECT * from tb_source; CREATE TABLE TB_COMPOSITE_PARTITION ( ID NUMBER PRIMARY KEY, LIBELLE VARCHAR2(40), DATE_TRT DATE, FLAGNUMBER(1), CODE VARCHAR2(5)) TABLESPACE DATA PARTITION BY RANGE (DATE_TRT) SUBPARTITION BY LIST (FLAG) ( PARTITION P_DAT2004 VALUES LESS THAN (TO_DATE('31/12/2004','DD/MM/YYYY')), TABLESPACE DATA ( SUBPARTITION P_2004_1 VALUES (1) TABLESPACE DATA, SUBPARTITION P_2004_2 VALUES (2) TABLESPACE DATA, SUBPARTITION P_2004_3 VALUES (DEFAULT) TABLESPACE DATA), PARTITION P_DAT2005 VALUES LESS THAN (TO_DATE('31/12/2005','DD/MM/YYYY')), TABLESPACE DATA ( SUBPARTITION P_2005_1 VALUES (1) TABLESPACE DATA, SUBPARTITION P_2005_2 VALUES (2) TABLESPACE DATA, SUBPARTITION P_2005_3 VALUES (DEFAULT) TABLESPACE DATA ), PARTITION P_DAT2006 VALUES LESS THAN (TO_DATE('31/12/2006','DD/MM/YYYY')), TABLESPACE DATA ( SUBPARTITION P_2006_1 VALUES (1) TABLESPACE DATA, SUBPARTITION P_2006_2 VALUES (2) TABLESPACE DATA, SUBPARTITION P_2006_3 VALUES (DEFAULT) TABLESPACE DATA ), PARTITION P_DAT2007 VALUES LESS THAN (MAXVALUE), TABLESPACE DATA ( SUBPARTITION P_2007_1 VALUES (1) TABLESPACE DATA, SUBPARTITION P_2007_2 VALUES (2) TABLESPACE DATA, SUBPARTITION P_2007_3 VALUES (DEFAULT) TABLESPACE DATA ) ); DEHECQ Olivier – http://aide.informatique1.fr 24 9 Datapump (export/import) Datapump est une nouveauté 10g : expdp d’une base en v11g ne peut pas faire impdp sur une base en v10g Expdp sur v10g peut faire impdp sur v11g Evidemment, les sauvegardes exp/imp sont incompatibles avec expdp/impdp Expdp/impdp est plus rapide, plus convivial et plus sympa que exp/imp! Exp/imp : les dump sont stockés sur le client Expdp/impdp : les dump sont stockés sur le serveur Oracle Il y a donc besoin d’un objet DIRECTORY pour que la base accède physiquement au serveur pour copier le fichier dump. 9.1 Exports : expdp Attention : il faut écraser le fichier dump existant AVANT de faire expdp. Donc un rm –f ! 9.1.1 Marche à suivre pour exporter 1 – créer un directory : DIRECTORY par défaut : DATA_PUMP_DIR (avec l’assistant) Pour lister les DIRECTORY : SELECT * FROM dba_directories; 2 –Attribuer des privilèges sur le directory (aux utilisateurs qui font des exports/imports) : GRANT read,write ON DIRECTORY data_pump_dir TO User1,User2; 3- Droits sur l’export/import (tout est controlé au niveau des privilèges) : IMP_FULL_DATABASE droit d’importer DEHECQ Olivier – http://aide.informatique1.fr 25 EXP_FULL_DATABASE droit d’exporter GRANT EXP_FULL_DATABASE TO User1; De plus sous Unix, l’utilisateur Oracle doit avoir les droits sur le répertoire (ex. chown) 4- Exécution de l’export/import : 9.1.2 Exemples d’utilisation de la commande expdp Aide en ligne de commande : $ expdp HELP=Y Estimation de la taille nécessaire à l’export : $ expdp system/oracle FULL=Y ESTIMATE_ONLY=Y Sauvegarde niveau Database (ne sauvegarde jamais SYS): EXPORT FULL (nécessite EXP_FULL_DATABASE) $ expdp system/oracle [DIRECTORY=DATA_PUMP_DIR] DUMPFILE=<path\monDump.dtp> FULL=Y LOGFILE=<path\monDump.log> Sauvegarde niveau Schéma : EXP_FULL_DATABASE permet de sauvegarder tous les schémas, même ceux auxquels on n’a pas accès. Exemple : export de schéma(s) $ expdp system/oracle [DIRECTORY=...] DUMPFILE=... LOGFILE=... SCHEMAS='toto,tata' Dans ce cas, on met toujours SCHEMAS avec un S Exemple : export de tous les schémas sauf le schéma TEST (voire aussi TOTO) $ expdp system/oracle [DIRECTORY=DATA_PUMP_DIR] FULL=Y DUMPFILE=data_pump_dir2:expFile.dtp LOGFILE=expFile.log> EXCLUDE=SCHEMA:\"=\'TEST\'\" [EXCLUDE=SCHEMA:\"=\'TOTO\'\"] Utilise le directory par défaut si il n’est pas indiqué (cas de LOGFILE=expFile.log) \ pour que le Shell n’interprète pas les " et ' Sauvegarde niveau table : Exemple : export de table(s) $ expdp system/oracle [DIRECTORY=...] DUMPFILE=... LOGFILE=...TABLES='employes,conges' Les cotes ' peuvent être nécessaires, OU PAS ! Dans ce cas, on met toujours TABLES avec un S Il va vouloir exporter les tables du schéma correspondant à l’utilisateur (ici system), sinon : user1.maTable1, user1.maTable2 Exemple : export du schéma TITI sauf les tables commençant pas ‘INS’ $ expdp system/oracle [DIRECTORY=DATA_PUMP_DIR] SCHEMA= DUMPFILE=data_pump_dir2:expFile.dtp LOGFILE=expFile.log> EXCLUDE=TABLE:\"LIKE \'INS%\'\" Utilisation de 3 processus pour effectuer la tache Bouffe des ressources, mais gain de temps $ expdp… PARALLEL=3 … Sauvegarde niveau tablespace : Tablespace transportable DEHECQ Olivier – http://aide.informatique1.fr 26 9.1.3 Déroulé complet d’export de base full Sur Windows (base ORCL) : 1234- Création d ‘un objet directory : monDir GRANT Export estimate Export full Créer le répertoire C:\SauvegardesOrcl sur le serveur Windows C:\> sqlplus system/oracle@ORCL SQL>CREATE DIRECTORY monDir AS 'C:\SauvegardesOrcl' ; SQL>GRANT READ,WRITE ON DIRECTORY monDir TO odehecq; C:\> expdp odehecq/password FULL=Y ESTIMATE_ONLY=Y Estimation : 67Mo C:\> expdp odehecq/password DIRECTORY=monDir DUMPFILE=monDir:exportOrcl.dtp FULL=Y LOGFILE=exportOrcl.log Sur Linux (base ORA10) : Créer le répertoire /save/ORA10/ sur le serveur linux Accorder les droits à l’utilisateur Oracle ($ chown oracle /save/ORA10) $ ./sqlplus system/oracle@ORCL SQL> CREATE DIRECTORY monDir2 AS '/save/ORA10' ; SQL> GRANT READ,WRITE ON DIRECTORY monDir2 TO odehecq; $./expdpodehecq/password FULL=Y ESTIMATE_ONLY=Y Estimation : 67Mo $ ./expdpodehecq/password DIRECTORY=monDir2 DUMPFILE=monDir2:exportORA10.dtp FULL=Y LOGFILE=exportORA10.log 9.2 Import : impdp 9.2.1 Exemples d’utilisation de la commande impdp Niveaux Database : $ impdp system/oracle DIRECTORY=... DUMPFILE=... LOGFILE=... FULL=Y EXCLUDE= (au minimum on exclut le schéma SYSTEM) niveau Schéma JAMAIS d’import FULL sans conditions ! (erreurs, écrasements, etc.) Niveau Schéma : $ impdp system/oracle DIRECTORY=... DUMPFILE=... LOGFILE=... SCHEMAS='schema1,schema2' Les cotes ' peuvent être nécessaires, OU PAS ! La création du schéma est automatisée : 1) drop user schema1 cascade; 2) impdp … Il n’y a plus besoin de create user, grant, etc. Exemple : Clonage de schéma (ancien exp fromuser= touser=) : $ impdp system/oracle DIRECTORY=... DUMPFILE=... LOGFILE=... SCHEMAS='schema1,schema2' REMAP_SCHEMA=schema1:newShema1,schema2:newSchema2 Transforme le schéma1 en newSchema1 et schema2 en newSchema2, en les créant si besoin Niveau Table : ça existe, mais on ne voit pas Niveau Tablespace : ça existe, mais on ne voit pas Olivier DEHECQ – http://aide.informatique1.fr Page 27 9.2.2 Déroulé complet d’import de base full Serveur Linux (base ORA10) : 1. Prérequis : Creation d’un tablespace “migration” 10M LOCAL MANAGEMENT AUTOALLOCATE Copier le dump full ORCL (Windows) dans /tmp Création d’un objet directory DIR_migration Connaitre les tablespaces utilisés par les tables de scott dans ORCL Importer les objets de la base ORCL, schéma scott (tablespace USERS) vers la base ORA10, schéma toto, tablespace MIGRATION Tester tout 2. Export des données SQL> CREATE TABLESPACE migration DATAFILE '/oracle/oradata/ORA10/miragtion.dbf' SIZE32 M AUTOEXTEND ON BLOCKSIZE 8K; $ ./$ORACLE_HOME/bin/expdp odehecq/password@ORCL DIRECTORY=monDir DUMPFILE=full.dpf LOGFILE=full.log FULL=Y 3. Activation du partage sur le serveur Oracle Activer samba sur Linux : $ su $ service smb start Dans Windows : copier le full.dtp vers \\10.2.100.43\root\etc Sur Linux ORA10 4. Création du répertoire des datapump SQL> CREATE DIRECTORY DIR_migration AS '/tmp'; Sur Windows (base ORCL) : 5. Lister les utilisateurs SQL> select distinct tablespace_name FROM dba_tables WHERE owner='SCOTT'; 6. Importer les données de scott vers scotty $ ./impdp system/oracle DUMPFILE=FULL.DPF DIRECTORY=DIR_migration LOGFILE=impSchemaScoot.log SCHEMAS=SCOTT REMAP_SCHEMA=SCOTT:SCOTTY REMAP_TABLESPACE=USERS:MIGRATION 7. Vérifier les informations de scotty SELECT distinct tablespace_name FROM dba_tables WHERE owner='SCOTTY'; Il faut remettre scotty (dont le compte est locked et password expiré) en état. SQL> ATLER USER SCOTTY IDENTIFIED BY tigger account unlock; 1.1.1 Option TABLE_EXIST_ACTION … TABLE_EXISTS_ACTION=SKIP|APPEND|APPEND|TRUNCATE|REPLACE SKIP : ne remplace pas les données existantes APPEND : ajoute à la suite (attention aux PK !) TRUNCATE REPLACE 9.2.3 : : vide les données de la table puis réimporte (pas de modification de la structure) supprime la table, et la recrée à partir de la nouvelle structure L’import planifié : d’une base à l’autre pour répliquer L’objectif est de répliquer les tables d’une base à une autre. Lors d’une modification de structure d’une table, il faut que l’import ne génère pas d’erreur : table_exists_action=replace : D. Olivier – http://aide.informatique1.fr 28 Schéma de la réplication planifié Le parfile <fichier.txt> contient l’ensemble des paramètres de impdp : … network_link=DB_LINK remap_schema=BDU:MANDATE table_exists_action=REPLACE … Transfère les tables, mais ne génère pas de fichier dump. D. Olivier – http://aide.informatique1.fr 29 10 La Haute Disponibilité sur Oracle 10.1 RAC : Real Application Cluster Cluster Oracle Pas de gain de performances, juste Haute Disponibilité ASM : Automatic Storage Management. Sur chaque serveur, il faut une instance dédiée à l’ASM Attention au taux de pannes (souvent la baie qui est la cause de pannes) 10.2 Dataguard Système de secours Infrastructure type Dataguard La copie des Redolog Files vers le site distant est asynchrone. Au pire on perd quelques transactions. En cas de panne de la base principale, la standy database devient base principale le temps qu’on résolve la panne. On utilise un serveur Oracle qui ne sert que pour la sécurité et il faut une version Oracle DB Enterprise de chaque côté. D. Olivier – http://aide.informatique1.fr 30 11 Déroulé complet de l’installation d’une Oracle 11g sur Linux Ajouter un disque dur (facultatif) Ajouter un disque dur avec VMware, (au moins 5Go) $ fdisk –l Nota : /dev/sdb n’est pas monté $ fdisk /dev/sdb n nouvelle partition sauver et quitter w $ $ $ $ principale, utilise tout l’espace mkfs –t ext3 /dev/sdb mkdir /oracle11 mount /dev/sdb /oracle11 chown oracle /oracle11 Monter l’image .iso sur le linux : $ mkdir /cdrom $ mount -o loop /tmp/Oracle_Database_11201_linux32.iso /cdrom Ouvrir le fichier /cdrom/doc/index.html : Lire Database Installation guide (important). Installer Oracle 11G $ ./cdrom/runInstaller Installer dans /oracle11, ne sélectionner que les options nécessaires Installer une base : ‘ORA11’ + listener et service d’écoute (si besoin) : $ ./dbca $ ./netca Créer le lien symbolique vers /oracle/product/11.2.0 : $ ln -s /oracle11 /oracle/product/11.2.0 Lancer sqlplus : $ ./sqlplus system/oracle Au cas où sqlplus ne démarre pas après une installation, exécuter ./usr/local/bin/oraenv pour réinitialiser les variables D. Olivier – http://aide.informatique1.fr 31 12 Sauvegarde / restauration (p288) 12.1 Introduction 12.1.1 Il faut sécuriser les fichiers sensibles : Les fichiers de contrôle (Controlfiles ) à multiplexer (au minimum 2 controlfiles) Les fichiers online redo logs : n groupes de n membres (au minimum 3 groupes de 2 membres) Mise en place d’une politique de sauvegarde Politique de sauvegarde Est-il acceptable de perdre des données ? Est-il possible d’arrêter périodiquement la base 12.1.2 Mode de fonctionnement Non : mode archivelog Oui : mode noarchivelog Non : mode archivelog Oui : mode noarchivelog Est-il possible d’effectuer une sauvegarde complète pendant l’arrêt ? Non : mode archivelog Usage OLTP (beaucoup de mises à jour) ? OLTP : sauvegardes planifiées Usage Décisionnel (base en read only : pas nécessairement de sauvegardes) ? Décisionnel : une sauvegarde puis plus rien Oui : mode noarchivelog Possibilités de sauvegarde : Logique : export / export datapump Il faut reconstruire la base avant l’import À faire quand même en complément d’une sauvegarde physique Physique : Backup du serveur Oracle / copie des fichiers Pas besoin d’import, rien à reconstruire D. Olivier – http://aide.informatique1.fr 32 12.2 La sauvegarde physique Cold backup : Consiste en une sauvegarde à froid des fichiers, base arrêtée Procédure : 1) arrêter la base (shutdown normal|immediate) ou aussi : shutdown abort ; arrêter le listener ; startup ; shutdown normal 2) copie des fichiers suivants : datafiles, controlfiles, redolog, (init.ora ou spfile), le fichier password PWD<SID>.ora, archived redo log (si on est en mode archive) Ne pas oublier de fichiers, et vérifier que la base est bien arrêtée AVANT Le fichier PWD<SID>.ora (ou orapw<SID>) est situé dans $ORACLE_HOME/dbs ou $ORACLE_HOME/database Hot backup : Sauvegarde à chaud, base démarrée 12.3 export backup Oracle Mode Archivelog Création des fichiers archivelog On peut copier en miroir les archivelog dans 1 à 10 répertoires simultanément. 12.3.1 Mise en mode archivelog d’une base Rappel : ALTER SYSTEM SET <param>=<valeur> répertoire (n allant de 1 à 10) ARCHIVE_DEST_[n] formatage du nom de fichier (p291) LOG_ARCHIVE_FORMAT LOG_ARCHIVE_DEST_STATE_[n] [LOG_ARCHIVE_START] un state par destination : ENABLE|DISABLE avant la 9i il fallait démarrer l’archivage (ou =AUTO) D. Olivier – http://aide.informatique1.fr 33 Nouveautés 10g: la Flash Recovery Area (un repertoire) DB_RECOVERY_FILE_DEST DB_RECOVERY_FILE_DEST_SIZE taille maxi de la Flash Recovery Area A propos de la Flash Recovery Area: C’est un repertoire (que l’on définit généralement sur un autre volume), et qui permet notamment des flashback de table. Tend à remplacer l’archivelog. 12.3.2 Cas concrets Exemple : connaitre les valeurs des paramètres de Flash Recovery Area : SQL> show parameter db_recovery; Exemple : changer la taille du flash recovery area : SQL> ALTER SYSTEM SET db_recovery_file_dest_size=5G SCOPE=BOTH; Exemple : savoir en quel mode on est : SQL> SELECT archiver FROM v$instance; STOPPED SQL> SELECT log_mode FROM v$database; NOARCHIVELOG Exemple : passer en mode archive (nécessite un arrêt propre de la base) SQL> SQL> SQL> SQL> SQL> SQL> SQL> shutdown immediate STARTUP MOUNT ALTER DATABASE ARCHIVELOG; ALTER DATABASE OPEN; SELECT archiver FROM v$instance; STARTED SELECT log_mode FROM v$database; ARCHIVELOG ARCHIVE LOG LIST; Simuler un switch : SQL> ALTER SYSTEM SWITCH LOGFILE; 12.3.3 Déroulé complet de la mise en place d’une sauvegarde archivelog Unix $ export ORACLE_SID=ORA10 $ sqlplus /nolog $ connect sys/oracle AS SYSDBA Si la base est ouverte : $ shutdown immediate SQL> show parameter db_recovery; Si les paramètres ne sont pas définis ou sont mal définis : SQL> ALTER SYSTEM SET db_recovery_file='/oracle/oradata/flash_recovery; D. Olivier – http://aide.informatique1.fr 34 12.4 Sauvegarde des données : rman (p294) 12.4.1 Principes Avant : backup à remplacer par rman RMAN (Recovery Manager) : il y a des livres dessus, conséquents : beaucoup d’options Sauvegarde complète / FULL : Sauvegarde de toutes les données de la base de données Sauvegarde incrémentielle : Principe sauvegarde incrémentielle : différentielle/cumulative Différentielle : Prend peu de place Long à restaurer Cumulative Prend beaucoup de place Rapide à restaurer D. Olivier – http://aide.informatique1.fr 35 12.4.2 Fonctionnement de rman Rman est un outil indépendant du moteur Oracle Principe de fonctionnement de rman Le contenu des redolog file n’est pas sauvegardé ! (juste la structure) Les backupSet sont stockés physiquement sur le disque. Pour le fonctionnement de rman, il y a besoin du référentiel qui est stocké : - Soit dans le controlfile (par défaut) : durée de rétention par défaut = 7 jours - Soit dans le RMAN Recovery Catalog Le référentiel stocke : infos de configuration, sauvegardes réalisées, structure base cible, etc. 12.4.3 Exemple de configuration de rman C:\> SET ORACLE_SID=ORA10 C:\> rman target / C:\> rman target sys/oracle@<alias> RMAN> SHOW ALL; target : BD à joindre, / : identifiant connexion pour se connecter à une base distante liste des paramètres La rétention : Soit on indique le nombre de jeux de sauvegardes qu’on veut garder, soit on indique le nombre de jours de sauvegardes qu’on veut. Les sauvegardes obsolètes sont écrasables RMAN> CONFIGURE RETENTION POLICY TO REDUNDANCY 2; On écrit tel que ça apparaitrait dans show all RMAN> CONFIGURE RETENTION POLICY TO WINDOWS OF 3 DAYS; 2 jeux de sauvegardes 3 jours de sauvegardes L’emplacement de sauvegarde : RMAN> CONFIGURE DEFAULT DEVICE TYPE TO DISK; sauvegarder sur disque RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON; stocke le référentiel dans controlfile RMAN> CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT 'h:\Sauvegarde\Oracle\%U'; p298 Configuration de l’emplacement et du nom de la sauvegarde D. Olivier – http://aide.informatique1.fr 36 12.4.4 Déroulé de sauvegarde avec rman RMAN> BACKUP [comment] quoi [options]; RMAN> BACKUP [AS BACKUPSET] DATABASE; = RMAN> BACKUP DATABASE; Lister les sauvegardes : RMAN> LIST BACKUP [SUMMARY]; RMAN> CROSSCHECK BACKUPSET; contrôler les références entre le catalogue et le disque Exemple de sauvegarde : Sauvegarde de base complète + archive log + supprime les archive logs originaux RMAN> BACKUP AS COMPRESSED BACKUPSET DATABASE Tag 'Data_Full' plus ARCHIVELOG Tag 'Arch_Full' delete all input; 12.4.5 Test : utilisation recovery automatique Sur Windows (base ORCL) : C:\> set oracle_sid = ORCL C:\> rman target / RMAN> BACKUP DATABASE; RMAN> BACKUP AS COMPRESSED BACKUPSET DATABASE; RMAN> report obsolete; RMAN> list backup summary; RMAN> delete obsolete; RMAN> RESTORE DATABASE VALIDATE; voir les sauvegardes obsolètes supprimer les sauvegardes obsolètes pour tester Sur Linux (base ORA10) : $ export ORACLE_SID=ORA10 $ cd $ORACLE_HOME/bin $ ./rman target / RMAN> refaire les paramètres + BACKUP DATABASE; + RESTORE DATABASE VALIDATE; RMAN> exit; $ ./sqlplus odehecq/password SQL> CREATE TABLE tb_kill (code number, libelle varchar22(20)); SQL> INSERT INTO tb_kill VALUES (1,'ligne1'); SQL> COMMIT; $ ps –ef | grep dbw0 $ kill -9 <n°PID récupéré> $ ./sqlplus / as sysdba SQL> startup SQL> connect odehecq/password SQL> SELECT * FROM tb_kill; Tout va bien ! $ less /oracle/admin/ORA10/bdump/alert_ORA10.log /crash Completed crash recovery at … pour rechercher “/crash” Oracle a de lui-même fait un recovery 12.4.6 Test : suppression de controlfile Sur linux (base ORA10) : $ ./sqlplus system/oracle SQL> show parameter control_file; /oracle/oradata/ORA10/control01.ctl,/oracle/oradata/ORA10/control02.ctl,oracle/oradat a/ORA10/control03.ctl Sur une 2e session putty : $ rm /oracle/oradata/ORA10/control01.ctl Retour sur la 1ere session : SQL> select * from v$instance; SQL> select count(*) from all_tables; D. Olivier – http://aide.informatique1.fr 37 SQL> insert into odehecq.tb_kill values (2,'ligne2'); SQL> COMMIT; Pour le moment, tout semble aller bien mais … SQL> connect / as sysdba SQL> shutdown immediate SQL> shutdown abort SQL> startup $ less /oracle/admin/ORA10/bdump/alert_ORA10.log ORA-00202: control file: '/oracle/oradata/ORA10/control01.ctl' ORA-27037: unable to obtain file status Résolution de la panne: $ cp /oracle/oradata/ORA10/control02.ctl /oracle/oradata/ORA10/control01.ctl $ ./sqlplus connect / as sysdba SQL> shutdown immediate SQL> startup Problème résolu, grâce à la redondance des fichiers contrôle 12.4.7 Test : suppression de datafile Sur linux (base ORA10) : $ ./sqlplus system/oracle SQL> SELECT tablespace_name FROM user_table WHERE table_name='TB_KILL'; SYSTEM SQL> ALTER TABLE tb_kill ADD (flag number); SQL> UPDATE tb_kill SET flag=10; SQL> SELECT * FROM tb_kill; SQL> COMMIT; Sur une 2e session Putty : $ rm /oracle/oradata/ORA10/system01.dbf Retour sur la 1ere session : SQL> alter system flush buffer_cache; SQL> SELECT * FROM tb_kill; Ça ne fonctionne plus 12.5 Restauration d’une base SQL> connect / as sysdba; SQL> shutdown abort Copie de fichier : sauvegarde à froid : Sauvegarde à froid = sauvegarde cohérente (au niveau des SCN des controlfiles) = consistent backup Sauvegarde à chaud : Sauvegarde incohérente (désynchronisation entre les numéros de transaction selon les tablespaces et les numéros de transaction des controlfiles) = inconsistent backup 1. Restore (restauration de la dernière sauvegarde) 2. Recovery (rejoue les transactions des redologs pour arriver au dernier numéro de transaction) Méthode pas à pas $ ./rman target / RMAN> STARTUP MOUNT; RMAN> RESTORE TABLESPACE SYSTEM; On vérifie que le fichier a bien été recréé RMAN> RECOVER TABLESPACE SYSTEM; RMAN> sql "alter database open"; RMAN> exit $ ./sqlplus system/oracle SQL> SELECT * FROM tb_kill; D. Olivier – http://aide.informatique1.fr 38 12.5.1 Cas particulier : DROP d’une table non voulu PITR (Point In Time Recovery) : Méthode approximative, on espère arriver au plus près avant le « DROP TABLE … » Long (il faut retrouver la bonne heure), sauf si on utilise le SCN SCN : chaque transaction est notée : Avec logminer, on trouve le numéro de la transaction « DROP TABLE … » 1. On récupère le numéro de transaction 2. On fait un RECOVER jusqu’à la (transaction -1) Exemple de restauration avec le PITR : $ ./sqlplus system/oracle SQL> SELECT current_scn FROM v$database; 1239801 SQL> DROP TABLE user.tb_kill; SQL> DESC user.tb_kill; SQL> connect / as sysdba SQL> shutdown immediate; la table est bien supprimée Une sauvegarde consistante de la base permet tout de même de se prémunir d’une mauvaise restauration $ ./rman target / RMAN> STARTUP MOUNT; RMAN> RESTORE DATABASE; RMAN> RECOVER DATABASE UNTIL SCN 1239801; RMAN> sql "alter database open resetlogs"; resetlogs : reset des online redolog Effectuer ensuite une sauvegarde complète avant de redonner la main aux utilisateurs, car ce n’est plus la même incarnation de la base de données. A CHAQUE INCARNATION : SAUVEGARDE COMPLETE Schéma récapitulatif de l’exercice $ ./sqlplus user/password SQL> SELECT * FROM tb_kill; Aparté : Astuce : sauvegarde sur disque, puis sauvegarde sur robot Fiable : en cas de pannes de robot, il y a toujours une sauvegarde. Gain de performances. Moins cher Moins ergonomique, besoin de connaitre rman D. Olivier – http://aide.informatique1.fr 39