Sincronización de 2 BDD MySQL en PHP
Red6Pc
-
Red6Pc -
Red6Pc -
Hola, necesito exportar mi base de datos MySQL que funciona en un Servidor Local Windows Server 2012 R2; la exportación debe hacerse hacia un Servidor en Línea alojado en IONOS y para el que la base de datos tiene la misma estructura que la Local pero con un nombre diferente. ¿Cómo debería hacerlo?
En la segunda etapa, se tratará de escribir otro script PHP en el Servidor IONOS remoto que corre en LINUX, el cual script PHP se encargará de importar ese archivo exportado desde mi Servidor Local Windows Server ... Entonces, mi pregunta: ¿Cómo debo proceder para lograrlo todo?
En la segunda etapa, se tratará de escribir otro script PHP en el Servidor IONOS remoto que corre en LINUX, el cual script PHP se encargará de importar ese archivo exportado desde mi Servidor Local Windows Server ... Entonces, mi pregunta: ¿Cómo debo proceder para lograrlo todo?
6 respuestas
Hola,
Para bases MySQL... basta con hacer un DUMP de la que quieras respaldar, luego importar ese DUMP en tu nueva BDD
https://phoenixnap.com/kb/how-to-backup-restore-a-mysql-database
https://www.sqlshack.com/how-to-backup-and-restore-mysql-databases-using-the-mysqldump-command/
.
--
Cordialement,
Jordane
Para bases MySQL... basta con hacer un DUMP de la que quieras respaldar, luego importar ese DUMP en tu nueva BDD
https://phoenixnap.com/kb/how-to-backup-restore-a-mysql-database
https://www.sqlshack.com/how-to-backup-and-restore-mysql-databases-using-the-mysqldump-command/
.
--
Cordialement,
Jordane
Estoy totalmente de acuerdo contigo en este punto (es decir, «En Línea de Comando»), solo que en mi caso el problema es escribir un script PHP que primero haga la EXPORTACIÓN de toda mi Base de Datos en Local, luego se conecte al Servidor MySQL en Línea de IONOS para hacer lo contrario, es decir, la IMPORTACIÓN de dicha Base MySQL que tenga la misma estructura ... ¿Cómo escribir este script PHP??? Porque no estoy seguro de que la sintaxis del Código que funciona En Línea de Comando sea la misma que la que hay que escribir en un script PHP!!! Son 2 entornos totalmente diferentes. Además, este script debe ser automatizado, tendría que crear una tarea CRON en mi Windows Server para que lo haga automáticamente, por supuesto a intervalos regulares, como cada 3 horas del tiempo (a las 6:30, luego a las 9:30, luego a las 12:30, 15:30, 18:30, 20:30 y debería detenerse a las 23:30, por ejemplo ...).
Voilà, eso es exactamente de детàlles de eso se trata en definitiva.
Voilà, eso es exactamente de детàlles de eso se trata en definitiva.
luego conectarse al Servidor en Línea MySQL de IONOS
Ya .. ese punto podría bloquearse....
El acceso remoto de tu BDD (en un servidor IONOS) es, la mayoría de las veces, imposible.
Son 2 entornos totalmente diferentes. Además, este script debe ser automatizado, tendría que crear una tarea CRON en mi Windows Server para que lo haga automáticamente, claro a intervalos regulares, como cada 3 horas del tiempo (a las 6:30, luego a las 9:30, luego a las 12:30, 15:30, 18:30, 20:30 y debería detenerse a las 23:30, por ejemplo ...).
A través de esta tarea CRON, genera un DUMP de tu BDD ..luego, envía por FTP, el DUMP a tu servidor IONOS
Luego, en tu servidor IONOS, también crear una tarea CRON que cargue ese DUMP en tu BDD.
Quiero decir que la sintaxis de mysqldump solo funciona en la línea de comandos y no en un script PHP, porque he puesto este script y luego he programado una tarea en Windows Server 2012 R2 (tarea CRON) y al ir a Sistema, el Programador de tareas de Windows me muestra un mensaje: "La operación fue cancelada por el usuario. (0x800704C7) ...
Aquí está el contenido de mi script PHP que he colocado en un directorio de mi aplicación:
No veo en mi código dónde está el fallo ...
Aquí está el contenido de mi script PHP que he colocado en un directorio de mi aplicación:
//Entre aquí la información de su base de datos y el nombre del archivo de respaldo. $mysqlDatabaseName ='database'; $mysqlUserName ='xxxxxxxxxxxxxx'; $mysqlPassword ='xxxxxxxxxxxxxx'; $mysqlHostName ='dirección ip'; $mysqlExportPath ='archivo-export.sql'; //Por favor, no modificar los siguientes puntos //Exportación de la base de datos y resultado $command='mysqldump --opt -h' .$mysqlHostName .' -u' .$mysqlUserName .' -p' .$mysqlPassword .' > ' .$mysqlExportPath; exec($command,$output=array(),$worked); switch($worked){ case 0: echo 'La base de datos <b>' .$mysqlDatabaseName .'</b> a été stockée avec succès dans le chemin suivant '.getcwd().'/' .$mysqlExportPath .'</b>'; break; case 1: echo 'Une erreur s est produite lors de l exportation de <b>' .$mysqlDatabaseName .'</b> vers'.getcwd().'/' .$mysqlExportPath .'</b>'; break; case 2: echo 'Une erreur d exportation s est produite, veuillez vérifier les informations suivantes : <br/><br/><table><tr><td>MySQL Database Name:</td><td><b>' .$mysqlDatabaseName .'</b></td></tr><tr><td>MySQL User Name:</td><td><b>' .$mysqlUserName .'</b></td></tr><tr><td>MySQL Password:</td><td><b>NOTSHOWN</b></td></tr><tr><td>MySQL Host Name:</td><td><b>' .$mysqlHostName .'</b></td></tr></table>'; break; } No veo en mi código dónde está el fallo ...
Dado el mensaje de error, parece más un problema de ejecución del script desde el planificador de tareas.
¿Al menos has probado el script directamente... (sin pasar por el planificador)?
Y luego, ¿cómo has creado tu tarea programada?
¿Con qué usuario programaste esta tarea?
En general, se ejecuta el script PHP desde un archivo .bat... y es ese .bat el que se lanza desde Windows... y hay que que la ruta al ejecutable de PHP esté configurada en el sistema
(pero ahí ya salimos del marco de este foro que solo trata del lenguaje PHP... si tienes problemas para programar la tarea, seguramente tendrás que plantear la pregunta en el foro de Windows.)
A notar que también podrías generar tu dump en PowerShell ...
por ejemplo
https://gallery.technet.microsoft.com/scriptcenter/PowerShell-to-perform-a687f0df
¿Al menos has probado el script directamente... (sin pasar por el planificador)?
Y luego, ¿cómo has creado tu tarea programada?
¿Con qué usuario programaste esta tarea?
En general, se ejecuta el script PHP desde un archivo .bat... y es ese .bat el que se lanza desde Windows... y hay que que la ruta al ejecutable de PHP esté configurada en el sistema
(pero ahí ya salimos del marco de este foro que solo trata del lenguaje PHP... si tienes problemas para programar la tarea, seguramente tendrás que plantear la pregunta en el foro de Windows.)
A notar que también podrías generar tu dump en PowerShell ...
por ejemplo
https://gallery.technet.microsoft.com/scriptcenter/PowerShell-to-perform-a687f0df
Siguiendo su enlace https://gallery.technet.microsoft.com/scriptcenter/PowerShell-to-perform-a687f0df, no he visto cómo explican la generación del DUMP en PowerShell ...
Para responder a sus preguntas, diré:
1/- ¿Cómo voy a probar el script directamente sin pasar por el programador?
2/- Para la creación de mi tarea programada, simplemente seguí este tutorial a través de este Lien: https://www.pcastuces.com/pratique/astuces/4245.htm
3/- ¿De qué usuario se refiere? He puesto al inicio de mi script PHP el nombre del usuario que había creado en phpMyAdmin, así como su contraseña, como esto:
4/- ¿Cómo se ejecuta un script PHP desde un archivo BAT?
Para responder a sus preguntas, diré:
1/- ¿Cómo voy a probar el script directamente sin pasar por el programador?
2/- Para la creación de mi tarea programada, simplemente seguí este tutorial a través de este Lien: https://www.pcastuces.com/pratique/astuces/4245.htm
3/- ¿De qué usuario se refiere? He puesto al inicio de mi script PHP el nombre del usuario que había creado en phpMyAdmin, así como su contraseña, como esto:
$mysqlDatabaseName ='nom de la base de données'; $mysqlUserName ='nom de l'utilisateur de la base de données'; $mysqlPassword ='mot de de l'utilisateur de la base de données'; $mysqlHostName ='adresse ip du serveur'; $mysqlExportPath ='fichier-export.sql';
4/- ¿Cómo se ejecuta un script PHP desde un archivo BAT?
Sin embargo, también en mi búsqueda de soluciones, había encontrado un Script en GitHub, el cual realiza la Exportación de una base de datos mediante PHP y la guarda vía FTP, pero aún no lo he probado. Aquí está íntegro el Script PHP organizado en 2 archivos:
A/ - Script PHP n° 1:
/** * DatabaseExport is a tool to export database via PHP and store it via FTP * * Copyright (c) 2011 Tomas Pavlatka (http://tomas.pavlatka.cz) * * @package DatabaseExport */ header("content-type: text/plain; charset=utf-8"); // Require classes. require_once 'classes/Database.php'; // Export params. $params = array( 'database' => array( 'db_host' => 'localhost', 'db_name' => 'db_name', 'db_user' => 'root', 'db_password' => '', 'db_charset' => 'utf8'), 'ftp' => array( 'ftp_server' => '', 'ftp_username' =&te; '', 'ftp_password' => '', 'ftp_folder' => '' ), 'export' => array( 'export_folder' => './backups/', 'export_zip' => 'bzip2', ) ); // Export database.. $dbObj = new PTX_Database($params['database']); $dbObj->connect(); $dbTables = array(); if($dbObj->mysqlListTables()) { while($table = $dbObj->mysqlFetchArray()){ $dbTables[] = (string)$table[0]; } } $exportedData = $dbObj->dbExport($dbTables); // Save a file. $fileName = $params['database']['db_name'].'-'.date('YmdHis').'.sql'; $filePath = $params['export']['export_folder'].$fileName; if($params['export']['export_zip'] == 'bzip2') { $fileName .= '.bz2'; $filePath .= '.bz2'; $bz = bzopen($filePath, "w"); bzwrite($bz, $exportedData); bzclose($bz); } else { $fopen = fopen($filePath,'w+'); fwrite($fopen,$exportedData); fclose($fopen); } // Copy to FTP. $ftpConnect = ftp_connect($params['ftp']['ftp_server']); $ftpLogin = ftp_login($ftpConnect, $params['ftp']['ftp_username'], $params['ftp']['ftp_password']); if($ftpLogin) { // Upload a file $destination = $params['ftp']['ftp_folder'].$fileName; $upload = ftp_put($ftpConnect, $destination, $filePath, FTP_BINARY); } ftp_close($ftpConnect);
B/ - Script PHP n° 2:
/** * DatabaseExport is a tool to export database via PHP and store it via FTP * * Copyright (c) 2011 Tomas Pavlatka (http://tomas.pavlatka.cz) * * @package DatabaseExport */ class PTX_Database { /* * Holds actual connection. */ private $_dbConnect; /* * Private variable holding option for class. */ private $_options = array( 'db_host' => '', 'db_name' => '', 'db_user' =' '', 'db_password' =' '', 'db_charset' => 'utf-8'); private $_selectQuery; /** * Construct. * * constructor of the class * @param array $options - parameters for class */ public function __construct(array $options = array()) { $this->_options = array_merge($this->_options,$options); } /** * Connect. * * connects to the database. */ public function connect(){ if(!$this->_dbConnect = @mysql_connect($this->_options['db_host'],$this->_options['db_user'],$this->_options['db_password'])){ exit('Unable to connect to database'); } if(!@mysql_select_db($this-'db_name'], $this->_dbConnect)) { exit(sprintf('Unable to connect to database %s',$this->_options['db_name'])); } // Set charset. mysql_query("SET CHARACTER SET ".$this->_options['db_charset']); } /** * Export. * * exports database into text * @param array $tables - list of the table * @return exported data */ public function dbExport(array $tables) { $exportData = null; foreach($tables as $table) { $exportData .= $this->_createExportHeader($table); $exportData .= $this->_getExportData($table); } return $exportData; } /** * Mysql Fetch Array. * * fetch array from database. */ public function mysqlFetchArray(){ return @mysql_fetch_array($this->_selectQuery); } /** * Mysql Fetch Assoc. * * fetch array assoc from database. */ public function mysqlFetchAssoc(){ return @mysql_fetch_assoc($this->_selectQuery); } /** * Mysql List Tables. * * mysql_query to find all tables in database. * @return true | false */ public function mysqlListTables(){ if(!$this->_selectQuery = @mysql_query("SHOW TABLES FROM ".$this-'_options['db_name'],$this->_dbConnect)) { return false; } else { return true; } } /** * Create export header (Private). * * creates header for export * @param $table - name of a table * @return header */ private function _createExportHeader($table) { // Fields. $fields = array(); $query = mysql_query("DESCRIBE `{$table}`",$this-'_dbConnect); while($field = mysql_fetch_assoc($query)) { $fields[] = $field; } // Indexes. $indexes = array(); $query = mysql_query("SHOW INDEXES FROM `{$table}`"); while($index = mysql_fetch_assoc($query)) { if(isset($indexes[$index['Key_name']])) { $indexes[$index['Key_name']][] = $index; } else { $indexes[$index['Key_name']] = array($index); } } // Table status. $query = mysql_query("SHOW TABLE STATUS WHERE `Name` = '{$table}'"); $status = mysql_fetch_assoc($query); // Table header. $header = "DROP TABLE IF EXISTS `{$table}`;\n"; $header .= "CREATE TABLE `{$table}` (\n"; foreach($fields as $key => $values) { $header .= "\t`".$values['Field']."` ".$values['Type']; if($values['Null'] == 'NO') { $header .= " not null"; } else { $header .= " null"; } // TODO: What about MySQL constants ? if(!empty($values['Default'])) { if($values['Default'] == 'CURRENT_TIMESTAMP') { $header .= " default ".$values['Default']; } else { $header .= " default '".$values['Default']."'"; } } if(!empty($values['Extra'])) { $header .= " ".$values['Extra']; } $header .= ",\n"; } $countIndexes = count($indexes); $counter = 1; foreach($indexes as $indexKey => $indexValeus) { if($indexKey == 'PRIMARY') { $header .= "\tPRIMARY KEY ("; $keyString = null; foreach($indexValeus as $indKey => $indValues) { $keyString .= "`".$indValues['Column_name']."`,"; } $header .= substr($keyString,0,-1); } else { $header .= "\tKEY `".$indexKey."` ("; $keyString = null; foreach($indexValeus as $indKey => $indValues) { $keyString .= "`".$indValues['Column_name']."`"; if(!empty($indValues['Sub_part'])) { $keyString .= ' ('.$indValues['Sub_part'].')'; } $keyString .= ","; } $header .= substr($keyString,0,-1); } if($counter++ < $countIndexes) { $header .= "),\n"; } else { $header .= ")\n"; } } $header .= ") "; // Additional information. $charsetExplode = explode('_',$status['Collation']); $status['Charset'] = (isset($charsetExplode[0])) ? $charsetExplode[0] : null; $additionalInfo = array('Engine' => 'ENGINE','Auto_increment' => 'AUTO_INCREMENT', 'Charset' => 'CHARSET', 'Collation' => 'COLLATE'); foreach($additionalInfo as $key => $name) { if(isset($status[$key]) && !empty($status[$key])) { $header .= $name .'='.$status[$key]." "; } } $header .= ";\n\n"; return (string)$header; } /** * Get Export Data (Private). * * exports records from database. * @param $table - name of a table * @return export of records */ private function _getExportData($table) { $d = null; $data = mysql_query("SELECT * FROM `{$table}` WHERE 1", $this->_dbConnect); $counter = 1; $insertData = null; $rowCounter = mysql_num_rows($data); if($rowCounter > 0) { while($row = mysql_fetch_assoc($data)) { if($counter == 1) { $insertData .= "INSERT INTO `{$table}` "; $columns = array_keys($row); $columnNames = null; foreach($columns as $key => $column) { $columnsNames .= "`{$column}`,"; } $insertData .= "(".substr($columnsNames,0,-1).") VALUES \n"; } $insertData .= "("; $rowData = null; foreach($row as $column => $value) { $rowData .= "'".mysql_escape_string($value)."',"; } $insertData .= substr($rowData,0,-1); if($counter < $rowCounter) { $insertData .= "),\n"; } else { $insertData .= ");\n\n"; } // Increase counter; $counter++; } } // Return data. return (string)$insertData; } }
Contrairement au premier, ce script me paraît beaucoup plus cohérent ... C'est vrai qu'il est un peu plus long... Qu'en dites-vous ?
Hola, tanto en local como en el servidor se ejecuta correctamente el DUMP de mi base de datos mediante un archivo .bat en una tarea programada en Windows/ Windows Server 2012 R2 ... Para la exportación, probé un procedimiento con SSH que efectivamente exportó el archivo en el servidor de IONOS, pero cuando inicio la importación me aparece el mensaje Unknown collation: 'utf8mb4_0900_ai_ci'
He intentado reemplazar en mi archivo sql que exporté pero sigue igual, teniendo en cuenta que IONOS está en MariaDB y yo en MySQL 8.0.17 - MySQL Community Server - GPL
- Otra preocupación: ¿existe alguna otra metodología en PHP para enviar el DUMP por FTP al servidor de IONOS?
He intentado reemplazar en mi archivo sql que exporté pero sigue igual, teniendo en cuenta que IONOS está en MariaDB y yo en MySQL 8.0.17 - MySQL Community Server - GPL
- Otra preocupación: ¿existe alguna otra metodología en PHP para enviar el DUMP por FTP al servidor de IONOS?
Entonces, ¿estás de acuerdo conmigo en que mi versión MySQL 8.0.17 - MySQL Community Server - GPL es más reciente que la versión de MariaDB de IONOS? Si sí, ¿seguro que IONOS permitirá que actualicemos su versión de base de datos? Porque ahora parecería que cuando creo mi base de datos en IONOS, debo indicar utf8_general_ci para que sea compatible con mi dump exportado...
Aquí tienes un poco cómo se ve mi archivo .bat que realiza el dump:
@echo off
mysqldump -h localhost -u Toto -ppassword maBase > C:\folder\loop.sql
Así como el que hace el FTP
ftp -s:C:\folder\gestion_Extranet.ftp
Aquí tienes un poco cómo se ve mi archivo .bat que realiza el dump:
@echo off
mysqldump -h localhost -u Toto -ppassword maBase > C:\folder\loop.sql
Así como el que hace el FTP
ftp -s:C:\folder\gestion_Extranet.ftp
Aquí tienes un poco de lectura para info:
https://www.ionos.fr/digitalguide/hebergement/aspects-techniques/mariadb-vs-mysql/
Si estás en un hosting compartido, dudo que puedas actualizar la versión de mariadb.
Hace falta que pongas la BDD que se encuentra en tu Windows “compatible” con la versión de mariadb presente en ionos.
empieza por la “collation” de las tablas a modificar en utf8_general_ci (o equivalente) tal como ya lo has descubierto.
https://www.ionos.fr/digitalguide/hebergement/aspects-techniques/mariadb-vs-mysql/
Si estás en un hosting compartido, dudo que puedas actualizar la versión de mariadb.
Hace falta que pongas la BDD que se encuentra en tu Windows “compatible” con la versión de mariadb presente en ionos.
empieza por la “collation” de las tablas a modificar en utf8_general_ci (o equivalente) tal como ya lo has descubierto.
Buenas noches, Sí es verdad que no podré actualizar la versión del SGBD de IONOS, por cierto la mía en mi PC sí ... He hecho varios tests hoy en línea de comandos, y efectivamente es mi codificación la que ha creado los problemas ... Partí de una base de datos en blanco que creé localmente y luego en línea respetando la codificación UTF-8, la importación manual funcionó ... Pero surge otro problema, el de los derechos ... En efecto, mi base local tiene un ROOT cuyo password es "hiper compuesto" con signos + y otros que había puesto, sin saber qué problemas podría acarrear ... Por lo tanto, incluso cuando hago el DUMP con el ROOT, no pasaba, tuve que crear un USER con todos los GRANT y luego el DUMP funcionó ... Ahora cuando importo en línea de comandos en IONOS, me aparece "ERROR 1227 (42000) Access denied", diciéndome que no tengo suficientes privilegios ... ¿Qué debo hacer en ese caso?