INSTITUTO
TECNOLÓGICO SUPERIOR DE FELIPE CARRILLO PUERTO
INVESTIGACIÓN
Integrantes:
ANGULO
POOL HONORIO
PEREZ GOMEZ BELLA ARELI
SUASTE SOLIS IRVING RAFAEL
SULUB SANTOS ANGEL SALVADOR
Aula:
J-2 Semestre: V Grupo: “B”
CARRERA:
Ingeniería en Sistemas Computacionales
MATERIA:
Administración
de Base de Datos
UNIDAD
4
DOCENTE:
ING. Eduardo Castillo Moo
Felipe
Carrillo Puerto, Quintana Roo a 29 de mayo de 2015
Contenido
Introducción
La unidad
trata acerca de cómo se hacen las bitácoras.
Que función
tiene y por qué son importantes, además es necesario conocer por que son
importantes a la hora de realizar cambios o conocer un poco más del sistemas de
base de datos que se están manejando.
Incluyendo
los todos los tipos de consulta al igual aquellas que no modifican los datos.
Al igual que
las funciones que se usan para grabar las modificaciones de las base de datos y
sus registros. También la posibilidad de deshacer una modificación que ya se ha
escrito en dicha base.
El manejo de
las operaciones COMMIT y ROLLBACK estableciendo su punto de sincronización, el
cual representa el límite entre dos transacciones consecutivas y el final de
una unidad lógica de trabajo, etc.; mencionando el manejo, significado y el por
qué son cruciales para la recuperación de rollback e incluso como se realizan
operaciones erróneas así mismo de las permanencia.
Y por último
el manejo de índices en el mejoramiento de las operaciones.
Unidad 4: Operación y Mantenibilidad
4.1
Bitácoras de trabajo del DBMS.
En muchos DBMS la bitácora incluye todo tipo de
consulta incluyendo aquellas que no modifican los datos.
La operación ROLLBACK está basada en el uso de una bitácora.
El DBMS (Sistema Manejador de Bases de Datos) mantiene una bitácora o diario en
cinta o en disco, comúnmente, en el cual se registran los detalles de todas las
operaciones de actualización, en particular, los valores iniciales y final del
objeto modificado. Por tanto, si resulta necesario anular alguna modificación
específica, el sistema puede utilizar la entrada correspondiente de la bitácora
para restaurar el valor original del objeto restaurado.
4.1.1.
Funciones específica de las bitácoras.
La
estructura más ampliamente usada para grabar las modificaciones de la base de
datos es la Bitácora. Cada registro de la bitácora escribe una única escritura
de base de datos y tiene lo siguiente:
§ Nombre de la transacción: Nombre de la
transacción que realizó la operación de escritura.
§ Nombre del dato: El nombre único del
dato escrito.
§ Valor antiguo: El valor del dato antes
de la escritura.
§ Valor nuevo: El valor que tendrá el
dato después de la escritura.
No se requiere hacer cambios en los sistemas de producción o
de desarrollo o en una simple instalación para la implementación de la
bitácora. A través de la parametrización
se generan las pantallas de consulta y reportes sin necesidad de
programar. Acceso a la bitácora a través
de una aplicación Web. Control de Acceso a la información de la bitácora a
través de Roles. Se puede implementar en los sistemas de información que
utilicen las principales bases de datos: Oracle, SQL Server, Informix, Sybase.
Permite hacer el seguimiento de todos los cambios que ha tenido un registro.
4.1.2
Recuperación (rollback)
Un
rollback es una operación que devuelve a la base de datos a algún estado
previo. Los Rollbacks son importantes para la integridad de la base de datos, a
causa de que significan que la base de datos puede ser restaurada a una copia
limpia incluso después de que se han realizado operaciones erróneas. Son
cruciales para la recuperación de crashes de un servidor de base de datos.
En SQL, ROLLBACK es un comando que causa que todos los
cambios de datos desde la última sentencia BEGIN WORK, o START TRANSACTION sean
descartados por el sistema de gestión de base de datos relacional (RDBMS), para
que el estado de los datos sea "rolled back"(devuelto) a la forma en
que estaba antes de que aquellos cambios tuvieran lugar.
Una sentencia ROLLBACK también publicará cualquier savepoint
existente que pudiera estar en uso. Los ROLLBACK son específicos de la
conexión. Esto significa que si se hicieron dos conexiones a la misma base de
datos.
La funcionalidad de rollback está normalmente implementada
con un Log de transacciones, pero puede también estar implementada mediante
control de concurrencia multiversión.
En el proceso de “Rollback”, SQL Server comienza a hacer un
rollback de todas las transacciones que no fueron confirmadas además de las que
fueron rechazadas, dejando de esta manera la base de datos en un estado
consistente.
Este proceso de
recuperación en algunos casos puede tardar mucho tiempo debido a la gran
cantidad de información que tienen que replicar desde el log de transacciones.
Es por eso que la frecuencia con la que se hacen los checkpoints dentro de la
base de datos es crucial para el tiempo que tardara el servidor en ejecutar el
proceso de recuperación.
4.1.3
Permanencia (commit)
La
gestión de datos, commit se refiere a la idea de consignar un conjunto de
cambios "tentativos, o no permanentes".
Las transacciones suelen verse implementadas en sistemas de
bases de datos
En cualquier momento, el programa podría decidir que es
necesario hacer fallar la transacción, con lo que el sistema deberá revertir
todos los cambios hechos por las operaciones ya hechas. En el lenguaje SQL se
denomina COMMIT a aplicar_cambios y ROLLBACK a cancelar_cambios.
Una sentencia COMMIT en SQL finaliza una transacción de base
de datos dentro de un sistema gestor de base de datos relacional (RDBMS) y pone
visibles todos los cambios a otros usuarios. El formato general es emitir una
sentencia BEGIN WORK, una o más sentencias SQL, y entonces la sentencia COMMIT.
Alternativamente, una sentencia ROLLBACK se puede emitir, la cual deshace todo
el trabajo realizado desde que se emitió BEGIN WORK. Una sentencia COMMIT
publicará cualquiera de los savepoints (puntos de recuperación) existentes que
puedan estar en uso.
En términos de transacciones, lo opuesto de commit para
descartar los cambios "en tentativa" de una transacción, es un
rollback.
4.2
Definición de los modos de operación de un DBMS. (Alta, baja, recovery)
La vida
de todo archivo comienza cuando se crea y acaba cuando se borra. Durante su
existencia es objeto de constante procesamiento, que con mucha frecuencia
incluye acciones de consulta o búsqueda y de actualización. En el caso de la
estructura archivos, entenderemos como actualización, además de las
operaciones, vistas para vectores y listas enlazadas, de introducir nuevos
datos (altas) o de eliminar alguno existente (bajas), la modificación de datos
ya existentes, (operación muy común con datos almacenados). En esencia, es la
puesta al día de los datos del archivo.
Una operación de alta en un archivo consiste en la adición
de un nuevo registro. En un archivo de empleados, un alta consistirá en
introducir los datos de un nuevo empleado. Para situar correctamente un alta,
se deberá conocer la posición donde se desea almacenar el registro
correspondiente: al principio, en el interior o al final de un archivo.
El algoritmo de ALTAS debe contemplar la comprobación de que
el registro a dar de alta no existe previamente. Una baja es la acción de
eliminar un registro de un archivo. La baja de un registro puede ser lógica o
física. Una baja lógica supone el no borrado del registro en el archivo. Esta
baja lógica se manifiesta en un determinado campo del registro con una bandera,
indicador o “flag” -carácter *. $, etc.,-, o bien con la escritura o rellenado
de espacios en blanco en el registro dado de baja
Altas
La operación de dar de alta un determinado registro es
similar a la de añadir datos a un archivo. Es importante remarcar que en un
archivo secuencial sólo permite añadir datos al final del mismo.
En otro caso, si se quiere insertar un registro en medio de
los ya presentes en el archivo, sería necesaria la creación nueva del archivo.
El algoritmo para dar de alta un registro al final del
fichero es como sigue:
algoritmo
altas
leer
registro de alta
inicio
abrir
archivo para añadir
mientras
haya más registros hacer {algunos lenguajes ahorran este bucle}
leer datos
del registro
fin_mientras
escribir
(grabar) registro de alta en el archivo
cerrar
archivo
fin
Bajas
Existen dos métodos para dar de baja a un registro en un
archivo secuencial, donde no es fácil eliminar un registro situado en el
interior de una secuencia: Para ello podemos seguir dos métodos:
1) Utilizar y por tanto crear un segundo archivo auxiliar
transitorio, también secuencial, copia del que se trata de actualizar. Se lee
el archivo completo registro a registro y en función de su lectura se decide si
el registro se debe dar de baja o no. En caso afirmativo, se omite la escritura
en el archivo auxiliar. Si el registro no se va a dar de baja, este registro se
reescribe en el archivo auxiliar
Tras terminar la lectura del archivo original, se tendrán
dos archivos: original (o maestro) y auxiliar. El proceso de bajas del archivo
concluye borrando el archivo original y cambiando el nombre del archivo
auxiliar por el del inicial.
2) Guardar o señalar los registros que se desean dar de baja
con un indicador o bandera que se guarda en un array; de esta forma los registros
no son borrados físicamente, sino que son considerados como inexistentes.
4.3
Comandos de activación de los modos de operación
Para ser uso de los diferentes
comandos para un modo de operación debemos estar como administrador o asuma un
rol que incluya el perfil de derechos Service Management.
Comando STARTUP
Para el arranque de una base de datos hay tres fases de
arranque, para realizar estas fases podemos utilizar startup más un comando,
las tres fases son las siguientes:
§
Fase de
no Montaje: se leen los parámetros del sistema, se inician las estructuras
de memoria y los procesos de segundo plano. La instancia se arranca sin
asociarla a la base de datos. Normalmente se utiliza cuando se modifica o se
necesita crear el archivo de control:
startup nomount ;
§
Fase de
Montaje: se asocia la instancia con la base de datos. Se usa el archivo de
parámetros para localizar los archivos de control, que contienen el nombre de
los archivos de datos y los registros rehacer. Los archivos de datos y los
registros de rehacer no están abiertos, así que no son accesibles por usuarios
finales para tareas normales. Para realizar esta fase se pueden utilizar dos
comandos:
startup mount;
alter database mount;
§ Fase de Apertura: se abren los archivos
de datos y los registros rehacer. La base de datos queda disponible para las
operaciones normales. Es necesario que existan registros rehacer de lo
contrario si no hay registros usamos el comando resetlogs, que crea registros
nuevos. Para esta fase se pueden usar dos comandos:
startup open;
alter database open;
Si es necesario utilizar
resetlogs:
startup open resetlogs;
alter database open resetlogs;
startup restrict (sólo permite
la conexión de usuarios con el privilegio restricted sesion).
startup force (hace shutdown abort y
arranca la BD).
Comando SHUTDOWN.- El comando SHUTDOWN lo utilizamos parar una base
de datos la cual consiste en varias cláusulas.
§ Shutdown Normal: Este es el valor por
defecto, durante el proceso de parada no admite nuevas conexiones y espera que
las conexiones actuales finalicen. En el próximo arranque la base datos no
requiere procedimientos de recuperación.
§ Shutdown Immediate: Se produce una
parada inmediata de la base de datos, durante el proceso de parada no permite
nuevas conexiones y las actuales la desconecta, las transacciones que no estén
commit se hara roolback de ellas. En el próximo arranque la base datos no
requiere procedimientos de recuperación.
§ Shutdown Transactional: Se produce una
parada hasta que hayan terminado las transacciones activas, no admite nuevas
conexiones y tampoco nuevas transacciones, una vez que las transacciones
activas van terminando va desconectando a los usuarios. En el próximo arranque
la base datos no requiere procedimientos de recuperación.
§ Shutdown Abort: Aborta todos los
procesos de una base de datos, durante el proceso de parada no permite nuevas
conexiones y las actuales la desconecta, las transacciones que no estén commit
se hará roolback de ellas. En el próximo arranque la base datos puede requerir
procedimientos de recuperación.
Comando Describe.- Este comando permite conocer la estructura de
una tabla, las columnas que la forman y su tipo y restricciones.
DESCRIBE f1;
Comando SHOW TABLES y
SHOW CREATE TABLE.- El comando SHOW TABLES muestra las tablas dentro
de una base de datos y SHOW CREATE TABLES muestra la estructura de creación de
la tabla.
Modificación.- Para realizar una modificación utilizamos el comando
ALTER TABLE. Para usar ALTER TABLE, necesita permisos ALTER, INSERT y CREATE
para la tabla.
4.4.
Manejo de índices
El índice de una base de datos es
una estructura alternativa de los datos en una tabla. El propósito de los
índices es acelerar el acceso a los datos mediante operaciones físicas más
rápidas y efectivas. En pocas palabras, se mejoran las operaciones gracias a un
aumento de la velocidad, permitiendo un rápido acceso a los registros de una
tabla en una base de datos. Al aumentar drásticamente la velocidad de acceso,
se suelen usar sobre aquellos campos sobre los cuáles se hacen búsquedas
frecuentes.
4.4.1 Tipos de índices
En MySQL se tienen dos tipos de índices,
los cuales son:
Índices
agrupados
Los índices agrupados, definen el orden en que almacenan las
filas de la tabla (nodos hoja/página de datos de la imagen anterior). La clave
del índice agrupado es el elemento clave para esta ordenación; el índice
agrupado se implementa como una estructura de árbol b que ayuda a que la
recuperación de las filas a partir de los valores de las claves del índice
agrupado sea más rápida. Las páginas de cada nivel del índice, incluidas las
páginas de datos del nivel hoja, se vinculan en una lista con vínculos dobles.
Además, el desplazamiento de un nivel a otro se produce recorriendo los valores
de claves.
Consideraciones para usar índices agrupados
§
Columnas selectivas
§
Columnas afectadas en consultas
§
Columnas accedidas "secuencialmente"
§
Columnas implicadas en JOIN, GROUP BY
§
Acceso muy rápido a filas: lookups
Índices No Agrupados
Los índices no agrupados tienen la misma estructura de árbol
b que los índices agrupados, con algunos matices; como hemos visto antes, en
los índices agrupados, en el último nivel del índice (nivel de hoja) están los
datos; en los índices no-agrupados, en el nivel de hoja del índice, hay un
puntero a la localización física de la fila correspondiente en el índice
agrupado. Además, la ordenación de las filas del índice está construida en base
a la(s) columna(s) indexadas, lo cual no quiere decir (a diferencia de los
índices agrupados), que la organización física de las páginas de datos
corresponda con el índice.
Consideraciones para usar índices agrupados
En Base de Datos Oracle ofrece varias combinaciones de
indexación, que proporcionan una funcionalidad complementaria sobre el
rendimiento. Los índices se pueden clasificar de la siguiente manera:
§
Los
Índices de Árbol B
Estos índices son el tipo de índice estándar. Son excelentes
para la clave principal y los índices altamente selectivos. Utilizado como
índices concatenados, B-tree índice pueden recuperar los datos ordenados por
las columnas de índice. Índices B-tree tienen los siguientes subtipos:
§
Índice de
Tablas Organizadas
Una tabla de índice-organizada difiere de un
montón-organizado porque los datos es en sí mismo el índice.
En este tipo de índice, los bytes de la clave de índice se
invierten, por ejemplo, 103 se almacena como 301. La inversión de bytes
extiende inserta en el índice durante muchos bloques.
§
Índices
Descendentes
Este tipo de índice almacena los datos en una columna o
columnas de concreto en orden descendente.
§
Índices
B-Tree de Racimo
Este tipo de índice se utiliza para indexar una clave de
clúster tabla. En lugar de apuntar a una fila, los puntos clave para el bloque
que contiene filas relacionadas con la clave de clúster.
§
Mapa de
Bits y los Índices Bitmap Join
En un índice de mapa de bits, una entrada de índice utiliza
un mapa de bits para que apunte a varias filas. En cambio, los puntos de
entrada de un índice B-tree en una sola fila. Un índice de combinación de mapa
de bits es un índice de mapa de bits para la unión de dos o más tablas.
Consulte "Indicadores de mapa de bits".
§
Índices
Basados en Funciones
Este tipo de índice incluye columnas que, o bien se
transforman por una función, tales como la función UPPER, o incluidos en una
expresión. Índices B-tree o mapa de bits puede ser basado en las funciones.
§
Índices
de Dominio de Aplicación
Este tipo de índice se crea por un usuario para los datos en
un dominio específico de la aplicación. El índice físico no tiene que utilizar
una estructura de índice tradicional y se puede almacenar ya sea en la base de
datos Oracle como tablas o externamente como un archivo. Consulte
"Indicadores de dominio de aplicación".
§
Índices
B-Tree
Árboles B, abreviatura de árboles balanceados, son el tipo
más común de índice de base de datos. Un índice B-tree es una lista ordenada de
valores dividida en rangos. Mediante la asociación de una tecla con una fila o
rango de filas, los árboles B proporcionan un excelente rendimiento de la
recuperación para una amplia gama de consultas, incluyendo coincidencia exacta
y búsquedas por rango.
4.4.2
Reorganización de índices
Un
paquete puede usar la tarea Reorganizar índice para reorganizar los índices de
una base de datos individual o de varias bases de datos. Si la tarea solo
reorganiza los índices de una base de datos individual, puede elegir las vistas
o las tablas cuyos índices reorganiza la tarea. La tarea Reorganizar índice
también incluye la opción de compactar datos de objetos grandes. Los datos de
objetos grandes son datos de tipo image, text, ntext, varchar(max),
nvarchar(max), varbinary(max) o xml.
La tarea Reorganizar índice encapsula la instrucción ALTER
INDEX de Transact-SQL. Si elige compactar datos de objetos grandes, la
instrucción utiliza la cláusula REORGANIZE WITH (LOB_COMPACTION = ON); en caso
contrario, se establece LOB_COMPACTION en OFF
Dentro de las tareas habituales de Mantenimiento de las
Bases de Datos se encuentran aquellas destinadas al control y respaldo de las
mismas como ser: Control de Integridad, Chequeo de Consistencia, Copias de
Seguridad o Compactación de las bases.
Pero también es necesario ejecutar trabajos de mantenimiento
cuyos objetivos sean el de mantener la performance de las bases de datos y
evitar su degradación
Las tablas que contienen índices al ser actualizadas o por
inserción de nuevos datos, generan fragmentación de estos índices. Estas
fragmentaciones conllevan a la pérdida de performance al acceder a ellas.
La instrucción DBCC DBREINDEX reorganiza el índice de una
tabla o todos los índices definidos para una tabla. La reorganización de
realiza dinámicamente sin necesidad de conocer la estructura de la misma o las
restricciones que ella tenga. Por lo tanto no es necesario conocer si una tabla
tiene clave primaria o si esta clave es única y además pertenece a algún
índice, ya que la reorganización no necesita eliminar y recrear éstas
restricciones para realizar su trabajo.
La sintaxis de esta instrucción es:
DBCC DBREINDEX
(
’basededatos.dueño.nombre_de_tabla‘
[ , índice
[ , fillfactor ]
]
) [ WITH NO_INFOMSGS ]
Fillfactor es el porcentaje de espacio de página destinado a
ser ocupado. El valor definido reemplaza al que fue generado en el momento de
la creación del índice. Si se quiere mantener el valor original, entonces se
utiliza el valor 0.
WITH NO_INFOMSGS se suprimen los mensajes generados en
la ejecución.
No es necesario conocer los nombres de todos los
índices de todas las tablas, ya que si utilizamos la instrucción de la
siguiente forma:
DBCC RBINDEX (Movimientos, ‘’, 0)
Se reorganizarán todos los índices que contengan la
tabla Movimientos, conservándose el fil factor original de cada índice en
particular.
Una de las formas de utilizarlo es, escribir un script
con una sentencia DBCC RBINDEX por cada tabla que necesitemos reorganizar y
agendarlas en forma periódica mediante un trabajo de mantenimiento dentro de
algún horario disponible.
4.4.3
Reconstrucción de índices
Es
importante periódicamente examinar y determinar qué índices son susceptibles de
ser reconstruidos. Cuando un índice está descompensado puede ser porque algunas
partes de éste han sido accedidas con mayor frecuencia que otras. Como
resultado de este suceso podemos obtener problemas de contención de disco o
cuellos de botella en el sistema. Normalmente reconstruimos un índice con el
comando ALTER INDEX.
Es importante tener actualizadas las estadísticas de la base
de datos. Para saber si las estadísticas se están lanzando correctamente
podemos hacer una consulta sobre la tabla dba_indexes y ver el campo
last_analyzed para observar cuando se ejecutaron sobre ese índice las
estadísticas.
Blevel (branch level) es parte del formato del
B-tree del índice e indica el número de veces que Oracle ha tenido que reducir
la búsqueda en ese índice. Si este valor está por encima de 4 el índice deberá
de ser reconstruido.
ALTER INDEX
<index_name> REBUILD;
Para reconstruir una partición de un índice podríamos hacer
el siguiente:
ALTER INDEX
<index_name> REBUILD PARTITION <nb_partition> NOLOGGING;
Nota: En algunos casos cuando alguno de los
índices tiene algún tipo de corrupción no es posible reconstruirlo. La solución
en este caso es borrar el índice y recrearlo.
Conclusiones
Ángel Sulub-.
Como se indica una
bitácora es una herramienta el cual permite el registro, análisis y
notificación de eventos que sucede en cualquier sistema de información en las
organizaciones, de igual manera notamos que cumple diversas funciones que
aplican usadas especialmente para grabar las modificaciones de la Base de Datos
con los siguientes componentes: Nombre de la transición, Valor antiguo y Valor
nuevo, donde la introducir nuevos datos son altas en los modos de operación, o
la eliminación de algún dato existente es una baja en los modos de operación,
la modificación de datos ya existentes, (operación muy común con datos
almacenados).
Así mismo muestra la
importancia de examinar periódicamente y tener actualizadas las base de datos.
Honorio Angulo.-
Es una herramienta de archivos o
registros que permite registrar, analizar, detectar y notificar y eventos que
sucedan en cualquier sistema de información utilizado en organizaciones. Nos
ayuda a recuperar la información ante algunos incidentes de seguridad,
detección de comportamiento inusual, información para resolver problemas y
permite guardar las transacciones realizadas sobre una base de datos en
específico, de tal manera que estas transacciones pueden ser auditadas y
analizadas.
Irving
Suaste.-
Al termino de este trabajo nos damos cuenta de
que las bitácoras en una base de datos son muy importantes dado que se realizan
todos los apuntes de las acciones que se realiza en la base de datos y se puede
reestablecer en cualquier punto que se desee, los componentes de las bitácoras
son la nombre de la transacción que se realiza, los valores antiguos y por
último el valor nuevo.
de igual manera debemos tener en cuenta las
principales funciones de la base de dados para que sea eficiente estas son la
descripción de lo que contiene en todos los aspectos como en el usuario final y
tanto para el programador, otro es la manipulación es decir la base de datos
debe permitir la manipulación de los datos al añadir, borrar, modificar, etc. y
por ultimo tenemos la utilización de la base en estés caso es el enlace que se
realiza de la base a la interfaz del usuario, en algunos casos igual tenemos la
parta de recuperación en la cual nos permite recuperar la base si sufre alguna
anomalía.
Uno de los conceptos con los que ya estamos
relacionados son los índices los cuales nos permiten encontrar de una manera
más rápida las diversas consultas que deseemos realizar, en MySQL existen dos
los índices Agrupados y los no agrupados.
Bella
Perez.-
Las Operaciones y mutabilidad, mantiene un
registro de todas las operaciones de actualización, en particular, los valores
iniciales y final del objeto modificado. Por lo tanto el sistemas puede
utilizar los registro correspondientes de la bitácora para restaurarla a su
valor original por cualquier problema, donde cada registro escribe una única
escritura en la base de datos, debe residir en una memoria estable como
resultado el volumen de datos en la bitácora puede ser exageradamente grade.
Se observó que los índices de una base de datos
es una estructura alternativa, y su principal objetivo es mejorar las
operaciones con su aumento de velocidad permitiendo un mejor acceso a los
registro de una tabla en una base de datos, donde en MySQL tiene dos tipos, los
agrupado y los no agrupados, a cambio, en Oracle se clasifica por árbol b, tablas
organizadas, descendentes, B-tree de racimo, en funciones, de dominio de
aplicaciones entre otras.
Adrián
Koyoc.-
Las bitácoras Son estructuras ampliamente
utilizadas para grabar las modificaciones de la base de datos. Cada registro de
la bitácora escribe una única escritura de base de datos y tiene lo
siguiente: Nombre de la Transacción:
Nombre de la transacción que realizó la operación de escritura. Nombre del Dato: El nombre único del dato
escrito. Valor Antiguo: El valor del dato antes de la escritura. Valor Nuevo:
El valor que tendrá el dato después de la escritura. Prácticamente las
bitácoras es donde se almacena datos dentro de un base de datos anteriores y
recientes de alguna consulta que ágamos
Bibliografía
Mapa Conceptual.


No hay comentarios:
Publicar un comentario