Linux

UNIDAD III Administracion de Mysql en Entornos GNU/Linux Derechos de Reproducción DOCUMENTO CEDIDO AL DOMINIO PÚBLICO Versión 2.0. Copyright © 2006...
6 downloads 1 Views 107KB Size
UNIDAD III

Administracion de Mysql en Entornos GNU/Linux

Derechos de Reproducción DOCUMENTO CEDIDO AL DOMINIO PÚBLICO Versión 2.0. Copyright © 2006 - 2007 Gianncarlo Gómez Morales Este documento se distribuye bajo licencia CREATIVE COMMONS http://creativecommons.org/licenses/bysa/2.0/es/deed.es, se autoriza la libre distribución y/o modificado del mismo siempre y cuando se cite el nombre del autor. Cualquier observación, sugerencia o consulta, favor contactarse con los siguientes correos:

 

[email protected] [email protected]

Conectándose a MySQL por primera vez El programa cliente de MySQL, también conocido como el monitor de MySQL, es una interfase que le permite a un usuario conectarse a un servidor MySQL, crear y modificar bases de datos, y ejecutar consultas y ver los resultados. Este programa es iniciado ejecutando el comando mysql en el prompt del sistema. En general, la sintaxis de este comando es: shell> mysql [opciones] [base de datos]

En donde [opciones] pueden ser una o más opciones usadas en conjunción con el programa mysql, y [base de datos] es el nombre de la base de datos sobre la que se va a trabajar. Puesto que se asume que es la primera vez que se usa el monitor MySQL, debe tomarse un momento para revisar todas las opciones permitidas al ejecutar el siguiente comando: shell> mysql --help

Éste produce una larga lista de opciones que se pueden usar en conjunción con el programa mysql. Por el momento, sin embargo, la meta principal es simplemente conectarse al servidor de bases de datos. Por lo tanto, hay que ejecutar el siguiente comando: shell> mysql -u root

Deberá de aparecer algo como los siguiente: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 to server version: 3.23.28-gamma-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer mysql>

Felicidades, ahora se encuentra conectado al monitor de MySQL como el usuario root (el todopoderoso). La primera acción oficial como el líder supremo del servidor de bases de datos MySQL es asegurarse que nadie más pueda declararse en esta posición, haciendo esto posible cuando alguién quiera conectarse como root al servidor deba de proporcionar una contraseña. Hay que cambiar la contraseña de su valor actual (un valor nulo), a algo difícil de adivinar usando el siguiente comando: mysql>SET PASSWORD FOR 'root'@'localhost' = PASSWORD('la_palabra_secreta');

El "root", que es el nombre de usuario, y "localhost", que es el nombre del host, constituyen un usuario único en MySQL. Para aquellos lectores no familiarizado con la terminología de redes, 'localhost' es un nombre usado para referirse al servidor local; en este caso, el

servidor sobre el cuál reside MySQL. Por lo tanto, al escribir 'root'@'localhost', este comando le dice al servidor MySQL que ponga la contraseña para un usuario denominado 'root' que se conectará específicamente del servidor local ('localhost'). Más específicamente, este comando cambiará la contraseña actualizando lo que se conoce comúnmente como la tabla de privilegios de MySQL. Estas tablas, que se encuentran en la base de datos llamada mysql, contienen información con respecto a las capacidades de conexión y uso de todos los usuarios que intentan usar el servidor de base de datos MySQL. Más específicamente, este comando actualiza la tabla user, actualizando el campo password de la fila en la cual el valor de campo user es root. El campo password se actualizará con el valor encriptado de la cadena que se pasa como parámetro a la función PASSWORD(). Por supuesto, no olvidar esta contraseña. Puesto que ésta es almacena en un texto encriptado dentro de la base de datos, no puede ser recuperada fácilmente en el caso de que sea olvidada. Hay también un método alternativo para actualizar la contraseña: shell> mysqladmin -u root password 'la_palabra_secreta'

Este comando tiene el mismo efecto que el comando introducido previamente.

Salir y conectarse de nuevo al monitor MySQL Para verificar que la nueva contraseña funciona, salir del monitor MySQL usando el siguiente comando: mysql> \q

Esto nos regresa al shell del sistema. Ahora hay que volver al monitor, pero esta vez usando el siguiente comando: shell> mysql -u root -p

El hacer esto resulta en un prompt para proporcionar la contraseña del usuario root, como se muestra a continuación: Enter password:

En este punto, debe de suministrarse la contraseña que se asignó al usuario root previamente. Asumiendo que ésta ha sido proporcionada correctamente, aparecerá el saludo estándar de MySQL, y root será conectado al servidor MySQL una vez más.

Cuidado con esa contraseña Muchos lectores pueden estar tentados a incluir la contraseña en la misma línea de comandos, como sigue: shell> mysql -u root -pla_palabra_secreta

¡No hacer esto!. ¡No sólo es un método sumamente inseguro para proporcionar la contraseña, sino que no producirá los resultados esperados!. Es inseguro porque permitirá a cualquier persona observar la contraseña en este formato de texto plano, pero también porque cualquier usuario puede usar el comando 'ps' de Unix para ver los comandos que se están ejecutando y ver allí la contraseña en su formato de texto plano. Quizás sea una buena idea almacenar la contraseña en nuestro archivo de configuración my.cnf, localizado en~/.my.cnf . Si usted no sabe lo que es este archivo, lea por favor la sección previa titulada El archivo de configuración de MySQL.

Seleccionado una base de datos Por supuesto, simplemente conectarse al servidor MySQL no servirá de mucho. Seguramente se querrá seleccionar una base de datos para trabajar sobre con ella. Esto se puede hacer de dos maneras: Una de ellas es incluir el nombre de la base de datos al ejecutar el comando mysql. Por ejemplo, para conectarse al servidor MySQL y seleccionar al mismo tiempo la base de datos es: shell> mysql -u root -p mibasededatos

Tal vez cause algo de confusión en algunos lectores, ya que parece que se proporciona la palabra "mibasededatos" como la contraseña del usuario root. Esto no es correcto. Hay que tomarse un momento para revisar la sintaxis que se describe en la salida del comando mysql --help, puesto que debe de ser evidente que "-u root -p" se refiere a la parte de [opciones] y "mibasededatos" a la parte de [base de datos]. La otra manera de seleccionar una base de datos, es cuando uno ya está conectado al servidor MySQL. Para ello se debe usar el siguiente comando: mysql> use mibasededatos

Una vez ejecutado cualquiera de los dos comandos, todas las consultas se dirigirán hacia la base de datos hipotética mibasededatos.

mysqladmin El programa mysqladmin se usa para administrar varios aspectos del servidor de bases de datos MySQL. Al usarlo, el administrador puede realizar las tareas tales como: crear y eliminar bases de datos, dar de baja el servidor MySQL, actualizar las tablas de privilegios, y ver los procesos que se están corriendo (ejecutando) dentro de MySQL. La sintaxis general es: shell> mysqladmin [opciones] comando(s) Dónde [opciones] puede ser toda una serie de opciones usadas en conjunción con el programa mysqladmin. Puesto que se asume que es la primera vez que se usa el programa mysqladmin, se recomienda que se revisen con detalle todas las opciones que se tienen permitidas con este programa. Usar el siguiente comando: shell> mysqladmin --help

Esto produce una larga lista de las opciones que se pueden usar en conjunción con el programa de mysqladmin. Para demostrar como son usadas estas opciones, a continuación vamos a decirle a mysqladmin que necesitamos crear una base de datos llamada widgets, la cuál será usada a través del resto de este artículo para ver otras funciones útiles de MySQL. Una base de datos se crea como sigue: shell> mysqladmin -u root -p create widgets Enter Password:

Después de la ejecución, mysqladmin creará la base de datos y regresará el shell del sistema. Típicamente, el siguiente paso consiste en asegurar la nueva base de datos modificando las tablas de privilegios. Los detalles de como se hace esto es el objetivo de la siguiente sección. Asegurando una base de datos La seguridad debe ser lo primero que debe venir a la mente de un administrador de MySQL después de crear una base de datos. Como se discutió en la sección "Las tablas de privilegios", asegurar una base de datos consiste en hacer modificaciones a las tablas que se encuentran en la base de datos llamada mysql. En esta sección, el lector aprenderá a asegurar la base de datos widgets que se creó anteriormente. Antes de hacer esto, se va a realizar un breve resumen de cómo son modificadas las tablas de privilegios. Hay dos métodos usados para modificar las tablas de privilegios. El primero es a través del uso de las sentencias típicas de SQL tales como INSERT, UPDATE, y DELETE. Sin embargo el uso de este método ha sido depreciado para introducir el segundo método, el cual involucra el uso de los comandos especiales GRANT yREVOKE. Por lo tanto, sólo este método se discutirá a continuación.

El comando GRANT La función del comando GRANT es crear nuevos usuarios, y asignarle sus privilegios. Su sintaxis es: GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name | * | *.* | db_name.*} TO user_name [IDENTIFIED BY 'password'] [, user_name [IDENTIFIED BY 'password'] ...] [WITH GRANT OPTION] Una comprensión de cómo trabaja el comando GRANT se obtiene mejor a través de ejemplos. En el ejemplo siguiente, el comando GRANT es usado para agregar un nuevo usuario a la base de datos. Este usuario será usado para accesar a la base de datos widgets: mysql>GRANT usage ON *.* TO widgetAdmin@localhost ->IDENTIFIED BY 'ilovewidgets';

Esto creará un nuevo usuario denominado widgetAdmin, capaz de conectarse al servidor MySQL vía el localhost usando la contraseña ilovewidgets. Hay que tener presente que sólo se otorgan privilegios de conexión, no se permitirá que el usuario haga nada en el servidor MySQL. Vamos a proseguir cambiándonos a la base de datos mysql y ejecutando la siguiente consulta: mysql> SELECT * FROM user;

Nótese que la fila conteniendo el usuario widgetAdmin tiene valores N para todos los demás privilegios. Esto es bueno, puesto que la tabla user contiene privilegios de carácter global. Para clarificar esto, si un valor "Y" se pone para cualquier privilegio en la tabla user, ese usuario puede aplicar ese privilegio a cualquier base de datos de MySQL. Por lo tanto, casi siempre será mejor si todos los privilegios están en "N" dentro de esta tabla. ¿Bien, entonces como se asignan los privilegios a un usuario para una base de datos en particular?. Esto se hace fácilmente modificando ligeramente el comando GRANT del ejemplo previo. Por ejemplo, si asumimos que el administrador quiere otorgar los privilegios SELECT, INSERT, UPDATE y DELETE al usuario widgetAdmin sobre la base de datos widgets, se tendría que usar el comando GRANT de la siguiente manera: mysql>GRANT SELECT, INSERT, UPDATE, DELETE ->ON widgets.* TO widgetAdmin@localhost;

Después de la ejecución de este comando, el usuario widgetAdmin puede inmediatamente hacer uso de estos privilegios.

Los privilegios introducidos aquí no son los únicos disponibles para el administrador. La tabla 1-1 proporciona un lista de todos los privilegios disponibles. Tabla 1-1: privilegios disponibles para usar con el comando GRANT y REVOKE Para ver los nuevos privilegios que han sido asignados, se puede ejecutar la siguiente consulta: ALL PRIVILEGES ALTER CREATE DELETE

FILE INDEX INSERT PROCESS

RELOAD SELECT SHUTDOWN UPDATE

Para ver los nuevos privilegios que han sido asignados, se puede ejecutar la siguiente consulta:

mysql> SELECT * FROM db;

Nótese que una fila ha sido agregada a la tabla "db" para el registro del usuario widgetAdmin, con los valores "Y" asignados a los campos SELECT, INSERT, UPDATE y DELETE. Aunque en este ejemplo se mostró como crear un usuario, y posteriormente como asignarle los privilegios, es posible hacer estos dos pasos en uno solo, al ejecutar el comando GRANT visto anteriormente, con una ligera variante. mysql>GRANT SELECT, INSERT, UPDATE, DELETE ->ON widgets.* TO widgetAdmin@localhost ->IDENTIFIED BY 'ilovewidgets';

Asumiendo que el usuario widgetAdmin aún no existe cuando se ejecute esta consulta, tanto la tabla "user", como la tabla "db" serán actualizadas con las registros necesarios. Por supuesto, el administrador puede revocar los privilegios otorgados en cualquier momento. Éste es el objetivo que se cubre en la siguiente sección.

La sentencia REVOKE La sentencia REVOKE es usada para rescindir los privilegios que han sido previamente otorgados a un usuario. Su sintaxis es la siguiente: REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name | * | *.* | db_name.*} FROM user_name [, user_name ...]

Como en el caso del comando GRANT, quizás la mejor manera de entender realmente cómo funciona este comando es experimentado con varios ejemplos. Asumiendo que el administrador tiene la necesidad de revocar el privilegio DELETE que había sido otorgado al usuario widgetAdmin, se tiene que ejecutar el comando REVOKE de la siguiente manera: mysql>REVOKE DELETE ON widgets.* ->FROM widgetAdmin@localhost;

Un punto que se debe tener presente es que mientras REVOKE puede quitar todos los privilegios otorgados a un usuario (inclusive los privilegios de conexión), éste no quita al usuario de la tabla de privilegios. Para ilustrar esto, hay que considerar el siguiente comando: mysql>REVOKE ALL PRIVILEGES ON widgets.* ->FROM widgetAdmin@localhost; ¡Mientras esto tendría como resultado que sean revocados todos los privilegios del usuario widgetAdmin, éste no borraría registros trascendentes de las tablas de privilegios!. Si lo que se desea es borrar completamente a un usuario de la base de datos se tiene que hacer uso de la sentencia DELETE como sigue: mysql>DELETE FROM user WHERE user = 'widgetAdmin'; Query OK, 1 row affected (0.00 sec) mysql>FLUSH PRIVILEGES;

Cuando ha sido ejecutada esta sentencia, se elimina a un usuario de manera definitiva de la tabla de privilegios. Respaldos de bases de datos El concepto final discutido en este tutorial es uno verdaderamente importante: respaldos de datos. En esta sección se discuten dos métodos de hacer respaldos de datos y de las estructuras de las bases de datos MySQL, los comandos mysqldump y mysqlhotcopy.

mysqldump El comando mysqldump proporciona una manera conveniente para respaldar datos y estructuras de tablas. Hay que notar que mientras el comando mysqldump no es el método más eficiente para crear respaldos (mysqlhotcopy se describe a continuación), éste ofrece un medio conveniente para copiar datos y estructuras de tablas que puede ser usado para "poblar" otro servidor SQL, no importando si se trata, o no de un servidor MySQL. El comando mysqldump puede ser usado para crear respaldos de todas las bases de datos, algunas bases de datos, sólo una de ellas, o incluso ciertas tablas de una base de datos

dada. En esta sección se ilustra la sintaxis involucrada con varios posibles escenarios, seguida con unos pocos ejemplos. Usando el comando mysqldump para respaldar sólo una base de datos: shell> mysqldump [opciones] nombre_base_datos

Usando el comando mysqldump para respaldar varias tablas de una base de datos: shell> mysqldump [opciones] nombre_base_datos tabla1 tabla2. . . tablaN

Usando mysqldump para respaldar varias bases de datos: shell> mysqldump [opciones] --databases [opciones] nombre_bd1 nombre_bd2... Usando mysqldump para respaldar todas las bases de datos: shell> mysqldump [opciones] --all-databases [opciones]

Las opciones pueden ser vistas ejecutando el siguiente comando: shell> mysqldump --help

- Ejemplos Respaldar ambos, la estructura y los datos encontrados dentro de la base de datos widgets puede ser realizado como sigue: shell> mysqldump -u root -p --opt widgets

Alternativamente, quizás se requiera respaldar únicamente los datos, esto es logrado al incluir la opción --no-create-info, lo que significa que no se creen los datos relativos a la creación de las tablas. shell>mysqldump -u root -p --no-create-info widgets

Otra variación es respaldar únicamente la estructura de las tablas, esto es logrado al incluir la opción --nodata, que significa la no creación de los datos de las tablas. shell>mysqldump -u root -p --no-data widgets

Si se está planeando usar mysqldump con el fin de respaldar datos para que puedan ser movidos a otro servidor MySQL, es recomendado que se use la opción "--opt". Esto nos dará un respaldo optimizado de los datos que tendrá como resultado un tiempo más rápido de lectura cuando se quieran cargar los datos en otro servidor MySQL. Mientras mysqldump proporciona un método conveniente para respaldar datos, hay un segundo método, el cuales más rápido, y más eficiente. Esto se describe en la siguiente sección. mysqlhotcopy El comando mysqlhotcopy es un script de Perl que usa varios comandos SQL y del sistema para respaldar una base de datos. Más específicamente éste bloquea las tablas, limpia las tablas, hace una copia, y desbloquea las tablas. Aunque este sea el método disponible más rápido para respaldar una base de datos MySQL, éste se limita a respaldar sólo las bases de datos que residen en la misma máquina en la cual está siendo ejecutado el comando mysqlhotcopy. El comando mysqlhotcopy puede ser ejecutado para respaldar una base de datos, varias bases de datos, o sólo las bases de datos cuyo nombre coincida con una expresión regular. En esta sección, se muestra la sintaxis involucrada con cada posible escenario seguida de unos pocos ejemplos. Usando mysqlhotcopy para respaldar sólo una base de datos: shell> mysqlhotcopy [opciones] nombre_bd /ruta/nuevo/directorio

Usando mysqlhotcopy para respaldar varias bases de datos: shell> mysqlhotcopy [opciones] nombre_bd1.. nombre_bdN /ruta/nuevo/directorio

Usando mysqlhotcopy para respaldar sólo las tablas de una base de datos cuyo nombre coincida con una expresión regular: shell> mysqlhotcopy [opciones] nombre_bd./expresionregular/

Las opciones completas del comando mysqlhotcopy pueden ser vistas ejecutando el siguiente comando: shell> mysqlhotcopy --help

- Ejemplos Para usar mysqlhotcopy para respaldar la base de datos "/usr/mysql/backups/" se tiene que ejecutar el siguiente comando:

widgets

al

directorio

shell>mysqlhotcopy -u root -p widgets /usr/mysql/backups

Un segundo ejemplo asume que la base de datos widgets contiene las tablas "productos2000", "productos2001", "clientes2000", y "clientes2001", con los cuatro digitos representando los datos correspondientes a cada año. Si se desean respaldar las tablas relativas al año "2000", el comando mysqlhotcopy tendría que usarse como sigue: shell> mysqlhotcopy -u root -p widgets./^.+('2000')$/ /usr/mysql/backups

En el ejemplo de arriba, la expresión /^.+('2000')$/ le dice a mysqlhotcopy que respalde sólo las tablas cuyo nombre finalice con la cadena "2000".