Guía de iniciación MySQL
1.
Empezando con MySQL
Contexto
MySQL es un servidor de base de datos popular que tiene distintas
aplicaciones. SQL son las iniciales de Lenguaje de Consulta
Estructurado (en inglés, (S)tructured (Q)uery (L)anguage), que es el
lenguaje que utiliza MySQL para comunicarse con otros programas. Sobre
ello, MySQL tiene sus propias funciones SQL extendidas que le añaden
funcionalidad. En este documento veremos como realizar una instalación
inicial, configurar la base de datos y las tablas, y como crear nuevos
usuarios. Empecemos con la instalación.
Instalación de MySQL
Primero asegúrate de tener instalado MySQL en tu sistema. En caso de
que necesites alguna funcionalidad específica de MySQL, por favor
revisa si tienes los parámetros USE adecuados ya que estos ayudarán a
ajustar la instalación a tus necesidades.
Listado de Código 1.1: Instalando MySQL |
# emerge --pretend --verbose mysql
# emerge mysql
|
Una vez completada la instalación, verás la siguiente nota:
Listado de Código 1.2: Mensaje de información MySQL |
You might want to run:
"emerge --config =dev-db/mysql-[version]"
if this is a new install.
|
Dado que esta es una nueva instalación, ejecuta el
comando. Necesitarás presionar ENTER cuando se te solicite
mientras se configura la base de datos MySQL. La configuración define
la base de datos MySQL principal que contiene información
administrativa como las bases de datos, tablas, usuarios, permisos y
demás. La configuración recomienda que modifiques tu contraseña de
super usuario lo antes posible. Definitivamente haremos eso, ya que de
otra manera alguien más podría tener la oportunidad de hacerlo y
hackear nuestra configuración por defecto del servidor MySQL.
Listado de Código 1.3: Configuración MySQL |
# emerge --config =dev-db/mysql-[version]
* MySQL DATADIR is /var/lib/mysql
* Press ENTER to create the mysql database and set proper
* permissions on it, or Control-C to abort now...
Preparing db table
Preparing host table
Preparing user table
Preparing func table
Preparing tables_priv table
Preparing columns_priv table
Installing all prepared tables
To start mysqld at boot time you have to copy support-files/mysql.server
to the right place for your system
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, issue the following commands to start the server
and change the applicable passwords:
/etc/init.d/mysql start
/usr/bin/mysqladmin -u root -h pegasos password 'new-password'
/usr/bin/mysqladmin -u root password 'new-password'
Depending on your configuration, a -p option may be needed
in the last command. See the manual for more details.
* For security reasons you should set your MySQL root
* password as soon as possible.
|
Importante:
A partir de mysql-4.0.24-r2, las contraseñas son introducidas en la fase
de configuración haciendo que introducir la contraseña de super usuario
sea más seguro.
|
El guión de configuración ya ha impreso los comandos que necesitamos
para definir nuestra contraseña de super usuario, así que ahora
debemos ejecutarlos.
Listado de Código 1.4: Definiendo la contraseña de administrador (super usuario) MySQL |
# /etc/init.d/mysql start * Re-caching dependency info (mtimes
differ)... * Starting mysqld (/etc/mysql/my.cnf) ... [ ok ]
# /usr/bin/mysqladmin -u root -h localhost password 'new-password'
|
Ahora puedes probar si la contraseña de administrador ha sido
correctamente configurada al intentar ingresar al servidor MySQL:
Listado de Código 1.5: Ingresando al servidor MySQL utilizando mysql |
$ mysql -u root -h localhost -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4 to server version: 4.0.25
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
|
La opción -u define qué usuario está tratando de conectarse. La
opción -h define a que máquina estás tratando de
conectarte. Normalmente utilizarás localhost a menos que estés
configurando un servidor remoto. Finalmente, -p indica al
cliente mysql que vas a utilizar una contraseña para ingresar al
sistema. Fíjate en el cursor mysql>. Aquí es donde
escribirás tus comandos. Dado que hemos ingresado como super usuario,
podemos empezar a configurar nuestra base de datos.
2.
Configurando la base de datos
Creando una base de datos
Hemos ingresado al sistema y tenemos el cursor mysql en
pantalla. Primero, démosle una mirada a las bases de datos que tenemos
actualmente. Para hacer eso, utilizamos el comando SHOW
DATABASES.
Listado de Código 2.1: Mostrando las bases de datos MySQL |
mysql> SHOW DATABASES;
+----------+
| Database |
+----------+
| mysql |
| test |
+----------+
2 rows in set (0.09 sec)
|
Importante:
Por favor recuerda que los comando MySQL deben terminar con un punto y
coma -- ;
|
Aunque ya existe una base de datos de prueba (test), vamos a crear la
nuestra. Las bases de son creadas utilizando el comando CREATE
DATABASE. Crearemos una llamada "gentoo".
Listado de Código 2.2: Creando la base de datos gentoo |
mysql> CREATE DATABASE gentoo;
Query OK, 1 row affected (0.08 sec)
|
La salida nos permite ver que el comando ha sido ejecutado sin ningún
error. En este caso, 1 fila ha sido modificada. Esto es una referencia
a la base de datos principal de mysql, que contiene una lista de todas
las bases de datos. No necesitarás preocuparte mucho acerca de los
detalles técnicos. El último número se refiere a qué tan rápido se ha
ejecutado la consulta. Podemos verificar que nuestra base de datos ha
sido creada utilizando nuevamente el comando SHOW DATABASES.
Listado de Código 2.3: Verificando si se creó la base de datos |
mysql> SHOW DATABASES;
+----------+
| Database |
+----------+
| gentoo |
| mysql |
| test |
+----------+
3 rows in set (0.00 sec)
|
Como podemos ver, nuestra base de datos ha sido creada. Para poder
trabajar con ella creando nuevas tablas, necesitamos seleccionarla
como nuestra base de datos actual. Esto lo podemos conseguir
utilizando el comando USE. El comando USE recibe como
argumento el nombre de la base de datos que quiere convertir en
actual. Otra opción es definirla en la linea de comandos justo luego
de la opción -D. Continuemos y cambiémonos a la base de datos
gentoo.
Listado de Código 2.4: Cambiando a nuestra base de datos |
mysql> USE gentoo;
Database changed
|
Y la base de datos actual es nuestra, previamente creada, base de
datos gentoo. Ahora que la estamos utilizando, podemos empezar a crear
algunas tablas y poner información en ellas.
3.
Trabajando con tablas en MySQL
Creando una tabla
En la estructura de MySQL, hay bases de datos, tablas, registros y
campos. Las bases de datos reunen tablas, las tablas agrupan
registros, estos a su vez almacenan campos, que son los encargados de
conservar la información real. Esta estructura permite a los usuarios
seleccionar cómo quieren acceder a su información. Hasta el momento
hemos trabajado con bases de datos, ahora enfoquémonos en las
tablas. Antes de nada, las tablas pueden ser mostradas de la misma
manera que las bases de datos utilizando el comando SHOW
TABLES. En este preciso momento no existen tablas en nuestra base
de datos gentoo, como nos lo mostrará la salida del comando:
Listado de Código 3.1: Base de datos gentoo vacia |
mysql> SHOW TABLES;
Empty set (0.00 sec)
|
Esto significa que tenemos que crear algunas tablas. Para poder hacer
esto, utilizamos el comando CREATE TABLE. Sin embargo, este
comando es un poco distinto del simple CREATE DATABASE. Este
comando recibe una lista de parámetros. La forma es la siguiente:
Listado de Código 3.2: Sintaxis de CREATE TABLE |
CREATE TABLE [nombre_de_la_tabla] ([nombre_del_campo] [tipo_del_campo]([tamaño]));
|
nombre_de_la_tabla es el nombre de la tabla que deseas
crear. En este caso crearemos una tabla
llamada developers. Esta tabla contendrá el nombre del
desarrollador, correo electrónico y trabajo. nombre_del_campo
contendrá el nombre del campo. En este caso tenemos 3 requerimientos:
nombre, correo electrónico y trabajo. El tipo_del_campo
especifica que clase de información vas a almacenar ahí. Los distintos
formatos disponibles puedes encontrarlos en
la Página de
los tipos MySQL para las columnas. En nuestro caso, utilizaremos
el tipo de dato VARCHAR para todos nuestros
campos. VARCHAR es uno de los tipos de datos más simples que
existen para trabajar con cadenas. tamaño es cuanto de
información tendrá almacenada cada campo. Utilizaremos 128, lo cual
significa que el campo puede tener información VARCHAR de 128
bytes de longitud. Puedes pensar por ahora tranquilamente que son 128
caracteres, sin embargo hay una explicación un poco más técnica que el
anterior sitio te dará. Ahora que sabemos como vamos a crear la tabla,
hagámoslo.
Listado de Código 3.3: Creando nuestra tabla |
mysql> CREATE TABLE developers ( name VARCHAR(128), email
VARCHAR(128), job VARCHAR(128));
Query OK, 0 rows affected(0.11 sec)
|
Parece que nuestra tabla ha sido creada sin problemas. Revisémoslo con
el comando SHOW TABLES:
Listado de Código 3.4: Verificando nuestra tabla |
mysql> SHOW TABLES;
+------------------+
| Tables_in_gentoo |
+------------------+
| developers |
+------------------+
1 row in set (0.00 sec)
|
Sí, esa es nuestra tabla. Sin embargo, parece no tener ninguna
información sobre los tipos de campos que hemos configurado. Para
ello, utilizamos el comando DESCRIBE (o si prefieres comandos
más cortos DESC), que toma como argumento el nombre de la
tabla. Veamos que información nos da de la tabla developers.
Listado de Código 3.5: Describiendo nuestra tabla |
mysql> DESCRIBE developers;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| name | varchar(128) | YES | | NULL | |
| email | varchar(128) | YES | | NULL | |
| job | varchar(128) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
|
Esta salida muestra los distintos campos y sus tipos. También muestra
algunos atributos extras que están más allá del ámbito de esta
guía. Siéntete libre de consultar
el Manual de Referencia
MySQL para mayor información. Ahora tenemos una tabla con la
cual trabajar. Sigamos adelante y probémosla.
Poblando nuestra base de datos MySQL
Se puebla una tabla (o se añade información) a través del
comando INSERT. Al igual que el comando CREATE TABLE,
posee un formato específico:
Listado de Código 3.6: Sintaxis de INSERT |
INSERT INTO tabla (col1, col2, ...) VALUES('valor1', 'valor2', ...);
|
Este comando se utiliza para ingresar un registro dentro de la
tabla. tabla contiene el nombre de la tabla MySQL a la cual le
queremos ingresar la información. El nombre de la tabla puede ser
seguido por la lista de columnas a las cuales se les insertarán los
datos y VALUES() contiene los valores que deseas insertar en la
tabla. Puedes omitir la lista de columnas si insertas un valor en cada
una y si los pones en el mismo orden en el cual las columnas han sido
definidas. En este caso, queremos insertar información dentro de la
tabla developers. Insertemos algunos registros de ejemplo:
Listado de Código 3.7: Insertando información en nuestra tabla desarrolladores |
mysql> INSERT INTO developers VALUES('Joe Smith', 'joesmith@gentoo.org', 'toolchain');
Query OK, 1 row affected (0.06 sec)
mysql> INSERT INTO developers (job, name) VALUES('outsourced', 'Jane Doe');
Query OK, 1 row affected (0.01 sec)
|
De acuerdo con el resultado, parece que el registro ha sido insertado
correctamente. ¿Qué sucede si deseamos ingresar más de un solo
registro?. Ahí es donde el comando LOAD DATA entra en
acción. Este carga los registros desde un archivo separado. Probémoslo
con un archivo en nuestro directorio raíz que contenga
registros. Llamaremos a este archivo records.txt. Veamos
un ejemplo:
Listado de Código 3.8: ~/records.txt |
John Doe johndoe@gentoo.org portage
Chris White chriswhite@gentoo.org documentation
Sam Smith samsmith@gentoo.org amd64
|
Importante:
Debes estar seguro de la información que maneja el archivo. ¡Es muy
peligroso utilizar LOAD DATA cuando no se está seguro del
contenido del mismo!
|
Ahora, el comando LOAD DATA tiene una ligeramente larga
definición, pero utilizaremos su forma más simple.
Listado de Código 3.9: Sintaxis de LOAD DATA |
LOAD DATA LOCAL INFILE '/ruta/al/archivo' INTO TABLE tabla;
|
/ruta/al/archivo es el directorio y nombre del archivo
que se utilizará. tabla es el nombre de nuestra tabla. En este caso el
archivo es
~/records.txt y la tabla es developers.
Listado de Código 3.10: Cargando nuestros datos |
mysql> LOAD DATA LOCAL INFILE '~/records.txt' INTO TABLE developers;
Query OK, 3 rows affected (0.00 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
|
Importante:
Si ocurre algún comportamiento extraño, asegúrate que tus campos están
separado por tabulaciones. Si pegaste la información desde otra
fuente, puede que se hayan convertido tus tabs en espacios.
|
Eso funcionó bien. Sin embargo, esto simplemente inserta registros, no
te da ningún tipo de control sobre MySQL. Muchas aplicaciones web
utilizan guiones sql para poder configurar rápida y fácilmente
MySQL. Si quieres utilizar un guión sql, tendrás que ejecutar mysql en
modo por lotes, o cargando un archivo fuente. Aquí hay un ejemplo de
mysql en modo por lotes:
Listado de Código 3.11: MySQL en modo por lotes |
$ mysql -u root -h localhost -p < sqlfile
|
Al igual que en LOAD DATA debes estar seguro de lo que dice el
archivo sqlfile. Si fallas en asegurarte de ello tu
base de datos puede ser comprometida Otra forma en la que puedes
lograrlo es utilizando el comando source. Este comando
ejecutará los comandos mysql desde un archivo sql mientras se está en
el modo interactivo. Aquí tenemos un ejemplo:
Listado de Código 3.12: Utilizando source para cargar un archivo sql |
mysql> source sqlfile;
|
Si ves alguna aplicación web que te pide ejecutar un archivo sql, los
dos comandos anteriores pueden ser utilizados para completar esta
tarea. Tenemos nuestra tabla configurada, entonces ¿cómo vemos
nuestros campos? Esto lo hacemos buscando en nuestra tabla utilizando
consultas.
Explorando las tablas MySQL mediante consultas
Las consultas son una de las más importantes características de
cualquier base de datos SQL. Nos ayudan a convertir los datos de
nuestras tablas en información útil. La mayoría de las consultas se
hacen a través del comando SELECT. El comando SELECT es
muy complejo, pero nosotros vamos a trabajar en este documento con
tres formas principales.
Listado de Código 3.13: Formas de SELECT |
SELECT * FROM tabla;
SELECT * FROM tabla WHERE campo=valor;
SELECT campo1,campo2,campo3 FROM tabla [WHERE campo=valor];
|
Démosle una rápida mirada a la primera forma. Es relativamente simple
y te da una mirada general de tu tabla. Bueno, sigamos adelante y
revisemos que datos tenemos hasta ahora.
Listado de Código 3.14: Contenido de nuestra tabla |
mysql> SELECT * FROM developers;
+-------------+-----------------------+----------------+
| name | email | job |
+-------------+-----------------------+----------------+
| Joe Smith | joesmith@gentoo.org | toolchain |
| John Doe | johndoe@gentoo.org | portage |
| Chris White | chriswhite@gentoo.org | documentation |
| Sam Smith | samsmith@gentoo.org | amd64 |
| Jane Doe | NULL | Outsourced job |
+-------------+-----------------------+----------------+
5 rows in set (0.00 sec)
|
Podemos ver los datos que ingresamos mediante INSERT y los que
insertamos utilizando LOAD DATA. Ahora, digamos que solo
queremos ver el registro de Chris White. Podemos hacerlo con la
segunda forma tal y como se muestra a continuación.
Listado de Código 3.15: Seleccionado un registro específico usando SELECT |
mysql> SELECT * FROM developers WHERE name = 'Chris White';
+-------------+-----------------------+---------------+
| name | email | job |
+-------------+-----------------------+---------------+
| Chris White | chriswhite@gentoo.org | documentation |
+-------------+-----------------------+---------------+
1 row in set (0.08 sec)
|
Como esperábamos, la entrada específica que estábamos buscando ha sido
seleccionada. Ahora, digamos que solo queremos saber el trabajo y
dirección de correo electrónico de la persona pero no su nombre. Eso
lo conseguimos con la tercera forma de SELECT como vemos a
continuación.
Listado de Código 3.16: Seleccionar un registro y campos específicos utilizando SELECT |
mysql> SELECT email,job FROM developers WHERE name = 'Chris White';
+-----------------------+---------------+
| email | job |
+-----------------------+---------------+
| chriswhite@gentoo.org | documentation |
+-----------------------+---------------+
1 row in set (0.04 sec)
|
Este método de selección es mucho más fácil de manejar, especialmente
con cantidades mayores de información, como veremos más
adelante. Ahora, estando conectado a la base de datos como el super
usuario, tenemos permisos ilimitados para hacer cualquier cosa en la
base de datos MySQL. En un ambiente de servidor, un usuario con tales
privilegios puede ser muy problemático. Para poder controlar quién
puede hacer qué en la base de datos, definimos privilegios.
4.
Privilegios en MySQL
Definiendo privilegios con GRANT
Los privilegios son qué tipo de acceso tienen los usuarios a las bases
de datos, tablas y esencialmente a todo. En este preciso momento en la
base de datos gentoo, la cuenta de super usuario MySQL es la única que
puede acceder a ella, dados sus permisos. Ahora, creemos dos usuarios
bastante genéricos, guest y admin, quienes accederán a la base de
datos gentoo y trabajarán con la información en ella. La cuenta guest
será restringida. Todo lo que será capaz de hacer es realizar
consultas para obtener información de la base de datos, y eso es
todo. admin tendrá el mismo control que el super usuario pero solo
para la base de datos gentoo (no la base de datos mysql
principal). Antes de que empecemos, veamos una forma bastante
simplificada del comando GRANT.
Listado de Código 4.1: Sintaxis de GRANT |
GRANT [privilegios] ON database.* TO '[user]'@'[host]' IDENTIFIED BY '[password]';
|
Nota:
GRANT es considerada la manera de crear usuarios. Versiones
posteriores de MySQL, sin embargo, contienen una
función CREATE_USER, sin embargo aún es preferible
utilizar GRANT.
|
Primero tenemos los privilegios que deseamos asignar. Con lo que hemos
aprendido hasta ahora, aquí están algunos de los privilegios que
puedes asignar:
-
ALL - Da el privilegio de control total para la base de datos
-
CREATE - Permite a los usuarios crear tablas
-
SELECT - Permite a los usuarios realizar consultas
-
INSERT - Permite a los usuarios insertar datos en una
tabla
-
SHOW DATABASES - Permite a los usuarios listar las bases de
datos
-
USAGE - El usuario no tiene privilegios
-
GRANT OPTION - Permite a los usuarios dar privilegios
Nota:
Si estás ejecutando MySQL para comunicar data a una aplicación web,
los privilegios de CREATE,
SELECT, INSERT (discutido aquí), DELETE
y UPDATE (para mayor información puedes buscar en
el Manual de
Referencia MySQL - Sintaxis de GRANT y REVOKE) son probablemente
los únicos que necesitarás. Mucha gente comete el error de entregar
todos los permisos cuando en realidad no es necesario. Revisa con los
desarrolladores de las aplicaciones para ver si dichos permisos
causarán problemas con la operación general.
|
Para nuestro usuario admin, utilizaremos ALL. Para el usuario
guest, SELECT será suficiente para un acceso de solo
lectura. database es la base de datos en la cual deseamos el usuario
tenga los permisos. En este ejemplo, gentoo es nuestra base de
datos. El .* representa a todas las tablas. Si deseas, puedes
modificar el acceso por tabla. user es el nombre del usuario y host es
el nombre de la máquina desde la cual el usuario accederá. En la
mayoría de los casos, esta será localhost. Finalmente, password es la
contraseña del usuario. Dada esta información, crearemos nuestros
usuarios.
Listado de Código 4.2: Creando los usuarios admin y guest |
mysql> GRANT ALL ON gentoo.* TO 'admin'@'localhost' IDENTIFIED BY 'password';
mysql> GRANT SELECT ON gentoo.* TO 'guest'@'localhost' IDENTIFIED BY 'password';
|
Ahora que hemos definido los usuarios, probémoslos. Primero salimos de
mysql ejecutando el comando quit en el cursor:
Listado de Código 4.3: Saliendo de MySQL |
mysql> quit
|
Ahora hemos regresado a la consola. Dado que ya tenemos configurados
los usuarios, continuemos y veamos que pueden hacer.
Probando los permisos de los usuarios
Ahora debemos intentar ingresar con nuestro usuario
guest. Actualmente, el usuario guest solamente tiene los
privilegios SELECT. Esto básicamente significa que es capaz de
buscar y nada más. Ingresemos con la cuenta guest.
Listado de Código 4.4: Ingresando con la cuenta guest |
$ mysql -u guest -h localhost -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6 to server version: 4.0.25
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
|
Ahora debemos probar las restricción(es) del usuario. Entremos a la
base de datos gentoo:
Listado de Código 4.5: Switching to the gentoo database |
mysql> USE gentoo;
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
|
Ahora intentemos hacer algo que se supone no debemos
hacer. Intentaremos crear una tabla
Listado de Código 4.6: Intentando crear una tabla con el usuario guest |
mysql> CREATE TABLE test (test VARCHAR(20), foobar VARCHAR(2));
ERROR 1044: Access denied for user: 'guest@localhost' to database 'gentoo'
|
Como puedes ver, esta función falló, dado que nuestro usuario no tiene
los accesos necesarios. Sin embargo, un acceso que sí posee es el
de SELECT. Probémoslo:
Listado de Código 4.7: Intentando ejecutar el comando SELECT |
mysql> SELECT * FROM developers;
+-------------+-----------------------+----------------+
| name | email | job |
+-------------+-----------------------+----------------+
| Joe Smith | joesmith@gentoo.org | toolchain |
| John Doe | johndoe@gentoo.org | portage |
| Chris White | chriswhite@gentoo.org | documentation |
| Sam Smith | samsmith@gentoo.org | amd64 |
| Jane Doe | NULL | Outsourced job |
+-------------+-----------------------+----------------+
5 rows in set (0.00 sec)
|
El comando tuvo éxito, y con ello tenemos una vista parcial de lo que
se puede hacer con los permisos de los usuarios. Nosotros también, sin
embargo, hemos creado una cuenta admin. Esta se creó con la intención
de mostrar que incluso los usuarios con todos los permisos pueden
tener limitaciones. Probemos esta cuenta ingresando como admin.
Listado de Código 4.8: Conectándose como admin |
mysql> quit
Bye
$ mysql -u admin -h localhost -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7 to server version: 4.0.25
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
|
Para comenzar, intentaremos crear una nueva base de datos con nuestro
usuario admin. Este usuario admin tendrá accesos similares a la cuenta
super usuario de MySQL, y será capaz de realizar cualquier tipo de
modificación que desee sobre la base de datos gentoo. A continuación
probaremos el acceso del usuario a la base de datos principal de
MySQL. Recuerda que anteriormente solo definimos permisos para una
base de datos específica.
Listado de Código 4.9: Intentado crear una nueva base de datos |
mysql> CREATE DATABASE gentoo2;
ERROR 1044: Access denied for user: 'admin@localhost' to database 'gentoo2'
|
En efecto, el usuario admin no puede crear bases de datos en la base
de datos MySQL principal, sin importar todos los permisos que tiene en
la base de datos gentoo. Sin embargo, nosotros seguimos siendo capaces
de modificar la base de datos gentoo a través de la cuenta admin, como
se muestra en el siguiente ejemplo de inserción.
Listado de Código 4.10: Permisos de admin para la base de datos gentoo |
mysql> USE gentoo;
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
mysql> INSERT INTO developers VALUES('Bob Simmons', 'bobsimmons@gentoo.org', 'python');
Query OK, 1 row affected (0.08 sec)
|
El usuario admin puede acceder a la base de datos como desee. Algunas
veces se necesita retirar algunos permisos de los usuarios. Esto puede
suceder debido a casos que van desde un usuario problemático hasta un
empleado retirado. Veamos como desactivar permisos de usuarios con el
comando REVOKE.
Retirando permisos de usuarios con el comando REVOKE
El comando REVOKE nos permite denegar accesos a los
usuarios. Se puede negar completamente el acceso, o alguno
específico. De hecho, su formato es muy similar a GRANT.
Listado de Código 4.11: Sintaxis REVOKE |
REVOKE [privileges] ON database.* FROM '[user]'@'[host]';
|
Las opciones de aquí están explicadas en la sección del
comando GRANT. En esta sección sin embargo, vamos a denegar
completamente el acceso a un usuario. Digamos que hemos encontrado que
la cuenta guest está causando algunos problemas de seguridad. Hemos
decidido revocarle todos los permisos, así que ingresamos como super
usuario y hacemos lo necesario.
Listado de Código 4.12: Revocando permisos de los usuarios |
mysql> REVOKE ALL ON gentoo.* FROM 'guest'@'localhost';
Query OK, 0 rows affected (0.00 sec)
|
Nota:
En este caso, el acceso del usuario es simple, así que revocar sus
permisos por cada base de datos no es un problema. Sin embargo, en
casos más extensos, es probable que prefieras utilizar *.* en vez de
gentoo.* para poder eliminar el acceso del usuario a todas las bases de
datos.
|
Ahora salgamos he intentemos ingresar como el usuario guest.
Listado de Código 4.13: Intentando ingresar como el usuario guest |
$ mysql -u guest -h localhost -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9 to server version: 4.0.24-debug
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
|
Aunque hemos sido capaces de ingresar, nuestro acceso a gentoo ya no
existe.
Listado de Código 4.14: Acceso denegado a la cuenta guest |
mysql> USE gentoo;
ERROR 1044: Access denied for user: 'guest@localhost' to database 'gentoo'
|
Y con esto nuestro usuario problemático ya no es capaz de acceder a la
base de datos gentoo. Por favor fíjate que el usuario todavía es capaz
de ingresar al sistema. Esto es porque todavía está registrado en la
base de datos principal de MySQL. Veamos como eliminar completamente
una cuenta con DELETE y la tabla de usuarios de MySQL.
Eliminando cuentas con DELETE
La tabla de usuarios de MySQL contiene a todos los usuarios e
información sobre ellos. Asegúrate de ingresar como super usuario,
luego utiliza la base de datos principal de MySQL.
Listado de Código 4.15: Utilizando la base de datos mysql principal |
mysql> USE mysql;
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
mysql>
|
Ahora veamos qué tablas contiene la base de datos mysql:
Listado de Código 4.16: listado de las tablas de la base de datos mysql |
mysql> SHOW TABLES;
+-----------------+
| Tables_in_mysql |
+-----------------+
| columns_priv |
| db |
| func |
| host |
| tables_priv |
| user |
+-----------------+
6 rows in set (0.00 sec)
|
La tabla user es la que estamos buscando. Sin embargo, la tabla
usuario contiene 30 campos distintos, haciéndola muy difícil de
leer. Para poder hacer las cosas más simples, vamos a utilizar la
tercera versión del comando SELECT. Los campos que necesitamos
son Host y User.
Listado de Código 4.17: Encontrado nuestro usuario guest en la tabla user |
mysql> SELECT Host,User FROM user WHERE User = 'guest';
+-----------+-------+
| Host | User |
+-----------+-------+
| localhost | guest |
+-----------+-------+
1 row in set (0.00 sec)
|
Ahora que tenemos nuestra información, podemos deshacernos de nuestra
cuenta guest. Esto lo conseguimos con el comando DELETE y la
sintaxis que mostramos a continuación.
Listado de Código 4.18: Sintaxis DELETE |
DELETE FROM table WHERE field='value';
|
Como podrás ver, DELETE es algo similar al
comando SELECT en cuanto al formato. En este caso, el field
(campo) será User, y el valor será guest. Esto eliminará el registro
del usuario guest de la tabla user, con lo que lograremos eliminar
exitosamente la cuenta de usuario guest. Ahora, hagámoslo:
Listado de Código 4.19: Eliminando la cuenta guest |
mysql> DELETE FROM user WHERE User='guest';
Query OK, 1 row affected (0.07 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
|
Parece haber funcionado sin problemas. Probémoslo saliendo y tratando
de ingresar de nuevo con nuestra cuenta de usuario guest.
Listado de Código 4.20: Intentado ingresar como el usuario guest |
mysql> quit
Bye
$ mysql -u guest -h localhost -p
Enter password:
ERROR 1045: Access denied for user: 'guest@localhost' (Using password: YES)
|
¡Nuestro usuario ha sido exitosamente eliminado!
Conclusión
Mientras esta guía se centra principalmente en configurar MySQL en la
línea de comandos, existes algunas alternativas con la forma GUI:
Esto da por concluido el tutorial introductorio de MySQL. Espero que
te haya dado un mejor entendimiento de los aspectos básicos detrás de
MySQL y como levantar una base de datos. Por favor, envíame un correo
electrónico a Chris White si tienes algún
comentario.
El contenido de este documento, a no ser que se especifique
expresamente, está registrado bajo los términos de la licencia
CC-BY-SA-2.5. Se aplican las
Pautas de
Utilización del logotipo y nombre de Gentoo.
|