Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
bloques, que van a ser ejecutados simultáneamente de tal forma que podamos evaluar si
alguna de las sentencias ha fallado y de ser así poder deshacer los cambios en el momento
sin alterar de forma alguna la base de datos.
START TRANSACTION;
UPDATE users SET name='jan
UPDATE users SET name='jho
COMMIT; / ROLLBACK;
1 START TRANSACTION;
2 UPDATE users SET name='jane' WHERE id=1;
3 UPDATE users SET name='jhon' WHERE id=2;
4 COMMIT; / ROLLBACK;
En este caso tenemos dos sentencias, cada una de ellas para editar un registro, MySQL las
evalúa y las guarda en un estado temporal y posteriormente son ejecutadas o desechadas
con los comandos COMMIT o ROLLBACK.
Ahora digamos que en nuestra base de datos tenemos una tabla llamada “users” con varios
usuarios registrados. vamos a agregar un nuevo usuario y editar uno existente en la misma
transacción
$conex->autocommit(false);
$conex->query("INSERT INTO u
1 $conex->autocommit(false);
2
3 $conex->query("INSERT INTO users (name) VALUES ('marcus')");
4
5 $conex->query("UPDATE users SET name = 'jane' WHERE 'id' = 39 ");
6
7 $conex->commit();
Al cambiar el autocommit a “false” estamos indicando que queremos enviar los cambios
de forma manual que es justo lo que hacemos al finall con commit().
1 $conex->autocommit(false);
2
3 try {
4 $conex->query("INSERT INTO users (name) VALUES ('marcus')");
5 $conex->query("UPDATE users SET name = 'jane' WHERE 'id' = 39 ");
6 $conex->commit();
7 } catch (Exception $e) {
8 $conex->rollback();
9 echo 'Something fails: ', $e->getMessage(), "\n";
10 }
Para implementar transacciones en MySQL hay que utilizar la versión 5.0.x y el motor de
almacenamiento InnoDB.
Una transacción tiene dos finales posibles, COMMIT (se ejecutan todas las instrucciones y
guardamos los datos) y ROLLBACK (se produce un error y no se guardan los cambios).
Por defecto, MySQL trae activado el modo autocommit, por lo que cuando se realiza una
transacción (INSERT, UPDATE o DELETE) esta se confirma automáticamente. Para
desactivar esta opción se debe ejecutar el siguiente comando (no recomendado):
> SET AUTOCOMMIT=0;
o también se puede desactivar para una serie de comandos utilizando START
TRANSACTION. (Esto es lo recomendado)
> START TRANSACTION;
> .....
> COMMIT;
Hay que tener en cuenta que al realizar una transacción SQL que cuando se realice un
INSERT, UPDATE o DELETE se generará un bloqueo sobre la tabla y que otros clientes
no pueden acceder esta para escribir. Pero si podrán realizar lecturas, en las que no podrán
ver los datos del primer cliente hasta que los mismos sean confirmados.
Cómo hacer copias de seguridad de una
base de datos MySQL
El método más utilizado para crear copias de seguridad de MySQL se basa en el uso del
comando mysqldump. Este comando se incluye dentro de las utilidades del propio servidor
MySQL, por lo que ya se instaló cuando instalaste MySQL. Para comprobar que dispones
de mysqldump, abre una consola de comandos y ejecuta lo siguiente:
$ mysqldump
Si se produce un error de tipo "command not found", es posible que no hayas instalado
MySQL correctamente o que tengas que indicar la ruta completa hasta donde se encuentre
el comando, como por ejemplo:
$ /usr/local/mysql/bin/mysqldump
Si por ejemplo el usuario es root, la contraseña también es root y la base de datos se llama
acme, el comando que debes ejecutar es el siguiente:
Si por motivos de seguridad no quieres escribir la contraseña como parte del comando,
puedes reemplazar la opción --password=XX por -p. Al hacerlo, MySQL te pedirá que
escribas la contraseña a mano cada vez que realices una copia de seguridad:
En este comando no hace falta indicar el nombre de la base de datos que se está
recuperando, porque los archivos generados por mysqldump ya contienen esa información.
De hecho, al ejecutar este comando de recuperación se borra la base de datos original
y toda la información de sus tablas, para después insertar toda la información contenida
en el archivo copia_seguridad.sql.
Si lo que quieres es realizar una copia de seguridad de todas las bases de datos, utiliza en su
lugar la opción --all-databases:
Las líneas que necesiten ser personalizadas por el usuario serán marcadas con rojo en este
tutorial. El resto podrá ser copiado y pegado en su mayoría.
Acerca de MySQL
MySQL es un manejador de base de datos de código libre que atyda a los usuarios a
almacenar, organizar y recolectar datos. Tiene variedad de opciones para otorgar a
determinados usuarios permisos entre tablas y bases de datos, éste tutorial te dará una
pequeña introducción a algunas de estas opciones.
Lamentablemente, a este punto el nuevo usuario no tiene permisos para hacer algo con las
bases de datos. Por consecuencia si el usuario intenta identificarse (con la contraseña
establecida), no será capaz de acceder a la consola de MySQL.
Por ello, lo primero que debemos hacer es porporcionarle el acceso requerido al usuario con
la información que requiere.
Una vez que has finalizado con los permisos que deseas configurar para tus nuevos
usuarios, hay que asegurarse siempre de refrescar todos los privilegios.
FLUSH PRIVILEGES;
Si deseas darles acceso a cualquier base de datos o tabla, asegurate de insertar un asterisco
(8) en lugar del nombre de la base de datos o tabla.
Cada vez que tu actualizas o cambias permisos, asegúrate de refrescar los privilegios
mediante FLUSH PRIVILEGES;.
Así como puedes borrar bases de datos con DROP, también puedes usar el comando DROP
para borrar usuarios:
Para probar el nuevo usaurio, debes cerrar sesión escribiendo quit y volviendo a iniciar
sesión con éste comando en la consola:
Es muy recomendable realizar siempre una copia de seguridad de las base de datos, siempre
que vayas a ejecutar cambios importantes en ella.
GRANT privilegios
ON base/tabla
TO usuario [IDENTIFIED by ´contraseña´]
[WITH GRANT OPTION];
La opción WITH GRANT OPTION facilita al usuario el poder de darle a otros usuarios
sus mismos privilegios.
Con la siguiente query darías todos los permisos (excepto WITH GRANT OPTION) a un
usuario sobre una base de datos especificada:
Para dar todos los permisos, incluido el WITH GRANT OPTION, debe de indicarse con
su opción pertinente:
De la siguiente forma únicamente le darías permiso para realizar algunas querys sobre la
base de datos. Cabe destacar que el usuario no podría crear nuevas tablas ni nuevas bases
de datos:
Lo primero que debemos hacer es acceder a la shell de MySQL con un usuario que tenga
privilegios de administración, en este caso lo hacemos como root y desde el propio host por
línea de comandos:
# mysql -u root -p
Enter password: **********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.1.73 Source distribution
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights
reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input
statement.
mysql>
La sintaxis es la siguiente:
Así pues, si quisieramos crear un usuario llamado “foo” y con clave “mipassword”
ejecutaríamos el siguiente comando:
Tenemos la opción de especificar la contraseña con su valor en hash. Este valor debe ser
generado anteriormente con la función PASSWORD() de MySQL:
En el siguiente ejemplo, asignamos todos los privilegios posibles al usuario “foo” (si no
existe se crea) sobre todas las bases de datos y tablas, para conexiones desde localhost
únicamente y además le concedemos el permiso GRANT para que tenga la opción de
asignar permisos a otros usuarios:
Recordad que el comando HELP de la shell de MySQL os mostrará la ayuda relativa a cada
comando. Para encontrar ayuda de GRANT usamos HELP GRANT y vemos que además
de la información relativa al comando aparecen varios ejemplos de uso:
Como podéis observar, cuando los privilegios hacen referencia a bases de datos, tablas o
hosts distintos se ejecuta un comando por cada uno de ellos, no se puede englobar todo en
una única ejecución ya que se almacena en registros distintos dentro de la tabla de
privilegios.
Al igual que a la hora de asignar los privilegios se realiza de forma individual por base de
datos, host, tabla, etc. A la hora de revocar es lo mismo:
En el caso de ‘foo’@’localhost’ vemos que tiene todos los privilegios para todas las bases
de datos, en lugar de eliminar completamente esa entrada de privilegios podemos hacerla
más restrictiva, por ejemplo manteniendo todos los permisos excepto INSERT:
FLUSH PRIVILEGES
El comando “FLUSH PRIVILEGES” sirve para recargar la tabla de privilegios pero sólo
es necesario cuando se manipulan directamente las tablas de privilegios ejecutando
INSERT, DELETE, etc en lugar de usar los comandos GRANT y REVOKE:
Es decir, en los casos que he especificado en este artículo no es necesario utilizar este modo
de recargar los privilegios, sólo sería necesario si crearamos o eliminaramos los usuarios “a
mano” directamente sin los comandos específicos para ello de MySQL:
mysql> INSERT INTO user
-> VALUES('localhost','foo',mipassword'),
-> 'Y','Y','Y','Y','Y','Y','N','N','N','Y','Y','Y','Y','Y');