May
29
2009

Uso de la linea de comando para MySQL – Tutorial

mysql

Esto es un tutorial introductorio (bastante bueno me permito decir). Si quieres una excelente lista de consulta rápida de comandos http://www.pantz.org/software/mysql/mysqlcommands.html

MySQL dispone de una interface/shell llamada mysql. Con ella podrás interactuar en forma rápida con tus bases de datos, especialmente si accedes a un servidor remoto, como es el caso de servidores web.

Tiene capacidades readline lo que fundamentalmente te permite recorrer el historial de entradas/comandos usando las teclas de cursor (arriba y abajo) y autocompletación usando [TAB].

En adelante suponemos:

  • fanquito: nombre de usuario
  • mibd: nombre de una base de datos
  • mipassword: tu password de acceso a MySQL (Esta password no es necesariamente la misma de la de tu cuenta de usuario)
  • Las mayúsculas no son obligatorias aunque son muy usadas para mayor claridad como ya verás.

    Acceso a la linea de comando

    Simplemente escribe mysql.

    1
    2
    3
    4
    5
    6
    7
    8
    $ mysql [ENTER]
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 22
    Server version: 5.0.75-log Source distribution

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

    mysql>

    Asi es, tu prompt es ahora mysql>. Y como muy amigablemente te recibe es con un: Tipée help si necesita ayuda.

    Super valiosa ayuda para usar la linea de comando

    Simplemente escribe help.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    mysql> help

    For information about MySQL products and services, visit:
       http://www.mysql.com/
    For developer information, including the MySQL Reference Manual, visit:
       http://dev.mysql.com/
    To buy MySQL Network Support, training, or other products, visit:
       https://shop.mysql.com/

    List of all MySQL commands:
    Note that all text commands must be first on line and end with ';'
    ?         (\?) Synonym for 'help'.
    clear     (\c) Clear command.
    connect   (\r) Reconnect to the server. Optional arguments are db/host.
    ... (varios comandos) ...

    For server side help, type 'help contents'

    mysql>

    De aquí aprendemos 2 cosas muy importantes:

  • Para ejecutar un comando debes terminar su enunciado con un punto y coma (;) y [ENTER]. Puedes escribir en varias lineas. El shell te responderá en cada nueva linea con el símbolo (->) que significa que aún espera el punto y coma.
  • Y lejos, lo mejor: Te dice que si de verdad quieres ayuda tipées help contents.

    Simplemente escribe help contents.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    # ayuda en general
    mysql> help contents
    You asked for help about help category: "Contents"
    For more information, type 'help <item>', where <item> is one of the
    following categories:
       Account Management
       Administration
       Data Definition
       Data Manipulation
       Data Types
       Functions
       Functions and Modifiers for Use with GROUP BY
       Geographic Features
       Language Structure
       Storage Engines
       Stored Routines
       Table Maintenance
       Transactions
       Triggers

    # ayuda sobre comandos de adminstración
    mysql> help administration
    You asked for help about help category: "Administration"
    For more information, type 'help <item>', where <item> is one of the
    following topics:
       DESCRIBE
       FLUSH QUERY CACHE
       HELP COMMAND
       HELP STATEMENT

    # ayuda sobre comando DESCRIBE
    mysql> help describe
    Name: 'DESCRIBE'
    Description:
    Syntax:
    {DESCRIBE | DESC} tbl_name [col_name | wild]

    DESCRIBE provides information about the columns in a table. It is a
    shortcut for SHOW COLUMNS FROM. As of MySQL 5.0.1, these statements
    also display information for views. (See [HELP SHOW COLUMNS].)

    URL: http://dev.mysql.com/doc/refman/5.0/en/describe.html

    mysql>

    Creación de una cuenta de usuario para MySQL

    MySQL tiene un subconjunto propio de usuarios y estos deben ser creados explícitamente.

    1
    2
    3
    4
    # sólo en MySQL 5.0.2+
    # para versiones anteriores usa GRANT
    CREATE USER fanquito IDENTIFIED BY 'mipassword';
    Query OK, 0 rows affected (0.01 sec)

    Esto crea una cuenta identificada como fanquito (aqui cuenta y usuario son sinónimos) en localhost, que es el host donde te encuentras ahora mismo, y es lo que la mayor parte de las veces necesitarás. Este nuevo usuario no tiene ningún privilegio, estos se asignan con GRANT. Luego este comando “CREATE USER” puedes servirte para crear una lista de usuarios de los cuales aún no sabes que tareas van a realizar. La forma más realista de crear nuevos usuarios es con GRANT.

    Creación de una cuenta de usuario para MySQL con el comando GRANT

    GRANT permite crear usuarios y asignarle privilegios al mismo tiempo.

    A todo esto los privilegios determinan que operaciones puedes realizar en que bases de datos (y sus tablas). Por ejemplo:

  • SELECT: leer
  • INSERT: escribir
  • DELETE: borrar
  • UPDATE: actualizar

    Veamos:

    1
    2
    3
    4
    5
    # crear el usuario "fanquito2" con password "mipassword"
    # que pueda leer y reescribir registros en todas las tablas de midb
    mysql> GRANT SELECT, UPDATE, DELETE ON midb.* TO fanquito2 IDENTIFIED
    -> by 'mipassword';
    Query OK, 0 rows affected (0.01 sec)

    Si el usuario ya existe sólo asigna/reasigna los nuevos privilegios y en este caso no es necesario agregar “IDENTIFIED by ‘mipassword’”.
    Mirando más de cerca el enunciado. “ON midb.*” determina donde será efectivos los privilegios.

    Usa:

  • *.* para todas las bases de datos.
  • midb..* para todas las tablas de una bases de datos.
  • midb.mitabla para especificar sólo una tabla.

    Si un usuario ha metido la pata, como por ejemplo, borrando todos los registros de una tabla de acceso colectivo (shú) le puedes dar una buena patada así:

    1
    2
    3
    4
    # revocar todos los privilegios en toda la base de datos
    # para el usuario fanquito2
    mysql> REVOKE * ON rac.* FROM fanquito2;
    Query OK, 0 rows affected (0.01 sec)

    Si sólo quieres quitarle la posibilidad de seguir cambiando el estado de la base de datos:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # averiguar que privilegios tiene el manos de hacha
    mysql> SHOW GRANTS FOR fanquito2;
    +----------------------------------------------------------------------+
    | Grants for fanquito2@%                                               |
    +----------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'fanquito2'@'%' IDENTIFIED BY PASSWORD '*CEE8' |
    | GRANT SELECT, UPDATE, DELETE ON `midb`.* TO 'fanquito2'@'%'          |
    +----------------------------------------------------------------------+
    3 rows in set (0.00 sec)

    # revocar privilegios de escritura
    # para el usuario fanquito2
    mysql> REVOKE UPDATE, DELETE ON rac.* FROM fanquito2;
    Query OK, 0 rows affected (0.00 sec)

    Muy bien. Con eso debiera dejar de dar problemas el susodicho. Ahora si que si se trataba de la tabla con los datos de lo me debes:

    1
    2
    3
    # borrar cuenta/usuario fanquito2
    mysql> DROP USER fanquito2;
    Query OK, 0 rows affected (0.01 sec)

    Datos comunes en scripts PHP referentes a bases de datos

    El script necesita saber tus datos de usuario en la base de datos para poder acceder en tu nombre. Generalmente se definen en una manera parecida a esta:

    1
    2
    3
    4
    5
    6
    7
    8
    define('DB_TYPE', 'mysql');
    define('DB_NAME', 'midb');
    # en el mismo servidor
    define('DB_HOST', 'localhost');
    # en la base de datos sudb un servidor remoto
    define('DB_HOST', 'sudb.servidorremoto.com');
    define('DB_USER', 'fanquito');
    define('DB_PASS', 'mipassword');

    La palabra reservada “define” es propia de PHP y asigna constantes. Estas a diferencia de las variables son superglobales o sea pueden ser accedidas desde cualquier función/clase (y no pueden ser redefinidas posteriormente).

    Importación y exportación de tablas y bases de datos

    Para empezar (que ingenuo fuí), una ventaja insuperable y que yo comúnmente aprovecho, por sobre una interface web como phpmyadmin, es la velocidad con que puedes importar y exportar tablas y bases de datos enteras.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # importar archivo sql
    # no importa la extension sql. sólo debe ser un archivo de texto
    # con instrucciones entendibles por MySQL
    mysql -uroot -pmipassword mibd < tubd.sql

    # exportar base de datos entera a archivo sql
    # sabiamente agregamos .sql pero no es necesario
    mysqldump -u root -pmipassword mibd > midb.sql

    # exportar sólo una tabla
    mysqldump -uroot -p mibd mitabla > mitabla.sql

    # exportar varias tablas
    mysqldump -uroot -p mibd mitabla mitabla2 mitabla 3 > mis3tabla.sql

    Fíjate que en el ultimo comando no escribimos la password, sólo “-p”. Esto es muy bueno si quieres mantener oculta tu password, tanto de ojos sobre tu hombro (como cuando aparecen sólo asteriscos en una página web) como de los logs del servidor.

    1
    2
    3
    # usando la opción -p podrás ingresar tu password en una manera segura
    $ mysqldump -uroot -p mibd mitabla> mitabla.sql
    Enter password:

    Personalmente creo que en un ambiente distendido de trabajo como por ejemplo, el manejo normal de tu blog, es lícito escribir tu password en la linea de comando para posteriormente usar history y ejecutar comandos rápidamente. Depende de tí.

    Comandos muy usados para consultar tus tablas

    Vuelvo a decir que esta es la manera ideal de trabajar si quieres terminar antes de las 5 de la tarde para alcanzar a tomarte una cerveza antes de que llegue la noche.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    # mostrar todas las bases de datos
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | mibd               |
    +--------------------+
    4 rows in set (0.00 sec)

    # trabajar con una en particular
    mysql> use mibd;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A

    Database changed

    # mostrar sus tablas
    mysql> show tables;
    +---------------------------------------------+
    | Tables_in_rac                               |
    +---------------------------------------------+
    | data_control                        |
    | data_record1                        |
    | data_record2                        |
    | data_source                         |
    | data_status_autotrader_control      |
    | data_status_ebay_control            |
    | data_status_exchangeandmart_control |
    | data_status_fish4_control           |
    +---------------------------------------------+
    8 rows in set (0.00 sec)

    # mostrar estructura de una tabla en particular
    mysql> describe data_control;
    +--------------+-------------+------+-----+---------+----------------+
    | Field        | Type        | Null | Key | Default | Extra          |
    +--------------+-------------+------+-----+---------+----------------+
    | id           | int(11)     | NO   | PRI | NULL    | auto_increment |
    | shedule_on   | tinyint(1)  | NO   |     | 0       |                |
    | admin        | varchar(20) | NO   |     |         |                |
    | password     | varchar(32) | NO   |     |         |                |
    | data         | tinyint(1)  | NO   |     | 1       |                |
    +--------------+-------------+------+-----+---------+----------------+
    5 rows in set (0.02 sec)

    # en una tabla de autos (170000 aprox.) con varias
    # características (columnas)
    # quiero saber cuantos hay de cada uno (columna marca)
    mysql> select distinct(marca),count(id) as c from data_record1 group by
    -> marca order by c desc;
    +---------------+-------+
    | marca         | c     |
    +---------------+-------+
    | VAUXHALL      | 32514 |
    | RENAULT       | 30945 |
    | PEUGEOT       | 29008 |
    | MERCEDES-BENZ | 22985 |
    | CITROEN       | 21015 |
    | TOYOTA        | 17921 |
    | FIAT          | 16676 |
    ... etc ...
    +---------------+-------+
    100 rows in set (4.39 sec)

    # borrar todos los que no indican año
    mysql> delete from data_record1 where year='';
    Query OK, 0 rows affected (0.11 sec)

    Definir password de root

    Aclaremos que este root se refiere al usuario root del conjunto de usuarios de MySQL y no del sistema operativo. Son distintos. Cuando se instala MySQL viene el usuario root predefinido y sin password.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # definir una password para root
    # primero seleccionamos la bases de datos "mysql"
    # esta es parte de MySQL y siempre existe
    mysql> USE mysql;

    mysql> UPDATE user SET password=PASSWORD("mipassword") WHERE user="root";

    # recargar cache interno de MySQL
    mysql> FLUSH PRIVILEGES;

    Recuperar password de root

    Sin comentarios.
    Para esto debes ser root en el sistema operativo de tal manera que puedas reiniciar el demonio mysqld.

    Te daré los pasos calcados. Haz lo mismo que yo nena.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    mysql> cabeza de pollo de nuevo olvidaste tu password >:(

    # asumir privilegios de root
    su[ENTER]
    password:

    # parar mysld
    $ service stop mysqld
    Stopping the mysqld service

    # iniciar mysqld sin cargar tabla de privilegios
    $ mysqld_safe --skip-grant-tables &
    Starting mysqld daemon with databases from /var/lib/mysql

    $ mysql -uroot
    ERROR 2002 (HY000): Can't connect to local MySQL server through
    socket '
    /var/run/mysql/mysql.sock' (2)

    # si, no es na'
    así
    # dijo clarito: Starting mysqld daemon with databases from /var/lib/mysql

    $ cd /var/lib/mysql/
    $ mysql -uroot
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 1
    Server version: 5.0.75-log Source distribution

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

    # reasignar password para root
    mysql> UPDATE user SET password=PASSWORD("mipassword") WHERE user="root";
    Query OK, 3 rows affected (0.01 sec)
    Rows matched: 3  Changed: 3  Warnings: 0

    # abandonar la linea de comando
    mysql> exit

    # reiniciar mysqld
    [17:47:40 root@zenwalk]$ service restart mysqld
    Restarting the mysqld service

    Muy bien, me he alargado bastante en esto que sólo iba a ser una entrentención mañanera antes de trabajar de veras. Así que ponte con unos comentarios tú también, vale, colega?

    Posts relacionados:

    1. Uso de su y sudo para simular al usuario root

  • Escrito por NomikOS en Linux, MySQL-DB, May 29 - 2009 @ 21:40 hrs.
    Hoy 10 lectores. Te agradecería que me dejaras un comentario. Gracias por tu visita. d [^_0]

    3 comentarios

    • sinh:

      Muy interesante, me sirvio de mucho para exportar una bd de Windows 2000 Server a Centos y a Fedora.

      Tenankius

      Firefox 3.0.14 Firefox 3.0.14 GNU/Linux GNU/Linux
      Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.0.14) Gecko/2009091106 CentOS/3.0.14-1.el5.centos Firefox/3.0.14
      Comment | October 15, 2009 @ 19:22
    • Antonio:

      Muy bueno, te felicito.

      Debian IceWeasel 3.0.6 Debian IceWeasel 3.0.6 Debian GNU/Linux Debian GNU/Linux
      Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.0.14) Gecko/2009091008 Iceweasel/3.0.6 (Debian-3.0.6-3)
      Comment | November 10, 2009 @ 00:49
    • Juan Perez:

      Un baño de humildad no te caeria nada mal :)

      Firefox 3.0.6 Firefox 3.0.6 Windows XP Windows XP
      Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6 (.NET CLR 3.5.30729)
      Comment | January 12, 2010 @ 01:27

    RSS feed para comentarios en este post

    TrackBack URL

    Deja un comentario

    XHTML: Etiquetas permitidas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

    Powered by WordPress. Theme: TheBuckmaker. Modifications by NomikOS