Manual de MySQL

Mysql es una base de datos cliente/servidor, lo cual quiere decir que tenemos un server (o daemon) que se ejecuta en segundo plano, a la escucha de las peticiones del programa cliente. En mysql, el daemon o servidor es mysqld y el cliente, mysql.

En el apartado de servidores habrás podido encontrar unas breves instrucciones sobre la instalación de la base de datos mysql bajo windows. Tambien algunas cosas básicas como cambiar el nombre de usuario y contraseña. Ahora refrescaremos algunos conceptos:
Ayudas:

En una sesión de DOS navegamos hacia c:/mysql/bin (o la ruta donde tengamos instalado mysql y escribimos

c:/mysql/bin:>mysqld –help

para obtener la lista de comandos disponibles a mysqld. Lamentablemente verás que la información desborda la pantalla y que en DOS no hay barras de scroll vertical !. No hay problema. Un nuevo truco de DOS: el carácter pipe, es decir, la barra vertical, acompañada de la palabra more, así:

c:/mysql/bin:>mysqld –help|more

Verás que ahora la información se muestra pantalla a pantalla, pulsando la barra espaciadora para ir avanzando.

Arrancando el servidor

Nosotros utilizaremos mysqld-opt. opt no es una propiamente una opción de mysqld (por eso no te saldrá listada si has realizado la prueba anterior), sino que es un ejecutable distinto a mysqld (mas rápido, a costa de algunas opciones avanzadas) que es recomendado para los principiantes como nosotros.

c:/mysql/bin:>mysqld-opt

Bien, aunque la pantalla no muestra nada, ya tenemos el daemon mysqld corriendo en segundo plano. Para comprobarlo, puedes pulsar ctrl-alt-delete y veras mysqld-opt en la lista de tareas. O haz un ping:

C:/mysql/bin>mysqladmin ping
mysqld is alive

Utilizamos la herramienta de administración mysqladmin para hacer un ping, y el server nos contesta mysqld is alive.

Para cerrar el servidor usamos de nuevo mysqladmin, sin olvidar nuestro nombre de usuario y password !!:

C:/mysql/bin>mysqladmin -u nombredeusuario -p shutdown
Enter password: *******

Recuerda que el nombre de usuario se introduce siempre precedido de -u y que si escribes a continuacion -p, al pulsar enter, mysql te permitirá que teclees la contraseña.

Verificamos que el proceso mysqld ya no está corriendo (ctrl-alt-supr de nuevo) y ya sabemos encender y apagar mysqld.

Que servidor ejecuto ?

Las versiones binarias para windows suelen traer diversos ejecutables del daemon. cual escoger ? aqui puedes ver sus diferencias.

* mysqld con soporte para debug, symbolic links, InnoDB y BDB
* mysqld-opt version optimizada, sin soporte para tablas transaccionales. En la version 4 por defecto lleva soporte InnoDB
* mysqld-nt Optimizada para NT/2000/XP, con soporte para conductos con nombre (named pipes), si se arranca el server con –enable-named-pipe
* mysqld-max version optimizada, con symbolic links, InnoDB y tablas berkeley
* mysqld-max-nt Como la anterior, pero con soporte para conductos con nombre (named pipes)

My.ini

Si instalas MySql en directorio distinto del sugerido durante la instalación (esto es, c:mysql y c:mysqldata) necesitas editar un archivo opcional, el my.ini o my.cnf. Tambien deberás recurrir a estos archivos si usas mysqld, mysqld-opt o mysqld-max-nt

La diferencia entre my.ini | my.cnf está unicamente en su ubicacion. my.ini debe estar en tu directorio de sistema (c:windows) mientras que my.cnf debe estar en el directorio raiz (c:). Solo debes usar uno de los dos. Los archivos My-huge.cnf, My-large.cnf, My-medium.cnf y My-small.cnf que encontraras en c:mysql son modelos que puedes usar para tu my.cnf.

Con la utilidad winmysqladmin.exe incluida en el directorio bin de tu distribución encontrarás una forma cómoda no solamente de lanzar o cerrar el servidor, sino de escoger el ejecutable que desees, y editar my.ini.

Las secciones que contiene este archivo son basedir que indica el directorio base de la instalacion (suele ser c:/mysql), datadir con la ruta al directorio data; finalmente, si vas a usar tablas InnoDB debes crear dos directorios para los datos y log respectivamente, por ejemplo c:ibdata y c:iblogs. y puede ser necesaria una configuracion adicional en my.ini. Puedes consultar mas detalles aqui .

Ten en cuenta que aunque uses windows, las rutas en los archivos de configuración debes escribirlas con barras normales, no invertidas: c:/mysql y no c:mysql.

mysqladmin

Mysqladmin es una utilidad para realizar tareas de mantenimiento de nuestras bases de datos, que viene incluida en la distribución de mysql.

Su sintaxis es:

prompt>mysqladmin [OPCIONES] comando [opciones de comando] comando2 …

Puedes obtener una lista de las opciones disponibles en tu version de mysql tecleando mysqladmin –help|more

A continuación una lista de las opciones mas corrientes. Primero vemos su denominacion abreviada, y separado con una barra vertical | su nombre completo:

* -p|–password [=pwd]
La contraseña para conectar con el server. Si usamos –p sin proporcionar la contraseña, mysql nos la preguntará antes de ejecutar el comando.
* -u|–user [=nombre de usuario]
El nombre de usuario. Es necesario especificarlo si no hemos hecho aun log en el server
* -h|–host=hostname
Conecta al servidor. Si no lo especificamos, intentara localhost
* -P|–port=pnum
Especifica el puerto por el que conectara al server. Si no se especifica usará el puerto por defecto
* -f|–force
Mediante esta opción podemos hacer drop en una base de datos (eliminarla) sin que pida confirmación. Si usamos esta opción en una orden que incluya varios comandos, obligamos a la ejecución de todos ellos incluso aunque haya algun error.
* -?|–help
muestra la ayuda y sale de la ejecución
* -s|–silent
Cierra la ejecución si no puede conectar con el server
* -v|–verbose
Especifica que el server debe contestar con toda la infromación disponible a cada comando que ejecutemos
* -V|–version
Muestra la versión y sale
* -w|–wait [=num de intentos]
Reintenta la conexión si el server esta caido

Comandos de mysqladmin

Podemos usar con mysqladmin los siguientes comandos:

* create nombre_base_datos
Crea una nueva base de datos con el nombre proporcionado.
* drop nombre_base_datos
Elimina la base de datos especificada (y todas sus tablas).
* status
proporciona un mensaje con el status del server.
* extended-status
Mensaje con información extendida sobre el server.
* version
Ofrece la version del servidor.
* flush-hosts
Vacía los servidores almacenados en cache.
* flush-logs
Vacia los archivos de registro
* flush-tables
Vacía todas las tablas.
* flush-privileges
Recarga las tablas con los permisos de usuario (igual que reload).
* kill id,id,…
Elimina los subrprocesos especificados.
* password
Especifica una nueva contraseña
* ping Comprueba si mysqld se está ejecutando.
* processlist
Muestra los subprocesos abiertos en el server.
* reload
Recarga los permisos de usuario.
* refresh
Vac?a las tablas de permisos, cierra y abre los archivos de registro.
* shutdown Apaga el server.
* variables
Muestra las variables disponibles.

Ejemplo: para crear una base de datos llamada dbtest

prompt>mysqladmin -u root -p create dbtest
Enter password: *******

el prompt de mysql

En anteriores entregas hemos visto lo b?sico sobre el daemon (mysqld) y mysqladmin, utilidad esta que nos sirve, sobre todo, para crear y borrar las bases de datos. A partir de aqui nos manejaremos sobre todo con mysql, el programa cliente.

En el uso diario de mysql probablemente no utilizaremos mucho la linea de comandos, ya que utilizaremos scripts como phpmyadmin para las tareas administrativas y las propias páginas php (o perl) para explotar nuestra base de datos. Sin embargo, la linea de comandos es la forma por defecto de usar la base de datos, y es imprescindible estar familiarizado con ella.

Para acceder abrimos una sesion DOS y navegamos hacia el directorio bin de la instalación mysql. Una vez alli tecleamos mysql, que es el nombre del programa cliente. Primera cuestión. Si tenemos creado un usuario, hemos de entrar con ese nombre:

C:/mysql/bin>mysql -u root -pmicontraseña
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 2 to server version: 3.23.43

Type ‘help;’ or ‘h’ for help. Type ‘c’ to clear the buffer.
mysql>_

Bien, cosas que hay que ver aqui: ya sabemos que la forma de meter nombre de user y pass es con las opciones -u y -p. Ten en cuenta que si solo pones -p (sin la contraseña detrás) el sistema te pedira que la introduzcas en cuanto intentes ejecutar la orden. Si quieres dar directamente la contraseña, advierte que has de escribirla inmediatamente detrás de la opción -p, esto es, sin espacios. Es preferible usar la opción -p sin contraseña y escribirla despues, por razones de seguridad (si la metes junto a la opción -p estas escribiendo tu passw de modo visible a todos). Fijate que el prompt del sistema ha cambiado a mysql>

Las instrucciones que podemos dar aqui son las que corresponden a la versión mysql del lenguage SQL (lenguaje de consultas estructurado).

Para introducir una orden hemos de teclearla y ordenar la ejecución pulsando punto y coma (;) o ‘g’. La tecla ENTER no es aqui la tecla de ejecución, su unico efecto es el de introducir una línea nueva. Veamos:

mysql> show tables
-> ;
+—————-+
| Tables_in_irv1 |
+—————-+
| tablalib |
+—————-+
1 row in set (0.39 sec)

mysql>

Fijate que hemos tecleado la orden show tables para que mysql nos muestre las tablas que existen en la base de datos en uso (en este caso era irv1). Al pulsar ENTER el sistema simplemente introdujo una linea en blanco y siguio a la espera. Al teclear en la segunda línea el punto y coma, ejecutó la orden.

Como ya he escrito varias veces antes, la linea de comandos es en muchas ocasiones una herramienta mas rápida y poderosa que una interfaz gr?fica. No obstante hay que reconocer que DOS no tiene una linea de comando muy amigable. Recuerda que puedes cargar la utilidad de DOS doskey que te facilitará la vida al permitirte reproducir los ultimos comandos utilizados pulsando la flecha de cursor hacia arriba. Y ten en cuenta que si decides que no quieres ejecutar un comando que está en proceso de introducción, puedes cancelarlo tecleando c :

mysql> SELECT
-> USER
-> c
mysql>

El siguiente cuadro muestra cada uno de los prompts que puedes ver cuando uses mysql:

mysql> Listo para un nuevo comando
-> Esperando una nueva línea
‘> Esperando la siguiente línea, hay una cadena abierta con ‘
“> Esperando la siguiente línea, hay una cadena abierta con ”

Las sentencias multi-línea ( prompt ->) ocurren normalmente cuando nos equivocamos y pulsamos ENTER para ejecutar un comando. En ese caso, completamos la orden en la siguiente linea pulsando ; y listo. Pero tambien es muy util para introducir ordenes largas con mayor comodidad, separando la entrada en varias lineas.

Los prompts ‘> y “> tienen lugar cuando introducimos una orden multilinea, y en la linea o lineas precedentes hay una cadena sin terminar. La cadena comienza con una comilla simple o doble, y al incluir esa comilla en el prompt, mysql nos recuerda que tenemos que cerrarla antes de ejecutar la orden.

Ten en cuenta que mientras no cierres la cadena con su comilla correspondiente, todo lo que teclees (incluido c de cancelar y quit o exit) ser? considerado por mysql como simple texto parte de la cadena, y no lo ejecutará.

El ‘otro’ prompt de mysql

En las distribuciones mysql la forma oficial de conectar con la base de datos es con el programa cliente en linea de comando mysql.

Se trata de una interfaz incómoda, que te obliga a repetir todo el comando si padeces algun error, ya que no tiene ninguna capacidad de edición.

Hay sin embargo una solución no muy conocida, que es la de usar mysqlc.exe, en lugar de mysql.exe.

mysqlc es una utilidad similar al prompt mysql, pero creada con el compilador gcc; antes de usarla comprueba que tienes en tu directorio mysql/bin/ los archivos mysqlc.exe y cygwinb19.dll; sin esta ultima libreria mysqlc no funcionar?.

mysqlc tiene integrada una versión de la libreria linux readline que proporciona algunas capacidades de edición. Sin embargo su uso tiene algunos inconvenientes. No es el interface ‘oficial’ para windows, asi que puede suceder que no está tan actualizado, o incluso que rechace algun comando SQL introducido recientemente. Otro problema es que se trata de una traslación de un programa linux, previsto por tanto para un sistema totalmente diferente, incluso a nivel de teclado. A título de ejemplo, en las combinaciones de teclas mostradas mas abajo, las combinaciones ESC + letra se corresponderan con el equivalente en linux metakey – letra

mysqlc se invoca de forma idéntica al otro prompt (mysql):

C:WINDOWS>cd..
C:>cd mysql
C:mysql>cd bin
C:mysqlbin>mysqlc -unombre_usuario -pcontraseña
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 9 to server version: 4.0.12-max-debug

Type ‘help’ for help.

mysql>

Comandos de edición
teclas de edicion uso
CTRL-A mueve el cursor al principio de la linea
CTRL-E mueve el cursor al final de la linea
CTRL-B mueve el cursor un caracter hacia atrás
CTRL-F mueve el cursor un caracter hacia delante
ESC-B mueve el cursor al comienzo de la palabra actual o anterior
ESC-F mueve el cursor al final de la siguiente palabra
CTRL-D borra el caracter bajo el cursor
CTRL-H borra el caracter antes del cursor
ESC-T Cambia el orden de la palabra bajo el cursor:
SHOW TABLE_ se convertiria en TABLE SHOW_
CTRL-T Cambia el orden de la letra bajo el cursor:
UES se convertiria en USE
ESC-U Convierte a mayusculas desde la posicion del cursor hasta el final de la palabra
ESC-L Convierte a minusculas desde la posicion del cursor hasta el final de la palabra

auto complete uso
TAB Autocompletado de la palabra en curso. Ejemplos:
sel TAB -> selected
in TAB -> insert
up -> update
ESC ? muestra las posibles palabras a completar para elas letras ante el cursor
ESC * inserta todas las posibles palabras dado el texto anterior al cursor.

historial uso
CTRL P inserta la linea anterior en el historial
CTRL N inserta la linea siguiente en el historial
ESC < inicio de la historia
CTRL R busqueda hacia atras en el historial
Esta busqueda completa las palabras que vas tecleando con el comando coincidente en el historial
CTRL S busqueda hacia adelante en el historial

Primeros pasos tras la instalación

Siempre que queramos utilizar MySQL deberemos hacer login como usuarios en el servidor.

MySQL permite asignar a cada usuario privilegios distintos, que determinan las tareas que podrá realizar cada uno: acceder, modificar, consultar datos y realizar tareas administrativas y de control en la base de datos.

El sistema de usuarios MySQL es independiente del sistema de usuarios de la plataforma linux o windows en que está ejecutandose. El usuario root no es el usuario root de linux.

Al instalar MySQL, por defecto se crea el usuario root, sin ninguna contraseña. Este el usuario más importante, ya que posee total control sobre las bases de datos, por lo que lo primero que debemos hacer es proporcionarle una contraseña. De lo contrario, cualquier persona que tenga acceso local o remoto a nuestro ordenador podria acceder y hacer cualquier cosa con los datos, las tablas o las bases.

Asimismo, es aconsejable crear un nuevo usuario para acceder a las bases de datos, al que daremos solo los permisos necesarios para las tareas que debemos hacer con ?l, y dejar a root solo para tareas administrativas y de control. Otra buena idea es la de borrar los usuarios que se crean por defecto.

Los usuarios que MySQL crea por defecto al instalarse tienen distintos permisos segun hayas instalado MySQL en linux o windows.

En Linux

Despues de instalar MySQL en linux, los privilegios de acceso por defecto se establecen ejecutando scripts/mysql_install_db. Este script lanza el servidor mysqld y crea los siguientes usuarios y permisos:

root es un superusuario con todos los permisos. Debe conectarse desde localhost. Carece de contraseña.

Se crea un usuario anonimo que tiene todos los privilegios respecto de las bases de datos cuyos nombres sean test o empiecen por test_. Accede también desde localhost.

En Windows: En la instalación por defecto, todos los usuarios locales (que accedan desde localhost tienen todos los privilegios respecto de todas las bases de datos, sin necesidad de contraseña. Para asegurar la instalación es conveniente eliminar estos usuarios aninimos, y establecer unos nuevos con contraseña, asi como fijar la contraseña del root o superusuario:

C:> C:mysqlbinmysql mysql
mysql> DELETE FROM user WHERE Host=’localhost’ AND User=”;
mysql> QUIT
C:> C:mysqlbinmysqladmin reload
C:> C:mysqlbinmysqladmin -u root password tu_nueva_contraseña

Lo anterior solo establece contraseña para el usuario root que se conecta desde localhost. Si nuestra base de datos va a estar conectada a internet, necesitamos también asignar una contraseña a root cuando se conecte a través de host (nombre de tu máquina, root@host):

C:mysqlbin>mysqladmin u root -h tu_host password tu_password

Las tablas en mysql

En toda instalación MySQL se crea la base de datos mysql, que controla el acceso a todas las bases de datos. Contiene varias tablas, con la información que vamos a ver a continuación.

Con el uso adecuado de estas tablas podemos tener un gran control y variedad de formas de acceso a nuestras bases. Podremos dar a usuarios permisos totales sobre parte de las bases de datos, o permisos parciales para todas las bases de datos, o descender a detalles como permisos sobre tablas o incluso sobre columnas.

Al tiempo de escribirse este artículo, MySQL crea seis tablas en la base de datos mysql: user, db, host, tables_priv, columns_priv, func. Cada tabla tiene una serie de campos (los primeros) que determinan su alcance o finalidad (permiten especificar valores para usuarios, bases de datos, puntos de acceso), mientras que el resto de campos sirve para conceder o denegar permisos para acciones concretas (Y/N)
En primer lugar, la tabla user, donde se especifican permisos globales.
Host localhost localhost % %
User root irv root phpuser
Password 5a1a 5aff 5ffa 4975
Select_priv Y Y Y N
Insert_priv Y Y Y N
Update_priv Y Y Y N
Delete_priv Y Y Y N
Create_priv Y Y Y N
Drop_priv Y Y Y N
Reload_priv Y Y Y N
Shutdown_priv Y Y Y N
Process_priv Y Y Y N
File_priv Y Y Y N
Grant_priv Y N Y N
References_priv Y Y Y N
Index_priv Y Y Y N
Alter_priv Y Y Y N

Vamos a explicar su contenido. Para empezar, el signo % en MySQL es un comodin, asi que si para un usuario especificamos, en el campo host el signo %, queremos decir que podr? acceder desde cualquier host.

En el ejemplo de la tabla superior puedes ver que los usuarios root y phpuser pueden acceder desde cualquier host.

Las tres primeras columnas, host, user, password sirven para almacenar el nombre de usuario, host desde el que puede acceder y contraseña, encriptada. Las restantes columnas señalan los privilegios para cada usuario, y pueden tener un valor Y/N, segun tengan o no dicho privilegio.

Los permisos que puedes reconocer aqui se refieren a operaciones Select, Insert, Update, Delete, Create, Drop, Reload, Shutdown, Process, File, Grant, References, Index, Alter

En la tabla db podemos especificar permisos para bases de datos individuales. Las tres primeras columnas sirven para especificar el nombre de usuario a quien se reconoce permisos, el host desde el que puede acceder, y la base de datos a la que se van a aplicar los permisos. Los siguientes campos se refieren, como en el caso anterior, a los privilegios que se conceden/deniegan (valores Y/N). Los permisos indicados en esta tabla solo se aplican a la base de datos identificada en cada columna:
Host % % %
Db sample_db php_category php_directory
User phpuser phpuser phpuser
Select_priv Y Y Y
Insert_priv Y Y Y
Update_priv Y Y Y
Delete_priv Y Y Y
Create_priv Y Y Y
Drop_priv Y Y Y
Grant_priv N N N
References_priv Y Y Y
Index_priv Y Y Y
Alter_priv Y Y Y

la tabla host controla permisos globales para máquinas con acceso a nuestras bases de datos. Contiene los mismos campos que la tabla db.

tables_priv es similar a la tabla db aunque su rango es inferior, ya que permite especificar permisos para tablas concretas dentro de bases de datos. En esta tabla, el campo Table_name es el nombre de la tabla de la base de datos.Grantor contiene el nombre de la persona que ha concedido los permisos y Table_priv los permisos para la tabla.

columns_priv permite especificar permisos para ciertas columnas de tablas determinadas. En el campo Column_priv controlamos el grado de acceso del usuario a esa columna.

Las tablas estan relacionadas entre si, y por ejemplo un usuario autorizado con caracter global no podra acceder desde una concreta máquina que tenga prohibido o restringido el acceso en la tabla host, de la misma forma que desde una máquina autorizada en host no podra acceder un usuario que expresamente no esta autorizado en user. Un usuario sin permisos globales puede ver modalizados sus privilegios para una base concreta en la tabla db.

Como los permisos de la tabla user tienen alcance global, la regla es, respecto de los permisos mas importantes, denegarlos con car?cter general y autorizarlos con car?cter particular. Por ejemplo, denegando Delete_priv a un usuario en la tabla user y reconociendoselo en la tabla db para una base concreta, conseguimos que solo pueda borrar en esa base de datos.

Si ves con detalle el contenido de cada una de las tablas te daras cuenta de que todos los permisos de administraci?n del servidor, es decir, shutdown, reload, process, etc… se especifican ?nicamente en la tabla user mientras que los permisos de acceso a las bases de datos (insert, delete, alter …) pueden especificarse, segun su rango y alcance, en el resto de las tablas.
Jerarquia de control

En cada acceso que se produce al servidor MySQL, en primer lugar se compara la entrada con la tabla user para ver si existe coincidencia con el nombre de usuario, host y contraseña. Si es as?, se autoriza el login

Si una vez realizada la conexión el usuario realiza una consulta sql, MySQL compara primero los permisos del usuario en la tabla user, y si carece de ellos, consulta a la tabla bd para comprobar si hay permisos especificos para ese usuario, host y base de datos. Si tampoco ahi estan los permisos necesarios, consulta por ?ltimo las tablas Tables_priv y Columns_priv. Si tampoco los encuentra, genera un mensaje de error.

Como ves, se realizan dos filtros independientes, uno para admitir la conexión, y otro para cada consulta

Para afinar los permisos la t?cnica, como se ha dicho anteriormente, es denegarlos en las tablas globales y concederlos en las tablas particulares.
privilegios de usuarios

Una buena pr?ctica es utilizar el superusuario root solo cuando verdaderamente sea necesario, y funcionar habitualmente con otro usuario con los permisos adecuados para la tarea a desarrollar. Puedes sacar ventaja del hecho de que puedes asignar permisos distintos para cada nueva base de datos, distinguir segun el usuario acceda de forma local o remota, etc.

Podemos asignar permisos actuando directamente sobre las tablas de la base de datos mysql pero no es la forma mas cómoda ni mas segura. Lo indicado es, una vez hecho login como root, asignar permisos con el comando GRANT:

mysql> grant select, insert on *.* to tester@’%’ identified by ‘blah’;
Query OK, 0 rows affected (0.17 sec)

Con este comando creamos un usuario llamado tester que tiene el derecho de seleccionar e insertar datos en todas las bases de datos y tablas (*.*), con la contraseña blah.

Como ya sabes el signo % despues del nombre de usuario significa que tester podra hacer login desde cualquier maquina. Si en su lugar hubieramos escrito tester@localhost solo podria conectar en modo local; y si solo queremos dar permiso a tester desde una máquina remota, deberiamos haber escrito el nombre de dicha máquina: tester@mimaquina.midominio.org

El comando GRANT no solo concede permisos, sino que sirve para crear nuevos usuarios. Basta con conceder permisos a un usuario para que si este no exist?a, sea creado en la tabla user.

mysql> GRANT
select, insert, update, create, alter, delete, drop
ON
directorio.*
TO
tester@localhost
IDENTIFIED BY
‘blah’;

En este otro ejemplo damos permisos a tester si accede por localhost para seleccionar, insertar datos, actualizar, crear, modificar y borrar tablas en todas las tablas de la base de datos directorio (directorio.*)

mysql> GRANT all
ON directorio.alfa
To tester@localhost
IDENTIFIED BY ‘Blah’;

concede todos (all) los permisos disponibles para la tabla alfa dentro de la base de datos directorio a tester

mysql> GRANT USAGE
ON *.*
To tester@localhost
IDENTIFIED BY ‘Blah’;

permite la conexión a tester a cualquier base de datos y tablas, pero no concede ningun otro privilegio.

Finalmente si queremos retirar permisos, usamos REVOKE, de forma similar a GRANT:

mysql> REVOKE ALL ON *.* FROM tester@’5′;

Glosario

Host es el nombre de la máquina del usuario.

User el nombre del usuario que va a acceder a MySQL, al que concedemos o negamos permisos.

Password la contraseña del usuario .

Select_priv Permiso para realizar consultas SELECT.

Insert_priv Permiso para a?adir datos con INSERT.

Update_priv Permiso para editar y actualizar datos con UPDATE.

Delete_priv Permiso para borrar datos con DELETE.

Create_priv Permiso para crear nuevas tablas o bases de datos con CREATE.

Drop_priv Permiso para borrar tablas o bases de datos con DROP.

Reload_priv Permiso para actualizar las tablas de permisos con FLUSH.

Shutdown_priv Permiso para apagar el servidor.

Process_priv Permiso para consultar los procesos del servidor con MYSQLADMIN PROCESSLIST o SHOW PROCESSLIST (o cancelar esos procesos).

File_priv Permiso para que el usuario lea o escriba en ficheros residentes en el server.

Grant_priv Permiso para que el usuario pueda conceder permisos a otros usuarios con GRANT.

References_priv.

Index_priv Permiso para indexar tablas (crear o borrar índices).

Alter_priv Permiso para cambiar la estructura de una tabla.

Db La base de datos a la cual son aplicables los privilegios. Un servidor MySQL puede albergar varias bases de datos.

creación de bases de datos y tablas

Para la creación de nuevas bases de datos basta sencillamente usar la orden CREATE DATABASE nombre_db que se limita a habilitar un nuevo directorio para los datos de la nueva base. Se puede completar la orden con la clausula CREATE DATABASE IF NOT EXISTS db_nombre en cuyo caso la nueva base de datos solo se intentar? crear si no existe otra con el mismo nombre. Si no usamos IF NOT EXISTS y el nuevo nombre est? duplicado, MySQL nos avisar? del error y no ejecutar? acci?n ninguna.

La creación de tablas tiene muchas mas opciones, ya que aqui no nos limitamos a reservar un espacio, sino que debemos crear la propia estructura de la tabla

La sintaxis general es:

CREATE TABLE nombre_tbl
(nombre_columna1 TIPO_COLUMNA(nn),
nombre columna2 TIPO_COLUMNA(nn),
nombre_columna3 TIPO_COLUMNA(nn),

);

Es decir, para cada columna debemos especificar su nombre, su tipo (char, varchar, int, etc) y su longitud.

Un buen diseño de la tabla determinara el éxito o fracaso de nuestra base de datos. Existen abundantes estudios acerca de la normalizaci?n de las bases de datos, cuya complejidad excede de las posibilidades de esta p?gina. A un nivel mucho mas b?sico se puede indicar que la sola elecci?n del tipo de tabla adecuado, y del tipo (y longitud) de datos de cada columna tendr? su reflejo en la rapidez y eficacia del sistema.

La tabla se crear? en la base de datos que esta en uso en ese momento. también puedes crear específicamente la tabla en otra base de datos del mismo servidor, usando la sintaxis CREATE TABLE bd_nombre.tabla_nombre

Algunas reglas a recordar son las siguientes:

* longitud: es opcional SALVO para los campos tipo DECIMAL NUMERIC CHAR y VARCHAR.
Por ejemplo, CREATE TABLE mi_tabla (id_field INT(4));
Como sabemos, las columnas tipo INT pueden albergar desde -2147463846 a 2147483647 (unsigned). Al fijar el rango en 4, lo limitamos desde -999 a 9999.
NOTA: MySQL guardará correctamente el dato fuera del rango especificado, siempre que no esta, además, fuera del rango para ese tipo de columna.
Para datatypes no numéricos, el rango determina el número fijo de carácteres almacenados en cada caso (CHAR) o el número máximo permitido (p.e. VARCHAR).
* decimal: máximo número de decimales para aquellos datatypes que admiten decimales. Si el número a almacenar tiene mas, sera redondeado:
FLOAT (5,2)

=> 2.14 se almacena como 2.14
=> 32.147 se almacena como 32.15 (5 caracteres en total)
=> 232.14 se almacena como 232.1

Es decir, un número máximo de 5 caracteres, un número máximo (si caben en el total) de 2 decimales.
* El atributo BINARY puede usarse con CHAR y VARCHAR, con el único efecto de que en caso de búsqueda distinguira mayusculas y minúsculas.
* El atributo ZEROFILL solo puede emplearse con datos tipo numérico. El atributo UNSIGNED solo puede emplearse con datos del tipo numérico entero.
* Cada columna (independientemente de su tipo) puede ser NULL o NOT NULL. Si no especificas nada, se asume que la columna es NULL
* Las columnas (salvo que sean AUTO_INCREMENT) siempre tienen un valor por defecto. Si la columna es tipo NULL el valor por defecto es justamente ese, NULL. Si es NOT NULL, y la columna num?rica, el valor por defecto es 0. Si la columna no es tipo num?rica el valor por defecto ser? “” (cadena vacia). Puede establecerse un valor por defecto propio con DEFAULT.
* Solo puede existir una columna AUTO_INCREMENT por tabla, que debe ser del tipo entero, y además NOT_NULL
* La columna AUTO_INCREMENT siempre ser? considerada como índice primario (PRIMARY KEY).
* Indices: en Mysql los indices se llaman (indistintamente) KEY o INDEX. En principio se puede indexar cualquier columna, sea cual sea su tipo, aunque algunas son mas idóneas que otras.
* Un INDEX puede ser UNIQUE en cuyo caso esa columna no podr? tener datos repetidos.
* PRIMARY KEY es un index sobre una columna NOT NULL y UNIQUE (que no puede estar vacía ni tener valores repetidos); es decir que la columna no puede valores vacios o duplicados.
* Aunque solo puede haber un PRIMARY KEY por tabla, puedes tener tantos indices como quieras (o debas) y puedes crearlos NOT NULL y UNIQUE
* Solo puede haber una columna AUTO_INCREMENT, solo puede existir un indice PRIMARY KEY (aunque puedes formar un PRIMARY KEY sobre dos o mas columnas.
* Es posible indicar la longitud del indice. En ese caso solo se indexaran los primeros caracteres de cada campo hasta la longitud indicada. La indicación de longitud es opcional para los campos CHAR y VARCHAR, y obligatorio para los campos de las familias TEXT y BLOB.
* Las columnas tipo CHAR VARCHAR y TEXT pueden ser indexadas además como FULLTEXT.

Que es un índice?

Un índice (o KEY, o INDEX) es un grupo de datos que MySQL asocia con una o varias columnas de la tabla. En este grupo de datos aparece la relación entre el contenido y el número de fila donde esta ubicado.

Los índices -como los indices de los libros- sirven para agilizar las consultas a las tablas, evitando que mysql tenga que revisar todos los datos disponibles para devolver el resultado.

Podemos crear el índice a la vez que creamos la tabla, usando la palabra INDEX seguida del nombre del índice a crear y columnas a indexar (que pueden ser varias):
INDEX nombre_indice (columna_indexada, columna_indexada2…)

La sintaxis es ligeramente distinta segun la clase de índice:

PRIMARY KEY (nombre_columna_1 [,nombre_columna2...])
UNIQUE INDEX nombre_indice (columna_indexada1 [,columna_indexada2 ...])
INDEX nombre_index (columna_indexada1 [,columna_indexada2...])

Podemos también añadirlos a una tabla después de creada:
ALTER TABLE nombre_tabla ADD INDEX nombre_indice (columna_indexada);

Si queremos eliminar un índice: ALTER TABLE tabla_nombre DROP INDEX nombre_indice
para que sirven ?

LOs index permiten mayor rapidez en la ejecución de las consultas a la base de datos tipo SELECT … WHERE

La regla básica es pues crear tus índices sobre aquellas columnas que vayas a usar con una cláusula WHERE, y no crearlos con aquellas columnas que vayan a ser objeto de un SELECT: SELECT texto from tabla_libros WHERE autor = Vazquez; En este ejemplo, la de autor es una columna buena candidata a un indice; la de texto, no.

Otra regla b?sica es que son mejores candidatas a indexar aquellas columnas que presentan muchos valores distintos, mientras que no son buenas candidatas las que tienen muchos valores id?nticos, como por ejemplo sexo (masculino y femenino) porque cada consulta implicar? siempre recorrer practicamente la mitad del indice.
La regla de la izquierda

Si necesitamos un select del tipo SELECT … WHERE columna_1 = X AND columna_2 = Y y ya tenemos un INDEX con la columna_1, podemos crear un segundo indice con la columna 2, o mejor todav?a, crear un ?nico indice combinado con las columnas 1 y 2. Estos son los índices multicolumna, o compuestos.

No obstante si tienes indices multicolumna y los utilizas en las clausulas WHERE, debes incluir siempre de izquierda a derecha las columnas indexadas; o el indice NO se usar?:

Supongamos un INDEX usuario (id, name, adress), y una cl?usula SELECT … WHERE NAME = x. Este Select no aprovechar? el índice. Tampoco lo har?a un SELECT … WHERE ID =X AND ADRESS = Y. Cualquier consulta que incluya una columna parte del index sin incluir además las columnas a su izquierda, no usar? el indice.

Por tanto en nuestro ejemplo solo sacarian provecho del indice las consultas SELECT … WHERE ID = x, o WHERE ID = X AND NAME = y o WHERE ID = x AND NAME = y AND ADRESS = Z

Cuando un índice contiene mas de una columna, cada columna es leida por el orden que ocupa de izquierda a derecha, y a efectos pr?cticos, cada columna (por ese orden) es como si constituyera su propio índice. Esto significa que en el ejemplo anterior, no har?a falta crear otro INDEX ID (id) ya que podr?amos usar nuestro INDEX USUARIO simplemente con la cl?usula SELECT … WHERE ID = X;

Puedes ver si tu llamada sql usa o no los índices correctos anteponiendo a select la orden explain:
EXPLAIN SELECT * FROM mitable WHERE ….
Y para ser sinceros, usando explain para comprobar el uso de indices en distintos selects con indices multicolumna, he obtenido resultados poco consistentes con la ‘regla de la izquierda’ ya que en muchos casos parece que se usaban indices que te?ricamente no debian estar disponibles … posiblemente un caso de mala configuracion en mi tabla-test
Tipos de indice

En algunas bases de datos existen diferencias entre KEY e INDEX. No asi en MySQL donde son sinónimos.

Un índice que sí es especial es el llamado PRIMARY KEY. Se trata de un índice diseñado para consultas especialmente rápidas. Todos sus campos deben ser UNICOS y no admite NULL

Un indice UNIQUE es aquel que no permite almacenar dos valores iguales.

Los indices FULL TEXT permiten realizar búsquedas de palabras. Puedes crear indices FULLTEXT sobre columnas tipo CHAR, VARCHAR o TEXT.

Una vez creado puedes hacer búsquedas del tipo:
SELECT * FROM nombre_tabla WHERE MATCH(nombre_indice_fulltext) AGAINST(‘palabra_a_buscar’);

Algunas limitaciones de los indices fulltext: solo busca por palabras completas. indice no encontrará indices. No se indexan las palabras de menos de cuatro letras. No se indexan columnas que contengan menos de tres filas, ni palabras que aparezcan en la mitad o mas de las filas. Las palabras separadas por guiones se cuentan como dos palabras.

Los indices ordinarios no tienen restricciones en cuanto a la existencia de valores idénticos o nulos. Una posibilidad interesante, si pensamos crear un índice sobre columnas CHAR y VARCHAR es la de limitar el campo a indexar. Por ejemplo, cada entrada en la columna puede ser de hasta 40 caracteres y nosotros indexar unicamente los primeros 10 de cada una. Para crear estos índices basta con indicar entre par?ntesis el numero de caracteres a indexar despues del nombre de la columna:
ALTER TABLE libros ADD INDEX idx_autor(nombre(10), apellidos(10));
Desventajas de los indices

Los índices se actualizan cada vez que se modifica la columna o columnas que utiliza. Por ello no es aconsejable usar como indices columnas en las que ser?n frecuentes operaciones de escritura (INSERT, UPDATE, DELETE).

Tampoco tendrá sentido crear indices sobre columnas cuando cualquier select sobre ellos va a devolver una gran cantidad de resultados; por ejemplo una columna booleana que admita los valores Y/N. En fin, tampoco es necesario usar indices en tablas demasiado peque?as, ya que en estos casos no hay ganancia de rapidez frente a una consulta normal.

Finalmente, los índices ocupan espacio. A veces, incluso mas que la tabla de datos.

ha ocurrido un desastre !

Calma … MySQL ofrece diversas herramientas para solucionar problemas. Posiblemente puedas arreglar el fallo.

NOTA: esta página está en construcción. Es recomendable que antes de iniciar nada leas cuidadosamente el manual
He perdido la contraseña del root

Si has perdido la contraseña que usas como root, es decir, para administrar MySQL, puedes establecer otra, usando el mismo ordenador donde f?sicamente est? instalado el daemon:

1. Apaga el servidor
2. Inicia el servidor con la opción –skip-grant-tables.
3. Conecta con el servidor usando mysql -u root mysql. Con eso no te pedira la password y accederas directamante a la base de datos MySQL que es la que guarda la informacion de usuarios.
4. cambia la contraseña usando este comando SQL:

mysql> UPDATE user SET Password=PASSWORD(‘nuevacontraseña’) WHERE User=’root’;

5. Ejecuta un nuevo comando SQL:

mysql> FLUSH PRIVILEGES;

6. Apaga y reinicia el servidor y ya podras usar la nueva password

El servidor termina de repente

Lo primero que has de ver es si efectivamente se ha caido el servidor o si es el programa cliente el que falla. mysql>mysqladmin -u root -p version servir? para ver si el servidor esta en funcionamiento (un simple ctrl-alt-supr tambien te sirve para ver si mysqld esta en la lista de procesos activos).

Si se ha caido el server, prueba a ver si encuentras pistas en el archivo tu_host.err, que encontrarás en la carpeta c:mysqldata. En este log de errores se guardan los arranques y cierres del server, y otra información util.

Tambien puedes crear un log general iniciando mysqld con la opcion –log[=archivo]. Por ejemplo:
C:mysqlbin>mysqld –log=log_general.log crear? en la carpeta data el archivo log_general.log. Este es un ejemplo de su contenido:

C:MYSQLBINMYSQLD.EXE, Version: 4.0.12-max-debug-log, started with:
Tcp port: 3306 Unix socket: MySQL
Time Id Command Argument
030504 16:07:21 1 Connect Acceso negado para usuario:
‘ODBC@127.0.0.1′ (Usando clave: SI)
030504 16:07:40 2 Connect root@127.0.0.1 on
030504 16:07:47 2 Query show databases
030504 16:07:52 3 Connect root@127.0.0.1 on
3 Query show status
2 Quit

El servidor debe siempre cerrarse de forma adecuada, bien con winmysqladmin desde la barra del reloj de tu ordenador, o bien desde la ventana msdos con el comando: c:mysqlbin>mysqladmin -u root -p shutdown

Cerrar el servidor de otra forma puede corromper los datos de las tablas y ser fuente de problemas.
Creando copias de tus datos con mysqldump

Con mysqldump puedes obtener copias de la estructura y datos de las tablas. Con la copia de la estructura podras recrear tus tablas (vacias de datos) mientras que con la copia completa de estructura y datos obtendr?s una copia espejo de tu base de datos.

Este es tambien el m?todo logico si lo que quieres es pasar tu base de datos de un servidor a otro, por ejemplo de tu servidor local de pruebas al servidor en la red.
Veamos algunos ejemplos:

* Copia de estructura y datos:
c:mysqlbin>mysqldump -u root -p –opt nombre_de_mi_db_a_copiar > nombre_copia.sql
* Copia solo datos:
c:mysqlbin>mysqldump -u root -p –no-create-info nombre_de_mi_db_a_copiar > nombre_copia.sql
* Copia solo estructura:
c:mysqlbin>mysqldump -u root -p –no-data nombre_de_mi_db_a_copiar > nombre_copia.sql

Como no hemos indicado ruta ninguna, los archivos resultantes apareceran en bin.

Para cargar el respaldo de nuevo en el server, simplemente: el proceso a la inversa:

C:mysqlbin>mysql -u root -pcontraseña base_a_cargar < copia_respaldo.sql.

Problemas de conexión con MySQL 4.1

MySQL ha cambiado el sistema de encriptado de contraseñas a partir de las series 4.1
Es posible que en una nueva instalación de MySQL te encuentres el siguiente escenario:

1. El servidor esta correctamente instalado. Puedes arrancar y apagar el server sin problema
2. Puedes utilizar sin problemas todas las aplicaciones de mysql.com: por ejemplo la linea de comandos (mysql), Mysql administrator o Mysql Query Browser.
3. Sin embargo, cuando intentas conectar con MySQL con un script php correctamente configurado te sale el siguiente error en el navegador:

Client does not support authentication protocol requested by server;
consider upgrading MySQL client

Si bien no he encontrado documentado este problema suficientemente, este mensaje de error significa que el cliente (php en este caso) no entiende el nuevo sistema de encriptado.

La mejor solución sera adaptar php al nuevo encriptado … pero no se como hacerlo.
La segunda mejor solución, es sencillamente crear un nuevo usuario, con los privilegios de administrador, pero con el ‘viejo’ sistema de contraseña.
Creando el nuevo usuario

mysql> GRANT ALL PRIVILEGES ON *.* TO ‘pepe’@'localhost’
-> IDENTIFIED BY ‘contraseña’ WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO ‘pepe’@'%’
-> IDENTIFIED BY ‘contraseña’ WITH GRANT OPTION;

shell> mysql

Donde creamos dos usuarios ‘pepe’ (usa el nombre que quieras) el primero solo podr? conectarse desde localhost y el segundo desde cualquier ordenador, ambos protegidos por contraseña.
Cambiando la contraseña

Solo resta cambiar la contraseña al viejo sistema para pepe:

mysql> SET PASSWORD FOR
-> ‘pepe’@'localhost’ = OLD_PASSWORD(‘contraseña’);

mysql> SET PASSWORD FOR
-> ‘pepe’@'%’ = OLD_PASSWORD(‘contraseña’);

la contraseña de pepe estará ahora encriptada en el sistema anterior, y podrá ser utilizada por tus scripts. Recuerda cambiar los datos en el config file de cada script, usando el nuevo usuario y contraseña.

Comparte!:
  • Print this article!
  • Facebook
  • Mixx
  • Google Bookmarks
  • BarraPunto
  • Bitacoras.com
  • Blogosphere News
  • E-mail this story to a friend!
  • LinkedIn
  • Meneame
  • Turn this article into a PDF!
  • Technorati

Comments are closed.