<?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>backup | ahierro.es</title>
	<atom:link href="https://blog.ahierro.es/tag/backup/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>Thu, 06 Jun 2019 06:26:11 +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>backup | ahierro.es</title>
	<link>https://blog.ahierro.es</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Clonar una web: los archivos</title>
		<link>https://blog.ahierro.es/clonar-una-web-los-archivos/</link>
					<comments>https://blog.ahierro.es/clonar-una-web-los-archivos/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Thu, 06 Jun 2019 05:39:03 +0000</pubDate>
				<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[ftp]]></category>
		<category><![CDATA[linux]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=1078</guid>

					<description><![CDATA[<p>En la entrada previa hemos visto cómo clonar la base de datos como parte de nuestro objetivo de disponer de un entorno de pruebas de nuestra web en un servidor local actualizado regularmente. En esta ocasión abordamos cómo mantener una copia actualizada de los archivos de nuestro servidor para así completar el proceso. Esta es &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/clonar-una-web-los-archivos/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Clonar una web: los archivos"</span></a></p>
La entrada <a href="https://blog.ahierro.es/clonar-una-web-los-archivos/">Clonar una web: los archivos</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>En la entrada previa hemos visto <a href="https://blog.ahierro.es/clonar-una-web-la-base-de-datos/">cómo clonar la base de datos </a>como parte de nuestro objetivo de disponer de un entorno de pruebas de nuestra web en un servidor local actualizado regularmente. En esta ocasión abordamos cómo mantener  una copia actualizada de los archivos de nuestro servidor para así completar el proceso.</p>



<figure class="wp-block-image"><img fetchpriority="high" 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-1078"></span>



<p>Esta es la tercera entrega de la serie <a href="https://blog.ahierro.es/clonar-una-web-en-un-servidor-local/">Clonar una web en un servidor local</a>, por lo que te recomiendo leer las entregas previas. No obstante, este artículo puede ser tratado como un artículo atómico asumiendo que perdemos ciertos matices.</p>





<p>Una de las ventajas del proceso de clonado de los archivos frente al de clonado de una base de datos es que si bien con la base de datos podíamos encontrarnos muchas limitaciones en función de los diferentes proveedores y planes de hostings, para clonar los archivos el único requisito que debemos cumplir con respecto a nuestro host remoto es tener acceso mediante ftp, algo que todos los hosting ofrecen.</p>



<h2 class="wp-block-heading">Descarga de archivos</h2>



<p>Para descargar los archivos nos serviremos del comando wget. Comenzaremos el proceso creando un script de consola y le asignándole los permisos necesarios:</p>


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


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


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

wget -r -N -q --level=15 --user=user --password=&#039;password&#039; --directory-prefix=~/webBackUp fttp://ftp.url.com
</pre></div>


<p>Dónde:</p>



<ul class="wp-block-list"><li>-r, indica recursividad</li><li>-N, indica que descargue solo archivos nuevos y/o modificados</li><li>-q, oculta los mensajes de salida del comando</li><li>&#8211;level=15, es el numero de niveles de recursividad</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, es el ftp con el path del que queremos descargar los archivos</li></ul>



<p>Esto realizará una copia de los archivos de nuestra web en la carpeta <em>~/webBackUp/ftp.url.com</em>. Esta operación suele tardar bastante tiempo, así que para agilizarla hemos optado por descargar únicamente los archivos nuevos y/o modificados recientemente, aun así con una web de tamaño medio tardará un buen rato.</p>



<p>Debemos destacar que no descargamos los archivos directamente a nuestro entorno de pruebas, sino que los descargamos a una carpeta intermedia. Esto lo hacemos por dos motivos:</p>



<ol class="wp-block-list"><li>Modificaremos algunos archivos antes de copiarlos en nuestro entorno de pruebas.</li><li>Podemos crear un segundo script que omita la descarga y que restaure nuestra copia mucho más rápido, muy útil en caso de querer descartar los cambios realizados y comenzar desde 0.</li></ol>



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



<p>Una vez hecha la descarga de los archivos deberemos modificar los que contienen datos relativos a nuestro host. En nuestro ejemplo, el archivo <em>wp-config.php </em>almacena la inforación de la conexión a la base de datos. En vuestro caso debereis localizar que archivos contienen este tipo de información antes de seguir avanzando.</p>



<p>La estrategia que seguiremos para ello sera la de realizar una copia inicial de forma manual de los archivos sensibles al entorno de pruebas. Una vez hecha actualizaremos los datos necesarios.</p>



<p>Por otro lado, automatizaremos una tarea que renombra estos archivos en la ubicación intermedia, de forma que cuando realicemos la copia al entorno de pruebas no se sobrescriban. Así que agregamos estas dos líneas a nuestro script:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
rm ~/webBackUp/ftp.url.com/w-config.php.renamed
mv ~/webBackUp/ftp.url.com/w-config.php ~/webBackUp/ftp.url.com/w-config.php.renamed
</pre></div>


<h2 class="wp-block-heading">Copia de archivos a la ubicación definitiva</h2>



<p>Ya con los archivos descargados y una vez resuelta la problemática de la información sensible al entorno copiamos los archivos:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
cp -r ~/webBackUp/ftp.url.com/* /var/www/targetVHost
</pre></div>


<p>Como vemos, este sistema solo copia los archivos nuevos y/o que han sufrido cambios, pero si hemos eliminado un archivo de nuestro host remoto no lo eliminará de nuestro host local. Para mi esta situación no supone un problema a día de hoy, así que simplemente no hago nada, pero siempre se puede preparar algún sistema que busque la diferencia de archivos entre la copia intermedia y el entorno de prueba y elimine los sobrantes de esta segunda ubicación. </p>



<h2 class="wp-block-heading">El script</h2>



<p>Y todo el rollazo que os he soltado se traduce básicamente en el siguiente script: </p>


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

wget -r -N -q --level=15 --user=user --password=&#039;password&#039; --directory-prefix=~/webBackUp fttp://ftp.url.com
rm ~/webBackUp/ftp.url.com/w-config.php.renamed
mv ~/webBackUp/ftp.url.com/w-config.php ~/webBackUp/ftp.url.com/w-config.php.renamed
cp -r ~/webBackUp fttp://ftp.url.com/* /var/www/targetVHost
</pre></div>


<h2 class="wp-block-heading">Programar la ejecución de la copia</h2>



<p>Al igual que hicimos con la clonación de la base de datos 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; gutter: false; title: ; notranslate">
0 2 * * 5 ~/scripts/clonWebFiles.sh
</pre></div>


<p>Aunque en principio ambos script podrían ejecutarse a la misma vez, hemos sido precavidos retrasando una hora la ejecución de la copia de los archivos, de forma que se ejecute cada viernes a las 02:00 de la madrugada.</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>Entrega previa de la seie: <a href="https://blog.ahierro.es/clonar-una-web-la-base-de-datos/">Clonar una web: la base de datos</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-los-archivos/">Clonar una web: los archivos</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-los-archivos/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>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 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="(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>
