4. MySQL

Debe instalar los paquetes mysql-client-5.1.54p0 y mysql-server-5.1.54p3. Tras instalar el servidor debe ejecutar mysql_install_db.

Inicialice el directorio donde estarán las bases de datos con

sudo /usr/local/bin/mysql_install_db
      

Después agregue a /etc/login.conf:

mysql:\
	:openfiles-cur=2048:\
	:openfiles-max=4096:\
	:tc=daemon:

que creará una clase de login ---tenga en cuenta no dejar espacios al final de cada línea y que desde la segundan comiencen con el caracter tabulador. A continuación regenere el archivo binario /etc/login.conf.db con

cd /etc
sudo cap_mkdb /etc/login.conf 

A continuación en /etc/rc.local agregue:

pgrep mysqld > /dev/null
if [ "$?" != 0  -a \
    	-x /usr/local/bin/mysqld_safe ]; then
    echo -n ' mysqld';      
    su -c mysql root -c '/usr/local/bin/mysqld_safe >/dev/null 2>&1 &'
fi
    

y después lance el servidor como se muestra desde la línea de comando[31] para iniciar el servidor (los errores quedarán en /var/mysql/host.err). Después puede establecer una clave para el usuario root de MySQL cuando ingresa desde localhost con:

/usr/local/bin/mysqladmin -u root  password 'nueva-clave' 
/usr/local/bin/mysqladmin -u root -h Jesus.miescuela.edu.co password 'nueva-clave'
    

Después puede iniciar una sesión, crear bases de datos, crear usuarios y otorgarles privilegios.

Para apagar el servidor mysql:

mysqladmin -u root -p shutdown
    

Si desea usar mysql con php, instale además de los paquetes básicos de php (php5-core-v y php5-extensions-v) el paquete (php5-mysql-v)

4.1. Uso básico

mysql -u root -p 
    

puede crear la base de datos datos, y un usuario erfurt que la pueda administrar (i.e con todos los privilegios excepto GRANT) y con clave vsewf usando:

CREATE DATABASE datos;
GRANT ALL PRIVILEGES ON datos.* TO erfurt@localhost IDENTIFIED BY 'vsewf';
    

Algunas operaciones usuales del administrador son:

SHOW DATABASES;
    

que muestra todas las bases disponibles.

USE base1;
    

que permite usar la base base1.

SHOW TABLES;
    

que muestra todas las tablas de la base activa.

DESCRIBE tabla;
SHOW CREATE TABLE tabla;
    

que presentan estructura de la tabla.

4.2. Cambio de la clave de administrador

Si olvida la clave de root después de haberla establecido puede cambiarla entrando a la cuenta de administrador:

  • Detenga el servidor.

  • Inicie el servidor con /usr/local/libexec/mysqld --user=root --skip-grant-tables

  • Ejecute:

    # mysql
    mysql> use mysql
    mysql> update user set password=password('supercosa') where user='root';
    mysql> flush privileges;
    mysql> exit
    	
  • Vuelva a apagar el servidor y reinicielo con: /usr/local/bin/mysqld_safe &

4.3. Recuperación y backups

MySQL mantiene bases de datos en directorios y las tablas en archivos. No es recomendable que modifique tales archivos, al menos no, mientras el servidor esté activo.

Para sacar una copia de respaldo de todas las bases de datos con:

# mysqldump --force -p --all-databases > /respaldomysql/dump-1nov2007.sql
	  

y posteriormente restaurarla con:

# mysql < /respaldomysql/dump-1nov2007.sql
	  

4.4. MySQL y Apache con chroot

Puede emplear aplicaciones para Apache en modo chroot que usen bases de datos MySQL de tres formas: (1) Conectándose a un puerto TCP/IP donde responda MySQL, (2) poniendo el socket de MySQL en un directorio dentro de la jaula de Apache o (3) Corriendo MySQL en modo chroot.

4.4.1. Socket en la jaula de Apache

Una vez instale mysql-server cree el directorio en el cual ubicará el socket, digamos:

mkdir -p /var/www/var/run/mysql/
chown _mysql:_mysql /var/www/var/run/mysql/
chmod a+w /var/www/var/run/mysql/
chmod +t /var/www/var/run/mysql/
			  

y después inicie MySQL indicando la ruta del socket con la opción --socket, por ejemplo para que el cambio se efectúe en cada inicio, edite /etc/rc.conf.local para agregar:

mysqld_flags="--socket=/var/www/var/run/mysql/mysql.sock"

e inicie desde /etc/rc.local con:

pgrep mysqld > /dev/null
if [ "$?" != 0  -a X"${mysqld_flags}" != X"NO" -a \
	-x /usr/local/bin/mysqld_safe ]; then
	echo -n ' mysqld ' 
	/usr/local/bin/mysqld_safe ${mysqld_flags} &
fi

Sus aplicaciones PHP pueden entonces conectarse con:

$dbhost  = "localhost";
$dbuname = "miusuario";
$dbpass  = "miclave";
mysql_connect($dbhost, $dbuname, $dbpass);

Tenga en cuenta también que otros binarios de MySQL también requerirán la opción --socket=/var/www/var/run/mysql/mysql.sock al ejecutarse por ejemplo:

# mysqldump --socket=/var/www/var/run/mysql/mysql.sock  
		\-p --all-databases
	

4.4.2. Corriendo MySQL chroot

Asumimos un servidor apache corriendo chroot en /var/www/ Nos proponemos instalar chroot en /var/www/ el servidor mysql.

He tomado como base el documento [SecMySQL] Este fue mi punto de partida, pero sobre la marcha hubo que añadirle cosas a este procedimiento. A continuación traduzco la parte pertinente y escribo las modificaciones en naranja.

Nota: Este procedimiento surgió para Mauricio Rivera a través de un método de ensayo y error con base en documento que explicaba como instalar el servidor mysql en un freebsd. Después de varias pruebas logré correr el servidor mysql y conectarlo a traves de apache, seguramente la configuración no es la única ni la óptima pero fue una que me funcionó.

4.4.2.1. Volviendo chroot el servidor

El primer paso para volver seguro a MySQL es preparar el ambiente de cambio de directorio, ambiente en el cual el servidor MySQL irá a correr. En nuestro caso /var/www/ era el chroot.

4.4.2.2. Sistema operativo

Como en artículos previos, el sistema operativo elegido es FreeBSD 4.7. Sin embargo, los métodos presentados deberán de poder aplicarse en la mayoría de sistemas UNIX modernos.

4.4.2.3. 3.2 Preparar el ambiente chroot

En orden a preparar el ambiente chroot, debemos crear la siguiente estructura de directorios:

mkdir -p /var/www/dev
mkdir -p /var/www/etc
mkdir -p /var/www/tmp
mkdir -p /var/www/var/tmp
mkdir -p /var/www/usr/local/mysql/libexec

mkdir -p /var/www/usr/local/share/mysql/english
mkdir -p /var/www/var/run/mysql
mkdir -p /var/www/var/mysql/

4.4.2.4. Establecer derechos de acceso

The access rights to the above directories should be set as follows:

chown -R root.daemon /var/www/
chmod -R 755 /var/www/
chmod 1777 /var/www/tmp

4.4.2.5. Crear estructura del directorio

A continuación, los siguientes archivos han sido copiados en la nueva estructura de directorio:

cp /usr/local/libexec/mysqld 
/var/www/usr/local/mysql/libexec/
cp /usr/local/share/mysql/english/errmsg.sys
/var/www/mysql/usr/local/share/mysql/english/
cp /etc/hosts /var/www/etc/
cp /etc/host* /var/www/etc/
cp /etc/resolv.conf /var/www/etc/
grep mysql /etc/group > /var/www/etc/group
grep mysql /etc/master.passwd > /var/www/etc/master.passwords
grep mysql /etc/passwd > /var/www/etc/passwd
	
4.4.2.6. Filtrar archivos de passwords y grupos

De los archivos: /var/www/etc/passwords y /var/www/etc/group debemos eliminar todas las líneas excepto las de la cuenta de mysql (este es _mysql). Esto ya se preparo con el grep anteriro. Luego, debemos construir la base de datos de contraseñas:

cd /var/www/etc
pwd_mkdb -d /var/www/mysql/etc passwords
rm -rf /var/www/etc/master.passwd

4.4.2.7. Consideraciones especiales

Igual que en el caso del servidor Apache, debemos crear un archivo de dispositivo especial /dev/null:

ls -al /dev/null
crw-rw-rw-  1 root  sys    2,   2 Jun 21 18:31 /dev/null
mknod /var/www/dev/null c 2 2
chown root.sys /var/www/dev/null
chmod 666 /var/wwww/dev/null

Debemos de copiar la base de datos mysql, la cual contiene tablas creadas durante la instalacion de MySQL:

cp -R /var/mysql/* /var/www/var/mysql/
chown -R _mysql._mysql /var/www/var/mysql/

4.4.2.8. Corriendo el servidor

Ejecutamos la orden:

mysqld_safe --user=_mysql --chroot=/var/www --datadir=/var/mysql &
		 

Comprobamos que el servidor MySQL ese corriendo:

ps -aux|grep -i mysql
		 

Corremos el cliente mysql, tenemos decirle que use un diferente socket:

mysql -S /var/www/var/run/mysql/mysql.sock
			 

aseguramos el acceso al servidor mysql con una clave:

mysqladmin -S /var/www/var/run/mysql/mysql.sock password 'clave_secreta'

Hacemos que el servidor mysql arranque cada vez que arranque el servidor, agregamos la anterior linea al final del archivo /etc/rc.local:

mysqladmin -S /var/www/var/run/mysql/mysql.sock password 'clave_secreta'

4.4.2.9. Habilitando php en el servidor apache

Instalar paquete principal de PHP:

pkg_add php4-core-4.3.5RC3.tgz
			 

Crear directorios donde iran las librerias de php para apache:

mkdir -p /chroot/usr/local/lib/php
			 

Copiar la libreria libphp4.so al directorio correspondiente en el /chroot:

cp -p /usr/local/lib/php/libphp4.so /chroot/usr/local/lib/php/

4.4.2.10. Habilitando mysql con php en el servidor apache

Instalar paquete php4-mysql-4.3.5RC3:

pkg_add php4-mysql-4.3.5RC3.tgz
		 

Nota: A modo de prueba copié ciertas librerias mysql a chroot, que pueden necesitar en el chroot:

mkdir -p /chroot/usr/local/lib/mysql/
cp -p /usr/local/lib/mysql/* /chroot/usr/local/lib/mysql/

4.5. Lecturas recomendadas

Referencias:



[31] mysqld_safe se encargará de iniciar el servidor desde el usuario _mysql, grupo _mysql creados automáticamente durante la instalación del paquete.