Servidor de base de datos MySQL

MySQL (mysql.com, paquetes mysql-server php5-mysql) es una base de datos con arquitectura cliente-servidor, por lo que necesita:

  • un servidor (mysqld) que escuche en el puerto 3306 TCP (por defecto) que atienda las consultas.
  • un cliente (como mysql), que permita conectar con el servidor.

Equivalencias en Windows: MS-SQL Server.

MySQL puede manejarse de varias maneras:

  1. desde consola, utilizando el cliente MySQL mysql.
  2. mediante algún interfaz web como phpMyAdmin (necesita Apache y PHP). Esta es la opción más recomendable, manejar la base de datos vía web usando páginas web dinámicas.
  3. mediante algún frontal gráfico como Knoda o OpenOffice.org.

Recursos

Configuración de MySQL

  • El script de inicio que inicia el demonio de MySQL es /etc/init.d/mysql
  • Los archivos de configuración están en el directorio /etc/mysql
  • Las bases de datos están en /var/lib/mysql/<base_de_datos>
  • Los usuarios de MySQL son independientes de los usuarios del sistema: el usuario root de MySQL no es el usuario root de Linux. Con los usuarios de MySQL haremos lo siguiente:
    • mysql: crearemos este usuario con todos los permisos: será el que utilicemos en nuestros scripts y para acceder a las bases de datos.
    • root: existe por defecto y sin contraseña. Lo borraremos.

      Atención

      ¡Antes de borrar el usuario root de MySQL crear el usuario mysql!

    • debian-syst-main: existe por defecto, con contraseña, lo utiliza MySQL en los scripst de inicio y parada. Ni tocarlo, es un usuario de sistema

Manejar MySQL desde consola

Para conectar con el servidor MySQL usaremos el comando mysql, cuya sintaxis es:

$ mysql -h <host> -u <usuario> datababse=<base_de_datos> -p
  • -h: host donde está el servidor (por defecto localhost).
  • -u: usuario.
  • -p: password.
  • -P: puerto.
  • database=: nombre de la base de datos a abrir.

Por ejemplo (el prompt de MySQL nos indica está listo para recibir comandos):

$ mysql -u root
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 6 to server version: 5.0.18-Debian_9-log
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
mysql>

Como vemos, hemos entrado como root sin contraseña. Usaremos el comando SHOW para ver las bases de datos existentes:

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
+--------------------+
3 rows in set (1.32 sec)

La base de datos mysql contiene la información de los privilegios de los usuarios de MySQL.

Para poner contraseña a root haremos:

mysql> SET PASSWORD FOR root@localhost=PASSWORD('root_clave');

Nos desconectamos ejecutando:

mysql> quit
Bye

Intentamos entrar como antes pero no nos deja:

$ mysql -u root
ERROR 1045: Access denied for user: 'root@localhost' (Using password: NO)

Ahora necesitamos contraseña:

$ mysql -u root -p
Enter password: ******
mysql>

Veamos un pequeño ejemplo:

  • crear la base de datos animales:
    mysql> CREATE DATABASE animales;
    Query OK, 1 row affected (1.02 sec)
  • consultar las bases de datos existentes:
    mysql> SHOW DATABASES;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | animales           |
    | mysql              |
    +--------------------+
    4 rows in set (1.02 sec)
  • abrir animales:
    mysql> USE animales;
    Database changed
  • crear la tabla mascotas:
    mysql> CREATE TABLE mascotas(nombre VARCHAR(20), especie VARCHAR(20));
    Query OK, 0 rows affected (0.89 sec)
  • consultar las tablas de animales:
    mysql> SHOW TABLES;
    +---------------------+
    | Tables_in_animales  |
    +---------------------+
    | mascotas            |
    +---------------------+
    1 row in set (0.00 sec)
  • consultar la estructura de mascotas:
    mysql> DESCRIBE mascotas;
    +-----------+-------------+------+-----+---------+-------+
    | Field     | Type        | Null | Key | Default | Extra |
    +-----------+-------------+------+-----+---------+-------+
    | nombre    | varchar(20) | YES  |     | NULL    |       |
    | especie   | varchar(20) | YES  |     | NULL    |       |
    +-----------+-------------+------+-----+---------+-------+
    2 rows in set (0.14 sec)
  • para terminar, nos desconectamos:
    mysql> quit

Ejemplo para comprobar PHP y MySQL

Una vez creada la base de datos en MySQL, vamos a comprobar que podemos acceder a ella mediante el navegador utilizando el servidor Apache y PHP. Para ello vamos a crear una página web (/var/www/conectar.php) que nos diga si se consigue una conexión con nuestra base de datos en MySQL, que contendrá lo siguiente:

<html>
  <body>
    <?php
    function Conectarse() {
      if (!($link=mysql_connect("localhost","root","root_clave"))) {
        echo "Error conectando a la base de datos.";
        exit();
      }
      if (!mysql_select_db("animales",$link)) {
        echo "Error seleccionando la base de datos.";
        exit();
      }
      echo "Conexion con la base de datos conseguida.<br>";
      return $link;
    }
    $link=Conectarse();
    mysql_close($link);
    echo "Conexion con la base de datos cerrada.<br>Fin.";
    ?>
  </body>
</html>

Tecleamos en el navegador la dirección http://127.0.0.1/conectar.php y, si todo está correcto, obtendremos:

PHP con MySQL

Manejar MySQL mediante phpMyAdmin

phpMyAdmin (phpmyadmin.net, paquete phpmyadmin) es un programa escrito en PHP que nos proporciona una interfaz web para manejar MySQL (necesita Apache y PHP). Permite crear bases de datos, tablas, borrar o modificar datos, añadir registros, hacer copias de seguridad, etc.

Equivalencias en Windows: MS-SQL Server Management.

  • Iniciar phpMyAdmin

    Iniciaremos phpMyAdmin tecleando en el navegador la dirección http://localhost/phpmyadmin y logueándonos como root (contraseña root_clave). Apache servirá /usr/share/phpmyadmin mediante el enlace /var/www/phpmyadmin o mediante una directiva Alias.

    phpMyAdmin

  • Crear un nuevo usuario para MySQL

    Lo primero que haremos será crear el usuario mysql con contraseña mi_clave, que será el que utilicemos para acceder a las bases de datos y en nuestros scripts. Para ello pulsaremos Privilegios / Agregar nuevo usuario, le daremos todos los permisos marcando todas las casillas que aparecen en Privilegios globales y le daremos acceso desde Cualquier servidor si pensamos acceder en remoto (de lo contrario seleccionaremos Local).

    Nota

    Siempre que se hagan cambios en los usuarios o en los permisos, debemos volver a cargar los privilegios desde Reload privileges para que los cambios sean efectivos.

  • Configurar phpMyAdmin

    Los archivos de configuración de phpMyAdmin están en el directorio /etc/phpmyadmin. Editaremos el archivo /etc/phpmyadmin/config.inc.php y descomentaremos las siguientes líneas:

    $cfg['Servers'][$i]['auth_type'] = 'cookie';    // Authentication method
    $cfg['Servers'][$i]['user']      = 'mysql';     // MySQL user
    $cfg['Servers'][$i]['password']  = 'mi_clave';  // MySQL password

    Para que la sesión no caduque a los 1800 segundos de inactividad (30 minutos, valor por defecto), cosa francamente molesta, añadiremos la siguiente línea:

    $cfg['LoginCookieValidity'] = 7200; // Validity of cookie login (seconds)
  • Configurar los scripts para el nuevo usuario

    En nuestros scripts PHP que trabajen con MySQL usaremos el usuario y contraseña que hemos creado, de tal forma que para conectar con MySQL haremos:

    mysql_connect("127.0.0.1","mysql","mi_clave");
  • Configurar Apache para phpMyAdmin

    Editaremos el archivo de configuración de Apache /etc/apache/httpd.conf y añadiremos una directiva Directory en la que permitimos que la configuración del directorio /usr/share/phpmyadmin se defina en el archivo /usr/share/phpmyadmin/.htaccess:

    <Directory /usr/share/phpmyadmin/>
        AllowOverride All
    </Directory>

Exportar e importar bases de datos MySQL grandes

Habitualmente para administrar una base de datos MySQL usaremos phpMyAdmin (phpmyadmin.net) pero en ocasiones, si nuestra base de datos es grande, nos encontraremos con problemas a la hora de exportar e importar datos por las limitaciones que PHP impone al tamaño máximo de los ficheros importados o la duración del tiempo de ejecución de los scripts.

En estos casos recurriremos a la consola utilizando dos comandos, mysqldump para volcar la base de datos en un fichero de texto y mysql para importar los datos. Lo haremos en dos pasos:

  1. Primero volcaremos la base de datos en un fichero de texto usando el comando mysqldump, siendo los parámetros el usuario de MySQL (USER), el servidor (SERVER) y el nombre de la base de datos a exportar (NAME). Si nuestra base de datos tiene gran cantidad de tablas usaremos la opción –skip-lock-tables para evitar el error Can’t open file when using LOCK TABLES:
    $ mysqldump --skip-lock-tables -u USER -p -h SERVER NAME > NAME.sql
    Enter password:
  2. Para importar los datos usaremos mysql, teniendo los parámetros el mismo significado:
    $ mysql -u USER -p -h SERVER NAME < NAME.sql
    Enter password:

Este método manual nos será de gran utilidad cuando tengamos que migrar de servidor grandes bases de datos, ya que nos permite evitar las limitaciones de PHP.

Artículos en la categoría "Servidores (software)"

  1. Monitorizar servidores con Nagios
  2. Monitorizar routers SNMP con MRTG
  3. Administración de máquinas Linux con Webmin
  4. Shell remoto con Telnet
  5. Servidor DNS Bind
  6. Servidor de IPs dinámicas DHCP
  7. Servidor de hora NTP
  8. Servidor proxy Squid
  9. Servidor de correo electrónico
  10. Servidor de terminales LTSP
  11. Servidor web Apache
  12. Soporte para PHP en Apache
  13. Soporte para CGI en Apache
  14. Analizador de logs de Apache
  15. Servidor de base de datos MySQL
  16. Servidor web Lighttpd
  17. Whois: Quién es el propietario de un dominio
  18. Servidor de archivos FTP
  19. Compartir archivos en Linux: NFS
  20. Compartir archivos en Windows: Samba
  21. Control de versiones: CVS y Subversion
  22. Servidor de streaming por Internet
  23. Servidor de streaming en red local

26 Comments:

  1. Edgar, Ruben, Fernando, Vanessa y Kokal

    Gracias… muchas gracias.. fue de extrema ayuda

  2. exelente aporte, pero cuando me meto a la consola, me meto al mysql, pero de ahi intento crear la BD
    mysql> create database miBASED
    >(eso, no paso nada)
    >(aprete enter, y nada)
    >(intento salir)
    >quit
    >(y nada)
    >exit (tampoco, ni salir , ni chao, ni adios, nada)
    si sabes por que me falta, el servidor apache funciona y php tambien esta instalado (php5)
    eso vale

  3. pablo, los comandos terminan con ‘punto y coma’ (;)…

  4. por que cuando creo un usuario usando la sentencia
    CREATE USER usuario IDENTIFIED BY ‘contraseña’
    me sale el error:
    consulta SQL:
    CREATE USER root IDENTIFIED BY ‘dragon’
    MySQL ha dicho:
    #1064 – Algo está quivocado en su sintax cerca ‘USER root IDENTIFIED BY ‘dragon” en la linea 1

    agradesco su respuesta a mi correo o msn, [email protected]

  5. Gracias por el aporte, me fue de gran ayuda.

  6. Muy buen explicado, gracias y sigue asi

  7. Felicidades por la aportación de este manual, muchas gracias por la ayuda

  8. Muy bueno justo lo que buscaba, uso mysql en win pero en linux estaba medio perdido
    Gracias

  9. Marco Castañeda

    Hola:

    Me fije que cuando uno trabaja con este asunto de mysql hay que escribir todo en mayúscula y terminado en punto y comas, sino simplemente salta una linea y mustra
    >
    >
    >
    >
    asi que todo en mayúscula excepto claro el nombre de tu base de datos, los campos, las tablas, etc.. los cuales no son obligatorias en mayuscula o miniscula.

    Los tipos de datos tambien hay que escribirlos con mayuscula sino tampoco funcionan (Esta es mi experiencia personal usando mysql-server y Ubuntu 8.10 asique no se si en otros casos podría funcionar así o no.

    Espero sirva a alguien. Saludos desde Vaparaiso, Chile.

    Olvidaba que para los que no puedan salir y solo les salga
    >
    >
    >
    hay que escribir q

    es decir:
    >q y saldrán sin problemas

  10. ramon izquierdo

    hola saludos esta muy bien todo pero lo que no entendi es como asignar la clave principal directamente desde consola

  11. disculpen alguien me puede ayudar se los supliko de manera mas atenta porfavor ..me encargarn como trabajo final una base de datos en mysql y ke jale en internet.. debo de hacer una agenda..segun yoo asi empeze

    mysql^^show database
    mysql^^create database agenda_2009
    mysql^^show table
    mysql^^show table usuario(
    mysql^^nombre VARCHAR(20), domicilio VARCHAR(20)colonia VARCHAR(20)
    BUENO DE AHI NO SE KE ONDA DIGANME SI VOY BIEN O KE PEX PORFA,, KE PASO SIGUE PARA HACER LA BASE DE DATOS

  12. Yosemite, te sale error pues no puedes crear un usuario root, debido a que este usuario es el usuario por defecto cuando instalas el MySql.

  13. Por que cuando instale phpmyadmin, y trato de iniciarlo tecleando en el navegador localhost/phpmyadmin lo que hace es como descargarme un archivo? Ayudenme con eso

  14. AL FIN ENCONTRÉ ALGO QUE SIRVE!!!!!

    Muchisimas gracias!!!!……me has quitado 10 toneladas de encima!!!! :D

  15. Buenos dias, será que alguno de ustedes me ayudan a crear un script o no se una base de datos, donde:
    * puedan cargar las notas de un alumno y el formulario debe tener lo sigueinte.

    -Nombre
    -Apellido
    -C.I (Cedula de Identidad)
    -Semestre
    -Carrera
    -Notas del Primer Parcial
    -Notas del Segundo Parcial
    -Notas del Final
    -Reparacion

    * Y que cuando ellos cuando vallan a consultarlas mediante un formulario de consulta puedan hacerlo mediante su cedula. Muchas Gracias y se los agradezco con el alma, o pues si tambien me hacen un tutorial de paso a paso y disculpen la molestias y de ante mano que Dios se los pague. mi correo es [email protected]

  16. Hola:

    Esta respuesta es a la pregunta de Snyflex

    <>

    Creo recordar que mi me sucede cuando intento arrancar phpmyadmin sin tener iniciado el servidor web (Apache en mi caso).

  17. Perfecto Me resulto todo bien

  18. bua esta bueno pero necesito una lap para probar ………..

  19. en donde lo ejecuto? en phpmyadmin? no solicita en ninguna parte una contraseña de usuario??

  20. Se ejecuta desde la consola

  21. para los que no sepan donde ejecutar ese comando, vean este video…. http://www.youtube.com/watch?v=e2SBqi3yw2Y

  22. Hola compañeros,

    Cuando le pongo localhost/phpmyadmin lo que me sale es un listdo del directorio donde esta el phpmyadmin ?¿?¿?¿?

    ¿que hice mal??
    Llevo días buscando la solución pero no soy capaz de encontrarla.

    Ayudénme please!!! Gracias de antemano :)

  23. Probaste si tenes el servidor apache con php funcionando?
    Si no intenta darl’e permiso al apache a la carpeta usando el chown -R `usuario` `carpeta`
    usuario generalmente es www-data

  24. pero si pones skip-lock-tables… no estarías dejando de backupear las tablas que esten bloqueadas en ese momento?

  25. La opción –skip-lock-tables realiza un backup completo de todas las tablas, pero sin bloquearlas.

    Con esta opción se evita el error Cant open file when using LOCK TABLES, pero se corre el riesgo de que si las tablas no están bloqueadas los datos pueden cambiar en medio del backup, lo que podría provocar que el backup tuviera datos inconsistentes.

    Existen otras opciones para evitar ese error, como detener la aplicación mientras se hace un backup, etc. La solución más adecuada dependerá de cada caso particular.