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 accades 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.mitabla para especificar sólo cierta 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 contantes. 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
| # 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 |
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?