mysql - registros - duplicar base de datos sql server
Cómo duplicar una base de datos MySQL en el mismo servidor (4)
El cliente de la línea de comandos mysql
aceptará una secuencia de sentencias de SQL de la entrada estándar. Por lo tanto, puede canalizar la salida de mysqldump
directamente a mysql
en la línea de comandos. Al hacer esto como un trabajo cron, se sobrescribirán regularmente sus datos de prueba con datos actualizados en vivo:
mysql --user=username --password=passwd -e ''DROP DATABASE test_db;''
mysql --user=username --password=passwd -e ''CREATE DATABASE test_db;''
mysqldump --user=username --password=passwd live_db | mysql --user=username --password=passwd test_db
Tenga en cuenta que dado que sus datos son grandes, tomará mucho tiempo.
Tengo una gran base de datos MySQL, llamémosla live_db
, que quiero replicar en la misma máquina para proporcionar un sistema de prueba para jugar ( test_db
), incluida la estructura de la tabla y los datos. En intervalos regulares quiero actualizar el test_db
con el contenido del live_db
; si es posible incremental.
¿Hay algún mecanismo incorporado en MySQL para hacer eso? Creo que la replicación maestro-esclavo no es lo que quiero, ya que debería ser posible alterar los datos en test_db
. Sin embargo, estos cambios no tienen que ser preservados.
Saludos,
CGD
En caso de que prefiera el Kit de herramientas de migración de MySQL, puede hacer doble clic en el nombre del esquema en el paso de asignación de datos y cambiar el nombre del esquema de destino.
Esta solución funciona bien, pero no hará el trato si está usando PHPunit para pruebas de unidad.
El uso de la contraseña en la línea de comandos genera una advertencia que es detectada por PHPUnit y genera una excepción (sí, un gran problema ...)
La forma de evitar esto es usar el archivo de configuración.
En mi caso, no quiero mantener la contraseña y el usuario tanto en los archivos de configuración como en el código PHP, así que genero el archivo de configuración a partir del código y verifico si existe (de lo contrario, uso el nombre de usuario y la contraseña directamente en la línea de comandos como una opción de retroceso).
Aquí hay un ejemplo, en PHP, de cómo copiar una base de datos de configuración para crear una nueva con un nombre diferente (si, por ejemplo, está administrando un dominio principal con un subdominio / base de datos diferente para cada uno de sus clientes):
/**
* If the $dbName doesn''t exist, then create it.
*
* @param $errorMessage String to return the error message.
* @param $dbName String name of the database to create.
* @param $cleanExisting Boolean if the database exist, clear it to recreate it.
*
* @return boolean ($dbExists)
*/
private function createDatabase(&$errorMessage, $dbName, $clearExisting = false){
$command = "";
$configurationString = "[client]" . "/r/n" . "user=" . parent::$support_user . "/r/n" . "password=" . md5(parent::$support_pass);
$dbExist = false;
$path = realpath(dirname(__FILE__));
$connectionString = " --defaults-extra-file=" . $path . "/mysql.cnf ";
$dbName = strtolower($dbName);
if ($this->isDestinationDbNameValid($errorMessage, $dbName)) {
$dbExist = $this->isDestinationDbExist($errorMessage, $dbName);
if (empty($errorMessage) and ($dbExist === false or $clearExisting === true)) {
if (file_put_contents($path . ''/mysql.cnf'', $configurationString) === false) {
$connectionString = " --user=" . parent::$support_user . " --password=" . md5(parent::$support_pass). " ";
}
if ($dbExist and $clearExisting) {
$command = $path . ''/../../../mysql/bin/mysql '' . $connectionString . '' --execute="DROP DATABASE '' . $dbName .'';" &'';
}
$command .= ''"'' . $path . ''/../../../mysql/bin/mysql" '' . $connectionString . '' --execute="CREATE DATABASE '' . $dbName . '';" &"'' .
$path . ''/../../../mysql/bin/mysqldump" '' . $connectionString . '' --events --triggers --routines setup | "'' .
$path . ''/../../../mysql/bin/mysql" '' . $connectionString . $dbName;
exec($command);
$dbExist = $this->isDestinationDbExist($errorMessage, $dbName);
if (!$dbExist) {
$errorMessage = parent::getErrorMessage("COPY_SETUP_DB_ERR", "An error occurred during the duplication process of the setup database.");
}
}
}
return $dbExist;
}
Nota adicional:
Tuve que usar comillas dobles (") en lugar de comillas simples ('') alrededor de mis sentencias de SQL.
Tuve que usar el símbolo comercial (&) para separar mi comando diferente.
Este ejemplo no incluye la validación para el nuevo nombre de la base de datos (método isDestinationDbNameValid ()). No es necesario mencionar que nunca debe confiar en la entrada del usuario ...
También debe escribir su método personalizado para validar que la copia de la base de datos funcionó como se esperaba (método isDestinationDbExist ()). Al menos debe validar que existe la base de datos, existe una tabla de su configuración y, opcionalmente, validar para los programas almacenados.
Usa la fuerza sabiamente mis amigos,
Jonathan Parent-Lévesque de Montreal
Las respuestas de Michaels a continuación funcionan bien pero no copian eventos, procedimientos almacenados o desencadenadores.
Para copiar esos unos pocos conmutadores más es necesario para mysqldump: - --events --triggers --routines
Para complementar una copia ya hecha:
mysqldump --user=username --password=passwd --no-data --no-create-info --no-create-db --events --triggers --routines live_db | mysql --user=username --password=passwd test_db