6. Uso de DBMS

6.1 Introducción

6.1.1 Definición

DBMS Database Management System
Colección de datos interrelacionados y un conjunto de programas para acceder a esos datos

6.1.2 Componentes de un DBMS

  • Data definition language (DDL):
    Define elementos de los datos en la base de datos

  • Data manipulation language (DML):
    Manipula datos para aplicaciones

  • Data dictionary:
    Definiciones de todas las variables en la base

6.2 DBMS más populares

6.2.1 Ejemplos

Logo
Nombre
URL
Productos
Sybase
Adaptive Server
Oracle
Oracle8, Oracle8i, Oracle8iEE, Oracle9i, Oracle 10g
PostgreSQL
PostgreSQL
Microsoft
Access, MS-SQL Server
MySQL
MySQL
Informix
Illustra, Universal Server, Dynamic Server
IBM
DB2
Apache
Derby
SQLite
SQLite
Firebird
Firebird

 

6.2.2 Principales Diferencias entre DBMS

6.2.2.1 Diferencias

Costo
”Gratuitos”:
MySQL, PostgreSQL, mSQL, Interbase

Comerciales:
DB2, Sybase, Informix, Oracle

Otros de dominio público:
http://www.faqs.org/faqs/databases/free-databases/

Técnicas

  • Sub-selects
  • Select into table
  • Transactions
  • UDF (user defined functions)
  • Foreign keys
  • Views
  • Tipos de Datos
  • Manejo de memoria (Virtual Memory, Shared Memory)
  • Manejo de disco (Archivos, Chunks)

6.2.2.2 Costos de Oracle (2000)

Cotizando Oracle

Example 1: You are licensing the Oracle8iEE for a computer which has

2 - 400MHz RISC processors.
How many Universal Power Units do you need?

(1 computer x 2 processors * 400MHz * 1.5 (RISC Factor) = 1,200 Universal Power Units for each program that you license for this computer.

Example 2: You are licensing Oracle8iEE for your entire environment -
4 Intel computers each with a 550MHz Intel processor;
1 computer with 8 - 400MHz RISC processors.
How many Universal Power Units do you need?

4 computers x 1 processor x 550MHz x 1.0 (Intel Factor)=2,200 UPU
1 computer x 8 processors x 400MHz x 1.5 (RISC Factor)=4,800 UPU Total: 7,000 UPU

Example 3: You have a mainframe computer that has 200 MIPS and are licensing Oracle8iEE.
How many Universal Power Units do you need?

1 computer x 200 MIPS x 24 (Mainframe Factor) = 4,800 UPUs are required

Pricing

Case 1

For Oracle 8i (you can get 5%-10% off the list price, but that about it) take the UPU and muiltiply by:
Perpetual $15.00
4 Year(lease) 9.00
2 year (lease) 5.25

Example:
2 Sun ULTRA10 with 450mhz 2*450*1.5=1350 upu
1350upu*$15= $20,500 usd

And do not forget about 15% or so per year for support.

Support (each year) $ 3,075 usd

 

Case 2
Now if you have more than 2 cpu's (they force you) or want Oracle 8iEE (all the good stuff)
Perpetual $100.00
4 Year(lease) 60.00
2 year (lease) 35.00

1350upu* $100= $ 135,000 usd for 8iEE

And do not forget about 15% or so per year for support.

Support (each year) $ 20,250 usd

 

Más cotizaciones de Oracle aquí

6.2.2.3 Escogiendo la combinación perfecta

Consideraciones al elegir un DBMS

  • Número de usuarios
  • Número de transacciones
  • Cantidad de datos para almacenar
  • Consistencia en la información
  • Presupuesto
  • Experiencia propia o externa*

 

*SQL Server, Informix, Oracle

SQL server is OK for very small installations. Do not try to run a major
organization on this product. If horsepower (CPU number crunching for
example) is required, move on to the real relation databases.

Oracle is popular, expensive, global in its reach, and can do most any thing
you need, (for a small fee). It tends to be more labour intensive then
INFORMIX, and from my experience crashes far too often for my taste. You will
hardly ever find an Oracle DBA alone. Be careful, because Oracle has the best
marketing going right now, not necessarily the best product. Sort of like MS.

Informix is fast, scalable ,affordable,stable if you have good code and does
not require a herd of DBA's to keep the database operational. Set it up on good
hardware and leave it alone. Case in point: Walmart runs every store and their
Corp offices on INFORMIX databases. There are several thousand servers
involved, all managed by less then 10 fulltime DBA's. Take a look at the
number of DBA's in an average Oracle shop and please note they are all very
busy, all the time.

Best thing to do is get some loaner boxes and try them both.

One Consultant/DBA's opinion

 

 

6.3 Arquitectura de un manejador de bases de datos (DBMS)

Nota: Las partes utilizadas para ejemplificar la arquitectura se refieren a Oracle


Una base de datos en ejecución consta de 3 cosas:

  • Archivos
    • Control (ctl): almacenan información acerca de la estructura de archivos de la base.
    • Rollback (rbs): cuando se modifica el valor de alguna tupla en una transacción, los valores nuevos y anteriores se almacenan en un archivo, de modo que si ocurre algún error, se puede regresar (rollback) a un estado anterior.
    • Redo (rdo): bitácora de toda transacción, en muchos dbms incluye todo tipo de consulta incluyendo aquellas que no modifican los datos.
    • Datos (dbf): el tipo más común, almacena la información que es accesada en la base de datos.
    • Indices (dbf) (dbi): archivos hermanos de los datos para acceso rápido.
    • Temp (tmp): localidades en disco dedicadas a operaciones de ordenamiento o alguna actividad particular que requiera espacio temporal adicional.
  • Memoria
    • Shared Global Area (SGA): es el área más grande de memoria y quizás el más importante
      • Shared Pool: es una caché que mejora el rendimiento ya que almacena parte del diccionario de datos y el parsing de algunas consultas en SQL
      • Redo Log Buffer: contiene un registro de todas las transacciones dentro de la base, las cuales se almacenan en el respectivo archivo de Redo y en caso de siniestro se vuelven a ejecutar aquellos cambios que aún no se hayan reflejado en el archivo de datos (commit).
      • Large Pool: espacio adicional, generalmente usado en casos de multithreading y esclavos de I/O.
      • Java Pool: usado principalmente para almacenar objetos Java
    • Program Global Area (PGA): información del estado de cursores/apuntadores
    • User Global Area(UGA): información de sesión, espacio de stack
  • Procesos
    • Threading
    • System Monitor: despierta periódicamente y realiza algunas actividades entre las que se encuentran la recuperación de errores, recuperación de espacio libre en tablespaces y en segmentos temporales.
    • Process Monitor: limpia aquellos procesos que el usuario termina de manera anormal, verificando consistencias, liberación de recursos, bloqueos.
    • Database Writer: escribe bloques de datos modificados del buffer al disco, aquellas transacciones que llegan a un estado de commit.
    • Log Writer: escribe todo lo que se encuentra en el redo log buffer hacia el redo file
    • Checkpoint: sincroniza todo lo que se tenga en memoria, con sus correspondientes archivos en disco

 

Instancia de una bd en Oracle

 

Rotación de segmentos de rollback

Rotación de bitácoras de Redo

Ejemplo del esquema de una base de datos en Oracle

Utilización del Shared Pool

Ejemplo del control de transacción

6.4 Tipos de instancias de un DBMS

Online Transaction Processing (OLTP): compra/venta, telemarketing

  • Segmentos cortos de rollback
  • Shared Pool muy largo
  • Redo log suficiente
  • Indices en discos separados
  • Segmentos temporales pequeños

Decision Support Systems (DSS): datawarehouse

  • Segmentos largos de rollback
  • Shared Pool relativamente corto
  • Redo log suficiente
  • Indices apropiados
  • Segmentos largos de temporal
  • Parallel Query en la medida de lo posible (si está disponible)

Por otro lado un dbms puede ser implantado de 2 formas:

  • Cliente-Servidor
  • Three tier

Implantación Cliente-Servidor de un DBMS

Implantación 3 Tier de un DBMS

Finalmente, también se puede considerar la opción de crear clusters de máquinas o discos para poder brindar disponibilidad y escalabilidad. Existen 2 tipos de clusters:

SharedNothing:

  • explota mejor hardware económico
  • casi ilimitada escalabilidad
  • trabaja bien en ambientes r-w
  • los datos están particionados a través del cluster

 

ShareNothing Cluster

SharedDisk:

  • adaptabilidad para el balance de cargas
  • gran disponibilidad
  • se desempeña mejor en ambientes de solo r
  • los datos no necesitan particionarse

DiskShared Cluster

 

 

6.5 Administración de un DBMS real

6.5.1 MySQL

MySQL (pronunciado mai-es-quiu-el), es una manejador de bases de datos relacional bastante robusto, de código abierto bajo la licencia GPL el cual se ha convertido en el más popular hoy en día.

Su origen se debió a la búsqueda por parte de los fundadores de crear un manejador de bases de datos que fuera "rápido", todavía más rapido que mSQL. Así surgió MySQL, primero como un producto de la empresa y despúes como software de dominio público.

El nombre de My se debe probablemente a que la hija del cofundador Monty Widenius recibía ese sobrenombre, aunque a ciencia cierta nunca se ha revelado el origen. Por otro lado en el año 2002 MySQL tuvo un logo más original que el simple nombre, incluyendo un delfín, el cual a través de una encuesta en la página web recibió su nombre: "Sakila", de origen africano.

6.5.1.1 Por qué usar MySQL ?

 

Es importante resaltar que no se trata de una herramienta de juguete o aprendizaje, MySQL es un manejador que puede competir competir con sus famosas contrapartes comerciales: Oracle, DB2, Informix, Sybase.

Básicamente los motivos por los cuales se podría optar por usar MySQL en lugar de otro manejador serían:

  • Es gratis
  • Es extensible
  • Es robusto
  • Es rápido
  • No requiere de una gran número de recursos para funcionar (obviamente para aplicaciones a gran escala es mejor contar con una buena infraestructura)
  • Es fácil de administrar

6.5.1.2 Instalación Básica

MySQL posee varias versiones 3, 4 y 5 siendo la 3 la más estable y la 5 la más experimental

Los cambios en la versión 4 permiten tener mayor funcionalidad, teniendo por ejemplo queries anidados y búsquedas a texto completo.

MySQL posee 4 tipos de tablas (y en consecuencia de índices):

Index

Versión

MyISAM

Standard, Max

Heap Standard, Max

BerkeleyDB

Max

Innodb

Max

Tabla 3.1 Indexamiento en MySQL

 

MyISAM se basa en un indexamiento por bloques, Heap es una tabla que existe solo en memoria, mientras que BDB e InnoDB utilizan B-Trees.

Se puede observar que existen 2 variantes del software, la Standard y la Max; la diferencia radica en el soporte de transacciones que es posible en la versión Max gracias a los módulos de Berkeley DB e InnoDB incorporados en ella.

Es importante resaltar que aunque esta funcionalidad esta disponible no es la configuración por default, salvo que se indique lo contrario, siempre tipo de indexamiento por defecto será MyISAM.

El equipo MySQL recomienda bajar los binarios compilados por ellos para evitar cualquier tipo de problema, de manera que en la sección de "Database Server" se puede bajar el binario de la versión deseada.

Una vez descargado el software se procede a desempaquetarlo (.tgz, zip) o bien ejecutar el .exe correspondiente.

Dichos directorios contenidos en un directorio que por lo general lleva el mismo nombre 'mysql' contiene una estructura de la siguiente manera:

  • bin: programas ejecutables, mysql, mysqld, mysqldump, myisamchk, mysqlbinlog.
  • include, lib, libexec: librerías y encabezados para programar en C/C++
  • mysql-test, sql-bench: pruebas y benchmarks
  • var ó data: estructura de todas las bases y datos de las tablas tipo MyISAM y Berkeley DB.
  • man: páginas de manual
  • share: información en distintos idiomas
  • support-files: archivos de configuración y scripts de arranque automático

Antes de poder ejecutar el demonio (o guardián) del manejador, es conveniente realizar una configuración, para ello se tiene que editar alguno de los archivos .cnf, los cuales se encuentran ubicados en el directorio raíz de mysql o bien en el directorio support-files. El archivo elegido dependera de la configuración de la máquina (small, medium, large, huge), cada archivo provee información acerca de la memoria apropiada para cada configuración. La tabla 3.2 muestra un ejemplo de configuración para una arquitectura media.

Parte de la tarea de configuración es habilitar el soporte de InnoDB, configurando cada una de las variables de acuerdo a lo propuesto en 3.2, desde luego los aspectos más importantes serán los buffers

# Example mysql config file for medium systems.
#
# This is for a system with little memory (32M - 64M) where MySQL plays
# a important part and systems up to 128M very MySQL is used together with
# other programs (like a web server)
#
# You can copy this file to
# /etc/mf.cnf to set global options,
# mysql-data-dir/my.cnf to set server-specific options (in this
# installation this directory is /centia01/develop/database/mysql/var) or
# ~/.my.cnf to set user-specific options.
#
# One can in this file use all long options that the program supports.
# If you want to know which options a program support, run the program
# with --help option.
# The following options will be passed to all MySQL clients
[client]
#password = your_password
port = 3306
socket = /tmp/mysql.sock
# Here follows entries for some specific programs
# The MySQL server
[mysqld]
port = 3306
socket = /tmp/mysql.sock
skip-locking
set-variable = key_buffer=64M
set-variable = max_allowed_packet=256M
set-variable = table_cache=64
set-variable = sort_buffer=512K
set-variable = net_buffer_length=8K
set-variable = myisam_sort_buffer_size=16M
set-variable = max_connections=500
set-variable = interactive_timeout=604800
set-variable = wait_timeout=604800
log-bin
server-id = 1
set-variable=default_table_type=innodb
# Point the following paths to different dedicated disks
tmpdir = /var/tmp/ 
#log-update = /centia01/final/database/mysql/var/log-catarina
# Uncomment the following if you are using BDB tables
set-variable = bdb_cache_size=4M
set-variable = bdb_max_lock=10000
# Uncomment the following if you are using Innobase tables
innodb_data_file_path = ibdata1:30G:autoextend
innodb_data_home_dir = /database/mysql/innodb
innodb_log_group_home_dir = /database/mysql/innodb
innodb_log_arch_dir = /database/mysql/innodb
set-variable = innodb_mirrored_log_groups=1
set-variable = innodb_log_files_in_group=3
set-variable = innodb_log_file_size=5M
set-variable = innodb_log_buffer_size=16M
innodb_flush_log_at_trx_commit=1
innodb_log_archive=0
set-variable = innodb_buffer_pool_size=256M
set-variable = innodb_additional_mem_pool_size=256M
set-variable = innodb_file_io_threads=4
set-variable = innodb_lock_wait_timeout=50
#set-variable = innodb_force_recovery=3
[mysqldump]
quick
set-variable = max_allowed_packet=256M
[mysql]
prompt=(\u) [\d]>\_
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates
[isamchk]
set-variable = key_buffer=20M
set-variable = sort_buffer=20M
set-variable = read_buffer=2M
set-variable = write_buffer=2M
[myisamchk]
set-variable = key_buffer=20M
set-variable = sort_buffer=20M
set-variable = read_buffer=2M
set-variable = write_buffer=2M
[mysqlhotcopy]
interactive-timeout

Tabla 3.2 Archivo de Configuración my.cnf, my.ini

6.5.1.3 Arranque y Terminación

Arranque del manejador

Una vez configurado se puede iniciar el demonio del dbms a través del comando "mysqld" o alguna de sus variantes "safe_mysqld", "mysqld-max"

Esto se puede hacer desde cualquier terminal y se pueden pasar como parametros algunas de las mismas variables disponibles para configuración (en caso de necesitar alguna opción particular)

Terminación del manejador

Se puede hacer de 2 maneras

  • a) Usando el comando "mysqladmin shutdown"
  • b) Matando el proceso asociado

6.5.1.4 Creación de bases y cuentas de usuario

La tabla 3.3 muestra la manera en que cualquier usuario puede conectarse a la base llamada 'mysql' con el usuario 'root', para ello es indispensable contar con el password correspondiente; como se presentará más adelante la cuenta del super usuario 'root' se administra de manera similar que los demás usuario.

[digital@pcproal digital]$ mysql -u root -p mysql
Enter password: ****
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 4.1.0-alpha-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

(root) [mysql]>

Tabla 3.3 Conexión con el dbms

La tabla 3.4 muestra las tablas correspondientes a la base principal y que administra todos los usuarios, máquinas y bases permitidas en el manejador, recordando que se trata de un esquema relacional en el cual por ejemplo los usuarios se encuentran vinculados son bases de datos, de manera que no pueden existir problemas de seguridad al haber algun usuario malintencionado que pretenda modificar una base a la cual no tenga acceso.

 

(root) [mysql]> show databases;
+------------+
| Database   |
+------------+
| mysql      |
+------------+
1 rows in set (0.12 sec)

(root) [mysql]> show tables;
+-----------------+
| Tables_in_mysql |
+-----------------+
| columns_priv    |
| db              |
| func            |
| help_category   |
| help_relation   |
| help_topic      |
| host            |
| tables_priv     |
| user            |
+-----------------+
9 rows in set (0.10 sec)

Tabla 3.4 Tablas de administración del dbms

Para cada tabla se puede emplear el comando 'desc' o 'describe' para analizar la estructura de cada tabla y apreciar la relación que tiene con las demás.

Para dar de un alta un usuario, ejemplo de la tabla 3.5, se debe crear el usuario dentro de la tabla 'user', crear la base de datos y posteriormente asociar dicho usuario con la base en la tabla 'bd', todo lo anterior utilizando instrucciones de SQL tradicionales.

                                
(root) [mysql]> desc user;
+-----------------------+-----------------------------------+-------------------+------+-----+---------+-------+
| Field                 | Type                              | Collation         | Null | Key | Default | Extra |
+-----------------------+-----------------------------------+-------------------+------+-----+---------+-------+
| Host                  | varchar(60) binary                | binary            |      | PRI |         |       |
| User                  | varchar(16) binary                | binary            |      | PRI |         |       |
| Password              | varchar(45) binary                | binary            |      |     |         |       |
| Select_priv           | enum('N','Y')                     | latin1_swedish_ci |      |     | N       |       |
| Insert_priv           | enum('N','Y')                     | latin1_swedish_ci |      |     | N       |       |
| Update_priv           | enum('N','Y')                     | latin1_swedish_ci |      |     | N       |       |
| Delete_priv           | enum('N','Y')                     | latin1_swedish_ci |      |     | N       |       |
| Create_priv           | enum('N','Y')                     | latin1_swedish_ci |      |     | N       |       |
| Drop_priv             | enum('N','Y')                     | latin1_swedish_ci |      |     | N       |       |
| Reload_priv           | enum('N','Y')                     | latin1_swedish_ci |      |     | N       |       |
| Shutdown_priv         | enum('N','Y')                     | latin1_swedish_ci |      |     | N       |       |
| Process_priv          | enum('N','Y')                     | latin1_swedish_ci |      |     | N       |       |
| File_priv             | enum('N','Y')                     | latin1_swedish_ci |      |     | N       |       |
| Grant_priv            | enum('N','Y')                     | latin1_swedish_ci |      |     | N       |       |
| References_priv       | enum('N','Y')                     | latin1_swedish_ci |      |     | N       |       |
| Index_priv            | enum('N','Y')                     | latin1_swedish_ci |      |     | N       |       |
| Alter_priv            | enum('N','Y')                     | latin1_swedish_ci |      |     | N       |       |
| Show_db_priv          | enum('N','Y')                     | latin1_swedish_ci |      |     | N       |       |
| Super_priv            | enum('N','Y')                     | latin1_swedish_ci |      |     | N       |       |
| Create_tmp_table_priv | enum('N','Y')                     | latin1_swedish_ci |      |     | N       |       |
| Lock_tables_priv      | enum('N','Y')                     | latin1_swedish_ci |      |     | N       |       |
| Execute_priv          | enum('N','Y')                     | latin1_swedish_ci |      |     | N       |       |
| Repl_slave_priv       | enum('N','Y')                     | latin1_swedish_ci |      |     | N       |       |
| Repl_client_priv      | enum('N','Y')                     | latin1_swedish_ci |      |     | N       |       |
| ssl_type              | enum('','ANY','X509','SPECIFIED') | latin1_swedish_ci |      |     |         |       |
| ssl_cipher            | blob                              | binary            |      |     |         |       |
| x509_issuer           | blob                              | binary            |      |     |         |       |
| x509_subject          | blob                              | binary            |      |     |         |       |
| max_questions         | int(11) unsigned                  | binary            |      |     | 0       |       |
| max_updates           | int(11) unsigned                  | binary            |      |     | 0       |       |
| max_connections       | int(11) unsigned                  | binary            |      |     | 0       |       |
+-----------------------+-----------------------------------+-------------------+------+-----+---------+-------+
31 rows in set (0.00 sec)

(root) [mysql]> desc db;
+-----------------------+-----------------+-------------------+------+-----+---------+-------+
| Field                 | Type            | Collation         | Null | Key | Default | Extra |
+-----------------------+-----------------+-------------------+------+-----+---------+-------+
| Host                  | char(60) binary | binary            |      | PRI |         |       |
| Db                    | char(64) binary | binary            |      | PRI |         |       |
| User                  | char(16) binary | binary            |      | PRI |         |       |
| Select_priv           | enum('N','Y')   | latin1_swedish_ci |      |     | N       |       |
| Insert_priv           | enum('N','Y')   | latin1_swedish_ci |      |     | N       |       |
| Update_priv           | enum('N','Y')   | latin1_swedish_ci |      |     | N       |       |
| Delete_priv           | enum('N','Y')   | latin1_swedish_ci |      |     | N       |       |
| Create_priv           | enum('N','Y')   | latin1_swedish_ci |      |     | N       |       |
| Drop_priv             | enum('N','Y')   | latin1_swedish_ci |      |     | N       |       |
| Grant_priv            | enum('N','Y')   | latin1_swedish_ci |      |     | N       |       |
| References_priv       | enum('N','Y')   | latin1_swedish_ci |      |     | N       |       |
| Index_priv            | enum('N','Y')   | latin1_swedish_ci |      |     | N       |       |
| Alter_priv            | enum('N','Y')   | latin1_swedish_ci |      |     | N       |       |
| Create_tmp_table_priv | enum('N','Y')   | latin1_swedish_ci |      |     | N       |       |
| Lock_tables_priv      | enum('N','Y')   | latin1_swedish_ci |      |     | N       |       |
+-----------------------+-----------------+-------------------+------+-----+---------+-------+
(root) [mysql]> insert into user (host,user,password) values ('%','carlos',password('lolo'));
Query OK, 1 row affected (0.07 sec)

(root) [mysql]> select * from user where user='carlos';
+------+--------+-----------------------------------------------+-------------+-------------+-------------+-------------+
| Host | User   | Password                                      | Select_priv | Insert_priv | Update_priv | Delete_priv |
+------+--------+-----------------------------------------------+-------------+-------------+-------------+-------------+
| %    | carlos | *87f0212af7420ce3e0b2b8992eb42dda4be54c9125b3 | N           | N           | N           | N           |
+------+--------+-----------------------------------------------+-------------+-------------+-------------+-------------+
1 row in set (0.00 sec)


(root) [mysql]> create database prueba;
Query OK, 1 row affected (0.00 sec)


(root) [mysql]> insert into db values ('%','prueba','carlos','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
Query OK, 1 row affected (0.00 sec)

(root) [mysql]> select * from db where user='carlos';
+------+--------+--------+-------------+-------------+-------------+-------------+
| Host | Db     | User   | Select_priv | Insert_priv | Update_priv | Delete_priv |
+------+--------+--------+-------------+-------------+-------------+-------------+
| %    | prueba | carlos | Y           | Y           | Y           | Y           |
+------+--------+--------+-------------+-------------+-------------+-------------+
1 row in set (0.09 sec)

(root) [mysql]> flush privileges;
Query OK, 0 rows affected (0.07 sec)

Tabla 3.5 Creación de una cuenta de usuario

6.5.1.5 Utilización de la base de datos

SQL

MySQL cumple con el estándar SQL92. Es importante resaltar que aunque no implementa todas las funciones que otros manejadores poseen, es posible realizar cualquier consulta usando los distintos tipos de joins o inclusive a través de tablas temporales.

[digital@pcproal digital]$ mysql -u carlos -p prueba
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3 to server version: 4.1.0-alpha-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

(carlos) [prueba]> show tables;
Empty set (0.00 sec)



(carlos) [prueba]> create table auser (id int primary key, last_name char(255),first_name char(255));
Query OK, 0 rows affected (0.07 sec)

(carlos) [prueba]> show tables;
+------------------+
| Tables_in_prueba |
+------------------+
| auser            |
+------------------+
1 row in set (0.00 sec)

(carlos) [prueba]> insert into auser values (1,'proal','carlos');
Query OK, 1 row affected (0.00 sec)


(carlos) [prueba]> select * from auser;
+----+-----------+------------+
| id | last_name | first_name |
+----+-----------+------------+
|  1 | proal     | carlos     |
+----+-----------+------------+
1 row in set (0.08 sec)

Tabla 3.6 Ejemplos de SQL

Creación de índices

La sintáxis de creación de índices no está considerada como un estándar, así que varía en cada dbms, ej.

create index index_name on table_name (atrib_1,..atrib_n);

En el caso partícular de MySQL toda llave primaria está asociada a un índice, así que no se requiere crear un índice adicional para dicho propósito.

Por otro lado si se crea un índice X que contiene a los atributos (a,b,c) ya no es necesario crear un índice para el caso de hacer una consulta que sólo involucre a (a) o (a,b) ya que se empleará el mismo índice X; para saber con certeza qué índices de están empleando en una consulta se puede recurrir a la expresión de 'explain'.


(carlos) [prueba]> create index iname on auser(last_name,first_name);
Query OK, 1 row affected (0.15 sec)
Records: 1  Duplicates: 0  Warnings: 0


(carlos) [prueba]> show index from auser;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| auser |          0 | PRIMARY  |            1 | id          | A         |           1 |     NULL | NULL   |      | BTREE      |         |
| auser |          1 | iname    |            1 | last_name   | A         |           1 |     NULL | NULL   | YES  | BTREE      |         |
| auser |          1 | iname    |            2 | first_name  | A         |           1 |     NULL | NULL   | YES  | BTREE      |         |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
3 rows in set (0.00 sec)

(carlos) [prueba]> explain select * from auser where last_name='aguilar';
+----+-------------+-------+------+---------------+-------+---------+-------+------+--------------------------+
| id | select_type | table | type | possible_keys | key   | key_len | ref   | rows | Extra                    |
+----+-------------+-------+------+---------------+-------+---------+-------+------+--------------------------+
|  1 | SIMPLE      | auser | ref  | iname         | iname |     256 | const |    1 | Using where; Using index |
+----+-------------+-------+------+---------------+-------+---------+-------+------+--------------------------+
1 row in set (0.08 sec)

Tabla 3.7 Empleo de índices

Mantenimiento y monitoreo de la base

Actividad Comando
Revisar el estado de las tablas show table status;
Los procesos que están ejecutándose show processlist;

Variables con las que se está ejecutando la instancia

show variables;
Estado actual de innodb; show innodb status;

Respaldos

La manera usual de hacer un respaldo es usando el comando mysqldump, que posee muchas opciones que permiten duplicar todas las base, una base en particular, una tabla, solo los datos, solo la estructura, etc.

Para obtener un respaldo completo de una base

[digital@pcproal digital]$ mysqldump --opt -u carlos -p prueba > prueba.bak
Para restaurar un respaldo completo de una base
[digital@pcproal digital]$ mysql -u carlos -p prueba < prueba.bak

Otra manera de hacer respaldos es através del comando "select into" y restaurar los datos con "mysqlimport" o "load data infile".