Trabajar BD Remota y BD Local iguales ambas (mysql)

Hola a todos necesito trabajar en dos BD iguales una local y una remota en un hosting, ya que tengo un sistema que trabaja local pero tambien se lee en un hosting remoto, aclaro tambien puedo hacer operaciones en el remoto y pasarla para el local, lo que quiero es que la BD del hosting remoto se actualice desde la BD local, o sea, todas las operaciones que haga en local se agreguen en el hosting o viceversa, las operaciones que haga en remoto se agreguen en local, tengo la idea pero no se como hacerlo, por ejemplo pienso:
Hacer una sincrocizacion de las BD, luego hacer un cron para hacerlo automatico, pero no tengo idea de como se hace y no tengo suficientes permiso en phpMyadmin del hosting, solo actualizar la BD, trabajar con las tablas y exportar e importar. Necesito sugerencias o si es posible algo como ejemplo, gracias por adelantado.

1 Like

Te recomiendo hacer un script que cada vez que se ejecute. Elimine completamente el contenido de la db remota y se actualice con la salva de la local.

Para obtener el .sql de la local te recomiendo rodzadra/yii-dump-db

Gracias Gabriel ya lo pense, pero ETECSA no permite ejecutar script en su servidor, ademas no tengo idea como se hace, nunca he echo esto

Ya. Ahora no tengo tiempo para entrar en detalles.Luego de las 12. Pero el mecanismo para saltarse eso con ETECSA es el siguiente.

  1. en lo que tienes en etecsa pones un endpoint (POST) con CORS (para tu dominio internacional). Este action es el que hará la “tarea programada”
  2. en el host internacional, es que configuras el CRON. este lo que hará será hacer una petición POST al endpoint definido en el paso 1.

O sea, el hosting internacional es el que ejecuta el trigger, y llama por HTTP, al script en el hosting nacional.

Lo feo (hablando en terminos de Yii) es que no puedes hacer el script como un comando de la consola de Yii, sino como un action normal. Pero… si extraes ese action como una clase independiente, luego lo podrías invocar en ambos contextos.

Recordarmelo luego de las 12 para mas detalles.

Gracias, ayudame con eso

1 Like

Hola y saludos, no logro descargar la extension yii-dump-db, ya no esta disponible, pueden aconsejarme algo, les voy a mostrar algo que hice hace un tiempo para actualizar dos BD en windows:

 public function actionExportar() {

        $filename = 'salvas.sql';

        system(Yii::app()->params['mysqlDir'] . "mysqldump --user=usuario--password=clave --no-create-db --no-create-info --extended-insert --insert-ignore base pongo las tablas a exportar > $filename");
        
        header("Content-type: text/plain");

        header("Content-disposition: attachment; filename=Salva_exportada_" . date("Y_m_d_a") . ".sql");

        readfile('salvas.sql');

        Yii::app()->end();
    }

    public function actionImportar() {
        $almacen = $_POST['entidad']; {
            Yii::app()->db->beginTransaction();
            $query = "CREATE TABLE IF NOT EXISTS tabla a crear, si lo necesito (
                id INT NOT NULL AUTO_INCREMENT,
                fecha date,
                PRIMARY KEY (id) )
                ENGINE = InnoDB";
            Yii::app()->db->createCommand($query)->execute();
        }

        foreach ($_FILES['files']['name'] as $key => $filename) {
            if (empty($filename)) {
                echo "Seleccione salva.";
                $this->render('salvasim');
                Yii::app()->end();
            }
            move_uploaded_file($_FILES['files']['tmp_name'][$key], $filename);

            $sqlFile = $filename;

            $restore = Yii::app()->params['mysqlDir'] . "mysql --password=clave --user=usuario base< $sqlFile";
            system($restore, $return);

            if ($return) {
                echo "Ocurrió un error al intentar cargar la salva.";
            } else {
                echo "Los datos fueron importados satisfactoriamente.";
                unlink($filename);
            }
            $this->render('salvasim');
        }
    }

esto es para windows lo que hace es exportar las tablas seleccionada en una bd e importarla en la otra bd, en linux no trabaja me da error en:

$restore = Yii::app()->params['mysqlDir'] . "mysql --password=clave --user=usuario base< $sqlFile";
            system($restore, $return);

aqui en el fichero del hosting, pongo la clave y el usuario del hosting que no son los mismos que en local, pero no se cual es el params[‘mysqlDir’] , ya que me da error aqui system($restore, $return); con la variable return. necesito ver si puedo trabajar aqui, o hay otra sugerencia.

El script que uso https://gist.github.com/glpzzz/90433c21a345b6965931177c78412df3

Gracias Gabriel lo analizo y te comento, de todas formas te preguntaba sobre el que puse, ya que tengo que trabajar en ambas direcciones, o sea, si creo una operacion en el hosting la tengo que actualizar en local y viceversa, cuando la creo en local necesito actualizar el hosting y ese que yo puse lo hace, para las tablas deseadas, el va a las tablas busca todas las operaciones y las que trae en la salva las pone en la otra base si no estan, sin borrar las que estaban. ya que puede darse el caso que actualice local desde el hosting y puede haber operaciones en local que no estan en el hosting y en el hosting que no estan en local, pero coge las del hosting que no estan en local y las pone en local. No se si me entiendes.

1 Like

@Rafael_Rosales porque no haces una rèplica de tu base de datos, basicamente seria una copia exacta de tu base de datos sin ningun script, yii2 tambien puede gerènciar eso https://www.yiiframework.com/doc/guide/2.0/en/db-dao#read-write-splitting, y si no me equivoco es bidirecional, te recomiendo que busques en la documentación de Mysql sobre las réplicas

Saludos jmar1998, segun lo que me dices es replicar la BD de local para el sitio y viceversa, aqui puedo tener algunos problemas:

  1. En local trabaja a diario, el hosting es ocacional, quiero actualizar cuando hago operaciones en ambos sentidos, en local a diario y en hosting cuando las hago, si hago una operacion en el hosting y hago la replica para el local, entonces ¿Puedo perder las operaciones que tenia en local antes de la replica?.
  2. No tengo permisos y no puedo editar mysql en el hosting

Ademas las BD, no son exactamente iguales, ya que en local podria crear el maestro y replicarlo en el hosting, pero la del hosting tiene las tablas del sistema y las del sitio web y en el local nadamas tengo las del sistema y lo que necesito mas es la del hosting para local