Sondeo

Escritorios alternativos Linux

¿Cuál prefieres?

  •  Xfce
  •  LXDE
  •  Razor-qt
  •  Enlightenment 0.17

Resultados
Other polls | 1,879 voters | 2 comentarios
· Próximas fechas Curso Global de Servidores con CentOS 6.
· Taller de programación de Python.
· Curso de programación de PHP.
· Prueba ALDOS 1.4.5. Nuestro sistema operativo para escritorio.

Configuración básica de MySQL™.

Autor: Joel Barrios Dueñas
Correo electrónico: darkshram en gmail punto com
Sitio de Red: http://www.alcancelibre.org/
Jabber ID: darkshram@jabber.org

Creative Commons Reconocimiento-NoComercial-CompartirIgual 2.1

© 1999-2014 Joel Barrios Dueñas. Usted es libre de copiar, distribuir y comunicar públicamente la obra y hacer obras derivadas bajo las condiciones siguientes: a) Debe reconocer y citar al autor original. b) No puede utilizar esta obra para fines comerciales (incluyendo su publicación, a través de cualquier medio, por entidades con fines de lucro). c) Si altera o transforma esta obra o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor. Los derechos derivados de usos legítimos u otras limitaciones no se ven afectados por lo anterior. Licencia completa en castellano. La información contenida en este documento y los derivados de éste se proporcionan tal cual son y los autores no asumirán responsabilidad alguna si el usuario o lector, hace mal uso de éstos.

Introducción.

Acerca de MySQL™.

MySQL™ es un DBMS (DataBase Management System) o sistema de gestión de base de datos SQL (Structured Query Language o Lenguaje Estructurado de Consulta) multiusuario y multihilo con licencia GNU/GPL. Fue propiedad y patrocinio de MySQL AB, compañía fundada por David Axmark, Allan Larsson y Michael Widenius, con base de operaciones en Suecia, la cual poseía los derechos de autor de prácticamente todo el código que lo integraba. MySQL AB desarrolló y se encargó del mantenimiento de MySQL vendiendo servicios de soporte y otros valores agregados, así como también licenciamiento privativos para los desarrollos de equipamiento lógico que requieren mantener cerrado su código fuente. MySQL™ AB fue adquirido en 2008 por Sun Microsystems, que a su vez fue adquirido por Oracle Corporation en 2009.

MySQL™ es actualmente el servidor de base de datos más popular para los desarrollos a través de la red mundial, principalmente sitios de Internet. Es célebre y casi legendario, por considerarse rápido y sólido.

MySQL™ será reemplazado de forma transparente por MariaDB™ —una bifurcación de MySQL dirigida por Michael Widenius— en la mayoría de los distribuciones de GNU/Linux como medida para hacer frente a la mala gestión que ha realizado Oracle sobre el proyecto MySQL™.

URL: http://www.mysql.com/

Equipamiento lógico necesario.

En CentOS, Fedora™ y Red Hat™ Enterprise Linux.

Ejecute lo siguiente para instalar los paquetes mysql (cliente) y mysql-server (servidor):

yum -y install mysql mysql-server

En openSUSE™ y SUSE™ Linux Enterprise.

Ejecute lo siguiente para instalar los paquetes mysql-client (cliente) y mysql (servidor):

yast -i mysql mysql-client

Modificaciones necesarias en el muro cortafuegos.

Es necesario abrir el puerto 3306 por TCP (mysql), pero sólo si requiere hacer conexiones desde anfitriones remotos.

Herramienta system-config-firewall.

Si utiliza el muro cortafuegos predeterminado del sistema, puede ejecutar el siguiente mandato:

system-config-firewall

Habilite el puertos 3306/TCP y aplique los cambios.

Herramienta system-config-firewall habilitando el puerto 3306/TCP pata MySQL
Herramienta system-config-firewall habilitando el puerto 3306/TCP pata MySQL.

Servicio iptables.

Si lo prefiere, también puede utilizar directamente el mandato iptables, ejecutando lo siguiente:

iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
service iptables save

O bien añada lo siguiente al archivo /etc/sysconfig/iptables:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

Y reinicie el servicio iptables:

service iptables restart

Shorewall.

La regla para el archivo /etc/shorewall/rules de Shorewall correspondería a lo siguiente:

#ACTION	SOURCE	DEST	PROTO 	DEST		SOURCE
#				PORT		PORT(S)1
ACCEPT	all	fw	tcp	3306
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

Para aplicar los cambios en Shorewall, ejecute lo siguiente:

service shorewall restart

En openSUSE™ y SUSE™ Linux Enterprise.

Ejecute el mandato yast del siguiente modo:

yast firewall

Y habilite MySQL Server y aplique los cambios. Ésto habilitará todos los puertos necesarios.

Módulo de cortafuegos de YaST, en modo gráfico, habilitando el MySQL™ Server.
Módulo de cortafuegos de YaST, en modo gráfico, habilitando el MySQL Server.

Módulo de cortafuegos de YaST, en modo texto, habilitando MySQL™ Server.
Módulo de cortafuegos de YaST, en modo texto, habilitando MySQL Server.

SELinux y MySQL™, sólo en CentOS, Fedora™ y Red Hat™ Enterprise Linux.

Para que SELinux permita al usuario regular establecer conexiones hacia el zócalo de MySQL™, utilice el siguiente mandato:

setsebool -P allow_user_mysql_connect 1

Para que SELinux permita al servicio mysqld conectarse a cualquier puerto distinto al 3306, utilice el siguiente mandato:

setsebool -P mysql_connect_any 1

Procedimientos.

Iniciar, detener y reiniciar el servicio mysqld.

En CentOS, Fedora™ y Red Hat™ Enterprise Linux.

Para que el servicio de mysqld esté activo en todos los niveles de ejecución, se ejecuta lo siguiente:

chkconfig mysqld on

Para iniciar por primera vez el servicio mysqld y generar la base de datos inicial (mysql), ejecute lo siguiente:

service mysqld start

Para reiniciar el servicio mysqld, ejecute lo siguiente:

service mysqld restart

Para detener el servicio mysqld, ejecute lo siguiente:

service mysqld stop

openSUSE™ y SUSE™ Linux Enterprise.

Para que el servicio de mysql esté activo en todos los niveles de ejecución, se ejecuta lo siguiente:

insserv mysql

Para iniciar por primera vez el servicio mysql y generar la base de datos inicial (mysql), ejecute lo siguiente:

rcmysql start

Para reiniciar el servicio mysql, ejecute lo siguiente:

rcmysql restart

Para detener el servicio mysql, ejecute lo siguiente:

rcmysql stop

Archivos y directorios de configuración.

El archivo /etc/my.cnf es el utilizado para establecer o cambiar opciones permanentes de MySQL. Las bases de datos se almacenan dentro del directorio /var/lib/mysql.

Asignación de contraseña al usuario root en MySQL.

El usuario root en MySQL™, carece de contraseña después de iniciado el servicio por primera vez, por lo cual es muy importante asignar una.

Si necesita poner en producción inmediatamente el servidor, ejecute el mandato mysql_secure_installation para iniciar un asistente que le permitirá asignar una contraseña al usuario root de MySQL, eliminar el usuario anónimo y la base de dato de pruebas (test), eliminar accesos remoto y otros ajustes de seguridad importantes.

mysql_secure_installation

Con lo anterior, recuerde que inicialmente el usuario root carece de contraseña. Cuando se le solicite asignar la contraseña de root se le solcitará la contraseña actual. Sólo pulse la tecla ENTER y luego asigne una nueva contraseña.

En adelante, será necesario añadir la opción -p a cualquier sentencia de línea de mandatos para mysql, mysqladmin y mysqldump para ingresar la contraseña del usuario root y poder, de esta forma, realizar diversas tareas administrativas.

De manera alternativa, puede ejecutar el mandato mysqladmin, con la opción -h con localhost como argumento, la opción -u con root y password como argumentos y la nueva contraseña entre comillas simples:

mysqladmin -u root password 'cualquier-contraseña-que-guste'

Recuperación de la contraseña del usuario root en MySQL.

En caso de que haya olvidado la contraseña del usuario root de MySQL™, detenga el servicio ejecutando service mysqld stop (CentOS, Fedora™ y Red Hat™ Enterprise Linux) o bien rcmysql stop (openSUSE™ y SUSE™ Linux Enterprise).

Ejecute el mandato mysqld_safe con la opción --skip-grant-tables, enviando el proceso a segundo plano:

mysqld_safe --skip-grant-tables &

Ingrese al intérprete de mandato de MySQL™ ejecutando el mandato mysql, sin argumentos u opciones:

mysql

Ejecute lo siguiente:

UPDATE mysql.user
SET Password=PASSWORD('nueva-contraseña')
WHERE User='root';
FLUSH PRIVILEGES;

Salga del intérprete de mandatos de MySQL™ ejecutando lo siguiente:

exit;

Detenga el servicio mysqld ejecutando sólo lo siguiente:

mysqladmin shutdown

Inicie MySQL™ ejecutando service mysqld start (CentOS, Fedora™ y Red Hat™ Enterprise Linux) o bien rcmysql start (openSUSE™ y SUSE™ Linux Enterprise).

Verifique el cambio de contraseña accediendo a MySQL™ con el mandato mysql y la opción -p, e ingrese la nueva contraseña.

mysql -p

Salga del intérprete de mandatos de MySQL™ ejecutando lo siguiente:

exit;

Procure memorizar la nueva contraseña asignada al usuario root de MySQL.

Crear y eliminar bases de datos.

Para crear una nueva base de datos, puede utilizarse el mandato mysqladmin con create como argumento, la opción -u con root como usuario y la opción -p para indicar que se ingresará una contraseña:

mysqladmin -u root -p create basedatos

Para eliminar una base de datos, se utiliza el mandato mysqladmin con drop como argumento en lugar de create, la opción -u con root como usuario y la opción -p para indicar que se ingresará una contraseña:

mysqladmin -u root -p drop basedatos

Respaldo y restauración de bases de datos.

Para respaldar una base de datos desde el anfitrión local, se ejecuta el mandato mysqldump con las opciones --opt (que añade automáticamente las opciones --add-drop-table, --add-locks, --create-options, --quick, --extended-insert, --lock-tables, --set-charset y --disable-keys), la opción -u con el nombre de usuario a utilizar, la opción -p para indicar que se ingresará una contraseña, el nombre de la base de datos, > para guardar la salida estándar (STDOUT) en un archivo y el nombre del archivo donde se guardará el respaldo. Ejemplo:

mysqldump --opt -u root -p basedatos > respaldo.sql

Para restaurar un respaldo, se ejecuta el mandato mysql con las opciones -u con el nombre de usuario con privilegios sobre la base de datos a restaurar, -p para indicar que se utilizará contraseña, el nombre de la base de datos a restaurar, < para indicar que la entrada estándar (STDIN) será un archivo y el nombre del archivo con el respaldo de la base de datos. Ejemplo:

mysql -u root -p basedatos < respaldo.sql

Para respaldar todas la bases de datos hospedadas en MySQL™, se ejecuta el mandato mysqldump con las opciones --opt, --all-databases para indicar que se respaldarán todas la bases de datos, la opción -u con root como usuario, la opción -p para indicar que se utilizará contraseña, el símbolo > para guardar la salida estándar (STDOUT) en un archivo y el nombre del archivo donde se guardará el respaldo. Ejemplo:

mysqldump --opt --all-databases -u root -p > respaldo-todo.sql

Para restaurar todas las bases de datos a partir de un único archivo de respaldo, se ejecuta el mandato mysql con la opción -u con root como usuario, la opción -p para indicar que se utilizará contraseña, el símbolo < para indicar que la entrada estándar (STDIN) será un archivo y el nombre del archivo con el respaldo de todas las bases de datos. Ejemplo:

mysql -u root -p < respaldo-todo.sql

Permisos de acceso a las bases de datos.

Ingrese al intérprete de MySQL™ como el usuario root:

mysql -u root -p

Para asignar los permisos select (seleccionar), insert (insertar), update (actualizar), create (crear), alter (alterar), delete (eliminar) y drop (descartar) sobre las tablas de una base de datos al usuario prueba desde el anfitrión localhost (anfitrión local), se ejecuta algo similar a lo siguiente:

GRANT
 select, insert, update, create, alter, delete, drop
ON
 base-de-datos.*
TO
 usuario@localhost
IDENTIFIED BY
 'contraseña';

Puede otorgar al usuario todos los permisos sobre la base de datos ejecutando lo siguiente:

GRANT
 all
ON
 base-de-datos.*
TO
 usuario@localhost
IDENTIFIED BY
 'contraseña';

Si se requiere permitir el acceso hacia una base de datos desde otro anfitrión en la red de área local, se ejecuta algo similar al ejemplo anterior, pero definiendo el usuario y la dirección IP del anfitrión remoto. Ejemplo:

GRANT
 select, insert, update, create, alter, delete, drop
ON
 directorio.*
TO
 usuario@192.168.70.2
IDENTIFIED BY
 'contraseña';

Puede otorgar al usuario todos los permisos sobre la base de datos ejecutando lo siguiente:

GRANT
 all
ON
 directorio.*
TO
 usuario@192.168.70.2
IDENTIFIED BY
 'contraseña';

Si se requiere permitir el acceso hacia una base de datos desde cualquier anfitrión, se ejecuta algo similar a lo anterior, pero definiendo el nombre del usuario entre comillas simples, arroba y el símbolo % entre comillas simples. Ejemplo:

GRANT
 all
ON
 directorio.*
TO
 'usuario'@'%'
IDENTIFIED BY
 'contraseña-usuario-usuario';

Optimización de MySQL.

Deshabilitar la resolución de nombres de anfitrión.

MySQL mantiene un cache de anfitriones utilizados en la memoria, la cual contiene las direcciones IP, nombres de anfitrión y errores de información asociados a éstos. El cache sólo se utiliza para conexiones TCP remotas con otros anfitriones y jamás lo utiliza para conexiones a través de la interfaz de retorno del sistema (loopback, 127.0.0.1) o conexiones hechas a través del archivo de zócalo, tubería o bien memoria compartida.

Por cada nueva conexión, MySQL™ utiliza la dirección IP del cliente para verificar si el nombre de anfitrión de éste está en el cache de anfitriones. Cuando el nombre es inexistente, MySQL™ intentará resolver el nombre de anfitrión, resolviendo primero la dirección IP, luego resolviendo el nombre, comparando el resultado de la dirección IP original para verificar que correspondan. MySQL™ almacena luego esta información en el cache de anfitriones.

El objetivo del cache es evitar hacer una consulta de DNS por cada conexión de cliente y el almacenamiento de información de errores que ocurren en el proceso de conexión de los clientes. Cuando ocurren demasiados errores desde un anfitrión en particular y se rebasa el valor de la variable max_connect_errors (10, de modo predeterminado), MySQL™ bloquea el acceso desde dicho anfitrión.

Cuando un anfitrión es bloqueado, sólo podrá acceder de nuevo si se reinicia MySQL™ o si se limpia el cache de anfitriones. Este último puede limpiarse ejecutando desde el intérprete de mandatos del sistema lo siguiente:

mysqladmin -p flush-hosts

Cuando se tiene un DNS muy lento o se carece de uno que resuelva el nombre de los anfitriones o bien se tiene demasiados anfitriones haciendo conexiones hacia el servidor MySQL™, deshabilitar el cache de anfitriones o hacer más grande éste, mejora el rendimiento considerablemente. La consecuencia de deshabilitar el cache de anfitriones es que en adelante sólo se podrán otorgar permisos de acceso y realizar conexiones utilizando direcciones IP, es decir utilizando usuario@a.b.c.d en lugar de usuario@anfitrión.dominio.tld.

Para deshabilitar el cache de anfitriones, se requiere editar el archivo /etc/my.cnf:

vi /etc/my.cnf

Y añadir la siguiente opción en la sección [mysqld]:

skip-name-resolve

Para aplicar los cambios, es necesario reiniciar el servicio.

Si se desea hacer más grande el cache de anfitriones, cuyo valor predeterminado es 128 anfitriones, se requiere cambiar el valor de HOST_CACHE_SIZE por cualquier valor entre 0 y 2048 y compilar MySQL™ desde código fuente, motivo por el cual es más práctico deshabilitar el cache de anfitriones.

Aumentar el tamaño de cache de consultas.

Cuando se habilita el cache de consultas en memoria y se dispone de suficiente de ésta, el desempeño del servidor MySQL™ se incrementa considerablemente. El valor predeterminado del tamaño cache de consultas (query_cache_size) es 0, lo que significa que está desactivado. Los valores permitidos son múltiplos de 1024 (bytes). Si, por ejemplo, se desea establecer un tamaño de cache de consultas de 32 MiB, el valor sería 33882112 bytes.

Ingrese al intérprete de MySQL™ como el usuario root:

mysql -u root -p

Verifique el valor de la variable query_cache_size ejecutando lo siguiente:

SHOW VARIABLES LIKE '%query_cache%';

La salida será similar a la siguiente:

+------------------------------+---------+
| Variable_name                | Value   |
+------------------------------+---------+
| have_query_cache             | YES     |
| query_cache_limit            | 1048576 |
| query_cache_min_res_unit     | 4096    |
| query_cache_size             | 0       |
| query_cache_type             | ON      |
| query_cache_wlock_invalidate | OFF     |
+------------------------------+---------+
6 rows in set (0.00 sec)

Ejecute lo siguiente para cambiar el valor de query_cache_size a 32 MiB:

SET GLOBAL query_cache_size = 33882112;

Verifique el cambio ejecutando lo siguiente:

SHOW VARIABLES LIKE '%query_cache%';

La salida será similar a la siguiente:

+------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| have_query_cache             | YES      |
| query_cache_limit            | 1048576  |
| query_cache_min_res_unit     | 4096     |
| query_cache_size             | 33882112 |
| query_cache_type             | ON       |
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+
6 rows in set (0.00 sec)

Salga del intérprete de MySQL.

exit;

El cambio prevalecerá hasta que sea reiniciado MySQL. Para que el cambio sea permanente, se requiere editar el archivo /etc/my.cnf:

vi /etc/my.cnf

Y añadir la siguiente opción en la sección [mysqld]:

query_cache_size = 33882112

Para aplicar los cambios, es necesario reiniciar el servicio. Ejecute:

service mysqld restart

Para verificar el estado del cache de consultas, ingrese al intérprete de mandatos de MySQL™:

mysql -u root -p

A fin de generar algo de actividad, realice algunas consultas al azar hacia cualquier base de datos MySQL™ hospedada en el servidor. Sólo la primera consulta que haga siempre será un poco más lenta que las subsecuentes. El resto de las consultas deberán ser más rápidas.

Para verificar el estado del cache de consultas, vuelva a ingresar ingresar al intérprete de mandatos de MySQL™:

mysql -u root -p

Desde el intérprete de mandatos de MySQL™ ejecute lo siguiente:

SHOW STATUS LIKE '%Qcache%';

La salida puede ser similar a la siguiente:

+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Qcache_free_blocks      | 1        | 
| Qcache_free_memory      | 33864568 | 
| Qcache_hits             | 0        | 
| Qcache_inserts          | 0        | 
| Qcache_lowmem_prunes    | 0        | 
| Qcache_not_cached       | 61       | 
| Qcache_queries_in_cache | 0        | 
| Qcache_total_blocks     | 1        | 
+-------------------------+----------+
8 rows in set (0.00 sec)

Soporte para UTF-8.

Algunas aplicaciones, como vTigerCRM, requieren se configuré UTF-8 como codificación predeterminada de MySQL. Edite el archivo /etc/my.cnf:

vi /etc/my.cnf

Añada las siguientes líneas resaltadas:

[mysql]
default-character-set=utf8

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
skip-name-resolve
query_cache_size = 33882112
collation_server=utf8_unicode_ci
character-set-server=utf8
init_connect='SET collation_connection = utf8_general_ci'
init_connect='SET NAMES utf8'

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

Al terminar, sólo es necesario reiniciar el servicio mysqld para que surtan efecto los cambios.

service mysqld restart

Bibliografía.

Última Edición: 29/03/2014, 12:13|Hits: 222,412 Ver la versión para imprimir