Jose M. Fernández Índice de Contenidos: Introducción |
MySQL
|
Tables |
---|
db |
host |
user |
Field | Type | Null | Key | Default | Extra |
Host | char(60) | PRI | |||
Db | char(32) | PRI | |||
User | char(16) | PRI | |||
Select_priv | char(1) | N | |||
Insert_priv | char(1) | N | |||
Update_priv | char(1) | N | |||
Delete_priv | char(1) | N | |||
Create_priv | char(1) | N | |||
Drop_priv | char(1) | N |
Field | Type | Null | Key | Default | Extra |
Host | char(60) | PRI | |||
Db | char(32) | PRI | |||
Select_priv | char(1) | N | |||
Insert_priv | char(1) | N | |||
Update_priv | char(1) | N | |||
Delete_priv | char(1) | N | |||
Create_priv | char(1) | N | |||
Drop_priv | char(1) | N |
Field | Type | Null | Key | Default | Extra |
Host | char(60) | PRI | |||
User | char(16) | PRI | |||
Password | char(16) | ||||
Select_priv | char(1) | N | |||
Insert_priv | char(1) | N | |||
Update_priv | char(1) | N | |||
Delete_priv | char(1) | N | |||
Create_priv | char(1) | N | |||
Drop_priv | char(1) | N | |||
Reload_priv | char(1) | N | |||
Shutdown_priv | char(1) | N | |||
Process_priv | char(1) | N | |||
File_priv | char(1) | N |
Se puede decidir si se autoriza o no a seleccionar (SELECT), insertar (INSERT), actualizar (UPDATE), y borrar (DELETE) filas de una tabla.
Se puede permitir, o no, crear o barrar (CREATE, DROP) tablas o bases de datos.
Se pude permitir, o no, usar comandos de administración del gestor de bases de datos como "shutdown", "reload", "process", etc.
Se puede siempre comprobar nuestros privilegios con el script "mysqlaccess".
Un HOST debe ser un "host local", un numero IP, o una expresión SQL . Si en la tabla "db" la columna host está vacía significa "cualquier host" en la tabla de "host". Si en la tabla "host" o "user" la columna host está vacía significa que cualquier HOST puede crear una conexión TCP con vuestro servidor.
Db es el nombre de una base de datos.
Una columna "USER" vacía significa cualquier nombre de usuario.
La forma más rápida de arrancar el servidor es ejecutando:
mysql.server starty para pararla:
mysql.server stop
Se puede realizar lo mismo ejecutando el script safe_mysql como indica en la guía de instalación, aunque al final, de una forma o de otra, se ejecuta el fichero "mysqld".
Es necesaria, como se pude suponer, arrancar el servidor para realizar cualquier operación con la base de datos, una vez realizado esto se pueden ejecutar varios comando para comprobar que el arranque del servidor ha sido correcto como, por ejemplo, "mysqladmin" cuyo formato completo será:
mysqladmin [OPCIONES] comando comando &
donde OPCIONES puede ser:
-f, --force | No realiza la pregunta para confirmar al borran una tabla. |
-?, --help | Visualiza esta ayuda . |
-h, --host=# | Conexión con el host. |
-p, --password[=...] | Palabra de paso para la conexión al servidor |
-P --port=... | Numero de puerto a usar en la conexión. |
-S --socket=... | Fichero Socket para usar en la conexión. |
-u, --user=# | Usuario de conexión si no es el usuario actual. |
-V, --version |
Información sobre la versión actual .
|
donde Comando puede ser uno o más de:
así que, ejecutando:
mysqladmin create nuevabasededatoscrearemos una nueva base de datos cuyo nombre será "nuevabasededatos".
Podremos ver los procesos que se están ejecutando en el servidor con:
mysqladmin processlistOtro comando importante es el mysqlshow que nos permite ver las bases de datos que existen, por ejemplo, si ejecutamos el comando tal cual:
mysqlshownos mostrará como resultado:
+-----------+ | Databases | +-----------+ | mysql | | personas | | test | +-----------+
Como idicamos en la introducción, este servidor de bases de datos está considerada como las más rápida entres las de sus misma categoría tanto para volúmenes de datos grandes como pequeños, pero como también indicamos al principio es a base de no implementar ciertos aspectos de las especificación SQL éstos aspectos, que a mi entender, son importantes son por una lado los Triggers y por otro lado la Lógica Transaccional.
Los triggers no es nada más que una porción de código almacenado que se "dispara" o se ejecuta cuando se realiza una operación ( actualización, borrado, etc.) con la base de datos. Naturalmente comprobar la propia existencia de disparador y ejecutarlo si existe consume recursos y tiempo y es como su propio manual indica, la única razón por la que los triggers no están soportados.
Un aspecto muy importante en cualquier base de datos relacional es la consistencia de las diferentes tablas que la componen, para conseguir esto de una forma más o menos fácil es utilizando la "Lógica Transaccional" , será el propio gestor de base de datos el que proporcione mecanismos de bloqueo de ficheros y consolidación o retroceso en la operaciones con las tablas. Pues bien Mysql no soporta las transacciones en aras simplemente de la velocidad (o por lo menos así lo indican en sus comentarios) , sólo nos podemos ayudar con los comandos LOCK tables /UNLOCK tables que permiten bloquear tablas impidiendo que otros usuarios puedan acceder a ellas pero sin la posibilidad de deshacer las operaciones realizadas con los datos.
Teniendo en cuenta estas restricciones en la utilización del servidor a continuación veremos como implementamos algunos comandos SQL, no con el objetivo de analizar los comandos, sino ver como éstos se implementan en este gestor de bases de datos
Una vez que tenemos el servidor arrancado ya no nos queda nada más que enviarle instrucciones para realizar las operaciones que deseemos. Como ejemplo veremos la creación de una base de datos "personas" que está constituida por tres tablas "clientes" "provincias" y "municipios". Es un ejemplo muy simple y sin ninguna utilidad pero nos ayudará en un ejemplo real como podemos manipular la base de datos. En primer lugar, diremos que éstas operaciones podemos realizarlas de varias formas: una de ellas sería atreves de una API en C , C++, JAVA o por medio de una ODBC si estuviéramos trabajando en Windows95 (con perdón) o también podríamos realizarlo con la shell de la propia instalación. Ésta última forma no parece más apropiada para nuestro articulo ya que no tenemos que describir las particularidades de los distintos lenguajes de programación.
La shell de Mysql podemos arrancarla ejecutando
mysql nombrebasedatos
y se nos presentará el prompt de la shell, con lo cual podemos enviar comandos al servidor.
Asimismo podemos ejecutar la shell en modo "batch" o diferido ejecutando:
mysql -e("comando SQL .... ") nombre_base_datos
con lo que conseguiremos enviar el comando SQL al servidor.
Para nuestro ejemplo hemos creado una base de datos llamada "personas"con el comando
mysqladmin create personas
Arrancaremos la shell con el comando
mysql personas
y ya desde la shell podemos enviar comandos al propio servidor , como por ejemplo, que nos enseñe las tablas de la bases de datos con la que hemos arrancado la shell:
> show tables /g
y el sistema nos responderá con:
Database: personas
+-------------+ | Tables | +-------------+ | clientes | | municipios | | provincias | +-------------+
Todos los comandos que enviamos al servidor desde la shell siempre acabarán con /g que es la forma de indicar el fin de comando y el envío de este al servidor para que lo ejecute.
Naturalmente, antes de que el sistema nos devuelva esta información, hemos tenido que crear las tablas con los correspondiente comandos CREATE , los cuales tendrán un aspecto como:
CREATE TABLE clientes (NIF CHAR(9) NOT NULL PRIMARY KEY, Nombre CHAR(15) NOT NULL, Apellidos CHAR(35) NOT NULL, Direccion CHAR(50) NOT NULL, Poblacion INT(5) NOT NULL, Provincia INT(2) NOT NULL, Telefono INT(9), Fecha_Alta DATE NOT NULL) /g CREATE TABLE provincias (Cod_provincia INT(2) NOT NULL PRIMARY KEY, Descripcion_p CHAR(30) NOT NULL) g CREATE TABLE municipios (Cod_provincia INT(2) NOT NULL, Cod_municipio INT(3) NOT NULL, Descripcion_m CHAR(30) NOT NULL, PRIMARY KEY(Cod_provincia,Cod_municipio)) /g
Si a continuación ejecutamos:
> show colums from clientes from personas /g > show columns from provincias from personas /g > show columns from municipios from personas /g
obtendremos respectivamente:
Database: personas Table: clientes Rows: 4 +--------------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+----------+------+-----+---------+-------+ | NIF | char(9) | |PRI | | | | Nombre | char(15) | YES | | | | | Apellidos | char(35) | | | | | | Direccion | char(50) | | | | | | Poblacion | int(5) | | | 0 | | | Provincia | int(2) | | | 0 | | | Telefono | int(9) | YES | | | | | Fecha_Alta | date | YES | | | | +--------------+----------+------+-----+---------+-------+
Database: personas Table: provincias Rows: 3 +-----------------+----------+------+-----+---------+-------+ | Field | Type | Null | Key| Default | Extra | +-----------------+----------+------+-----+---------+-------+ | Cod_provincia | int(2) | | PRI | 0 | | | Descripcion_p | char(30) | | | | | +-----------------+----------+------+-----+---------+-------+
Database: personas Table: municipios Rows: 9 +------------------+----------+------+-----+---------+-------+ | Field | Type | Null | Key| Default | Extra | +------------------+----------+------+-----+---------+-------+ | Cod_provincia | int(2) | | PRI | 0 | | | Cod_municipio | int(3) | | PRI | 0 | | | Descripcion_m | char(30) | | | | | +------------------+----------+------+-----+---------+-------+
El siguiente paso sería introducir datos a cada una de las tablas, vamos ha utilizar el comando INSERT puro del SQL sin que intervenga ningún lenguaje de programación ni rutina ni API:
Para insertar un registro en la tabla de clientes, municipios y provincias lo realizaremos respectivamente como:
INSERT INTO clientes VALUES ("5316828K","PEDRO","ROMERO DIAZ","C/ HOLA 9 ",29003,29,911111111,19980203) /g INSERT INTO municipios VALUES (28,001,"Fuenlabrada") /g INSERT INTO provincias VALUES (08,"Barcelona") /g
Y finalmente, terminaremos nuestro recorrido por los comandos SQL realizando selecciones de los filas que hemos introducido en las tablas creadas anteriormente dentro de la base de datos que hemos creado para el ejemplo de este articulo. Seleccionaremos registros de las tabla de cliente variando la condición se selección y una primera selección de la tabla de municipios:
> SELECT ALL Cod_provincia, Cod_municipio, Descripcion_m from municipios where Cod_provincia = 28 /g Cod_provincia Cod_municipio Descripcion_m 28 1 Fuenlabrada 28 2 Pozuelo 28 3 Madrid > SELECT ALL NIF,Nombre,Apellidos,Direccion from clientes where Poblacion = 28001 NIF Nombre Apellidos direccion 2416728U JOSE FERNANDEZ ROMERO C/ FELIZ 1 3G > SELECT ALL NIF,Nombre,Apellidos,Direccion from clientes where Provincia = 29 NIF Nombre Apellidos direccion 23198623N JUAN ANDRES RUIZ MORALES C/ CATEDRAL 12 2B 5316828K PEDRO ROMERO DIAZ C/ HOLA 9 52312844J LUIS ALBERTO LISTO JIMENEZ C/ ROSA DE LOS VIENTOS 129 3I
Como comentaba al principio del artículo, el objetivo que seguía era simplemente mostrar el funcionamiento y ver las características fundamentales de una implementación en concreto de un servidor de bases de datos SQL , pero no sólo quería indicar una sería de recetas y comandos para poder utilizarlo, sino que pretendía realizar un estudio de las posibilidades y carencias que podía tener este software , sobre todo porque conociendo a fondo un producto podemos obtener el máximo rendimiento de éste, utilizándolo en aquellos aspectos que más potenciados están. Este es el caso de este gestor de bases de datos, ya que considero que la no implementación de los triggers y la lógica transaccional hace muy complicado el manejo de datos (inserciones, modificaciones, borrado de registros) desde aplicaciones multiusuarios y utilizando multitud de tablas relacionas entre si. Aunque pienso que, para aplicaciones donde se pretenda realizar consultas muy rápidas a bases de datos muy grandes, sería recomendable éste servidor (teniendo siempre como referencia la versión semi-free de este servidor)
Indicar para concluir que la base de este articulo la he obtenido de la propia documentación Mysql, que la considero bastante completa, de algunos artículos de revistas especializadas así como de un amarillento manual de "auto-estudio" de IBM sobre SQL.
Texto original en Castellano
Páginas web mantenidas por Miguel Ángel Sepúlveda © Jose M. Fernández 1998 LinuxFocus 1998 |