<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MySQL | ahierro.es</title>
	<atom:link href="https://blog.ahierro.es/tag/mysql/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.ahierro.es</link>
	<description>Un blog personal  donde compartir experiencias e inquietudes relacionadas con internet, tecnología y otros asuntos interesantes</description>
	<lastBuildDate>Wed, 25 Sep 2019 06:54:44 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.2</generator>

<image>
	<url>https://blog.ahierro.es/wp-content/uploads/2018/10/cropped-logo_small-1-2-32x32.png</url>
	<title>MySQL | ahierro.es</title>
	<link>https://blog.ahierro.es</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Triggers en MySQL</title>
		<link>https://blog.ahierro.es/triggers-en-mysql/</link>
					<comments>https://blog.ahierro.es/triggers-en-mysql/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Wed, 25 Sep 2019 06:42:57 +0000</pubDate>
				<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[bases de datos]]></category>
		<category><![CDATA[MySQL]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=1711</guid>

					<description><![CDATA[<p>Los grandes motores de búsqueda como MySQL, PostgreSQL, SQL Server u Oracle, disponen de una cantidad de funcionalidades realmente extensa. Una de esas funcionalidades son los desencadenadores o triggers, en esta entrada hablaremos sobre ellos. Mi experiencia con los triggers proviene principalmente de SQL Server, plataforma en la que he hecho un uso bastante extenso &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/triggers-en-mysql/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Triggers en MySQL"</span></a></p>
La entrada <a href="https://blog.ahierro.es/triggers-en-mysql/">Triggers en MySQL</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Los grandes motores de búsqueda como MySQL, PostgreSQL, SQL Server u Oracle, disponen de una cantidad de funcionalidades realmente extensa. Una de esas funcionalidades son los desencadenadores o triggers, en esta entrada hablaremos sobre ellos.</p>



<figure class="wp-block-image is-resized"><img fetchpriority="high" decoding="async" src="https://blog.ahierro.es/wp-content/uploads/2019/09/mysql_triggers.png" alt="Triggers en Mysql" class="wp-image-1714" width="768" height="270"/></figure>



<p>Mi experiencia con los triggers proviene principalmente de SQL Server, plataforma en la que he hecho un uso bastante extenso de ellos, y me atrevería a asegurar que para algunos programadores, en según que condiciones, los triggers pueden abrir un mundo nuevo de posibilidades, facilitando enormemente la realización de algunas tareas que de no ser por éstos tendrían una resolución  bastante más aparatosa. </p>



<span id="more-1711"></span>



<h2 class="wp-block-heading">Qué son los triggers en MySQL</h2>



<p>Los triggers (o desencadenadores) son pequeños programas creados por el usuario que se invocan de forma automática por el propio motor de bases de datos al producirse ciertos eventos, lo que nos permite capturarlos, controlarlos e intervenir en ellos.</p>



<p>En MySQL los eventos que podemos capturar son los relacionados con las sentencias INSERT, UPDATE y DELETE.</p>



<h2 class="wp-block-heading">Precauciones en el uso de triggers</h2>



<p>Antes de entrar de lleno con ellos, es importante conocer cuales son los  inconvenientes más comunes derivados de su uso para así evitarlos o cuanto menos minimizarlos.</p>



<p>El primero de ellos es el rendimiento. Ejecutar el código programado en el trigger conlleva un consumo de recursos que por norma general suele ser muy superior al de la sentencia que lo origina. Por lo tanto deberemos tener en cuenta esa carga y optimizarla para evitar posibles problemas como ralentización del sistema o interbloqueos.</p>



<p>El segundo inconveniente a tratar es la visibilidad. Hablamos de una porción de código que se encuentra completamente separada del resto, lo que en ocasiones puede provocar que nos olvidemos que está ahí, o que lo desconozcamos  por completo si nos enrolamos en un nuevo proyecto.</p>



<p>Y una recomendación derivada del punto anterior, es poner un extra de atención para asegurar su correcto funcionamiento, o de lo contrario podemos encontrarnos con resultado indeseados mucho tiempo después de su activación.</p>



<p>Por último debemos destacar el efecto global de los triggers, que actuarán siempre que ocurra el evento para el que han sido definidos, independientemente de la aplicación, usuario o cualquier otra variable de sistema que se nos ocurra. Esta condición es intrínseca los triggers y es básicamente lo que buscamos, pero debemos recordarlo si en algún momento actuamos sobre la base de datos desde un lugar diferente al habitual.</p>



<h2 class="wp-block-heading">Cuándo utilizar triggers</h2>



<p style="text-align:left">Desde mi punto de vista los triggers tienen dos escenarios principales de uso:</p>



<p>El primero es cuando no podemos intervenir en el código fuente de la aplicación que trabaja sobre la base de datos sobre la que queremos actuar o reaccionar a sus eventos.</p>



<p>El segundo es cuando a pesar de disponer del código, éste pertenece a un software desarrollado por terceros y existe una probabilidad relativamente alta de aplicar actualizaciones o instalar pluggins, y hemos decidido modificar el código fuente lo menos posible para facilitar este tipo de tareas.</p>



<p>Un ejemplo muy habitual son integraciones de software en las que al menos uno de los programas que intervienen es de código cerrado. En este tipo de situaciones los triggers nos permiten capturar los eventos que modifican la base de datos y actuar en consecuencia, evitando crear tareas programadas y e incluso tablas de integración.</p>



<h2 class="wp-block-heading">Cuándo no utilizar trigger</h2>



<p>Cuando tenemos acceso al código fuente de la aplicación que trabaja sobre la base de datos que nos interesa y no tenemos que mantener ningún tipo de compatibilidad con cambios como nuevas versiones, no existe razón alguna para utilizar triggers. En estos casos será mejor trabajar sobre el código de la aplicación y así evitaremos los inconvenientes de uso de los triggers.</p>





<p>Bien sea para registrar logs de acciones, generar registros de integración, realizar validaciones pre o post inserción o cualquier otra tarea que se nos ocurra, siempre será más eficiente,  más visible y por lo tanto sencillo para el programador delegar esa responsabilidad en la propia aplicación.</p>



<h2 class="wp-block-heading">Usando los triggers</h2>



<p>Muy bien, ya hemos tomado las consideraciones necesarias y hemos decidido utilizar triggers, veamos ahora cómo crearlos.</p>



<h3 class="wp-block-heading">Sentencias sobre las que podemos crear triggers</h3>



<p>Ya lo adelantábamos al comienzo del artículo, podemos crear triggers que actúen sobre las sentencias:</p>



<ul class="wp-block-list"><li>INSERT</li><li>UPDATE</li><li>DELETE</li></ul>



<p>De esta forma podremos intervenir cada vez que se inserte, modifique o elimine un registro.</p>



<p>Cada trigger se define para un tipo de evento, de forma que si queremos controlar los tres eventos para una determinada tabla deberemos crear tres triggers.</p>



<p>También es importante mencionar que los triggers actúan registro a registro, es decir, supongamos que tenemos una sentencia UPDATE que modifica 100 registros, el trigger se ejecutará 100 veces, una  por cada registro modificado</p>



<h3 class="wp-block-heading">BEFORE y AFTER</h3>



<p>Y como complemento al tipo de sentencia, podemos decidir si intervenir antes o después de que ésta realice los cambios. Así un trigger AFTER INSERT nos permitirá actuar una vez que el nuevo registro este insertado, y un trigger BEFORE DELETE lo hará antes de eliminar un registro.</p>



<p>La combinación del tipo de sentencia con BEFORE o AFTER nos ofrecen mucha versatilidad a la hora de diseñar nuestros triggers.</p>



<h3 class="wp-block-heading">NEW y OLD</h3>



<p>NEW y OLD son las palabras reservadas de MySQL para acceder a los valores de los registros sobre los que estamos trabajando.</p>



<ul class="wp-block-list"><li>OLD nos permite acceder a los datos previos a la modificación realizada por la sentencia.</li><li>NEW nos permite acceder a los nuevos datos que propone la sentencia.</li></ul>



<p> La sintaxis es muy sencilla, OLD.campo o NEW.campo, dónde campo es el nombre del campo de la tabla al que queremos acceder.</p>





<h3 class="wp-block-heading">Cómo crear un trigger en MySQL</h3>



<p>Y una buena forma de aprender a crear un triggers es mediante un ejemplo, así que veamos uno. Supongamos que tenemos la tabla <em>brands</em> que forma parte de la base de datos de un software propietario:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
+----+----------+---------+
| ID | Name     | Segment |
+----+----------+---------+
|  1 | Opel     | Mass    |
|  2 | Renault  | Mass    |
|  3 | Ford     | Mass    |
|  4 | Audi     | Premium |
|  5 | Mercedes | Premium |
|  6 | Porche   | Luxury  |
|  7 | Ferrari  | Luxury  |
+----+----------+---------+
</pre></div>


<p>Y queremos registrar los cambios que se producen para integrarlos con otro sistema, para lo que hemos creado una tabla en la que registraremos cualquier cambio que se produzca en la tabla <em>brands</em>. La nueva tabla la hemos llamado <em>integration</em>, y tiene los siguientes campos:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
+----+--------+----------+--------+---------------------+-----------+---------------+------------+
| ID | Object | ObjectID | Action | DateCreated         | Processed | DateProcessed | ErrorCount |
+----+--------+----------+--------+---------------------+-----------+---------------+------------+

</pre></div>


<p>Para registrar todos los cambios que se produzcan en la tabla <em>brands</em> deberemos generar tres triggers:</p>



<ul class="wp-block-list"><li>Uno para registrar los nuevos registros: AFTER INSERT.</li><li>Uno para registrar los cambios: AFTER UPDATE.</li><li>Uno para registrar las eliminaciones: BEFORE DELETE.</li></ul>



<p>En esta entrada crearemos únicamente el trigger para la sentencia INSERT. Crear el resto de triggers se hace de forma muy similar, y en caso de que estés interesado en aprender será una buena práctica.</p>



<p>Así que veamos como crear el trigger, que será el encargado de registrar las nuevas marcas:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
delimiter //
CREATE TRIGGER brandsInsertLog AFTER INSERT ON brands
FOR EACH ROW
BEGIN

	INSERT INTO integration (`Object`, `ObjectID`, `Action`, `DateCreated`, `Processed`, `DateProcessed`, `ErrorCount`) 
	VALUES (&#039;brands&#039;, NEW.ID, &#039;insert&#039;, now(), 0, null, 0);

END;//
delimiter;

</pre></div>


<p>De forma que si ejecutásemos una sentencia de de inserción sobre la tabla <em>brands</em>:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
INSERT INTO `osticket`.`brands` (`ID`, `Name`, `Segment`)
VALUES (8, &#039;Citroen&#039;, &#039;Mass&#039;);
</pre></div>


<p>Se registraría automáticamente la entrada correspondiente en la tabla <em>integration</em>:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
+----+--------+----------+--------+---------------------+-----------+---------------+------------+
| ID | Object | ObjectID | Action | DateCreated         | Processed | DateProcessed | ErrorCount |
+----+--------+----------+--------+---------------------+-----------+---------------+------------+
|  1 | brands |        8 | insert | 2019-09-21 08:20:07 |         0 | NULL          |          0 |
+----+--------+----------+--------+---------------------+-----------+---------------+------------+

</pre></div>


<p>Así de sencillo. Espero que esta entrada te haya servido de ayuda y si es así un comentario siempre es de agradecer.</p>



<h2 class="wp-block-heading">Créditos, referencias y artículos relacionados</h2>



<ul class="wp-block-list"><li>Imagen <a rel="noreferrer noopener" aria-label="Peggy und Marco Lachmann-Anke (abre en una nueva pestaña)" href="https://pixabay.com/users/3d_maennchen-1553824/" target="_blank">Peggy und Marco Lachmann-Anke</a> en pixabay.</li><li><a rel="noreferrer noopener" aria-label="Documentación sobre triggers de María DB (abre en una nueva pestaña)" href="https://mariadb.com/kb/en/library/trigger-overview/" target="_blank">Documentación sobre triggers de María DB</a></li><li><a rel="noreferrer noopener" aria-label="Documentación sobre triggers de MySQL (abre en una nueva pestaña)" href="https://dev.mysql.com/doc/refman/5.7/en/triggers.html" target="_blank">Documentación sobre triggers de MySQL</a></li><li><a href="https://blog.ahierro.es/backup-de-base-de-datos-mysql-con-php/">Backup de base de datos MySQL con PHP</a></li><li><a href="https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/">Servidor Web en Raspberry PI y Ubuntu Mate</a></li></ul>La entrada <a href="https://blog.ahierro.es/triggers-en-mysql/">Triggers en MySQL</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/triggers-en-mysql/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Clonar una web: la base de datos</title>
		<link>https://blog.ahierro.es/clonar-una-web-la-base-de-datos/</link>
					<comments>https://blog.ahierro.es/clonar-una-web-la-base-de-datos/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Thu, 06 Jun 2019 05:37:13 +0000</pubDate>
				<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=1076</guid>

					<description><![CDATA[<p>Clonar una web se divide básicamente en clonar los archivos y clonar la base de datos. Y si como en nuestro caso además queremos mantener una copia actualizada con relativa frecuencia deberemos automatizar este proceso. En esta entrada veremos cómo de sencillo es hacerlo intentando mantener la máxima compatibilidad con cualquier tipo de hosting. Esta &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/clonar-una-web-la-base-de-datos/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Clonar una web: la base de datos"</span></a></p>
La entrada <a href="https://blog.ahierro.es/clonar-una-web-la-base-de-datos/">Clonar una web: la base de datos</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Clonar una web se divide básicamente en clonar los archivos y clonar la base de datos. Y si como en nuestro caso además queremos mantener una copia actualizada con relativa frecuencia deberemos automatizar este proceso. En esta entrada veremos cómo de sencillo es hacerlo intentando mantener la máxima compatibilidad con cualquier tipo de hosting.</p>



<figure class="wp-block-image"><img decoding="async" width="650" height="438" src="https://blog.ahierro.es/wp-content/uploads/2019/05/clonar_web.png" alt="Conar Web" class="wp-image-927" srcset="https://blog.ahierro.es/wp-content/uploads/2019/05/clonar_web.png 650w, https://blog.ahierro.es/wp-content/uploads/2019/05/clonar_web-300x202.png 300w" sizes="(max-width: 650px) 100vw, 650px" /></figure>



<span id="more-1076"></span>



<p>Esta entrada pertenece a la serie <a href="https://blog.ahierro.es/clonar-una-web-en-un-servidor-local/">Clonar una web en un servidor local</a>. Por ese motivo te recomiendo que leas dicho artículo para darle perspectiva a este. Sea como sea, este artículo puede ser leído sin la referencia anterior, pero perderemos ciertos matices que quizás resulten interesantes. </p>



<h2 class="wp-block-heading">Backup de la base de datos remota</h2>



<p>En función del hosting que tengamos contratado dispondremos de una serie de funcionalidades. Por norma general si has contratado un VPS o servidor dedicado tendrás la posibilidad de ejecutar scripts de consola, lo cual ofrece muchas posibilidades para la tarea que queremos realizar.</p>



<p>Si por el contrario dispones de un hosting compartido no sueles tener acceso a esta opción, así que para dar respuesta a la mayor cantidad de situaciones posibles realizaremos el backup con PHP, más concretamente haremos uso de la clase <a rel="noreferrer noopener" aria-label="MySql Backup Lite  (abre en una nueva pestaña)" href="https://github.com/ahierrohdez/MySqlBackupLite" target="_blank">MySql Backup Lite </a>que introducimos en la entrada <a href="https://blog.ahierro.es/backup-de-base-de-datos-mysql-con-php/">Backup de base de datos MySQL con PHP</a>. Y para programar la ejecución de esta tarea nos ayudaremos de nuestro servidor local, dónde programaremos la ejecución de un script que acceda a la url que realiza el respaldo.</p>





<p>Para no extendernos demasiado y no repetirnos, no copiaremos la clase en esta entrada, puedes encontrarla en los enlaces del párrafo anterior.</p>



<p>Así que crearemos un script en PHP en nuestro servidor remoto que llamaremos <em>backUpDb.php </em>en el directorio <em>scripts</em> que tras ser ejecutado generará una copia de la base de datos en el archivo <em>backups</em>/<em>wordpressBackUp.sql</em>. </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
include(&#039;MySqlBackup.php&#039;);

$arrayDbConf&#x5B;&#039;host&#039;] = &#039;dbHost&#039;;
$arrayDbConf&#x5B;&#039;user&#039;] = &#039;dbUser&#039;;
$arrayDbConf&#x5B;&#039;pass&#039;] = &#039;dbPassword&#039;;
$arrayDbConf&#x5B;&#039;name&#039;] = &#039;wordpressDbName&#039;;

try {

  $bck = new MySqlBackupLite($arrayDbConf);
  $bck-&gt;backUp();
  $bck-&gt;setFileDir(&#039;../backups/&#039;);
  $bck-&gt;setFileName(&#039;wordpressBackUp.sql&#039;);
  $bck-&gt;saveToFile();

}
catch(Exception $e) {

  die($e);

}
</pre></div>


<p>Si nuestro hosting tiene habilitada la conexión remota a la base de datos este paso podríamos ejecutarlo en el servidor local. Como no siempre tendremos esta opción, nos hemos decantado por la alternativa más universal.</p>



<p>Y puesto que en este ejemplo el backup es de una plataforma WordPress, y que por ese motivo los datos de conexión a la base de datos ya están especificados en un archivo de configuración escrito en PHP, sería más interesante hacer un <em>include</em> del archivo <em>wp-config.php </em>y obtenerlos desde ahí. De nuevo, en pro de mantener esta entrada lo más genérica posible hemos decidido hacerlo así.</p>



<h2 class="wp-block-heading">Programar la ejecución del backup de la base de datos</h2>



<p>Una vez más existen múltiples opciones para programar esta tarea, unas más elegantes que otras. En un VPS programar una tarea con Cron sería lo más lógico y eficiente, pero tal y como hemos comentado, tomaremos la opción que podemos aplicar independientemente del hosting que tengamos: utilizaremos Cron en nuestro servidor local para programar una tarea que ejecute el script de backup de base de datos que acabamos de crear en el host remoto.</p>



<p>Para ello creamos un script de consola y le asignamos los permisos necesarios:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
mkdir ~/scripts
vim ~/scripts/cloneWebDb.sh
chmod 0755 ~/scripts/clonWebDb.sh
</pre></div>


<p>Con el siguiente contenido:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
#!/bin/bash

curl -Is https://url.com/scripts/backUpDb.php
</pre></div>


<p>Y programamos la ejecución del script con Cron:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
crontab -e
</pre></div>


<p>E incluimos la siguiente línea en el archivo crontab:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
0 1 * * 5 ~/scripts/clonWebDb.sh
</pre></div>


<p>Asegurándonos de que el script se ejecuta cada Viernes a la 1 de la madrugada. Evidentemente puedes programar la periodicidad que más te convenga. Puedes visitar la entrada <a href="https://blog.ahierro.es/programar-tareas-en-ubuntu-con-cron/">Programar tareas en Ubuntu con Cron</a> para profundizar en la programación de tareas con Cron.</p>



<h2 class="wp-block-heading">Descargar el backup de la base de datos</h2>



<p>Lo siguiente es descargar el backup que acabamos de realizar. Lo haremos mediante el protocolo ftp, sirviéndonos del comando wget. Para ello agregamos una línea más a nuestro script clonWeb.sh, de forma que quede así:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
#!/bin/bash

curl -Is https://url.com/scrpts/backUpDb.php
wget -q --user=user --password=&#039;password&#039; --directory-prefix=~/webBackUp fttp://ftp.url.com/backups/wordpressBackUp.sql
</pre></div>


<p>Dónde:</p>



<ul class="wp-block-list"><li>-q, oculta los mensajes de salida del comando</li><li>&#8211;user=user, es el usuario ftp</li><li>&#8211;password=&#8217;password&#8217;, es la contraseña del ftp</li><li>&#8211;directory-prefix=~/webBackUp, es el directorio dónde copiaremos los archivos</li><li>fttp://ftp.url.com/backups/wordpressBackUp.sql, es el ftp con el path del que queremos descargar los archivos</li></ul>



<p>Con esto ya habremos descargado nuestra base de datos en el directorio <em>~/webBackUp/ftp.url.com/backups/wordpressBackUp.sql</em>. El siguiente paso será restaurarla.</p>



<h2 class="wp-block-heading">Restauración de la base de datos</h2>



<p>Y para restaurar la base de datos en nuestro servidor local la estrategia que seguiremos será:</p>



<ol class="wp-block-list"><li>Eliminamos la base de datos.</li><li>Volvemos a crear base de datos vacía.</li><li>Restauramos la base de datos desde el backup.</li></ol>



<p>Como puedes ver el proceso es bastante crítico pues elimina completamente la copia existente. Además hará que durante el tiempo que toma el proceso nuestro clon local no esté accesible. En mi caso el uso que le voy a dar es disponer de una réplica de una web en productivo en un servidor local para realizar pruebas. Para este uso el riesgo es perfectamente asumible, y en todo el tiempo que llevo utilizándola no he tenido ningún tipo de problema. Evidentemente, tú deberás evaluar si este riego y esta parada de servicio son asumibles para ti.</p>



<p>Así que crearemos un script SQL que elimine completamente la base de datos y vuelva a crearla. De nuevo lo haremos dentro de la carpeta <em>~/scripts </em>y lo llamaremos <em>dropAndCreateDb.sql</em>. El contenido será el siguiente:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
DROP DATABASE localDbName;
CREATE DATABASE localDbName;
</pre></div>


<p>Y agregamos dos líneas más a nuestro script de consola para ejecutar</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
#!/bin/bash

curl -Is https://urlToScript.com/backUpDb.php
wget -N -q --user=user --password=&#039;password&#039; --directory-prefix=~/webBackUp ftp://ftp.miweb.com/path/backups/wordpressBackUp.sql
mysql -u localDbUserName -plocalDbPassword localDbName &lt; ~/scripts/dropAndCreateDb.sql
mysql -u localDbUserName -plocalDbPassword localDbName &lt; ~/webBackUp/ftp.url.com/backups/wordpressBackUp.sql
</pre></div>


<h2 class="wp-block-heading">Actualización de los datos relativos al entorno</h2>



<p>El último paso para dar por completado el proceso de clonación de nuestra base de datos será reemplazar todos los datos datos necesarios para que nuestro clon funcione perfectamente. Este paso es el que más puede variar de un entorno a otro, a continuación os dejo un ejemplo bastante básico para un blog realizado en wordpress:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
update wp_options set option_value=&#039;http://192.168.1.10&#039; where option_name=&#039;siteurl&#039;;
update wp_options set option_value=&#039;http://192.168.1.10&#039; where option_name=&#039;home&#039;;
update wp_posts set guid=REPLACE(guid, &#039;blog.ahierro.es&#039;, &#039;192.168.1.146:8085&#039;) where guid like &#039;%blog.ahierro.es%&#039;;
</pre></div>


<p>Vosotros tendréis que localizar las tablas, campos y registro a modificar en vuestras plataformas. En el ejemplo expuesto las dos primeras líneas hacen referencia a datos de configuración y son imprescindible, pues de no actualizar estos campos nuestro wordpress local siempre redirigiría al remoto.</p>



<h2 class="wp-block-heading">Créditos y Referencias</h2>



<ul class="wp-block-list"><li>Articulo de la serie: <a href="https://blog.ahierro.es/clonar-una-web-en-un-servidor-local/">Clonar una web en un servidor local</a>.</li><li>Siguiente entrega de la serie: <a href="https://blog.ahierro.es/clonar-una-web-los-archivos/">Clonar una web: los archivos</a>.</li><li>Clase  <a rel="noreferrer noopener" href="https://github.com/ahierrohdez/MySqlBackupLite" target="_blank">MySql Backup Lite</a>.</li><li>Imagen de portada: <a rel="noreferrer noopener" aria-label="Martin Harry (abre en una nueva pestaña)" href="https://pixabay.com/users/martinharry-1411929/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=941625" target="_blank">Martin Harry</a>.</li></ul>La entrada <a href="https://blog.ahierro.es/clonar-una-web-la-base-de-datos/">Clonar una web: la base de datos</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/clonar-una-web-la-base-de-datos/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Clonar una web en un servidor local</title>
		<link>https://blog.ahierro.es/clonar-una-web-en-un-servidor-local/</link>
					<comments>https://blog.ahierro.es/clonar-una-web-en-un-servidor-local/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Thu, 06 Jun 2019 05:34:58 +0000</pubDate>
				<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[ftp]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=900</guid>

					<description><![CDATA[<p>Independientemente de los distintos entornos de desarrollo que podamos tener configurados, en muchas ocasiones es tremendamente util disponer de una copia exacta de nuestra web de producción en otro servidor local o remoto. Y cuando hablamos de «una copia exacta», queremos decir que tanto archivos como bases de datos estén perfectamente actualizados. Esto es muy &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/clonar-una-web-en-un-servidor-local/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Clonar una web en un servidor local"</span></a></p>
La entrada <a href="https://blog.ahierro.es/clonar-una-web-en-un-servidor-local/">Clonar una web en un servidor local</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Independientemente de los distintos <a href="https://blog.ahierro.es/entornos-en-el-desarrollo-de-software/">entornos de desarrollo</a> que podamos tener configurados, en muchas ocasiones es tremendamente util disponer de una copia exacta de nuestra web de producción en otro servidor local o remoto.</p>



<p>Y cuando hablamos de «una copia exacta», queremos decir que tanto archivos como bases de datos estén perfectamente actualizados. Esto es muy útil para realizar pruebas de todo tipo: nuevos plugins, cambios de configuración, revisión de actualizaciones, etc.</p>



<figure class="wp-block-image"><img decoding="async" width="650" height="438" src="https://blog.ahierro.es/wp-content/uploads/2019/05/clonar_web.png" alt="Conar Web" class="wp-image-927" srcset="https://blog.ahierro.es/wp-content/uploads/2019/05/clonar_web.png 650w, https://blog.ahierro.es/wp-content/uploads/2019/05/clonar_web-300x202.png 300w" sizes="(max-width: 650px) 100vw, 650px" /></figure>



<span id="more-900"></span>



<p>Realizar esta tarea manualmente es tedioso, aburrido y consume mucho tiempo, eso sin contar que es probable que cuando nos propongamos realizar nuestras pruebas este entorno esté desactualizado, alterado por las últimas pruebas realizadas, o lo que es aún peor, no esté disponible. Así que una buena idea es automatizar esta tarea y programar su ejecución con la periodicidad que nos interese.</p>



<h2 class="wp-block-heading">Algunos aspectos relativos al clonado</h2>



<h3 class="wp-block-heading">Resumen del proceso</h3>



<p>Es buena idea tener una visión general del proceso antes de adentrarnos en él. Lo que vamos a hacer básicamente es un proceso ETL  (Extract, Transform, Load) manual.</p>



<p>Como parte del proceso de extracción realizaremos una copia de seguridad de la base de datos y la descargaremos a una ubicación intermedia. Haremos lo mismo con los archivos del servidor.</p>





<p>Una vez tenemos todo lo necesario en nuestro servidor local, modificamos algunos datos como son archivos de configuración o los registros en la base de datos relativos al entorno.</p>



<p>Finalmente restauraremos la base de datos y sobrescribiremos los archivos de nuestro servidor local.</p>



<h3 class="wp-block-heading">Local versus Remoto</h3>



<p>A pesar de que cada una de las tareas que realizaremos no son complicadas por si mismas, alternaremos de host continuamente y eso puede generar alguna confusión, así que para seguir los pasos indicados sin error deberemos estar muy  atentos al host en el que se realizan las distintas acciones. Identificaremos los hosts como «remoto», el servidor de producción que queremos clonar, y «local» el servidor de pruebas dónde queremos tener la copia.</p>



<p>Es importante que las versiones de <a href="https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/">LAMP (Linux, Apache, PHP y MySQL) </a>sean lo más similar posible, de este modo es posible que nos ahorraremos algunos quebraderos de cabeza. Además, es recomendable dedicar un <a href="https://blog.ahierro.es/como-configurar-virtual-hosts-en-apache-y-ubuntu/">virtual host de Apache </a>para este entorno en nuestro servidor local.</p>



<h3 class="wp-block-heading">Ejemplo sobre WordPress</h3>



<p>Y ya que estas líneas que lees están escritas sobre WordPress, utilizaremos esta plataforma como ejemplo para realizar el clonado. Esto quiere decir que por norma general, si queréis clonar otra plataforma, las mayores diferencias las encontraremos en los los registros de la base de datos y los archivos de configuración referentes al entorno.</p>



<h3 class="wp-block-heading">Periodicidad</h3>



<p>Como hemos dicho queremos automatizar el clonado de nuestra web para tener nuestra réplica preparada y actualizada en todo momento. Podemos establecer la periodicidad que más nos convenga, personalmente estoy cómodo con una semana por dos motivos:</p>



<ol class="wp-block-list"><li>En una semana no suelen producirse muchos cambios en el blog.</li><li>Algunas pruebas se extienden durante varios días, y una restauración diaria las sobrescribiría.</li></ol>



<p>Además, siempre estamos a tiempo de lanzar una actualización manual en caso de ser necesario con la simple ejecución de un script. Si no tienes una web muy grande el proceso será relativamente rápido.</p>



<h2 class="wp-block-heading">Requisitos hardware</h2>



<p>En cuanto a los requisitos de hardware puedes estar tranquilo, pues no necesitas un gran servidor para implementar este sistema. Un ejemplo muy claro de ello es que para este blog lo tengo implementado con una humilde Raspberry Pi. Por si te interesa, aquí te dejo un enlace en el que puedes ver cómo de sencillo es <a href="https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/">montar un servidor web Apache sobre una Raspberry Pi</a>.</p>



<h2 class="wp-block-heading">Clonando nuestra web: el proceso</h2>



<p>Llegados a este punto creo que al igual que yo ya tendréis ganas de poneros manos a la obra, así que no me enrollo más y vamos al lío.</p>



<p>Y puesto que esto se ha alargado un poco más de la cuenta, hemos dividido este artículo en varias entregas para que sea más fácil de seguir:</p>



<ol class="wp-block-list"><li>Clonar una web en un servidor local (es decir, esta entrada).</li><li><a href="https://blog.ahierro.es/clonar-una-web-la-base-de-datos/">Clonar una web: la base de datos</a>.</li><li><a href="https://blog.ahierro.es/clonar-una-web-los-archivos/">Clonar una web: los archivos</a>.</li></ol>



<h2 class="wp-block-heading">Créditos y referencias</h2>



<ul class="wp-block-list"><li>Imagen de portada: <a rel="noreferrer noopener" href="https://pixabay.com/users/martinharry-1411929/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=941625" target="_blank">Martin Harry</a>.</li></ul>





<p></p>La entrada <a href="https://blog.ahierro.es/clonar-una-web-en-un-servidor-local/">Clonar una web en un servidor local</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/clonar-una-web-en-un-servidor-local/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Backup de base de datos MySQL con PHP</title>
		<link>https://blog.ahierro.es/backup-de-base-de-datos-mysql-con-php/</link>
					<comments>https://blog.ahierro.es/backup-de-base-de-datos-mysql-con-php/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Sun, 19 May 2019 08:42:36 +0000</pubDate>
				<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=905</guid>

					<description><![CDATA[<p>Existen múltiples opciones para exportar o realizar copias de seguridad de bases de datos en MySQL: phpMyAdmin, MySQL Workbench, utilizando la línea de comandos, etc. Si nos referimos a una página web, podremos hacer uso de unas u otras en función de las posibilidades que nos ofrezca nuestro proveedor de hosting. Otra de esas posibilidades &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/backup-de-base-de-datos-mysql-con-php/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Backup de base de datos MySQL con PHP"</span></a></p>
La entrada <a href="https://blog.ahierro.es/backup-de-base-de-datos-mysql-con-php/">Backup de base de datos MySQL con PHP</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Existen múltiples opciones para exportar o realizar copias de seguridad de bases de datos en MySQL: phpMyAdmin, MySQL Workbench, utilizando la línea de comandos, etc. Si nos referimos a una página web, podremos hacer uso de unas u otras en función de las posibilidades que nos ofrezca nuestro proveedor de hosting.</p>



<p>Otra de esas posibilidades de las que hablamos es realizar el respaldo con PHP, lo que nos permitirá hacerlo con casi todos los hostings, además de que es fácilmente automatizable. La principal desventaja, por contra, es que es una opción algo más laboriosa, pues tendremos que programar el script. Pero como la rueda casi siempre está inventada, en internet tienes muchas soluciones que te facilitarán la labor.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="650" height="438" src="https://blog.ahierro.es/wp-content/uploads/2019/05/backup_mysql.png" alt="Backup base de datos Mysql" class="wp-image-929" srcset="https://blog.ahierro.es/wp-content/uploads/2019/05/backup_mysql.png 650w, https://blog.ahierro.es/wp-content/uploads/2019/05/backup_mysql-300x202.png 300w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



<span id="more-905"></span>



<h2 class="wp-block-heading">MySQL BackUp Lite</h2>



<p>Yo os propongo esta sencilla solución que he desarrollado, de la que os dejo el código a continuación. En cualquier momento puedes acceder a <a rel="noreferrer noopener" aria-label="la versión más actualizada en Github (abre en una nueva pestaña)" href="https://github.com/ahierrohdez/MySqlBackupLite" target="_blank">la versión más actualizada de MySQL Backup Lite en Github</a>.</p>




<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
/**
*
* MySql Backup Lite Class
*
* @author     Andres Hierro
* @copyright  2019 Andres Hierro
* @license    http://www.apache.org/licenses/LICENSE-2.0  Apache License, Version 2.0
* @version    0.0.1
* @link       http://ahierro.es/
*
*
*
* Copyright 2019 Andrés Hierro
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/

class MySqlBackupLite {

  private $host;
  private $user;
  private $pass;
  private $name;

  private $fileName = &quot;mySqlBackup.sql&quot;;
  private $fileDir = &quot;./&quot;;
  private $fileCompression = false;

  private $timeZone = &#039;+00:00&#039;;

  private $mySqli;
  private $sqlString = &quot;&quot;;
  private $arrayTables;

  private $tableFieldCount = 0;
  private $tableNumberOfRows = 0;
  private $queryResult;



  public function __construct(array $arrayConnConfig) {

      if (
        (!isset($arrayConnConfig&#x5B;&#039;host&#039;])) ||
        (!isset($arrayConnConfig&#x5B;&#039;user&#039;])) ||
        (!isset($arrayConnConfig&#x5B;&#039;pass&#039;])) ||
        (!isset($arrayConnConfig&#x5B;&#039;name&#039;]))
      ) {
          throw new Exception(&#039;Missing connection data.&#039;);

      }
      $this-&gt;setHost($arrayConnConfig&#x5B;&#039;host&#039;]);
      $this-&gt;setUser($arrayConnConfig&#x5B;&#039;user&#039;]);
      $this-&gt;setPass($arrayConnConfig&#x5B;&#039;pass&#039;]);
      $this-&gt;setName($arrayConnConfig&#x5B;&#039;name&#039;]);

  }



  public function backUp() {

    $this-&gt;connectMySql();
    $this-&gt;getTables();
    $this-&gt;generateSqlHeader();
    $this-&gt;createTableStaments();
    $this-&gt;insertStaments();
    $this-&gt;generateSqlFooter();

  }



  private function setHost($host) {
    $this-&gt;host = $host;
  }



  private function setUser($user) {
    $this-&gt;user = $user;
  }



  private function setPass($password) {
    $this-&gt;pass = $password;
  }



  private function setName($name) {
    $this-&gt;name = $name;
  }



  public function setFileName($name) {
    $this-&gt;fileName = $name;
  }



  public function setFileDir($dir) {
    $this-&gt;fileDir = $dir;
  }



  public function setFileCompression($compression) {
    $this-&gt;fileCompression = $compression;
  }



  private function connectMySql() {

    $this-&gt;mySqli = new mysqli($this-&gt;host, $this-&gt;user, $this-&gt;pass, $this-&gt;name);
    $this-&gt;mySqli-&gt;select_db($this-&gt;name);
    $this-&gt;mySqli-&gt;query(&quot;SET NAMES &#039;utf8&#039;&quot;);

  }



  private function getTables() {

    $queryTables = $this-&gt;mySqli-&gt;query(&#039;SHOW TABLES&#039;);
    while($row = $queryTables-&gt;fetch_row()) {
      $this-&gt;arrayTables&#x5B;] = $row&#x5B;0];
    }

  }



  private function generateSqlHeader() {

    $this-&gt;sqlString  = &#039;SET SQL_MODE = &quot;NO_AUTO_VALUE_ON_ZERO&quot;;&#039; . &quot;\r\n&quot;;
    $this-&gt;sqlString .= &#039;SET time_zone = &quot;&#039; . $this-&gt;timeZone . &#039;&quot;;&#039; . &quot;\r\n\r\n\r\n&quot;;
    $this-&gt;sqlString .= &#039;/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&#039; . &quot;\r\n&quot;;
    $this-&gt;sqlString .= &#039;/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&#039; . &quot;\r\n&quot;;
    $this-&gt;sqlString .= &#039;/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&#039; . &quot;\r\n&quot;;
    $this-&gt;sqlString .= &#039;/*!40101 SET NAMES utf8 */;&#039; . &quot;\r\n&quot;;
    $this-&gt;sqlString .= &#039;--&#039; . &quot;\r\n&quot;;
    $this-&gt;sqlString .= &#039;-- Database: `&#039; . $this-&gt;name . &#039;`&#039; . &quot;\r\n&quot;;
    $this-&gt;sqlString .= &#039;--&#039; . &quot;\r\n\r\n\r\n&quot;;

    return;

  }



  private function createTableStaments() {

    foreach($this-&gt;arrayTables as $table){
      $this-&gt;sqlCreateTableStament($table);
    }

  }



  private function sqlCreateTableStament($table) {

    $res = $this-&gt;mySqli-&gt;query(&#039;SHOW CREATE TABLE &#039;.$table);
    $temp = $res-&gt;fetch_row();
		$this-&gt;sqlString .= &quot;\n\n&quot; . str_ireplace(&#039;CREATE TABLE `&#039;,&#039;CREATE TABLE IF NOT EXISTS `&#039;, $temp&#x5B;1]) . &quot;;\n\n&quot;;

  }



  private function insertStaments() {

    foreach($this-&gt;arrayTables as $table){
      $this-&gt;sqlInsertStaments($table);
    }

  }



  private function sqlInsertStaments($table) {

		$this-&gt;getTableData($table);

    if($this-&gt;tableFieldCount == 0) {
      return;
    }


    $i = 0;
		while($row = $this-&gt;queryResult-&gt;fetch_row())	{

      $this-&gt;insertResultHeader($table, $i);
      $this-&gt;insertSingleResult($row);

      $i++;
      $this-&gt;sqlString .= (($i != 0) &amp;&amp; ($i % 100 == 0) || ($i == $this-&gt;tableNumberOfRows)) ? &quot;;&quot; : &quot;,&quot;;

		}

    $this-&gt;sqlString .= &quot;\n\n\n&quot;;

  }



  private function getTableData($table) {

  	$this-&gt;queryResult	= $this-&gt;mySqli-&gt;query(&#039;SELECT * FROM `&#039; . $table . &#039;`&#039;);
    $this-&gt;tableFieldCount = $this-&gt;queryResult-&gt;field_count;
    $this-&gt;tableNumberOfRows = $this-&gt;mySqli-&gt;affected_rows;

  }



  private function insertResultHeader($table, $currentRowNumber) {

  	if ($currentRowNumber % 100 == 0 || $currentRowNumber == 0 )	{
      $this-&gt;sqlString .= &quot;\nINSERT INTO &quot; . $table . &quot; VALUES&quot;;
    }

  }



  private function insertSingleResult($row) {

    $this-&gt;sqlString .= &quot;\n(&quot;;

    for($i = 0; $i &lt; $this-&gt;tableFieldCount; $i++){

      $row&#x5B;$i] = str_replace(&quot;\n&quot;,&quot;\\n&quot;, addslashes($row&#x5B;$i]));

      $this-&gt;sqlString .= (isset($row&#x5B;$i])) ? &#039;&quot;&#039;.$row&#x5B;$i].&#039;&quot;&#039; : &#039;&quot;&quot;&#039;;
      if($i &lt; ($this-&gt;tableFieldCount-1)){
        $this-&gt;sqlString.= &#039;,&#039;;
      }

    }

    $this-&gt;sqlString .=&quot;)&quot;;

  }



  private function generateSqlFooter() {

    $this-&gt;sqlString .=  &quot;\r\n\r\n&quot;;
    $this-&gt;sqlString .=  &#039;/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&#039;;
    $this-&gt;sqlString .=  &quot;\r\n&quot;;
    $this-&gt;sqlString .=  &#039;/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&#039;;
    $this-&gt;sqlString .=  &quot;\r\n&quot;;
    $this-&gt;sqlString .=  &#039;/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&#039;;

  }



  public function downloadFile() {

      ob_get_clean();
      header(&#039;Content-Type: application/octet-stream&#039;);
      header(&quot;Content-Transfer-Encoding: Binary&quot;);
      header(&#039;Content-Length: &#039;. (function_exists(&#039;mb_strlen&#039;) ? mb_strlen($this-&gt;sqlString, &#039;8bit&#039;): strlen($this-&gt;sqlString)) );
      header(&quot;Content-disposition: attachment; filename=\&quot;&quot;.$this-&gt;fileName.&quot;\&quot;&quot;);
    	echo $this-&gt;sqlString; exit;

  }



  public function saveToFile() {

    if (!$backupFile = fopen($this-&gt;fileDir . $this-&gt;fileName, &quot;w+&quot;)) {
        throw new Exception(&#039;Imposible to create file.&#039;);
    }
    fwrite($backupFile, $this-&gt;sqlString);
    fclose($backupFile);

  }


}
</pre></div>


<h2 class="wp-block-heading">Realizar la copia de seguridad</h2>



<p>La solución propuesta nos proporciona dos opciones que podemos utilizar según nuestras necesidades:</p>



<ol class="wp-block-list"><li>Realizar el backup y descargarlo.</li><li>Realizar el backup y guardarlo en un archivo.</li></ol>



<p>En ambos casos incluimos la clase y le pasaremos al método constructor los datos de la conexión a la base de datos en un array como el que ves a continuación:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
include(&#039;MySqlBackup.php&#039;);

$arrayDbConf&#x5B;&#039;host&#039;] = &#039;dbHost&#039;;
$arrayDbConf&#x5B;&#039;user&#039;] = &#039;dbUser&#039;;
$arrayDbConf&#x5B;&#039;pass&#039;] = &#039;dbPassword&#039;;
$arrayDbConf&#x5B;&#039;name&#039;] = &#039;dbName&#039;;
</pre></div>


<h3 class="wp-block-heading">Respaldar y descargar</h3>



<p>Para realizar el backup y descargarlo serán suficientes unas pocas líneas:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
try {

  $bck = new MySqlBackupLite($arrayDbConf);
  $bck-&gt;backUp();
  $bck-&gt;downloadFile();

}
catch(Exception $e) {

  echo $e;

}
</pre></div>


<h3 class="wp-block-heading">Respaldar y guardar en un archivo</h3>



<p>Para guardar el resultado en un archivo además deberemos de indicarle el nombre del archivo y el directorio dónde guardarlo.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
try {

  $bck = new MySqlBackupLite($arrayDbConf);
  $bck-&gt;backUp();
  $bck-&gt;setFileDir(&#039;./backups/&#039;);
  $bck-&gt;setFileName(&#039;backupFileNae.sql&#039;);
  $bck-&gt;saveToFile();

}
catch(Exception $e) {

  echo $e;

}
</pre></div>


<h2 class="wp-block-heading">Solo una parte del proceso</h2>



<p>Pero en muchas situaciones, este respaldo sera solo una parte del proceso. Nosotros hemos propuesto un escenario mayor en el que clonamos nuestra web en un servidor local, en breve publicaremos el artículo.</p>





<h2 class="wp-block-heading">Créditos y rerefencias</h2>



<ul class="wp-block-list"><li>Imagen principal: <a rel="noreferrer noopener" aria-label="Tumisu (abre en una nueva pestaña)" href="https://pixabay.com/users/tumisu-148124/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1990406" target="_blank">Tumisu en Pixabay</a>.</li><li>Solución <a rel="noreferrer noopener" aria-label="Mysql Backup Lite: Andrés Hierro, github (abre en una nueva pestaña)" href="https://github.com/ahierrohdez/MySqlBackupLite" target="_blank">Mysql Backup Lite: Andrés Hierro, github</a>.</li></ul>La entrada <a href="https://blog.ahierro.es/backup-de-base-de-datos-mysql-con-php/">Backup de base de datos MySQL con PHP</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/backup-de-base-de-datos-mysql-con-php/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
