TP_03_Tablespaces_Co..
Transcription
TP_03_Tablespaces_Co..
Gestion de l'espace de stockage - Corrigé Objectifs : ➢ Créer, modifier et supprimer les tablespaces ➢ Obtenir des informations sur les tablespaces ➢ Gérer les tablespaces temporaires ➢ Gérer les tablespaces UNDO Démarrer la machine virtuelle, puis charger le TP « 3 : Gestion de l’espace de stockage». Tablespaces de données Cette partie doit être traitée avec une connexion SQLPlus polytech@di. 1. Quel est le tablespace par défaut de la base pdbdi ? SQL> SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_PERMANENT_TABLESPACE'; PROPERTY_VALUE -------------------------------------------------------------------------------SYSTEM 2. Donner une requête permettant de donner la liste des tablespaces de données SQL> select ts#, name, con_id from v$tablespace; TS# NAME CON_ID ---------- ------------------------------ ---------2 UNDOTBS1 0 0 SYSTEM 4 1 SYSAUX 4 2 TEMP 4 3 TSA 4 4 TSB 4 On remarquera la présence du tablespace UNDOTBS1 qui correspond à une autre base de données. Il s'agit du tablespace undo qui est celui de la base CDB$ROOT. On peut aussi utiliser la requête SELECT tablespace_name FROM dba_tablespaces qui donnera la liste des tablespaces de la base uniquement. 3. Donner une requête donnant l'emplacement des fichiers pour chaque tablespaces de données SQL> SELECT tablespace_name, file_name FROM dba_data_files ORDER BY 1; TABLESPACE_NAME FILE_NAME -------------------- -------------------------------------------------SYSAUX /oracle/oradata/POLYTECH/pdbdi/sysaux01.dbf SYSTEM /oracle/oradata/POLYTECH/pdbdi/system01.dbf TSA /oracle/oradata/POLYTECH/pdbdi/tsA_1.dbf TSA /oracle/oradata/POLYTECH/pdbdi/tsA_2.dbf TSB /oracle/oradata/POLYTECH/pdbdi/tsB_1.dbf TSB /oracle/oradata/POLYTECH/pdbdi/tsB_2.dbf TSB /oracle/oradata/POLYTECH/pdbdi/tsB_3.dbf TSB /oracle/oradata/POLYTECH/pdbdi/tsB_4.dbf Remarque : Il est également possible d'utiliser la vue v$datafile 4. Donner une requête permettant de trouver la taille actuelle et maximale de chaque fichiers de chaque tablespaces. SQL> SELECT tablespace_name, file_name, bytes, maxbytes FROM dba_data_files ORDER BY 1; TABLESPACE_NAME FILE_NAME BYTES MAXBYTES -------------------- -------------------------------------------------- ---------- SYSAUX 3,4360E+10 SYSTEM 3,4360E+10 TSA 31457280 TSA 52428800 TSB 5242880 TSB 5242880 TSB 5242880 TSB 5242880 /oracle/oradata/POLYTECH/pdbdi/sysaux01.dbf 713031680 /oracle/oradata/POLYTECH/pdbdi/system01.dbf 314572800 /oracle/oradata/POLYTECH/pdbdi/tsA_1.dbf 31457280 /oracle/oradata/POLYTECH/pdbdi/tsA_2.dbf 39845888 /oracle/oradata/POLYTECH/pdbdi/tsB_1.dbf 5242880 /oracle/oradata/POLYTECH/pdbdi/tsB_2.dbf 5242880 /oracle/oradata/POLYTECH/pdbdi/tsB_3.dbf 5242880 /oracle/oradata/POLYTECH/pdbdi/tsB_4.dbf 5242880 5. Trouver une requête qui donne l'espace utilisé et la taille maximale de chaque tablespace de données. SQL> SELECT tablespace_name, sum(bytes),sum(maxbytes) FROM dba_data_files GROUP BY tablespace_name ORDER BY 1; TABLESPACE_NAME SUM(BYTES) SUM(MAXBYTES) -------------------- ---------- ------------SYSAUX 713031680 3,4360E+10 SYSTEM 314572800 3,4360E+10 TSA 71303168 83886080 TSB 20971520 20971520 Tablespace temporaire 1. Quel est le tablespace temporaire par défaut ? SQL> SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_TEMP_TABLESPACE'; PROPERTY_VALUE -------------------------------------------------------------------------------SYSTEM 2. Lister les tablespaces temporaires, leurs fichiers et leurs tailles actuelles et maximales. SQL> select tablespace_name, file_name, bytes, maxbytes from dba_temp_files; TABLESPACE_NAME FILE_NAME BYTES MAXBYTES -------------------- -------------------------------------------------- ---------------TEMP /oracle/oradata/POLYTECH/pdbdi/pdbseed_temp01.dbf 20971520 3,4360E+10 Création/modification 1. Créer un tablespace tsC qui devra être composé des fichiers : • /oracle/oradata/POLYTECH/pdbdi/tsC1.dbf : 20Mo à l'origine, pas d'extension possible /oracle/oradata/POLYTECH/pdbdi/tsC2.dbf : 20Mo à l'origine, extension infinie par pas de 10Mo. Regarder la valeur MAXBYTES dans dba_data_files pour les fichiers du tablespace tsC. Les valeurs sont elles cohérentes? • SQL> CREATE TABLESPACE tsC DATAFILE '/oracle/oradata/POLYTECH/pdbdi/tsC_1.dbf' SIZE 20M, '/oracle/oradata/POLYTECH/pdbdi/tsC_2.dbf' SIZE 20M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED ; Grégory Fonlupt - Gestion de l'espace de stockage - Corrigé - 2/6 Tablespace Créé SQL> SELECT file_name, bytes, maxbytes, autoextensible FROM dba_data_files WHERE tablespace_name='TSC'; FILE_NAME BYTES MAXBYTES AUTOEXTEN -------------------------------------------------- ---------- ---------- --------/oracle/oradata/POLYTECH/pdbdi/tsC_1.dbf 20971520 0 NO /oracle/oradata/POLYTECH/pdbdi/tsC_2.dbf 20971520 3,4360E+10 YES Le fichier tsC2.dbf a une valeur de 32Go ; En effet Oracle limite la taille d'un fichier à 4 millions de blocks soit 32Go pour des blocks de 8ko. Pour tsC1.dbf la valeur est de 0 car il n'autorise pas les extensions automatiques. 2. Regarder les valeurs BYTES et MAXBYTES des fichiers du tablespace tsC. a. Créer une table dans ce tablespace avec: CREATE TABLE tableC1( texte CHAR(2000) ) TABLESPACE tsC; b. Exécuter 5 fois de suite le script PL/SQL suivant et remplir le tableau ci-dessous: BEGIN FOR i in 1..5000 LOOP INSERT INTO tableC1 VALUES ('Ligne '||i||' tableC1'); END LOOP; END; / Commit; SELECT file_name, bytes, user_bytes FROM dba_data_files WHERE tablespace_name='TSC'; Valeurs de BYTES Nb Lignes 0 5000 10000 15000 20000 25000 tsC_1.dbf 20971520 20971520 20971520 20971520 20971520 20971520 tsC_2.dbf 20971520 20971520 20971520 31457280 41943040 62914560 c. Supprimer toutes les lignes de tableC1 (DELETE FROM tableC1), et observer une dernière fois les valeurs BYTES et MAXBYTES des fichiers du tablespace tsC. Que pouvez vous conclure sur l'allocation d'espace dans les fichiers de données. A l'origine on constate que chaque fichier a une taille de 20Mo, cette taille correspond bien à l'état alloué, et non a l'espace disponible. Une ligne représentant un peu plus de 2Ko les deux fichiers devraient pouvoir recevoir environ 20000 lignes avant de grandir. Or on constate que le fichier 2 a grandi de 10Mo dès 15000 lignes, le fichier 1 lui ne peut grandir (pas d'autoextend). L'accroissement de la taille des fichiers est du à la façon dont fonction l'AUTOALLOCATE. Plusieurs raisons à cet accroissement anticipé : • Oracle conserve toujours de la place dans un fichier. Si des lignes existantes sont modifiées (update) leur taille peu augmenter, donc Oracle garde de l'espace libre pour ne pas fractionner une ligne • La table grandit très rapidement. Dans ce cas l'algo AUTOALLOCATE va créer des extents plus grands pour anticiper un accroissement futur et limiter le nombre et la fragmentation des extents. Après suppression l'espace alloué reste le même. C'est le fonctionnement normal, entre autre pour la fonction RECYCLEBIN. 3. Exécuter le script PL/SQL suivant : BEGIN FOR i in 1..3000 LOOP INSERT INTO tableB1(key, ts, content, last_mod) VALUES (i, 'tsB', 'Ligne '||i||' tableB1',sysdate); END LOOP; END; Grégory Fonlupt - Gestion de l'espace de stockage - Corrigé - 3/6 a. Pourquoi ce code génère une erreur ? b. Proposer des solutions pour corriger l'erreur BEGIN FOR i in 1..3000 LOOP INSERT INTO tableB1(key, ts, content, last_mod) VALUES (i, 'tsB', 'Ligne '||i||' tableB1',sysdate); END LOOP; 5 END; 6 / BEGIN FOR i in 1..3000 LOOP * ERREUR à la ligne 1 : ORA-01653: impossible d'étendre la table POLYTECH.TABLEB1 de 128 dans le tablespace TSB ORA-06512: à ligne 2 Il n'y a plus d'espace dans le tablespace tsB et tous les fichiers tous les fichiers sont arrivés à leur taille maximale. Pour corriger le problème on peut : • Ajouter 1 ou plusieurs fichiers au tablespace • Augmenter la valeur MAXSIZE d'un ou plusieurs fichier de données existants Information Espace Vous devez créer une script sqlplus tsinfo qui devra être appelé de la façon suivante : sqlplus cnxinfo @tsinfo, où cnxinfo représente une chaîne de connexion à une base de données. Le script devra retourner les informations sur les tablespaces de données uniquement (les tablespaces undo et temporaires doivent être exclus), de la base ciblée par cnxinfo. Par exemple : [oracle@oracle12c ~]$ sqlplus -silent di_admin/oracle@di @tsinfo ******************************************************************* Informations sur les tablespaces de la base PDBDI Liste des tablespaces ... Tablespace #3, TSA : 68.00Mo, 85.00 % occupé Fichier /oracle/oradata/POLYTECH/pdbdi/tsA_1.dbf Maximum Fichier /oracle/oradata/POLYTECH/pdbdi/tsA_2.dbf Maximum Tablespace #4, TSB : 20.00Mo, 100.00 % occupé Fichier /oracle/oradata/POLYTECH/pdbdi/tsB_1.dbf Maximum Fichier /oracle/oradata/POLYTECH/pdbdi/tsB_2.dbf Maximum Fichier /oracle/oradata/POLYTECH/pdbdi/tsB_3.dbf Maximum Fichier /oracle/oradata/POLYTECH/pdbdi/tsB_4.dbf Maximum Tablespace #5, TSC : 50.00Mo, 00.15 % occupé Fichier /oracle/oradata/POLYTECH/pdbdi/tsC_1.dbf Maximum Fichier /oracle/oradata/POLYTECH/pdbdi/tsC_2.dbf Maximum … 30.00 Mo, 0.03Go 38.00 Mo, 0.05Go 5.00 Mo, 0.005Go 5.00 Mo, 0.005Go 5.00 Mo, 0.005Go 5.00 Mo, 0.005Go 20.00 Mo, 0.02Go 30.00 Mo, 32.00Go Commencer par faire un script qui affiche les informations pour un tablespace dont le nom est passé en argument. Celui-ci sera utilisé par tsinfo pour tous les tablespaces de la base. Pour formater un nombre vous pouvez utiliser la fonction TO_CHAR. Par exemple TO_CHAR(n, '900.99') affichera des nombres de la forme 01.00, 15.23. Grégory Fonlupt - Gestion de l'espace de stockage - Corrigé - 4/6 -- desc_ts.sql -- Affiche des informations sur un tablespace dont le nom est passé en argument set head off set pagesize 5000 set line 1000 set verify off SELECT 'Tablespace #'||ts#||', '||name||' : '||To_CHAR(Sum(Bytes)/ (1024*1024),'99990.99')||'Mo, '||TO_CHAR(100*sum(Bytes)/Sum(decode(maxbytes, 0, bytes, maxbytes)),'900.99')||' % occupé' FROM v$tablespace vts INNER JOIN dba_data_files df ON vts.name=df.tablespace_name WHERE name='&1' GROUP BY ts#, name; SELECT ' Fichier '||file_name||' '||TO_CHAR(Bytes/(1024*1024), '99990.99')||' Mo, '||TO_CHAR(maxbytes/(1024*1024*1024), '9990.999')||'Go Maximum ' FROM dba_data_files WHERE tablespace_name = '&1' AND autoextensible='YES' UNION SELECT ' Fichier '||file_name||' '||TO_CHAR(Bytes/(1024*1024), '99990.99')||' Mo, '||TO_CHAR(Bytes/(1024*1024*1024), '9990.999')||'Go Maximum ' FROM dba_data_files WHERE tablespace_name = '&1' AND autoextensible!='YES' ; -- tsinfo.sql -- Affiche des informations sur tous les tablespaces du conteneur courant set head off set pagesize 0 set line 200 set term off set feed off SPOOL describeTS.sql SELECT '@desc_ts '||tablespace_name FROM dba_tablespaces WHERE contents!='TEMPORARY'; SPOOL OFF set term on prompt ******************************************************************* SELECT 'Informations sur les tablespaces de la base '||SYS_CONTEXT('USERENV', 'CON_NAME') FROM dual; PROMPT Liste des tablespaces @describeTS.sql exit; Configuration UNDO 1. Quelle est la configuration actuelle de la base de données (mode de gestion, tablespace utilisé et durée de la rétention)? SQL> select name, display_value from v$parameter ('UNDO_MANAGEMENT', 'UNDO_RETENTION', 'UNDO_TABLESPACE'); where upper(name) in NAME DISPLAY_VALUE -------------------- -------------------undo_management AUTO undo_tablespace UNDOTBS1 Grégory Fonlupt - Gestion de l'espace de stockage - Corrigé - 5/6 undo_retention 600 Le paramètre UNDO_MANAGEMENT est à AUTO, ce qui signifie que c'est le mode automatique qui est utilisé. Le tablespace est UNDOTBS1 et la durée minimale de rétention est de 600 secondes 2. Fixer la durée de la rétention à 1 heure (de façon définitive). Il faut pour cela modifier le paramètre UNDO_RETENTION dans la mémoire et dans le fichier de paramètres. Cette opération ne peut se faire que depuis une connexion à la CDB. SQL> alter session set container=cdb$root; Session modifiée. SQL> ALTER SYSTEM SET undo_retention=3600 SCOPE=BOTH; Système modifié. Grégory Fonlupt - Gestion de l'espace de stockage - Corrigé - 6/6