Está en la página 1de 32
War Te im | TS Rael) ea Mey ee Ce 2" edicion CID ITSOEH 2 ium SAVES: ee CAPITULO 14 ADMINISTRACION DEL ESPACIO Y CREACION MANUAL DE LA BASE DE DATOS ESTIMACION DEL TAMANO DE UNA BASE DE DATOS Cuando disefie una base de datos, puede que necesite realizar una estimacion del tamafio que tendrd la base de datos cuando esté Ilena. Esta estimacién puede ayudarle a determinar la configuracién de hardware que necesitari para conseguir el rendimiento que necesitan las aplicaciones y para asegurar la cantidad fisica adecuada de espacio en disco para almaenar los datos y los indice Asi mismo, la estimacién del tamafio de Ia base de datos puede ayudarle a determinar si el disefio de su base de datos necesita reajustes. Por ejemplo, puede determinar que el tamano estimado de la base de datos es. demasiado grande para una implementacién en su organizacién, y que se necesita un mayor grado de normalizacién. Por el contrario, el tamaito estimado puede ser menor del esperado, con lo que podra reducir la normalizacién de la base de datos para mejorar el rendimiento de las consultas. Para realizar una estimacidn del tamafio de una base de datos, es necesario tener presente que éstas almacenan la informacion de forma organizada y que, para almacenar los datos, Oracle utiliza estructuras de almacenamiento, tanto Idgicas (tablas, base de datos, etc.) como fisicas (archivo de datos, bloque de datos). El espacio total dependera de estas estructuras de almacenamiento légicas y fisicas que componen Oracle, y que esencialmente son: espacios de tabla (tablespaces), archivos de control, segmentos de datos, segmentos de indice, segmentos temporales, segmentos de restauracién, extensiones, bloques de datos y divisién de datos para tablas ¢ indices. 482 ORACLE 10g: ADMINISTRACION Y ANALISIS DE BASES DE DATOS: © RAMA, ESPACIOS DE TABLA (TABLESPACES) Y ARCHIVOS DE DATOS Un espacio de tabla (normalmente denominado tablespace) de una base de datos de Oracle almacena fisicamente los datos de la tabla en uno o mas archivos de datos asociados, Cuando se crea un nuevo objeto de base de datos, como una tabla o un indice, Oracle almacena el objeto de base de datos dentro de su espacio de tabla elegido. Cuando no se indica un espacio de tabla especifico para un nuevo objeto de la base de datos, Oracle almacena el objeto en el espacio de tabla predefinido de la cuenta. Cuando un espacio de tabla sélo tiene un archivo de datos, el espacio de tabla almacena los datos de todos los abjetos asociados dentro de dicho archivo. Cuando un espacio de tabla tiene miltiples archivos de datos, Oracle puede almacenar los datos para un objeto dentro de cualquier archivo del espacio de tabla y puede distribuir los datos de un objeto individual a lo largo de varios archivos de datos de un espacio de tabla. Cualquier base de datos Oracle tiene al menos un espacio de tabla denominado SYSTEM con el fin de almacenar el diccionario de datos (conjunto de tablas interas del sistema que almacenan informaci6n sobre la propia base de datos), los cédigos fuente y compilado de todos los programas PL/SQL (procedimientos y funciones almacenadas, disparadores de base de datos, etc.}, y los objetos de la base de datos (vistas, sinénimos, secuencias, etc.). Normalmente, en Oracle existen otros tipos de espacios de tabla tipicos como el espacio de tabla TEMP (separa los datos temporales usados durante el procesamiento interno del sistema de los datos almacenados permanentemente), el espacio de tabla ROLLBACK (separa los datos de restauracién de transacciones del ‘sistema de otro tipo de datos) y otros espacios temporales encaminados a separar los datos de la tabla de una aplicacién de los datos de indice o separar los datos de aplicaciones independientes de la informacién del diccionario de datos interno, etc. Por lo tanto, Oracle utiliza varios espacios de tabla para separar légica y fisicamente el almacenamiento de distintos conjuntos de informacién de base de datos. Los espacios de tabla pueden estar ert linea (los datos estin a disposicién de las aplicaciones y de las bases de datos) 0 fivera de tinea {los datos no estan a disposicion de los usuarios de la base de datos incluso aunque la base de datos esté disponible). Oracle utiliza el diccionario de datos para administrar la asignacién de espacios de tabla, aunque es posible cambiar un espacio de tabla administrado por diccionario para un espacio de tabla administrado localmente con la finalidad de que Oracle use mapa de bits (parte del espacio de tabla) para administrar la asignacién y Treclamacién de espacio de tabla con menos sobrecarga que la requerida en un espacio de tabla administrado por diccionario. © RAMA CAPITULO 14: ADMINISTRACION DEL ESPACIO Y GREACION... 483 Los espacios de tabla nuevos son, por defecto, espacios de tabla de dectura/escritura, es decir, es posible crear, modificar y eliminar objetos de la base de datos dentro del espacio de tabla y las aplicaciones pueden realizar consultas, agregar, modificar y eliminar informacién desde los objetos de la base de datos dentro del espacio de tabla. Sin embargo, a veces es conveniente proteger el espacio de tabla contra modificaciones convirtiéndolo en espacio de tabla de sélo lectura, E} archivo para el _almacenamiento fisico en disco de un espacio de tabla de una base de datos se denomina archivo de datos. Cuando se crea un espacio de tabla. se pueden crear uno o mas archivos de datos (dentro de un limite) para el nuevo espacio de tabla que incluso pueden estar situados en diferentes discos (técnica Util cuando se particionan los datos de la base de datos). Después de crear un espacio de tabla siempre se pueden agregar mds archivos de datos nuevos para incrementar su capacidad de almacenamiento, También se puede cambiar el tamafo de uno o mis archivos de datos existentes en el espacio de tabla. Es posible también configurar uno 0 mas de los archivos de datos en el espacio de tabla para que se amplie automaticamente cuando el espacio de tabla se Ilene y necesite mas espacio (extensién autométiea). También es posible configurar Oracle para que detecte y registre la corrupcién de archivos de datos a nivel de bloque. Crear un espacio de tabla mediante SOL La sentencia SQL que crea espacios de tabla es CREATE TABLESPACE. Su sintaxis basica es la siguiente: CREATE [UNDO] TABLESPACE tablespace [DATAPILE archivo [autoextend cléusula] [, archivo jautoextend clause]]... ] {{ MINIMUM EXTENT entero [ K | M ] | BLOCKSIZE entero [K] | { LOGGING | NOLOGGING } | DEFAULT storage _clausula | { ONLINE | OFFLINE } | { PERMANENT | TEMPORARY } | extent_management_cldusula | segment_management_cléusula oe 1 UNDO se utiliza para crear un tablespace modificable. DATAFILE indica el nombre de los archivos de datos que se almacenan en el tablespace. MINIMUM EXTENT indica el tamafio minimo de una extensidn en el tablespace. BLOCKSIZE especifica el tamafio de los bloques no esténdar del tablespace. LOGGIN/NOLOGGIN indica seguimiento 0 no en fichero redo log de las operaciones. ONLINE/OFFLINE significa tablespace en \inea 9 no y PERMANET/TEMPORARY indica tablespace permanente o temporal. 484 ORACLE 10g: ADMINISTRACION Y ANALISIS DE BASES DE DATOS La sintaxis autoextend_clausula regula la extensién automatica del espacio de tabla, pudiendo asignar espacio para la siguiente extensién (NEXT) y pudiendo limitar 0 no (MAXSIZE y UNLIMITED) el espacio de la extensién automatica, Su desarrollo es el siguiente: AUTOEXTEND { OFF | ON [NEXT integer [ K | M ]] (MAXSIZE { UNLIMITED | integer [K | M1 }] } La sintaxis storage_cldusula regula el almacenamiento por defecto en el espacio de tabla y su sintaxis (ya conocida para nosotros) es la siguiente: STORAGE ( { INITIAL entero [ K ] M1] NEXT entero [ K | M) MINEXTENTS entero MAXEXTENTS { entero | UNLIMITED } PCTINCREASE entero FPREELISTS integer FREELIST GROUPS entero OPTIMAL [ entero [K | M] | NULL ] BUFFER_POOL { KEEP | RECYCLE | DEFAULT } INITIAL especifics el espacio asignado inicialmente para el tablespace al crearlo. (en kilobytes o megabytes). NEXT especifica el tamafio a asignar a la préxima extensién del espacio de tabla. MINEXTENS determina el nimero minimo de extensiones a asignar a la hora de crear el espacio de tabla. MAXEXTENS limita el numero maximo de extensiones, PCTINCREASE especifica un factor de crecimiento a aplicar antes de asignar las extensiones siguientes al segmento. FREELIST GROUPS controla el nimero de ‘grupos de listas libres en el espacio de tabla y FREELIST establece el nimero de listas libres por grupo. OPTIMAL petmite establecer un tamafio Optimo para el espacio de tabla (NULL se usa para no asignar espacio para los segmemws rollback). BUFFER_POOL especifica una caché por defecio para el tablespace que puede ser reciclads una vez usado (RECYCLE) 0 no (KEEP) o gestionado por defecto (DEFAULT). La sintaxis extent_management_cldusula regula las extensiones no automiaticas del espacio de tabla y tiene el siguiente desarrollo EXTENT MANAGEMENT { DICTIONARY | LOCAL [ AUTOALLOCATE | UNIFORM [SIZE integer [ K | M1]] } DICTIONARY se especifica para que el espacio de tabla sea administrado utilizando un diccionario de tablas, LOCAL se especifica para que el espacio de tabla sea administrado localmente (AUTOALLOCATE indica que el sistema realiza la asignacién de las extensiones del espacio de tabla, y UNIFORM indica que las citadas extensiones tendran el tamafio uniforme indicado en SIZE). © RAMA CAPITULO 14: ADMINISTRACION DEL ESPACIO Y CREACION... 485 La simaxis segment_management_cldusula regula el uso del espacio libre en Jos segmentos del tablespace utilizando listas libres (MANUAL) o bitmaps (AUTO) y tiene el siguiente desarrollo: SEGMENT SPACE MANAGEMENT { MANUAL | AUTO } Para crear un espacio de tabla temporal se utiliza la sentencia CREATE TEMPORARY TABLESPACE mediante la siguiente sintaxis: CREATE TEMPORARY TABLESPACE tablespace (TEMPFILE archivo [AUTOEXTEND { OFF | ON [NEXT integer [ K | M]] (MAXSIZE { UNLIMITED | integer [ K | M1] }] } 1] (EXTENT MANAGEMENT LOCAL] [UNIFORM [SIZE integer [ K | M]]]; Las cldusulas de esta sentencia ya son conocidas. Administrar un espacio de tabla mediante SOL La sentencia SQL que administra espacios de tabla es ALTER TABLESPACE. Su sintaxis es la siguiente: ALTER TABLESPACE tablespace { datafile tempfile clausulas | DEFAULT storage cléusula | MINIMUM EXTENT entero [ K | M ] | ONLINE | OFFLINE [ NORMAL | TEMPORARY | IMMEDIATE ] | { BEGIN | END } BACKUP | READ { ONLY | WRITE } | PERMANENT| TEMPORARY | COALESCE | { LOGGING | NOLOGGING } } DEFAULT storage cliusula permite especificar nuevos parimetros de almacenamiento por defecto para los objetos del tablespace y su desarrollo ya lo conocemos de la pagina anterior. MINIMUM EXTEN permite controlar la minima fragmentacién del espacio en el tablespace. ONLINE sit el tablespace en linea y OFFLINE lo sitiia fuera de linea (de forma normal, termporal o inmediata). BEGIN | END BACKUP indica backup abierto o finalizado para el tablespace. READ ONLY | READ WRITE transforma el tablespace en sélo lectura o lecturwescritura. PERMANENT | TEMPORARY sitiia cl espacio de tabla como permanente o temporal. COALESCE fusiona el espacio libre de los archivos de datos del tablespace. LOGGING | NOLOGGING se utiliza para registrar 0 no en fichero log las operaciones de modificaciOn del tablespace. 486 ORAGLE 10g: ADMINISTRACION Y ANALISIS DE BASES De DATOS: La sintaxis datafile_tempfile_cidusulas, que regula los ficheros de temporales del tablespace, tiene el siguiente desarrollo: { ADD { DATAFILE | TEMPFILE } archivo [AUTOEXTEND { OFF | ON [NEXT entero [ K | mM ]] (MAXSIZ® { UNLIMITED | entero [ K | M] }] } ] [, archivo (AUTOEZTEND { OFF | ON [NEXT entero [ K | M ]] [MAXSIZE { UNLIMITED | integer [K | mM] }] } 1]... | RENAME DATAFILE ‘archivo' [, 'archivo']... To ‘archivo’ [, ‘archivo') . | { DATAFILE | TEMPFILE } { ONLINE | OFFLINE } } ADD { DATAFILE | TEMPFILE } indica afadir al tablespace un archivo de datos un archivo temporal de nombre archivo, AUTOEXTEND | ON | OF indica habilitar o no extensiones del tablespace con un tamafio maximo MAXSIZE dado en kilobytes © megabytes o con un tama‘ ilimitado (UNLIMITED), pudiendo habilitar espacio para la extension siguiente (NEXT). RENAME DATAFILE permite renombrar uno o més archivos de datos del tablespace. DATAFILE | TEMPFILE OFFLINE | ONLINE toma todos los archivos de datos (0 sélo los temporales) que estén fuera de Ifnea y los sitda en linea (también es posible lo contrario). Borrar un espacio de tabla mediante SQL La sentencia DROP TABLESPACE permite borrar espacios de tabla mediante la siguiente sintaxis: DROP TABLESPACE tablespace [INCLUDING CONTENTS [AND DATAFILES] [CASCADE CONSTRAINTS] ] + INCLUDING CONTENTS se utiliza para borrar el contenido completo del tablespace, AND DATAFILES borra adicionalmente los ficheros de datos asociados, y CASCADE CONSTRAINT borra todas las relaciones de integridad referencial que afecten a las tablas del tablespace suprimido. Como primer ejemplo se crea un tablespace modificable de nombre undots! con un fichero de datos de nombre undotbs_ia.f con un tamaiio de 10 megabytes y con posibilidad de expansién, Gracle, #1 Rights Reserves. ace eta sotepeite alten teteas ‘Rear evan temuesrsesungotst ‘Stee to aurerstese © RAMA ‘CAPITULO 14: ADMINISTRACION DEL ESPACIO Y CREACION... 487 En el ejemplo siguiente se crea un tablespace de nombre ¢hs_2 con un fichero de datos alojado en diskb, con nombre tabspace_fileS.dat, con un tamaiio de 500 K reutilizable, y habilitando automaticamente un espacio de 500 K para la extensién siguiente dentro de un espacio maximo de 10 megabytes. Eamele to 0B Td QL> CREATE TABLESPACE tbs 2 al 2 DATAFILE “diskb-tabspace_fileS.dat' SIZE 500K REUSE AUTOEXTEND ON NEXT 500K FiRXSIZE 10M; # i a: En el siguiente ejemplo se crea un tablespace de nombre fbs_4 con un fichero de datos de 10 Megabytes y de nombre file If, de modo que el espacio de tabla sea administrado localmente con asignaci6n de extensiones de tamafio uniforme de 128 K. Bact eli Td OL> CREATE TABLESPACE tbs_s DATAFILE ‘File_1.F' SIZE 10H 2 EXTENT MAHAGEMENT LOCAL UNIFORM SIZE 128 En el siguiente ejemplo se crea un tablespace de nombre aufo_seg fs con un fichero de datos de 1 Megabyte y de nombre ile2.f, de modo que la extensién del espacio de tabla sea administrado localmente con administracién automitica de espacio de segmento, Bae acs eg) QL? CREATE TABLESPACE auto_seg ts DATAFILE “File 2.6" SIZE 1 2 EXTENT MANAGEMENT LOCAL 3 —-SEGHENT SPACE MAHAGEMENT AUTO; 488 ORACLE 10g: ADMINISTRAGION Y ANALISIS DE BASES DE DATOS o En el ejemplo siguiente se crea un espacio de tabla de nombre omf' ts2 con un fichero de datos Oracle de 100 Megabytes que no es extensible. Bale Bs Badd SOL> CREATE TABLESPACE omf ts2 DATAFILE AUTOERTEND OFF; zal La consulta siguiente indica que esta a punto de comenzar un backup en la base de datos (tablespace accounting). Eames et) ma ly LD ALTER TABLESPACE accounting 2 BEGIN BACKUP; < 0L> ALTER TABLESPACE accounting END BACKUP; El ejemplo siguiente afiade el fichero de datos ‘diska:tabspace_file3.dat' al tablespace con un tamafio de 50 K que admite extensiones de 10 K hasta un tamafio maximo de 100K. RAMA CAPITULO 14: ADMINISTRACION DEL ESPACIO Y CREACION.... 489 een) Echero Editar Buscar Qncones Ayuda’ ILESPACE tab_space2 ‘ADD DATAFILE "diskaztabspace_File3 dat" ‘SIZE 50K AUTOEXTEND OW NEXT 10K WAXSIZE 100K; En el ejemplo siguiente se cambia la asignacién de las extensiones del blespace tabspace_st a un miiltiplo de 128 K. Bale ra Sse Td at OL> ALTER TABLESPACE tabspace_st MINIMUM EXTENT 128K; « » En el ejemplo siguiente se afiade un archivo de datos al tablespace omf ts] modo que el nuevo fichero de datos es de 100 Megabytes y autoextensible con afi maximo ilimitado, Ba ea td QL> ALTER TABLESPACE onf_tsi ADD DATAFILE: « ARCHIVO DE CONTROL Todas las bases de datos de Oracle disponen de un archivo de control que contiene informacién sobre la estructura fisica de la base de datos. Entre otras cosas contiene el nombre de la base de datos y los nombres y ubicaciones de todos sus archivos asociados. También registra informacién sobre copias de seguridad. 490 ORACLE 10g: ADMINISTRACION Y ANALISIS DE BASES DE DATOS Cuando se crea una base de datos nueva, Oracle crea el archivo de con automaticamente y posteriormente lo va actualizando también de mado automiti segiin lo necesite SEGMENTOS, EXTENSIONES Y BLOQUES DE DATOS ‘Ya hemos visto que para los espacios de tabla de las bases de datos sirv como almacenamiento fisico los archives de datos. De igual forma, para los objetos de la base de datos (tablas, indices, clisteres de datos, ete.), sirven como almacenamiento fisico los segmentos de bloques de datos. Las extensiones son grupos de bloques de datos contiguos para un objeto de la base de datos. Un Segmento es la reunién de todas las extensiones dedicadas a un objeto de la base de datos. Cuando se crea una tabla o un indice (u otro objeto de almacenamiento de datos) se puede indicar el espacio de tabla en el que deberia crearse el correspondiente segmento. En una base de datos puede haber distintos tipos de segmentos incluyendo Segmentos de datos (almacenan en ellos sus datos las tablas), segmentos de indice (almacenan en ellos sus datos los indices), segmentos LOB (almacenan en ellos las tablas sus valores LOB), segmentos de desbordamiento (para almacenar filas de tablas que no encajan en su segmento de indice original), segmentos de restauracién (Oracle almacena en ellos informacion de restauracién de transacciones) y segmentos temporales (espacio de trabajo temporal en disco que Oracle utiliza para almacenar’ datos intermedios durante el procesamiento de sentencias SQL). Un bloque de datos es la unidad de acceso a disco para una base de datos Oracle. Oracle almacena y recupera datos en disco utilizando bloques de datos. El tamafio de bloque puede ser definido al crear la base de datos y debe ser igual a un miiltiplo del tamaito de bloque del sistema operativo del servidor. Cuando se crea un nuevo objeto de almacenamiento de datos, como una tabla un indice, se puede utilizar la clausula TABLESPACE del comando correspondiente CREATE para indicar explicitamenie dentro de qué espacio de tabla deberia crearse ef segmento del objeto. Esto ya se ha visto en la sintaxis de CREATE TABLE y CREATE INDEX. Si se omite esta cléusula, Oracle crea el segmento del objeto en el espacio de tabla predeterminado de la cuenta de usuario. La sintaxis de la cldusula era: TABLESPACE nombre_del_espacic_de_tabla Cuando se crea un nuevo objeto de almacenamiento de datos, como una tabla o un indice, se puede utilizar la cléusula STORAGE de la sentencia CREATE. para controlar los diferentes valores de almacenamiento relacionados con la asignacién de extensiones del segmento del objeto. La sintaxis de la cldusula era la siguiente: ‘CAPITULO 14: ADMINISTRACION DEL ESPACIO Y CREACION... 491 ORAGE { INITIAL integer [ K | M ] NEXT integer [XK | M ] MINEXTENTS integer MAXEXTENTS { integer | UNLIMITED } PCTINCREASE integer FREELISTS integer FREELIST GROUPS integer OPTIMAL [ integer [K | M] | NULL ] BUFFER POOL { KEEP | RECYCLE | DEFAULT } INITIAL integer ( K | M ] NEXT integer [ K | M ] MINEXTENTS integer MAXEXTENTS { integer | UNLIMITED } PCTINCREASE integer FREELISTS integer FREELIST GROUPS integer OPTIMAL [ integer [K | M] | NULL ) BUFFER_POOL { KEEP | RECYCLE | DEFAULT } | | | ! ! | | } | | | | | | | EI significado de todas las clausulas de esta sintaxis ya ha sido explicado teriormente. Para madificar la configuracién de extensiones para los objetos de la base datos se utiliza la clausula STORAGE de la sentencia ALTER (similar a la de la itencia CREATE), tal y como ya hemos visto al analizar las sentencias ALTER FABLE y ALTER INDEX. Para establecer la configuracién de los bloques de datos de una tabla, de un ice 0 de otro objeto de la base de datos se utilizan las clausulas siguientes: 1{ PCTFREE integer) | PcTuSED integer INITRANS integer MAXTRANS integer storage_clause | | | } { PCTFREE integer) | PCTUSED integer | INTTRANS integer | MAXTRANS integer | storage clause 1 492 ORACLE 10g: ADMINISTRACION Y ANALISIS DE BASES DE DATOS ° El significado de todas las clausulas de esta sintaxis ya ha sido explicé anteriormente al tratar las sentencias CREATE TABLE, CREATE INDEX, ALTER: TABLE Y ALTER INDEX. En cuanto a los segmentos de restauracién, Oracle dispone de la sentencia CREATE ROLLBACK SEGMENT para crearlos. Su sintaxis es la siguiente: CREATE [PUBLIC] ROLLBACK SEGMENT segmento [{ TABLESPACE tablespace | storage cldéusula} [ TABLESPACE tablespace | storage_cldusula ].. PUBLIC habilita el segmento para ser utilizado por cualquier instancia. TABLESPACE identifica el espacio de tabla en el que se crea el segmento, La sintaxis de la cléusula storage _cldusula es la de la cldusula general de almacenamiento ya conocida y presentada en la pagina anterior. Para modificar un segmento de restauracién se utiliza la sentencia ALTER ROLLBACK SEGMENT, cuya sintaxis es la siguiente: ALTER ROLLBACK SEGMENT segmento { ONLINE | OFFLINE | storage cléusula | SHRINK [TO entero [K | M] ] } ; ONLINE sitiia el segmento en linea y OFFLINE fuera de linea. SHRINK se utiliza para contraer el segmento al niimero de kilobytes o megabytes dado. La sintaxis de la clausula storage ckiusula es la de la cldusula general de almacenamiento ya conocida y presentada en la pagina anterior. Para borrar un segmento de restauracién se utiliza la sentencia DROP ROLLBACK SEGMENT, cuya sintaxis es la siguiente: DROP ROLLBACK SEGMENT segmento; En el ejemplo siguiente se crea la tabla divisions asignindole una extensién a su creacién y un nimero maximo de extensiones de 50, Ademés, el tamafio de la primera extensién es 100 kilobytes y si la tabla excede Ia primera extensién, Oracle utiliza una segunda extensién de 50 kilobytes. Por iltimo, las extensiones a partir de la tercera se incrementaran en un 3% del espacio de la extensi6n anterior (52,5 K para la tercera extensidn, redondeados a 52 si el tamafio del bloque es 2). CAPITULO 14: ADMINISTRACION DEL ESPACIO Y GREAGION... 493 eee a eee ry cs ‘VARCHARZ( 1%) 5 location uARCHAR2(13) ") STORAGE ( INITIAL 100K HEXT Sox MINEXTENTS 1 MAXEXTENTS 58 PCTINCREASE 5) En el ejemplo siguiente se crea un segmento de restauracién de nombre |store al que se asignan dos extensiones a su creacién y un mimero miximo de fensiones de 25. Si el segmento rebasa esta extensidn, se crea una segunda de afio 10 K. Si se rebasa la segunda extensidn, todas las demds serin de tamafio 10 Ya que al no especificarse PCTINCREASE, se supone que es cero. Ademis, el afio 6ptimo del segmento son 50 K, por lo que Oracle desasignara las extensiones superen dicho espacio. Eee a ee eg te) STORAGE ( THITIAL 10% HEXT 108 MINEXTENTS 2 _MAXEXTENTS 25 OPTIMAL SOK); En los ejemplos siguientes, primeramente se sitiia en linea el segmento de muraci6n rs_one, después se cambian sus parametros de almacenamiento situando nimero maximo de extensiones a 20 y las extensiones posteriores a la primera in de 1000 K. Después, se contrae el segmento a 100 M y por tiltimo, se borra cade iad ed 494 ORACLE 10g: ADMINISTRACION Y ANALISIS DE BASES'DE DATOS QL> DROP ROLLBACK SEGHENT r's_one; aa En el gjemplo siguiente se modifica la tabla employees situando en 30 el niimero de espacio de bloques de datos que se deben reservar para futuras actualizaciones de las filas, y situando en 60 el umbral de bloque minimo, Bae cd eel td PCTFREE 90 PCTUSED 60) © RAMA CAPITULO 14: ADMINISTRACION DEL ESPACIO'Y CREACION... 495 LA SENTENCIA CREATE DATABASE DE ORACLE 10g SQL La sentencia CREATE DATABASE crea una base de datos y hace posible su uso. Si se usa esta sentencia sobre una base de datos ya existente, se perdern todos los datos, Después de la creacién, esta sentencia monta la base de datos en modo exclusivo 0 paralelo (segin el valor especificado en CLUSTER_DATABASE) y la abre, haciéndola utilizable para su uso normal. La sintaxis general es la siguiente: CREATE DATABASE [nombre_base de datos] { CONTROLFILE REUSE | LOGFILE [GROUP entero] filespec [, [GROUP entero] filespec]... MAXLOGFILES entero MAXLOGMEMBERS entero MAXLOGHISTORY entero MAXDATAFILES entero MAXINSTANCES entero { ARCHIVELOG | NOARCHIVELOG } CHARACTER SET charset NATIONAL CHARACTER SET charset DATAFILE filespec [autoextend_cldusula] [, filespec [autoextend_cléusula]] ... | default _temp tablespace | undo_tablespace cléusula | SET STANDBY DATABASE { PROTECTED | UNPROTECTED } | set_time zone _cléusula La sintaxis autoextend_cldusula, que habilita o deshabilita (ON y OFF) la extensién automatica limitada a un tamafio (MAXSIZE) o ilimitada (UNLIMITED) de un nuevo fichero de datos o fichero temporal, tiene el siguiente desarrollo; AUTOEXTEND { OFF | ON [NEXT integer [ K | M ]] (MAXSIZE { UNLIMITED | entero [K | M1] }] } La sintaxis defaalt_temp_tablespace, que crea un espacio de tabla temporal (EXTENT usa una parte del espacio para mapa de bits y UNIFORM indica el tamaiio en bits del tablespace temporal), tiene el siguiente desarrollo: DEFAULT TEMPORARY TABLESPACE tablespace [TEMPFILE filespec] [EXTENT MANAGEMENT LOCAL] [UNIFORM [SIZE integer [ K | M 1]] La sintaxis undo_tablespace_cidusula , que crea espacio de tabla para datos undo, tiene el siguiente desarrollo: UNDO TABLESPACE tablespace (DATAFILE filespec [autoextend clause] [, filespec [autoextend clause]]...] 496 ORACLE 10g: ADMINISTRAGION Y ANALISIS DE BASES DE DATOS La sintaxis set_time_zone_eldusula, que sitia la zona horaria de la base datos, tiene el siguiente desarrollo: SET TIME ZONE - ' { { + | - } hh: mi | time_zone_region } ' ‘CONTROL FILE REUSE se utiliza para reutilizar ficheros de control existentes identificados por el parimetro de inicializacion CONTROL_FILES. Se suele utilizar cuando se vuelve a crear una base de datos. LOGFILE especifica uno o mas ficheros que se utilizarin como ficheros: redo log. GROUP especitica el nimero que identifica el grupo de ficheros redo log. MAXLOGFILES especifica el ntimero maximo de grupos de ficheros redo log que pueden ser creados en la base de datos. MAXLOGMEMBERS especifica el ntimero maximo de miembros o copias para un grupo de ficheros redo log. MAXLOGHISTORY se utiliza sélo si se usa Oracle en modo ARCHIVELOG con Real Application Clusters y especifica el mimero maximo de ficheros redo log archivados. MAXDATAFILES especifica el mimero maximo de ficheros de datos accesibles en la instancia. MAXINSTANCES indica el nimero maximo de instancias que pueden estar simulténeamente montadas y abiertas en la base de datos, ARCHIVELOG indica que el contenido del grupo de ficheros redo log seri archivado antes de que el grupo pueda ser reutilizado. NOARCHIVELOG indica lo contrario, CHARACTER SET indica el conjunto de caracteres que la base de datos utiliza para almacenar los datos. DATAFILE indica uno o més ficheros que se utilizaran como ficheros de datos. Todos estos ficheros son del espacio de tabla (tablespace) SYSTEM. A continuacién, se presenta un ejemplo de creacién de la base de datos de nombre sampie. CREATE DATABASE sample CONTROLFILE REUSE LOGFILE GROUP 1 ('diskx:logl.log', ‘disky:logl.log') SIZE 50K, GROUP 2 ('diskx:log2.log', 'disky:log2.leg') SIZE 50K MAXLOGFILES 5 MAXLOGHISTORY 100 MAXDATAFILES 10 MAXINSTANCES 2 ARCHIVELOG CHARACTER SET UTF8 O RAMA CAPITULO 14: ADMINISTRACION DEL ESPACIO Y CREACION.... 497 NATIONAL CHARACTER SET ALL6UTF16 DATAPILE ‘disk1:df1.dbf' AUTOEXTEND ON, ‘disk2:4£2.abf' AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED DEFAULT TEMPORARY TABLESPACE temp_ts UNDO TABLESPACE undo_ts SET TIME_ZONE = '+02:00'; LA SENTENCIA ALTER DATABASE DE ORACLE 10g SQL La sentencia ALTER DATABASE puede utilizarse para modificar, mantener 0 recuperar una base de datos existente. Su sintaxis general es la siguiente: ALTER DATABASE [database] { startup_clauses | recovery clauses | database file clauses | logfile clauses controlfile clauses standby database clauses default settings clauses conversion clauses redo thread clauses | | J | \ 3 Arrangque de la base de datos La sintaxis startup_clauses, que controla las clausulas de arranque, tiene el siguiemte desarrollo: { MouNT [{ STANDBY | CLONE } DATABASE] | OPEN { [READ WRITE] [ RESETLOGS | NORESETLOGS } | READ ONLY MOUNT monta la base de datos (sélo se usard si la base no esta montada), bien en modo STANDBY (emergencia o reserva}, o bien en mode CLONE (clon). OPEN abre la base de datos para uso normal, REDO WRITE abre Ia base de datos en modo lectura/escritura y permite a los usuarios generar ficheros redo log. RESETSLOG resetea af mimero [ ef mimero de fa secuencia corriente del log. READ ONLY restringe a los usuarios al modo lectura. 498 ORACLE 10g: ADMINISTRACION Y ANALISIS DE BASES DE DATOS Recuperacion de la base de datos Con ALTER DATABASE es posible designar medios de recuperacidn de la base de datos y especificar tablespaces y ficheros. La sintaxis de recovery_clauses, que controla las cléusulas de recuperacién, tiene el siguiente desarrollo: { RECOVER [AUTOMATIC] [FROM 'location'] { { full_database recovery | partial database recovery | LOGFILE 'filename' ( { TEST | ALLOW entero CORRUPTION | parallel_clause } ( TEST | ALLOW entero CORRUPTION | parallel clause ] 1 CONTINUE [DEFAULT] ‘CANCEL | | } | managed_standby_recovery | END BACKUP Esta cldusula se puede utilizar cuando la instancia tiene la base de datos montada_ Solamente es posible recuperar la base de datos completa cuando esti cerrada. La instaneia ‘debe tener la base de datos montada en modo exclusivo. Se pueden recuperar tablespaces y ficheros de datos cuando la base de datos esti abierta o cerrada, siempre que los tablespaces y ficheros a recuperar esién offline. No se pueden ejecutar medios de recuperacién si la conexién a Oracle es a través de una arquitectura de servidor compartido. AUTOMATIC permite que Oracle genere automdticamente el nombre del siguiente fichero redo log archivado necesitado para continuar la operacién de recuperacién. FROM indica la localizacién de donde se leen el grupo de ficheros redo log archivados. LOGFILE continiia la recuperacién aplicando el fichero redo log. especificado. TEST permite una demostracién de la recuperacién. ALLOW especifica el mimero de bloques de corrupeién permitidos. CONTINUE permite la continuacién de la recuperacién después de una interrupeién y CANCEL hace lo contrario. La subopeién firll_database_recavery, para la recuperacién completa de la base de datos, tiene la siguiente sintaxis: [STANDBY] DATABASE ({ UNTIL { CANCEL | TIME date | CHANGE integer } | USING BACKUP CONTROLFILE { UNTIL { CANCEL | TIME date | CHANGE integer } | USING BACKUP CONTROLFILE ] 1 ‘ORAMA ‘CAPITULO 14: ADMINISTRACION DEL ESPACIO Y CREACION... 499 UNTIL especifica la duracién de la operacién de recuperacién, basada en tiempo (TIME), en una instruccién de cancelacién (CANCEL) o en el nimero de cambio del sistema (CHANGE). La subopcién partial database_recovery, para la recuperacion parcial de la base de datos, tiene la siguiente sintaxis: { TABLESPACE tablespace [, tablespace]... | DATAFILE ‘filename’ [, 'filename']... | STANDBY TABLESPACE tablespace [, tablespace]. Pi | DATAFILE 'filename' [, ‘'filename']... } UNTIL [CONSISTENT WITH] CONTROLFILE } TABLESPACE se utiliza para recuperar sdlo los tablespaces especificados, DATAFILE se utiliza para recuperar sélo los ficheros de datos especificados, STANDBY TABLESPACE se utiliza para recuperar los tablespaces perdidos o dafiados. en la base de datos standby utilizando archivos redo log copiados de la base de datos. primaria y un fichero de control. STANDBY DATAFILE se utiliza para recuperar los ficheros de datos perdidos 0 datiados en la base de datos standby utilizando archivos redo log copiados de la base de datos primaria y un fichero de control. La subopeién paralell clause, para el procesamiento paralelo, tiene la siguiente sintaxis: { NOPARALLEL | PARALLEL [integer] } La subopcién managed_standby_recovery, para la recuperacién automatica de Ja base de datos standby, tiene la siguiente sintaxis: RECOVER MANAGED STANDBY DATABASE ( { NODELAY | [TIMEOUT] integer | CANCEL (IMMEDIATE) [NOWAIT) | (DISCONNECT [FROM SESSION]] [FINISH [NOWAIT]] 1 NODELAY se utiliza para aplicar los archivos redo log inmediatamente (sin retraso), TIMEOUT especifica en minutes ef periodo de espera de la gestién de recuperacién. CANCEL devuelve el control de sesién cuando el proceso actual de recuperacién finalice. NOWAIT devuelve el control de sesién inmediatamente después de finalizar la recuperacién. FINISH recupera los ficheros log de la base de datos standby. DISCONECT indica la desconexién del proceso de recuperacién. — 500 ORACLE 10g: ADMINISTRAGION Y ANALISIS DE BASES DE DATOS RAMA Ficheros de la base de datos La sintaxis database_file_cleruses, que controla los ficheros de la base de datos y los ficheros temporales permitiendo modificarlos, tiene el siguiente desarrollo: { CREATE DATAFILE ‘filename’ [, ‘filename')... las { filespec [, filespec]... | NEW }] | DATAPILE ‘filename’ [, 'filename'] { ONLINE | OFFLINE [DROP] | RESIZE integer [ K | M ] | AUTOEXTEND { OFF | ON [NEXT integer [ R | M ]] ; (MaxSize { UNLIMITED | integer [K | mM] } ] | END BACKUP | TEMPFILE ‘filename’ [, ‘filename']... RESIZE integer [Kk | ™ ] AUTOEXTEND { OFF | ON [NEXT integer [ A M)) (MAXSIZE { UNLIMITED | integer [KX | M DROP [INCLUDING DATAFILES] ONLINE. OFFLINE | RENAME FILE 'filename' [, 'filename']... TO 'filename' CREATE DATAFILE crea un fichero de datos nuevo vacio en el lugar de uno antiguo. Se puede utilizar para volver a crear un fichero de datos que habia sido perdido sin existir backup (AS permite asignar nombre al nuevo fichero creado y AS ‘NEW permite al sistema generar el nombre para el nuevo fichero manieniendo el tamaiio del fichero al que reemplaza). ONLINE permite traer el fichero en linea y OFFLINE permite tomarle fuera de linea. RESIZE permite aumentar o disminuir el ‘tamafio del fichero de datos nuevo respecto del antiguo en los megabytes (M) 0 kilobytes (K) especificados. END BACKUP permite tomar el fichero fuera del modo backup en linea, TEMPFILE permite cambiar el tamafio del fichero de datos temporal. AUTOEXTEND habilita o deshabilita la extension automatica del nuevo fichero temporal o fichero de datos (ON habilita AUTOEXTEND y OFF lo deshabilita). NEXT especifica el tamafio en bytes del siguiente incremento de espacio de disco que va a ser asignado autométicamente cuando se requieran mis extensiones, MAXSIZE especifica el maximo tamafio de disco que puede ser asignado para la extensién automatica de un fichero de datos. UNLIMITED permite situar como ilimitado el espacio de disco asignado para ficheros de datos o ficheros temporales. DROP borra el fichero de datos o fichero temporal de la base de datos manteniendo el tablespace. RENAME FILE permite renombrar ficheros de datos, ficheros temporales y ficheros redo log. > RAMA ‘CAPITULO 14: ADMINISTRACION DEL ESPACIO Y CREACION... 501 . Ficheros redo log (ficheros de registro de la actividad) La sintaxis /ogfile_clauses, que controla los ficheros redo log de la base de datos (permitiendo aftadirlos, borrarlos o modificarlos), tiene el siguiente desarrollo: { ARCHIVELOG | NOARCHIVELOG | ADD [STANDBY] LOGFILE [THREAD integer] (GROUP integer] filespec [, [GROUP integer] filespec]... | DROP LOGFILE logfile descriptor [, logfile_descriptor] ... ADD [STANDBY] LOGFILE MEMBER ‘filename' [REUSE] [, ‘filename' [REUSE)]... TO logfile descriptor [, logfile descriptor]... | DROP LOGFILE MEMBER '‘filename' [, ‘filename']. | ADD SUPPLEMENTAL LOG DATA ( { PRIMARY KEY | UNIQUE INDEX } [, { PRIMARY KEY | UNIQUE INDEX }]... ) COLUMNS | DROP SUPPLEMENTAL LOG DATA | RENAME FILE ‘filename' [, 'filename']... TO 'filename' | CLEAR [UNARCHIVED] LOGFILE logfile descriptor [, logfile descriptor]... (UNRECOVBRABLE DATAFILE] } La subopeidn Jogyile_descriptor tiene la siguiente sintaxis; { GROUP integer | ( 'filename' [, ‘filename']... ) | ‘filename! } ARCHIVELOG indica que el contenido del grupo de ficheros redo log sera archivado antes de que el grupo pueda ser reutilizado, NOARCHIVELOG indica lo contrario. ADD [STANDBY] LOGFILE ajiade uno 0 més grupos de ficheros redo log (con la posibilidad de usarse s6lo en bases de datos standby). THREAD especifica el numero de hilos, GROUP identifica univocamente la cantidad de grupos de ficheros redo log y varia desde 1 hasta MAXLOGFILES. ADD [STANDBY] LOGFILE MEMBER permite afiadir uno o mas miembros a los grupos de ficheros redo log (con la posibilidad de usarse s6lo eri bases de datos standby). GROUP especifica el entero que identifica al grupo redo log. ADD SUPPLEMENTAL LOG DATA sitiia columnas de datos adicionales en la cadena log al tiempo que se ejecuta una operacién de actualizacién. DROP LOGFILE borra todos los miembros de un grupo de ficheros redo log. PRIMARY KEY y UNIQUE INDEX especifican que las columnas clave primaria ¢ indice ‘inico se situardn en los ficheros redo log en una operacién de actualizacién. DROP LOGFILE MEMBER borra uno o mas miembros de un grupo de ficheros redo log. 802 ORACLE 109: ADMINISTRAGION Y ANALISIS DE BASES DE DATOS © RAMA DROP SUPPLEMENTAL LOG DATA indica que se detenga el proceso de afiadir informacién log cuando ocurra una operacién de actualizacién. CLEAR LOGFILE ializa un fichero redo log en linea. UNARCHIVED se usa para reutilizar un fichero redo log que no fue archivado. Se especifica UNRECOVERABLE DATA FILE si se toma un fichero fuera de linea con la base de datos en modo ARCHIVELOG. Ficheros de control La sintaxis controlfile_clauses, que permite crear o hacer backup de un fichero de control de la base de datos, tiene el siguiente desarrollo: { CREATE STANDBY CONTROLFILE AS ‘filename’ [REUSE] | BACKUP CONTROLFILE TO { ‘filename! [REUSE] | TRACE [ RESETLOGS | NORESETLOGS] } ) CREATE STANDBY CONTROLFILE permite crear un fichero de control que seré utilizado para mantener una base de datos standby (si el fichero ya existe se debe especificar REUSE), BACKUP CONTROLFILE permite hacer backup del fichero de control actual. TO especifica el nombre del fichero sobre el cual se realizara el backup (si el fichero ya existe se debe especificar REUSE). TO TRACE permite registrar instrucciones SQL relativas al proceso de backup del fichero de control, RESETLOGS indica que la instruccién SQL escrita para arrancar la base de datos es ALTER. DATABASE OPEN RESETLOGS (lo mismo ocurre con NORESETLOGS). Clausula standby La sintaxis standby database_clause, que se utiliza para activar la base de datos standby (base de datos de reserva 0 emergencia) 0 cuando esté en modo protegido o desprotegido, tiene el siguiente desarrollo: { ACTIVATE [PHYSICAL] STANDBY DATABASE | SET STANDBY DATABASE { PROTECTED | UNPROTECTED } | REGISTER [OR REPLACE] [PHYSICAL] LOGFILE [filespec [, filespec] ...] | PREPARE TO SWITCHOVER TO { PHYSICAL PRIMARY | PHYSICAL STANDBY ( WAIT | NOWAIT ] (parallel_clause] ACTIVATE STANDBY DATABASE cambia el estado de una base de datos standby a una base de datos activa y la prepara para ser una base de datos primaria activa Labase de datos debe estar montada antes de que se pueda especificar esta cléusula, RAMA ‘CAPITULO 14: ADMINISTRACION DEL ESPACIO Y CREACION... 503 a SET STANDBY DATABASE especifica cuindo la base de datos esti en modo no-data-loss mode (e| enlace entre la base de datos standby y la primaria tiene absoluta prioridad). UNPROTECTED indica que la instancia no requiere una base datos standby para ser mantenida por el proceso logwriter. PROTECT indica lo contrario, REGISTER LOGFILE permite registrar en ficheros log los fallos primarios, OR REPLACE permite introducir un archivo log existente en la base de datos standby para actualizacion. PREPARE TO SWITCHOVER TO STANDBY permite preparar la base de datos primaria corriente para cambiar al estado standhy. PREPARE TO SWITCHOVER TO PRIMARY permite preparar la base de datos standby corriente para cambiar a primaria. Caracteristicas por defecto de la base de datos La sintaxis default sestings_clauses, que sitia las caracteristicas por defecto de la base de datos (Conjunto de caracteres, conjunto de caracteres nacionales, tablespace temporal por defecto-y renombrado de la base de datos global), se desarrolla como sigue: CHARACTER SET character_set NATIONAL CHARACTER SET character_set set_time_zone_clause DEFAULT TEMPORARY TABLESPACE tablespace RENAME GLOBAL_NAME TO database . domain [. domain]... Clausulas de conversién La sintaxis conversion_clauses, que fija la conversion en la base de datos, se desarrolla como sigue: { RESET COMPATIBILITY | CONVERT } RESET COMPATIBILITY marca la base de datos para ser convertida a una versién posterior de Oracle cuando la base de datos se vuelva a iniciar. CONVERT completa la conversién del diccionario de datos de Oracle 7. Se utiliza s6lo para la migracién a Oracle 10g y no se puede usar cuando la base de datos esti montada. La sintaxis redo_thread clauses, que habilita y deshabilita los hilos de los grupos de ficheros redo log, se desarrolla como sigue: { ENABLE [PUBLIC] THREAD integer | DISABLE THREAD integer } En los ejemplos siguientes se abre la base de datos en modo lectura y posteriormente se abre en modo tectura/escritura eliminando los ficheros de registra de actividad (ficheros redo log) en linea. 504 ORACLE 10g: ADMINISTRAGION ¥ ANALISIS DE BASES DE DATOS © po aad En el ejemplo siguiente se recupera el tablespace is utilizando un proceso de recuperacién paralela, pee ead RECOVER TABLESPACE tot PARALLEL: El ejemplo siguiente deshabilita 5 hilos en un entomo Real Application : Clusters, RAMA ‘CAPITULO 14: ADMINISTRACION DEL ESPACIO Y CREACION... 505 Bae ceed En el ejemplo siguiente se crea un nuevo fichero de datos de nombre k2:db 1 dat’ basado en el fichero ‘disk 1:db].dat’. Eel ese a REMANE GLOBAL NAHE TO sales.australia.acne_con: En el ejemplo siguiente se realiza una recuperacién completa de toda la base de datos. de modo automitico. + Oracle SQL*Plus 9806 ORACLE 10g: ADMINISTRACION Y ANALISIS DE BASES DE DATOS En el ejemplo siguiente se recupera el tablespace del usuario nimero 5. ee ead BASE CANCEL IMMEOIAI DEFAULT STORAGE (THITIAL 10K NEXT SOK MINEXTENTS 1 MAXEXTENTS 999) OWLINES RAMA (CAPITULO 14: ADMINISTRACION DEL ESPACIO Y CREACION... 507 aera em Td DATAFILE ‘tabspace_File3.qbF" SIZE 2H MIMIMUH EXTENT 6: . DEFAULT STORAGE (INITIAL 128K NEXT 428K) re Crear un SQL> CREATE TEMPORARY TABLESPACE temp ‘2 JEMPFILE "Renpb}.0D5° SIZE SH AUTOEXTERD OM; En primer fugar situamos ef tablespace fuera de finea usando [a sentencia ALTER TABLESPACE con la cliusula OFFLINE, ated ee) ae td a ISQL> ALTER TABLESPACE accounting OFFLINE NORMAL; En segundo lugar copiamos el fichero “diska:pay'I.clat’ a ‘diskb:receivel.dat' usando comandos del sistema operativo. 508 ORACLE 10g: ADMINISTRACION Y ANALISIS DE BASES DE DATOS © RAMA, En tercer lugar renombramos el fichero de datos del tablespace. Bares Selig (QL> ALTER TABLESPACE accounting 2 RENAHE DATAFILE ‘diska:payt dbf’ CK SEGHENT rbs_2 TABLESPACE system STORAGE CINITIAL 10K NEXT 10K MAXEXTEMTS UNLIMITED: RAMA CAPITULO 14: ADMINISTRAGION DEL ESPACIO Y CREACION... 509 pa a ea SOL? CREATE TABLE countries 2 C country ia ewanc2) a CONSTRAINT country _id_nn HOT HULL a + Country_name — waREHAR2(40) 5 {currency name WARCHARZ(2S) 8 + currency_symbol vaRCHAR2(3) 7 + region vaRCHARZ¢15) { CONSTRAINT —_country_c_id_pk PRIMARY KEY (Country _ia) 10 > 44 ORGANIZATION INDEX 12 INCLUDING — cauntry_nane 413 PCTTHRESHOLD 2 a4 STORAGE 15 CINITIAL at 16 NEXT 2K v7 PCTINCREASE 0 48 MINEXTENTS 1 9 WOXEXTENTS 1) 20 DUERFLOW 24 ‘STORAGE 22 CTRITTAL aK 2a NEXT 2K 24 PCTINCREASE 0 WINEXTENTS 4 MAXEXTENTS 1); [S0L> ALTER DATABASE stocks ADD LOGFILE MEMBER “diske:10g3-10g" To GROUP 3; a [SOL> ALTER DATABASE stocks RENAME FILE ‘diskb:10g3.1og° 10 “diskd:1og3.10g" RESIZE 4 RAMA CAPITULO 14: ADMINISTRACION DEL ESPACIO Y CREACION... 511 a SQL> ALTER DATABASE 2 RECOVER AUTOMATIC UNTIL TIME "4 RED

También podría gustarte