Alvaro Marín
Instalación, configuración y manejo de MySQL
Su principal objetivo de diseño fue la velocidad, por ello se suprimieron algunas características de los demás SGBDs (Sistema de Gestion de Base de Datos), como las transacciones y las subselects. Consume pocos recursos y se distribuye bajo licencia GPL (a partir de la versión 3.22).
Ventajas:
El lenguaje SQL para acceder a bases de datos relacionales, fue lanzado al mercado por IBM al mercado allá por 1981, después
de varios años de desarrollo y en 1983 empezó a vender DB2, un sistema de gestión de bases de datos que se hizo muy popular.
Posteriormente, el Instituto de Estándares Nacional Americano(ANSI) adoptó el SQL como estándar para el acceso a
bases de datos relacionales, y al añó siguiente, se convirtió en estándar ISO.
Actualmente, se encuentra en fase de estandarización la versión 3, que será un lenguaje por sí mismo, y no necesitará de otros
para actuar, nuevos tipos de datos complejos...
Alrededor de la década del 90, Michael Windenis (monty@analytikerna.se) comenzó a usar mSQL (http://www.hughes.com.au/) para conectar tablas usando sus propias rutinas de bajo nivel (ISAM). Sin embargo, después de algunos testeos llego a la conclusión que mSQL no era lo suficientemente rápido ni flexible para sus necesidades. De todo esto surgió en una nueva interfaz SQL (claro que con código mas portable) con algunas apariencias similares en la API de C y en los nombres y funciones de muchos de sus programas. Esto había sido hecho para lograr con relativa facilidad portar aplicaciones y utilidades de MiniSQL a MySQL.
Este tutorial va a tratar de introducir al lector en el amplio mundo de MySQL. Para un estudio más amplio, recomiendo la visita del completo tutorial que hay en su web www.mysql.com.
apt-get install mysql-serverSe nos preguntan varios aspectos, como si queremos "purgar" o borrar las bases de datos, cuando desinstalemos el programa o si queremos que se ejecute cada vez que iniciemos la máquina. Una vez respondidas, ya tendremos el servidor instalado.
El archivo de configuración, está situado en /etc/mysql/my.cfg . También en el home de cada usuario, se puede crear un .my.cnf para definir los parámetros de los clientes, de tal forma de que si un parámetro está definido en los dos, toma preferencia el último leido por MySQL, es decir, el del ~/.my.cnf, como veremos posteriormente.
En /etc/mysql/my.cnf entonces, se indica dónde guardar los logs que se generan, puerto por el que escuchará las conexiones... Por defecto, el acceso por red, está deshabilitado por seguridad. Para habilitarlo, comentaremos la línea "skip-networking", con lo que al reiniciar el servicio tendremos MySQL a la escucha, en el puerto TCP 3306.
En cuanto a los logs, se indican en el archivo de configuración anterior. Por defecto, en /var/mysql/mysql.log se guardan las consultas realizadas contra las bases de datos que "alberga" MySQL. Los errores y demás, en /var/log/mysql/mysql.err.
Junto con el servidor de base de datos, MySQL nos proporciona otras herramientas, como el cliente mysql que utilizaremos para conectarnos al servidor a partir de ahora. Ejecutando
$mysql -hvemos todas las opciones de este programa, entre las más importantes
$mysql -u root -pPor defecto deja al usuario root SIN contraseña, lo cambiaremos luego.
$mysql -u root -p Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 to server version: 3.23.49-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql>MySQL tiene "auto completado" de comandos, como el bash. Así que podemos dar al [Tab] para ver todas los posibles comandos a ejecutar. Para empezar vamos a ver qué bases de datos tenemos ya creadas por defecto:
mysql>show databases;La BD mysql es la principal del servidor. Para poder usarla y hacer consultas sobre ella, debemos indicar a MySQL que queremos trabajar con dicha BD:
mysql>use mysql; Database changedA partir de ahora, todas las sentencias SQL que hagamos van a ser sobre las tablas de esta base de datos. Si en un momento dado, queremos ver con cuál estamos trabajando, lo podemos hacer con:
mysql> select database(); +------------+ | database() | +------------+ | mysql | +------------+ 1 row in set (0.00 sec)También podemos hacerlo para recordar el usuario con el que estabamos:
mysql>select user();Para ver las tablas de las que está formada, lo hacemos con:
mysql>show tables; +-----------------+ | Tables_in_mysql | +-----------------+ | columns_priv | | db | | func | | host | | tables_priv | | user | +-----------------+ 6 rows in set (0.00 sec)La tabla tables_priv, correponde a los permisos de los usuarios a nivel de tablas, es decir, en qué tablas puede hacer consultas cada usuario.
mysql>SELECT * FROM user;muestra todos los usuarios de MySQL, el host desde el que está permitido que se conecte, la contraseña y si tiene o no privilegios para hacer selects, inserts... sobre esta tabla y apagar/reiniciar...el servidor. Vamos a añadir un usuario nuevo:
mysql>insert into user (Host,User,Password) values("localhost","ghost",password('ghost'));
En la tabla db, tenemos los permisos que tiene cada usuario para una determinada base de datos, si puede hacer
selects, inserts... deberíamos hacer una nueva insert en esta tabla... todo esto puede ser bastante "pesado" por lo que
se creó una herramienta para manejar más fácilmente todo esto, el comando GRANT.
Vamos a repetir lo anterior pero con este nuevo comando. Antes borramos el usuario creado con:
mysql>DELETE FROM user WHERE User="ghost" and Host="localhost";y lo creamos usando GRANT:
GRANT privileges(columns) ON what TO user IDENTIFIED BY "password" [WITH GRANT OPTION];Con esto, se crea una nueva entrada en la tabla mysql.user y mysql.db. La contraseña es cifrada con la función vista antes (password()).
mysql>create database BDghost; mysql>GRANT ALL ON BDghost.* TO ghost@localhost IDENTIFIED BY "ghost";Donde los privilegios pueden ser ALTER,CREATE,DELETE,DROP...ALL,USAGE(se crea el user pero sin privilegios).
mysql>select * from user;y sus privilegios en la base de datos que crearemos:
mysql>select * from db;Para eliminar privilegios, tenemos REVOKE:
mysql>REVOKE privileges(columns) ON what FROM user;
Por ejemplo, si queremos negar al usuario 'ghost' la posibilidad de borrar las tablas de la base de datos, lo haríamos de la siguiente forma:
mysql> REVOKE DROP ON BDghost.* FROM ghost@localhost;
Pero esto no elimina los usuarios completamente del sistema, solo le quita los privilegios. Para eliminarlo completamente deberemos ir a la tabla user de la base de datos mysql y borrarlo "a mano" con un sentencia delete, como hemos visto antes.
Como hemos dicho, en un principio, MySQL deja la cuenta root sin contraseña, por lo que habrá que cambiarlo inmediatamente, para ello: Diferentes formas:
mysql> SET PASSWORD FOR root@localhost=password('nuevapass');o cambiando directamente en la tabla user:
$mysql -u root mysql -p mysql> UPDATE user SET Password=password('nuevapass') WHERE user='root'; mysql> FLUSH PRIVILEGES;Salimos con exit; Ahora vamos a conectarnos con el usuario que acabamos de crear, para ello lo podemos hacer con
$mysql -u ghost -p (habría que poner -h hostname si estamos en otra máquina)pero resulta muy util crearse un .my.cnf (nótese el '.' para ocultar el archivo) en nuestro home, con las siguientes opciones:
[client] host=localhost user=ghost password=ghostLógicamente, este archivo deberá tener solamente permisos de lectura para el usuario para ello, hacemos:
$chmod 600 .my.cnfEn el caso de que accederíamos todo el rato a una base de datos, podríamos poner tambien:
database=BDghostDe esta forma, para conectarnos a mysql, ahora nos basta con poner mysql sin parámetro alguno desde la shell y se nos conectara con los parámetros dados en .my.cnf
CREATE TABLE Usuario ( id int(8) NOT NULL AUTO_INCREMENT PRIMARY KEY, nick varchar(40) NOT NULL, email varchar(60), web varchar(100) ); CREATE TABLE Mensaje ( id int(8) NOT NULL AUTO_INCREMENT PRIMARY KEY, autor int(5) NOT NULL, fecha date, texto blob, padre int(5), tema int(8), FOREIGN KEY (autor) REFERENCES Usuario(id), FOREIGN KEY (tema) REFERENCES Tema(id) ); CREATE TABLE Tema ( id int(8) NOT NULL AUTO_INCREMENT PRIMARY KEY, nombre varchar(20) NOT NULL, descripcion varchar(60) );Una vez creado el archivo, se lo pasamos a MySQL:
$mysql -u ghost -p BDghost < foros.sqlo si tenemos el .my.cnf anterior creado :
mysql < foros.sqlde tal forma, que lo copiará con la base de datos, usuario y pass del archivo .my.cnf.
MySQL acepta un montón de tipos de datos como int(tinyint,smallint,mediumint,bigint),float,double,char,varchar,blob,mediumblob,date,time...
Destacar también el atributo AUTO_INCREMENT, de id por ejemplo.
Con esto indicamos, que cada vez que se inserte una fila en la tabla,
MySQL asignará un nº al id, que será el posterior al anterioriormente asignado.
De esta forma, tenemos secuencias enteras de ids sin necesitar
de "llevar la cuenta" ni nada por el estilo.
Al hacer la insert, será con el valor NULL y MySQL se encarga automáticamente de generarlo.
También se puede introducir un valor para saltarse
el autoincrement, pero dará error si ya existe.
Se puede definir un valor de inicio para el AUTO_INCREMENT, para que empieze a contar desde un valor. Esto se hace asgnadole dicho
valor al crear la tabla.
Podemos ver las tablas que acabamos de crear, reconectándonos al servidor y poniendo:
mysql> show tables; +-------------------+ | Tables_in_BDghost | +-------------------+ | Mensaje | | Tema | | Usuario | +-------------------+ 3 rows in set (0.00 sec)Para ver la descripción de cada tabla (columnas, tipos...), tenemos el comando desc o describe. Por ejemplo:
mysql> describe Usuario; +-------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+----------------+ | id | int(8) | | PRI | NULL | auto_increment | | nick | varchar(40) | | | | | | email | varchar(60) | YES | | NULL | | | web | varchar(100) | YES | | NULL | | +-------+--------------+------+-----+---------+----------------+ 4 rows in set (0.00 sec) mysql> desc Mensaje; +-------+--------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------+------+-----+---------+----------------+ | id | int(8) | | PRI | NULL | auto_increment | | autor | int(5) | | | 0 | | | fecha | date | YES | | NULL | | | texto | blob | YES | | NULL | | | padre | int(5) | YES | | NULL | | | tema | int(8) | YES | | NULL | | +-------+--------+------+-----+---------+----------------+ 6 rows in set (0.00 sec)
Explicado esto, podemos hacer las correspondientes inserts a las tablas, por ejemplo:
mysql>insert into Usuario values(NULL,"split","split77@terra.es","http://split.no-ip.org"); mysql>insert into Tema values(NULL,"GNU/Linux","Tema sobre GNU/Linux"); mysql>insert into Mensaje values(NULL,1,now(),"Primer mensaje",NULL,1); mysql>insert into Usuario values(NULL,"cicatriz","cicatriz@enlamatriz.org",""); mysql>insert into Mensaje values(NULL,1,now(),"Segundo Mensaje",NULL,1);Para hacer una consulta sencilla de todos los mensajes que ha escrito split, hacemos:
mysql> select Mensaje.texto from Mensaje,Usuario where Usuario.id=Mensaje.autor and Usuario.nick="split"; +-----------------+ | texto | +-----------------+ | Primer mensaje | | Segundo Mensaje | +-----------------+ 2 rows in set (0.01 sec)
$mysqldump -u ghost -p BDghost > backup.sqlSi tenemos el .my.cnf dará un error de --databases. Para solucionarlo, renombramos temporalmente el archivo
$mv .my.cnf .my.cnf.OLDy ya podemos hacer el backup tranquilamente.
Pero este comando tiene bastantes opciones como:
--all-databases => vuelca todas las bases de datos que tiene MySQL (hacen falta permisos en todas ellas, claro)
--add-drop-table => añade una sentencia al principio del archivo de backup para que si se tiene que restaurar
borre la tabla existente.
--add-locks => añade las sentencias de bloqueo y desbloqueo para hacer las inserts
$mysql -u ghost -p BDghost < backup.sqlo como hemos dicho, si tenemos el .my.cnf con los datos apropiados:
$mysql < backup.sql
Con el fin de hacer el manejo de MySQL un poco más "amigable", hay programas como el PHPMyAdmin, que es un front-end vía
web para el acceso a las bases de datos y sus tablas.
Lo podemos instalar como siempre:
apt-get intall phpmyadmin
Depende del servidor web Apache por lo que nos pedirá instalarlo también.
Para acceder, una vez arrancado el Apache, basta con poner en el navegador http://localhost/phpmyadmin
y se nos pedirá un nombre de usuario y una contraseña para el acceso a las bases de datos, como hemos
tenido que poner en nuestro .my.cnf por ejemplo.
Una vez que se nos permita el acceso, tenemos la posibildad de consultar las tablas, insertar filas, modificarlas...
y un montón de opciones vía web y muy comodamente.
Sin duda, herramienta recomendable para el manejo de grandes bases de datos.