MySQL

De Astillas.net

Enlaces y referencias

Recetario

Contraseña del administrador perdida

Apuntes obtenidos de la documentación oficial.

  • Detener el servidor mysqld y arrancarlo con el parámetro --skip-grant-tables. Esto permite a cualquiera conectar sin contraseña y con todos los privilegios.
  • Conectar empleando el cliente mysql.
  • Cambiar la contraseña del administrador con la siguiente instrucción:
mysql> UPDATE mysql.user SET Password=PASSWORD('NuevaContraseña') WHERE User='root';
  • Recargar las tablas de derechos de acceso con:
mysql> FLUSH PRIVILEGES;
  • Comprobar que se puede utilizar la nueva contraseña con la cuenta Root.
  • Detener el servidor y arrancarlo de nuevo con sus parámetros habituales.

Cambiar contraseña a un usuario

Leído en la documentación oficial, se puede hacer el cambio de varias formas, pero en todas ellas conviene emplear la función PASSWORD() para asegurarnos de que la contraseña se cifra antes de guardarla en la base de datos.

SET PASSWORD

Con esta orden se puede cambiar la contraseña de cualquier usuario si la sesión la iniciamos como administrador (obviamente) y empleamos la claúsula FOR.

mysql> SET PASSWORD FOR 'victor@%' = PASSWORD('contraseña');

o la del propio usuario si se excluye dicha claúsula:

mysql> SET PASSWORD = PASSWORD('contraseña');

Modificando la tabla user

Si se entra como administrador se puede crear una cuenta con su contraseña insertando una fila como la siguiente:

mysql> INSERT INTO user (Host,User,Password)
    -> VALUES('%','victor',PASSWORD('contraseña'));
mysql> FLUSH PRIVILEGES;

y si la cuenta ya existe se puede cambiar la contraseña con:

mysql> UPDATE user SET Password = PASSWORD('contraseña')
    -> WHERE Host = '%' AND User = 'victor';
mysql> FLUSH PRIVILEGES;

Creación de base de datos

Para crear una base de datos de nombre DATABASE empleamos el acceso de administrador (o de un usuario privilegiado) y ...

mysql> create database DATABASE character set utf8;

Después, si queremos dar acceso a un usuario en concreto sobre la base de datos usamos:

mysql> create user USERNAME;
mysql> set password for USERNAME = PASSWORD('CONTRASEÑA');
mysql> grant all on DATABASE to 'USERNAME'@'localhost';

Operaciones cotidianas

Las siguientes secciones listan algunas operaciones que se pueden realizar una vez conectados con la base de datos y que siempre se me olvidan.

El programa cliente en consola para la base de datos se llama mysql y se emplea así:

$ mysql -h server -u user -p database
Enter password: 
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 117
Server version: 5.0.51a-24+lenny5 (Debian)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> 

Listado de bases de datos

La orden show databases; permite ver las bases de datos a las que tiene acceso el usuario activo en la sesión.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema | 
| clipperz           | 
+--------------------+
2 rows in set (0.00 sec)

mysql> 

Listado de tablas

La orden show tables; permite ver las tablas de la base de datos con la que estamos conectados.

mysql> show tables;
+-----------------------+
| Tables_in_clipperz    |
+-----------------------+
| base64_data           | 
| onetimepassword       | 
| onetimepasswordstatus | 
| record                | 
| recordversion         | 
| user                  | 
+-----------------------+
6 rows in set (0.00 sec)

mysql> 

Información de estado

Para ver en un vistazo toda la información acerca de la sesión empleamos la orden status;:

mysql> status;
--------------
mysql  Ver 14.12 Distrib 5.0.51a, for debian-linux-gnu (i486) using readline 5.2

Connection id:          97
Current database:       clipperz
Current user:           clipperz@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
...
...
mysql> 

Programas cliente sin contraseña

Los diferentes programas cliente de MySQL (mysql, mysqladmin, mysqldump, ...) pueden recibir de varias formas la contraseña de acceso al servidor de bases de datos:

Parámetro --password con contraseña
Rápido y sencillo, pero inseguro ya que queda almacenado en la lista de parámetros del proceso que puede consultarse después con el programa ps.
Parámetro --password sin contraseña
Entrada de la contraseña vía terminal. Más seguro que el anterior pero inútil en programas no interactivos; si además la conexión es remota ésta debe asegurarse por otro lado.
Variable de entorno MYSQL_PWD
Método muy inseguro y poco flexible. El entorno de un proceso es más consultable aún que su línea de órdenes.
Archivo de configuración .my.cnf
La forma más segura de proporcionar una contraseña a este programa. El archivo debe contener una sección concreta llamada client, por defecto se le busca en $HOME/.my.cnf y debe tener permisos únicamente para el propietario. Tiene la ventaja adicional de poder cambiarlo de ruta empleando la opción --defaults-file=path.

Así pues queda que teniendo un archivo como

[client]
password=my super segura contraseña

se puede llamar al programa de esta forma

$ mysql --defaults-file=mysql-options

Intentando que sea el primer parámetro porque algunos programas tienen problemas en cualquier otro órden.

Salvando la base de datos con bacula

Desde el punto de vista de bacula (y de otros muchos programas) salvar los archivos físicos de MySQL no tiene sentido porque no son recuperables directamente; esto es, no basta con restaurarlos en su sitio para volver a tener las bases de datos en línea. En su lugar es necesario ejecutar un programa que extraiga una versión portable de las bases de datos y sobre la que se pueda leer.

En la documentación oficial de bacula se muestran dos formas de efectuar dicha extracción de datos:

  • Volcados completos
  • Registros binario de cambios

Volcados completos

Este tipo de extracción consiste en obtener el habitual volcado de instrucciones SQL para crear las tablas y rellenarlas con datos. Tiene varios inconvenientes, entre ellos la necesidad de que se cumplan ciertas condiciones para asegurar un volcado consistente; una de ellas es que los programas empleen transacciones.

Su uso es bastante habitual y basta con ejecutar el siguiente programa con los permisos adecuados por cada base de datos:

$ mysqldump --opt -u USER -p PASSWORD bacula > database-bacula.sql 

En este caso lo aconsejable es que el archivo final se comprima y se almacene en un directorio dentro del juego de archivos que bacula salvará más tarde.

Registro binario de cambios

Desde la versión 5 MySQL tiene la capacidad de producir registros de cambios en las bases de datos de forma segura y portable. Este registro tiene como propósito mejorar la replicación de datos entre servidores facilitar la recuperación de datos.

Para usar el registro de cambios es necesario retocar la configuración del servidor, además de ciertas repercusiones en su rendimiento puesto que se ve penalizado en cierta forma, y con respecto a la seguridad pues los registros pueden contener contraseñas y otra información sensible.

El servidor mysqld debe arrancar con el parámetro

--log-bin

en su configuración. Este parámetro puede incluir una ruta base para almacenar los registros y si no se define se empleará el valor de pid-file y el sufijo -bin.

La documentación de bacula aconseja que se emplee el programa mysqldump con los siguientes parámetros

$ mysqldump -u USER -p PASSWORD --single-transaction --flush-logs \
  --master-data=2 --all-databases --delete-master-logs > $DUMPDIR/dump.$$.sql

para obtener una copia completa (full) o diferencial (diferential) de todas las bases de datos.

Para el día a día de las copias incrementales sugiere emplear mejor el programa mysqladmin

$ mysqladmin -u USER --password=PASSWORD flush-logs

Al emplear este mecanismo se puede indicar que el directorio donde se guardan los registros de cambios sea incluído como origen en el trabajo de copia. Una opción interesante puede ser el directorio /var/lib/mysql-dump con los permisos más restrictivos posibles.

Más artículos sobre copias de seguridad

Recuperando la base de datos

Para recuperar la base de datos después de una catástrofe se deben seguir estos pasos:

  1. Recuperar los programas de MySQL: bien sea mediante las copias de seguridad, bien mediante nueva instalación. Recordar también restaurar la configuración en /etc/mysql/*.
  2. Recuperar los archivos de salvaguarda de la base de datos. Generalmente son de dos tipos: instrucciones SQL y archivos binarios de cambios (sólo si se ha optado por usarlos).
  3. Alimentar al programa mysql con los archivos SQL que forman la copia completa
    shell> mysql < full_backup.sql
  4. Convertir los registros binarios de cambios en instrucciones SQL y repetir el paso anterior
    shell> mysqlbinlog archivos_de_registro | mysql
  5. Poner en marcha la base de datos.