ADMINISTRACIÓN DE USUARIOS EN MYSQL

* Nombre de usuario:

Cuando creamos un nuevo usuario en MySQL, éste queda identificado por su
nombre de usuario más el nombre o IP del ordenador desde el cual hemos dicho
que accederá (podemos utilizar el carácter comodín ‘%’ para representar
varios ordenadores). La sintaxis es:

usuario@ordenador

Ejemplos de usuarios:

pepito
pepito@’%’
pepito@localhost
pepito@’192.168.0.%’
pepito@’%.midominio.org’

Por ejemplo, el usuario ‘pepito@localhost’ se considera diferente del usuario
‘pepito@192.168.0.%’, aunque tengan el mismo nombre ‘pepito’, y por lo tanto
pueden tener permisos diferentes.

* Ver los usuarios:
SELECT User,Host,Password FROM mysql.user;

* Crear un usuario:
CREATE USER usuario [IDENTIFIED BY ‘contraseña’] [, usuario [IDENTIFIED BY ‘contraseña’]] …

Ejemplos:
CREATE USER Pepito IDENTIFIED BY ‘Griyo’;
CREATE USER Anonimo@localhost;
CREATE USER Alumno@’192.168.0.%’ IDENTIFIED BY ‘Alumno’;

* Borrar un usuario:
DROP USER usuario [, usuario] …

Ejemplos:
DROP USER Anonimo;

* Cambiar el nombre de un usuario:
RENAME USER viejo_usuario TO nuevo_usuario [, viejo_usuario TO nuevo_usuario] …

Ejemplos:
RENAME USER Pepito TO Pepito@127.0.0.1;

* Cambiar la contraseña de un usuario:
SET PASSWORD FOR usuario = PASSWORD(‘contraseña’)

Ejemplos:
SET PASSWORD FOR Pepito = PASSWORD(‘Grillo’)

* Ver los privilegios de un usuario:
SHOW GRANTS FOR usuario

Ejemplos:
SHOW GRANTS FOR root;
SHOW GRANTS FOR Pepito;

* Otorga privilegios a un usuario:
GRANT privilegios ON base_datos.tabla(columnas) TO usuario;

Sintaxis ampliada:
GRANT privilegios [(columnas)] [, privilegios [(columnas)]] …
ON [objecto] {tabla | * | *.* | basedatos.*}
TO usuario [IDENTIFIED BY [PASSWORD] ‘contraseña’] [, usuario [IDENTIFIED BY [PASSWORD] ‘contraseña’]] …
[REQUIRE NONE | [{SSL| X509}] [CIPHER ‘cipher’ [AND]] [ISSUER ‘issuer’ [AND]] [SUBJECT ‘subject’]]
[WITH opcion [opcion] …]

privilegios = ALL, ALTER, CREATE, CREATE USER, CREATE VIEW, DELETE, DROP, EXECUTE, INDEX, INSERT,
LOCK TABLES, RELOAD, SELECT, SUPER, UPDATE, GRANT OPTION, …

objecto = TABLE | FUNCTION | PROCEDURE

opcion = GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count

Ejemplos:
GRANT UPDATE, INSERT, SELECT ON world.City TO pepito@localhost;
GRANT UPDATE, INSERT, SELECT ON world.City TO fulanito@localhost IDENTIFIED BY ‘nuevapasswd’, tu@equipo.remoto.com;
GRANT UPDATE, INSERT, SELECT ON world.Country TO pepito@’%.empresa.com’, fulanito@’%’, menganito;
GRANT UPDATE, INSERT, SELECT ON world.Country TO pepito@192.168.10.111, fulanito@’192.168.10.%’, menganito;
GRANT UPDATE(Population), SELECT(Name, Population) ON world.Country TO pepito@localhost;
GRANT SELECT ON world.* TO pepito@’%’ REQUIRE ssl;
GRANT SELECT ON world.* TO pepito@’%’ WITH MAX_CONECTIONS_PER_HOUR 3 MAX_QUERIES_PER_HOUR 300 MAX_UPDATES_PER_HOUR 30;
GRANT ALL ON *.* TO operador@localhost
GRANT ALL ON *.* TO operador@localhost WITH GRANT OPTION;

* Elimina privilegios de un usuario:
REVOKE privilegios ON base_datos.tabla(columnas) FROM usuario;

Sintaxis ampliada:
REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] …
ON [object_type] {tbl_name | * | *.* | db_name.*} FROM user [, user] …

REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] …

Ejemplos:
REVOKE ALL ON *.* FROM pepito@localhost;

* Todos los privilegios se guardan en las tablas ‘user’, ‘db’, ‘tables-priv’,
‘columns_priv’ y ‘host’ de la base de datos ‘mysql’. Se pueden realizar las
modificaciones directamente sobre estas tablas, para obtener los mismos
resultados que con GRANT, REVOKE, DROP o SET PASSWORD:

USE mysql;
SHOW TABLES;
DESCRIBE user;
DESCRIBE db;
DESCRIBE tables_priv;
SELECT User, Host, Select_priv FROM user WHERE User = ‘pepito’;
UPDATE user SET Password = PASSWORD(‘nuevapasswd’) WHERE User = ‘pepito’ AND Host = ‘localhost’;
FLUSH PRIVILEGES;
DELETE FROM user WHERE User = ‘pepito’ AND Host = ‘localhost’;
FLUSH PRIVILEGES;
DELETE FROM user WHERE Password = »;
FLUSH PRIVILEGES;

* Podemos iniciar el servidor pidiéndole que no tenga en cuenta los privilegios
otorgados a los usuarios. Por ejemplo, si hemos olvidado la contraseña del
administrador de la base de datos y necesitamos poner una nueva:

mysqld –skip-grant-tables –skip-networking
mysql -e «UPDATE mysql.user SET Password = PASSWORD(‘nuevo’) WHERE User = ‘root'»

* De nada sirve controlar los privilegios de los usuarios dentro del servidor
de bases de datos si fuera del servidor, en el entorno del sistema operativo,
estos usuarios tienen libre acceso al sistema de ficheros. Para evitarlo
debemos vigilar los permisos de acceso de los siguientes archivos:
– Las bases de datos y sus tablas, para que usuarios no autorizados no puedan
acceder a ellas directamente.
– Ficheros de logs y de estado, para que usuarios no autorizados no puedan
acceder a ellas directamente.
– Ficheros de configuracion, para que usuarios no autorizados no puedan
reemplazarlos o modificarlos.
– Programas y scripts que manejan y acceden a bases de datos, para que
los usuarios no puedan reemplazarlos o modificarlos.

* Una capa adicional de seguridad nos la da encriptar los datos que escribimos
y leemos de la base de datos, mediante las funciones ENCODE(), DECODE(),
DES_ENCRYPT(), DES_DECRYPT(), AES_ENCRYPT(), AES_DECRYPT(), y PASSWORD();

* Lecturas para profundizar:
– http://dev.mysql.com/doc/refman/5.0/es/user-account-management.html
– http://dev.mysql.com/doc/refman/5.0/es/account-management-sql.html
– http://dev.mysql.com/doc/refman/5.0/es/privilege-system.html
– http://dev.mysql.com/doc/refman/5.0/es/encryption-functions.html

 

Se espera que para la version de PHP 6 el módulo de Mysql sea eliminado

Una importante noticia hemos recibido , y es que a través del sitio web www.phpclasses.org nos enteramos que la gente responsable del desarrollo del lenguaje PHP, el mas utilizado para el desarrollo de webs en toda la internet mundial, ha decidido poner en deprecated de tal manera que a partir de dicha version se obligaria a los programadores a migrar a otros gestores de bases de datos, como Posgress, por ejemplo.

En este caso las funciones mysql_pconnect, mysql_query, entre otras quedarían afectadas,lo mas posible es que sea por la actitud de los nuevos dueños de MySQL quienes cada vez cierran el proyecto libre inicial y lo manejan como un sentido crematístico.

phpMyAdmin 3.4 disponible

phpMyAdmin 3.4 es la nueva versión de este gestor de bases de datos web bajo la licencia GPL desarrollado para manejar MySQL.

El lanzamiento de esta nueva versión de la herramienta de libre distribución en PHP, cuenta además de ciertas mejoras con las que se ha simplificado la interfaz para importación/exportación, la inclusión de Ajax con el que evitar la recarga de las páginas de forma completa, o un nuevo visual query builder que nos permita construir de forma sencilla las consultas SQL.

phpMyAdmin 3.4 requiere como mínimo de PHP 5.2 y MySQL 5, al igual que sucediera con la versión anterior.

Interesados pueden disponer de la última versión phpMyAdmin 3.4 desde www.phpmyadmin.net.

fuente desarrolloweb

MySQL 5.6, ya viene

MySQL 5.6 es la próxima versión de la base de datos de código abierto más popular en todo el mundo que Oracle presentó durante MySQL Users Conference 2011.

Debido a sus correcciones, a sus nuevas funciones, a las mejoras en el motor de almacenamiento InnoDB, al incremento del rendimiento o de la escalabilidad, MySQL 5.6 espera convertirse en la mejor versión del sistema de gestión de bases de datos.

La última versión estable de la alternativa a SQL Server de Microsoft, MySQL 5.5, fue liberada el pasado mes de diciembre. Por el momento, Oracle no ha dado a conocer una fecha oficial para el lanzamiento de MySQL 5.6 final.

Aquellos que lo deseen, pueden acceder al listado de novedades de MySQL 5.6 desde Whats New in MySQL 5.6.

Interesados pueden acceder a MySQL 5.6 Release candidate desde mysql.com/downloads.

Administradores de Bases de Datos para la Web

El World Wide Web quizá sea una de las mayores fuentes de información a la que hoy podemos dirigirnos: teniendo a disposición una conexión a Internet y un navegador Web, un software común de cualquier ordenador, tenemos la posibilidad de consultar un patrimonio de cientos de millones de páginas a propósito de cualquier argumento que nos interese.

A menudo, estas páginas no son documentos estáticos, sino que se crean dinámicamente cuando las invocamos, y las informaciones que contienen se extraen de una base de datos. Si se trata de una base de datos relacional (veremos a continuación qué significa esto), es probable que el lenguaje usado para recuperar las informaciones que se nos muestran sea SQL (Structured Query Language).

Antes de ocuparnos de qué es y cómo se usa SQL intentemos entender qué se entiende con la expresión database, que a menudo en español se traduce como «base de datos».
Una base de datos es una colección de datos que es gestionada y organizada por un software específico, el DBMS (DataBase Management System, Sistema de Gestión de DataBase). Un DBMS es sustancialmente un software que se coloca entre el usuario y los datos como tales. Gracias a este estrato intermedio el usuario y las aplicaciones no acceden a los datos tal y como se memorizan efectivamente, es decir a su representación física, sino que se ve sólo una representación lógica. Esto permite un grado elevado de independencia entre las aplicaciones y la memorización física de los datos. El administrador de la base de datos, si lo necesita, puede decidir memorizar los datos de un modo diferente o incluso cambiar el DBMS sin que las aplicaciones, es decir los usuarios, se resientan. Lo importante es que no cambie la representación lógica de esos datos, que es la única cosa que los usuarios conocen. Esta representación lógica se conoce como ‘Esquema de la base de datos’ y es la forma de representación de los datos de más bajo nivel a la que un usuario de la base de datos puede acceder. Por ejemplo, en la Figura 1 está representada una situación en la que el administrador de la base de datos ha decidido que, por motivos de eficacia, era necesario cambiar el disco en el que se habían memorizado algunos datos, repartiéndolos, además, en más discos para permitir accesos paralelos a subconjuntos de datos independientes. Desde el punto de vista del usuario, no ha cambiado absolutamente nada y probablemente ni siquiera conoce el cambio que se ha producido.

La característica principal según la cual los DBMS se clasifican es la representación lógica de los datos que muestran a sus usuarios. Con el paso de los años, se han adoptado numerosos modelos para los datos, al frente de los cuales existen diversos tipos de bases de datos. Los más comunes son:

Bases de datos jerárquicos: los datos se organizan en grupos unidos entre ellos por relaciones de «posesión», en las que un conjunto de datos puede tener otros conjuntos de datos, pero un conjunto puede pertenecer sólo a otro conjunto. La estructura resultante es un árbol de conjuntos de datos.

Bases de datos reticulares: el modelo reticular es muy parecido al jerárquico, y de hecho nace como una extensión de este último. También en este modelo conjuntos de datos están unidos por relaciones de posesión, pero cada conjunto de datos puede pertenecer a uno o más conjuntos. La estructura resultante es una red de conjuntos de datos.

Bases de datos relacionales: las bases de datos que pertenecen a esta categoría se basan en el modelo relaciones, cuya estructura principal es la relación, es decir una tabla bidimensional compuesta por líneas y columnas. Cada línea, que en terminología relacional se llama tupla, representa una entidad que nosotros queremos memorizar en la base de datos. las características de cada entidad están definidas por las columnas de las relaciones, que se llaman atributos. Entidades con características comunes, es decir descritas por el mismo conjunto de atributos, formarán parte de la misma relación.

Base de datos por objetos (object-oriented): el esquema de una base de datos por objetos está representado por un conjunto de clases que definen las características y el comportamiento de los objetos que poblarán la base de datos. La diferencia principal respecto a los modelos examinados hasta ahora es la no positividad de los datos. En efecto, con una base de datos tradicional (entendiendo con este término cualquier base de datos no por objetos), las operaciones que se tienen que efectuar en los datos se les piden a las aplicaciones que los usan. Con una base de datos object-oriented, al contrario, los objetos memorizados en la base de datos contienen tanto los datos como las operaciones posibles con tales datos. En cierto sentido, se podrá pensar en los objetos como en datos a los que se les ha puesto una inyección de inteligencia que les permite saber cómo comportarse, sin tener que apoyarse en aplicaciones externas.

Los primeros dos tipos de bases de datos, los jerárquicos y reticulares, hoy ya casi pertenecen a la historia de la informática.
La mayor parte de las bases de datos que hoy se usan pertenece a la categoría de las bases de datos relacionales. Los motivos de este éxito (también comercial) hay que buscarlos en el rigor matemático y en la potencialidad expresiva del modelo relacional en que se basan, en su facilidad de uso y, último pero no menos importante, en la disponibilidad de un lenguaje de interrogación estándar, el SQL, que, al menos potencialmente, permite que se desarrollen aplicaciones independientes del DBMS concreto relacional que se use.
Las bases de datos por objetos son la nueva frontera en la investigación sobre las bases de datos; efectivamente, sus características de extendibilidad, que se derivan de la posibilidad de definir nuevos tipos de datos y comportamientos, las hacen particularmente apetecibles para todas las aplicaciones que usan datos complejos, como por ejemplo imágenes, sonidos o ambos coordinados. Por desgracia, la falta de un modelo universalmente aceptado para los objetos, así como que no exista un lenguaje de interrogación estándar, hace que cada productor implemente la propia visión específica, a menudo absolutamente incompatible con las otras. Recientemente, han aparecido en el mercado algunas bases de datos definidas como object-relational, que intentan introducir en el modelo relacional las características de extendibilidad propias de las bases de datos object-oriented.

Independientemente del tipo de base de datos, las funciones principales que se pueden esperar de un DBMS son:

* permitir el acceso a los datos a través de un esquema conceptual, en vez de hacerlo a través de un esquema físico;
* compartir e integrar los datos entre aplicaciones diferentes;
* controlar el acceso compartido a los datos;
* garantizar la seguridad e integridad de los datos;

Gracias a estas características, las aplicaciones que se desarrollan pueden contar con una fuente de datos segura, fiable y generalmente escalabale. Estas propiedades son deseables para aplicaciones que usan la red Internet como infraestructura y que por tanto tienen evidentes problemas de seguridad y de escala.

ANÁLISIS Y OPTIMIZACIÓN DEL SERVIDOR MYSQL

* Caché de consultas MySQL: el servidor compara el string de la consulta, y si
es idéntico a uno anterior y la tabla no ha cambiado, recoge el resultado de
la caché.

* Tres variables a configurar en /etc/mysql/my.cnf:
– query_cache_limit : tamaño máximo de cada resultado
– query_cache_size : tamaño máximo de la caché
– query_cache_type : activa la caché cuando está a 1

* Lecturas para profundizar:
– http://dev.mysql.com/doc/refman/5.0/es/query-cache.html
– http://www.xtec.net/~acastan/textos/Tuning%20LAMP.pdf
– http://dev.mysql.com/doc/refman/5.0/es/optimizing-the-server.html

INTEGRIDAD Y REPARACIÓN DE TABLAS en MYSQL

* Inserción y borrado masivo de datos + bloqueo del sistema o fallo del disco =
tabla o índice corrupto

USE world;
SELECT * FROM City;

ERROR 1016: No puedo abrir archivo: ‘City.MYD’. (Error: 145)

system perror 145
MySQL error code 145: Table was marked as crashed and should be repaired

Si tenemos copia de seguridad podemos restaurarla y recuperar la tabla. Si no
tenemos copia tendremos que reparar la tabla, proceso en el cual se suelen
perder los registros defectuosos.

* Consulta y reparación de la integridad mediante sentencias SQL:

CHECK TABLE City EXTENDED;
REPAIR TABLE City;

* Consulta y reparación con la utilidad ‘myisamchk’: esta utilidad es para
tablas ‘MyISAM’, accede a los ficheros de tablas directamente, y por lo tanto
necesita parar el servidor. Ejemplos:

sudo /etc/init.d/mysql stop
myisamchk –check /var/lib/mysql/*/*.MYI
myisamchk –recover /var/lib/mysql/world/*.MYI
myisamchk –safe-recover /var/lib/mysql/world/City.MYI
myisamchk –key_buffer_size=64M –sort_buffer_size=64M
–read_buffer_size=1M –write_buffer_size=1M
–silent –force –fast –update-state /var/lib/mysql/world/*.MYI
sudo /etc/init.d/mysql start

* Consulta y reparación con la utilidad ‘mysqlcheck’: esta utilidad es para
tablas ‘MyISAM’, ‘InnoDB’ y ‘BDB’, se conecta como cliente al servidor y le
envía sentencias SQL, y por lo tanto no se debe parar el servidor. Ejemplos:

mysqlcheck -u root -p –check world City
mysqlcheck -u root -p –repair world City
mysqlcheck -u root -p –force world City

* Reparar tablas InnoDB: si se ha producido una caída del servidor, con
reiniciarlo hay suficiente. InnoDB reconocerá que no se apagó correctamente e
iniciará una recuperación automática.

Aún así, podemos detectar errores mediante la sentencia ‘CHECK TABLE’ o
mediante la utilidad ‘mysqlcheck’. Pero para reparar una tabla InnoDB no se
puede utilizar la sentencia ‘REPAIR TABLE’ o la utilidad ‘mysqlcheck’. El
único método es exportar la tabla con ‘mysqldump’, después borrar la tabla
defectuosa, y por último importarla de nuevo.

* Lecturas para profundizar:
– http://dev.mysql.com/doc/refman/5.0/es/check-table.html
– http://dev.mysql.com/doc/refman/5.0/es/repair-table.html
– http://dev.mysql.com/doc/refman/5.0/en/myisamchk.html
– http://dev.mysql.com/doc/refman/5.0/es/using-mysqlcheck.html

IMPORTAR Y EXPORTAR DATOS EN MYSQL

* El método estándar para importar y exportar fácilmente bases de datos es
mediante ficheros de texto, donde cada fichero corresponde a una tabla de la
base de datos, cada fila del fichero es un registro, y los valores de los
campos se separan por tabuladores u otras marcas.

* Podemos importar mediante la sentencia ‘LOAD DATA [LOCAL] INFILE’ (la palabra
LOCAL se utiliza cuando el fichero a importar está en el ordenador del
cliente, y no se utiliza cuando el fichero está en el servidor):

LOAD DATA LOCAL INFILE ‘ciudades.txt’ INTO TABLE City;

LOAD DATA LOCAL INFILE ‘ciudades.txt’
FIELDS TERMINATED BY ‘,’ ENCLOSED BY ‘»‘ LINES TERMINATED BY ‘\r\n’
IGNORE 1 LINES INTO TABLE City;

* También podemos importar con el comando externo ‘mysqlimport’:

mysqlimport base_de_datos fichero1.txt fichero2.txt …

* Podemos exportar mediante la sentencia ‘SELECT … INTO OUTFILE’ (el fichero
a exportar quedará en el servidor):

SELECT * FROM City INTO OUTFILE ‘ciudades.txt’;

SELECT * FROM City INTO OUTFILE ‘ciudades.txt’
FIELDS TERMINATED BY ‘,’ ENCLOSED BY ‘»‘ LINES TERMINATED BY ‘\r\n’;

* También podemos exportar redireccionando la salida (el fichero a exportar
quedará en el cliente):

mysql world -u root -p -e «SELECT * FROM City» > ciudades.txt
mysql world -u root -p –html -e «SELECT * FROM City» > ciudades.html
mysql world -u root -p –xml -e «SELECT * FROM City» > ciudades.xml

* Lecturas para profundizar:
– http://dev.mysql.com/doc/refman/5.0/es/load-data.html
– http://dev.mysql.com/doc/refman/5.0/es/select.html
– http://dev.mysql.com/doc/refman/5.0/es/mysqlimport.html

 

REALIZAR Y RESTAURAR COPIAS DE SEGURIDAD EN MYSQL

* Primer método: parar el servidor y copiar o restaurar los ficheros, que están
en el directorio de datos (normalmente en ‘/var/lib/mysql/’). Para obtener
dicho directorio:

SHOW VARIABLES LIKE ‘datadir’;

En tablas de tipo MyISAM estos ficheros están en una carpeta con el nombre de
la base de datos, tienen el mismo nombre que las tablas y extensiones ‘*.frm’
(formato), ‘*.myd’ (datos), y ‘*.myi’ (índices).

En tablas de tipo InnoDB se encuentran ficheros con los nombres de las tablas
y extensión ‘*.frm’ en la carpeta de la base de datos, y en el directorio
principal de datos existen varios ficheros de datos con nombre ‘ibdata1’,
‘ibdata2’, … que comparten todas las bases de datos InnoDB del servidor, y
también los ficheros de «logs» de InnoDB: ‘ib_logfile0’, ‘ib_logfile1’, …

(Aviso: si los ficheros InnoDB vamos a copiarlos de un ordenador a otro, debe
cumplirse:
(1) que las bases de datos y tablas tengan nombres en minúsculas;
(2) que ambos ordenadores utilicen aritmética entera de complemento a dos; y
(3) que si hay tablas con columnas de tipo numero real, ambos ordenadores
utilicen el formato de números reales especificado por la IEEE.)

Ejemplos de realización de copias de seguridad: (1) con tar, (2) con zip, (3)
con rsync, (4) con cp, (5) con cp sólo bbdd world, (6) con cp sólo tabla City.

mysqladmin -u root -p shutdown

(1) sudo tar czf /tmp/mysql-backup.tar.gz /var/lib/mysql/
(2) sudo zip -r /tmp/mysql-backup.zip /var/lib/mysql/
(3) sudo rsync -r /var/lib/mysql/ /tmp/mysql-backup
(4) sudo cp -r /var/lib/mysql/ /tmp/mysql-backup
(5) sudo cp -r /var/lib/mysql/world/ /tmp/mysql-backup
(6) sudo cp -r /var/lib/mysql/world/City.* /tmp/mysql-backup

sudo /etc/init.d/mysql start

Ejemplos de restauración de las copias (vigilad con los permisos y con que el
propietario de los ficheros siga siendo ‘mysql’):

sudo /etc/init.d/mysql stop

sudo cp -r /otro_directorio/ /var/lib/mysql/
sudo chown -R mysql.mysql /var/lib/mysql/

sudo /etc/init.d/mysql start

* Segundo método: mediante el script ‘mysqlhotcopy’. Sólo sirve para tablas
MyISAM, pero es rápido y no hace falta parar el servidor ya que el script
bloquea las tablas. Se ejecuta localmente en el servidor.

Ejemplos de realización de copias de seguridad:

sudo mysqlhotcopy world /otro_directorio -u root -p contraseña

Ejemplos de restauración de las copias (vigilad con los permisos y con que el
propietario de los ficheros siga siendo ‘mysql’):

sudo /etc/init.d/mysql stop

sudo cp -r /otro_directorio/ /var/lib/mysql/
sudo chown -R mysql.mysql /var/lib/mysql/

sudo /etc/init.d/mysql start

* Tercer método: mediante el comando ‘mysqldump’. Es menos rápido, pero sirve
para todo tipo de tablas. El fichero que genera no contiene los datos, sino
instrucciones SQL que generan las tablas y les insertan los datos, por lo que
también nos sirve para migrar las bases de datos de MySQL a otro gestor. Se
puede ejecutar de forma local y remota, y los ficheros quedan en el servidor.

Ejemplos de realización de copias de seguridad:

mysqldump -u root -p world > world.sql
mysqldump -u root -p world Country City > pais_i_ciutat.sql
mysqldump -u root -p –xml world > world.xml
mysqldump -u root -p –tab=/tmp world
mysqldump -u root -p –all-databases > backup.sql
mysqldump -u root -p –opt world | mysql -h 192.168.0.110 -u root -pcontraseña mundo
mysqldump -u root -p –no-data world | mysql -h 192.168.0.110 -u root -pcontraseña mundo

Ejemplos de restauración de las copias:

mysql world -u root -p < world.sql

* Cuarto método: las sentencias SQL ‘BACKUP TABLE’ y ‘RESTORE TABLE’, que no
explicaré porque han quedado obsoletas.

* Para restaurar los cambios en la base de datos que se produjeron después de
la copia de seguridad debemos obtener dichos cambios de los ficheros de «logs»:

– Miramos cuales son posteriores a la fecha de la copia de seguridad:

ls -l /var/log/mysql


-rw-rw—- 1 mysql adm 11949 2007-02-04 09:23 mysql-bin.000102
-rw-rw—- 1 mysql adm 117 2007-02-04 13:46 mysql-bin.000103
-rw-rw—- 1 mysql adm 11906 2007-02-04 13:48 mysql-bin.000104

– Si queremos asegurarnos comprobando su contenido:

mysqlbinlog /var/log/mysql/mysql-bin.000102 | less

– Los restauramos ordenadamente:

mysqlbinlog /var/log/mysql/mysql-bin.000102 | mysql -u root -p
mysqlbinlog /var/log/mysql/mysql-bin.000103 | mysql -u root -p
mysqlbinlog /var/log/mysql/mysql-bin.000104 | mysql -u root -p

* Relacionado con el tema de las copias de seguridad, podemos comprimir las
tablas MyISAM que ya no se actualizan para que ocupen mucho menos espacio.
Comprimidas con la utilidad ‘myisampack’ todavía se pueden consultar aunque
no se pueden actualizar hasta que se descomprimen de nuevo con ‘myisamchk’.

myisampack /var/lib/mysql/world/City.MYI
myisamchk –recover –quick /var/lib/mysql/world/City.MYI

Para descomprimirlas:

myisamchk –unpack /var/lib/mysql/world/City.MYI

Para consultar si estaban comprimidas:

shell> mysql world -u root -p -e «SHOW TABLE STATUS LIKE ‘City'»

* Lecturas para profundizar:
– http://dev.mysql.com/doc/refman/5.0/es/disaster-prevention.html
– http://dev.mysql.com/doc/refman/5.0/es/mysqlhotcopy.html
– http://dev.mysql.com/doc/refman/5.0/es/mysqldump.html
– http://dev.mysql.com/doc/refman/5.0/es/mysqlbinlog.html
– http://dev.mysql.com/doc/refman/5.0/es/myisampack.html

ADMINISTRACIÓN DE TABLAS Y BASES DE DATOS MYSQL

 * Crear una nueva base de datos:
     CREATE DATABASE nueva_base_datos;

 * Borrar toda una base de datos:
     DROP DATABASE base_datos;

 * Ver las bases de datos del sistema:
     SHOW DATABASES;

 * Seleccionar una base de datos para trabajar con ella:
     USE base_datos;

 * Crear una nueva tabla:
     CREATE TABLE tabla definición;

   Sintaxis completa en http://dev.mysql.com/doc/refman/5.0/es/create-table.html

 * Borrar toda una tabla:
     DROP TABLE tabla;

 * Cambiar la definición de una tabla:
     ALTER TABLE tabla modificación;

   Sintaxis completa en http://dev.mysql.com/doc/refman/5.0/es/alter-table.html

 * Ver las tablas de una base de datos:
     SHOW TABLES;

 * Ver la descripción de los campos de una tabla:
     DESCRIBE tabla;

 * Bloquea una tabla y sólo deja leer a quien la bloqueo y al resto de usuarios:
     LOCK TABLES tabla READ;

 * Bloquea una tabla y sólo deja leer y escribir a quien la bloqueo:
     LOCK TABLES tabla WRITE;

 * Desbloquea las tablas:
     UNLOCK TABLES;

 * Ejecuta un fichero de sentencias SQL:
     SOURCE fichero_SQL;

 * Marca el inicio y fin de una transacción, y hace los cambios permanentes:
     BEGIN [nombre];
     ...
     COMMIT [nombre];

 * Marca el inicio y fin de una transacción, pero al final deshace los cambios:
     BEGIN [nombre];
     ...
     ROLLBACK [nombre];

 * Muestra variables del servidor:
     SHOW VARIABLES;

 * Ejemplo:
     CREATE DATABASE escuela;
     SHOW DATABASES;
     USE escuela;
     CREATE TABLE alumnos (
       DNI int(8) NOT NULL,
       Nombre char(35) default '',
       Nota int(2),
       PRIMARY KEY (DNI));
     DESCRIBE alumnos;
     ALTER TABLE alumnos MODIFY Nota float(3,1);
     DESCRIBE alumnos;
     SHOW TABLES;
     DROP TABLE alumnos;
     DROP DATABASE escuela;

 * Lecturas para profundizar:
   - http://dev.mysql.com/doc/refman/5.0/es/data-definition.html
   - http://dev.mysql.com/doc/refman/5.0/es/transactional-commands.html