{"id":38146,"date":"2019-10-31T22:21:54","date_gmt":"2019-10-31T19:21:54","guid":{"rendered":"https:\/\/prohoster.info\/blog\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql\/"},"modified":"2019-10-31T22:21:54","modified_gmt":"2019-10-31T19:21:54","slug":"perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql","title":{"rendered":"Replicaci\u00f3n cruzada entre PostgreSQL y MySQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Replicaci\u00f3n cruzada entre PostgreSQL y MySQL\" src=\"\/wp-content\/uploads\/2019\/09\/47cf48f9024f406d625ecb6b21020c74.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A grandes rasgos, hablar\u00e9 sobre la replicaci\u00f3n cruzada entre PostgreSQL y MySQL, as\u00ed como sobre los m\u00e9todos para configurar la replicaci\u00f3n cruzada entre estos dos servidores de bases de datos. Por lo general, las bases de datos en replicaci\u00f3n cruzada se consideran homog\u00e9neas, y este es un m\u00e9todo conveniente para pasar de un servidor RDBMS a otro.<\/p>\n<p><\/p>\n<p>Se considera que las bases de datos PostgreSQL y MySQL son relacionales, pero con extensiones adicionales ofrecen capacidades NoSQL. Aqu\u00ed discutiremos la replicaci\u00f3n entre PostgreSQL y MySQL desde el punto de vista de las bases de datos relacionales.<\/p>\n<p><\/p>\n<p>No vamos a describir toda la mec\u00e1nica interna, solo los principios b\u00e1sicos para que tenga una idea de la configuraci\u00f3n de la replicaci\u00f3n entre servidores de bases de datos, sus ventajas, limitaciones y escenarios de uso.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Generalmente, la replicaci\u00f3n entre dos servidores de bases de datos id\u00e9nticos se realiza en modo binario o mediante consultas entre el nodo principal (tambi\u00e9n conocido como publicador, maestro o activo) y el secundario (suscriptor, en espera o pasivo). El objetivo de la replicaci\u00f3n es proporcionar en tiempo real una copia de la base de datos principal en el lado secundario. En este proceso, los datos se transmiten del nodo principal al secundario, es decir, de activo a pasivo, ya que la replicaci\u00f3n se realiza en una sola direcci\u00f3n. Sin embargo, es posible configurar la replicaci\u00f3n entre dos bases de datos en ambas direcciones, de modo que los datos se transmitan del secundario al principal en una configuraci\u00f3n de 'activo-activo'. Todo esto, incluida la replicaci\u00f3n en cascada, es posible entre dos o m\u00e1s servidores de bases de datos id\u00e9nticos. La configuraci\u00f3n 'activo-activo' o 'activo-pasivo' depende de la necesidad, la disponibilidad de tales opciones en la configuraci\u00f3n de origen o el uso de soluciones externas para la configuraci\u00f3n y compromisos existentes.<\/p>\n<p><\/p>\n<p>La configuraci\u00f3n descrita es posible entre diferentes servidores de bases de datos. Un servidor puede configurarse para recibir datos replicados de otro servidor de bases de datos, manteniendo al mismo tiempo instant\u00e1neas de los datos replicados en tiempo real. MySQL y PostgreSQL ofrecen la mayor\u00eda de estas configuraciones por s\u00ed mismos o mediante extensiones de terceros, incluyendo m\u00e9todos de log binario, bloqueo de disco y m\u00e9todos basados en operadores y filas.<\/p>\n<p><\/p>\n<p>La replicaci\u00f3n cruzada entre MySQL y PostgreSQL es necesaria para migrar una base de datos de un servidor a otro. Estas bases de datos utilizan diferentes protocolos, por lo que no se pueden conectar directamente. Para establecer el intercambio de datos, se puede utilizar una herramienta externa de c\u00f3digo abierto, como pg_chameleon.<\/p>\n<p><\/p>\n<h3 id=\"chto-takoe-pg_chameleon\">Qu\u00e9 es pg_chameleon<\/h3>\n<p><\/p>\n<p>pg_chameleon es un sistema de replicaci\u00f3n de MySQL a PostgreSQL en Python 3. Utiliza la biblioteca de c\u00f3digo abierto mysql-replication, tambi\u00e9n en Python. Las im\u00e1genes de las filas se extraen de las tablas de MySQL y se guardan como objetos JSONB en la base de datos PostgreSQL, luego se descifran con la funci\u00f3n pl\/pgsql y se reproducen en la base de datos PostgreSQL.<\/p>\n<p><\/p>\n<h3 id=\"vozmozhnosti-pg_chameleon\">Funciones de pg_chameleon<\/h3>\n<p><\/p>\n<p>Varios esquemas de MySQL de un cl\u00faster se pueden replicar en una \u00fanica base de datos de PostgreSQL con una configuraci\u00f3n de \"uno a muchos\".<br \/>\nLos nombres de los esquemas de origen y destino no pueden coincidir.<br \/>\nLos datos de replicaci\u00f3n se pueden extraer de una r\u00e9plica en cascada de MySQL.<br \/>\nLas tablas que no se pueden replicar o que generan errores se excluyen.<br \/>\nCada funci\u00f3n de replicaci\u00f3n es controlada por demonios.<br \/>\nControl a trav\u00e9s de par\u00e1metros y archivos de configuraci\u00f3n basados en YAML.<\/p>\n<p><\/p>\n<h3 id=\"primer\">Ejemplo<\/h3>\n<p><\/p>\n<p>Host<br \/>\nvm1<br \/>\nvm2<\/p>\n<p><strong>Versi\u00f3n del sistema operativo<\/strong><br \/>\nCentOS Linux 7.6 x86_64<br \/>\nCentOS Linux 7.5 x86_64<\/p>\n<p><strong>Versi\u00f3n del servidor de base de datos<\/strong><br \/>\nMySQL 5.7.26<br \/>\nPostgreSQL 10.5<\/p>\n<p><strong>Puerto de la base de datos<\/strong><br \/>\n3306<br \/>\n5433<\/p>\n<p><strong>Direcci\u00f3n IP<\/strong><br \/>\n192.168.56.102<br \/>\n192.168.56.106<\/p>\n<p><\/p>\n<p>Primero, prepare todos los componentes necesarios para instalar pg_chameleon. En este ejemplo, se instala Python 3.6.8, que crea un entorno virtual y lo activa.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; wget https:\/\/www.python.org\/ftp\/python\/3.6.8\/Python-3.6.8.tar.xz\n$&gt; tar -xJf Python-3.6.8.tar.xz\n$&gt; cd Python-3.6.8\n$&gt; .\/configure --enable-optimizations\n$&gt; make altinstall<\/code><\/pre>\n<p><\/p>\n<p>Despu\u00e9s de instalar Python 3.6 con \u00e9xito, debe cumplir con los otros requisitos, como crear y activar un entorno virtual. Adem\u00e1s, el m\u00f3dulo pip se actualiza a la \u00faltima versi\u00f3n y se usa para instalar pg_chameleon. En los comandos a continuaci\u00f3n, se establece deliberadamente pg_chameleon en 2.0.9, aunque la \u00faltima versi\u00f3n es 2.0.10. Esto se hace para evitar nuevos errores en la versi\u00f3n actualizada.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; python3.6 -m venv venv\n$&gt; source venv\/bin\/activate\n(venv) $&gt; pip install pip --upgrade\n(venv) $&gt; pip install pg_chameleon==2.0.9<\/code><\/pre>\n<p><\/p>\n<p>Luego llamamos a pg_chameleon (chameleon es el comando) con el argumento set_configuration_files para habilitar pg_chameleon y crear directorios y archivos de configuraci\u00f3n predeterminados.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">(venv) $&gt; chameleon set_configuration_files\ncreando directorio \/root\/.pg_chameleon\ncreando directorio \/root\/.pg_chameleon\/configuration\/\ncreando directorio \/root\/.pg_chameleon\/logs\/\ncreando directorio \/root\/.pg_chameleon\/pid\/\ncopiando configuraci\u00f3n de ejemplo en \/root\/.pg_chameleon\/configuration\/\/config-example.yml<\/code><\/pre>\n<p><\/p>\n<p>Ahora creamos una copia de config-example.yml como default.yml para que se convierta en el archivo de configuraci\u00f3n predeterminado. A continuaci\u00f3n se muestra un ejemplo de archivo de configuraci\u00f3n para este caso.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; cat default.yml\n---\n#ajustes globales\npid_dir: '~\/.pg_chameleon\/pid\/'\nlog_dir: '~\/.pg_chameleon\/logs\/'\nlog_dest: file\nlog_level: info\nlog_days_keep: 10\nrollbar_key: ''\nrollbar_env: ''\n\n# type_override permite al usuario anular la conversi\u00f3n de tipo predeterminada a una diferente.\ntype_override:\n  \"tinyint(1)\":\n    override_to: boolean\n    override_tables:\n      - \"*\"\n\n#conexi\u00f3n de destino de postgres\npg_conn:\n  host: \"192.168.56.106\"\n  port: \"5433\"\n  user: \"usr_replica\"\n  password: \"pass123\"\n  database: \"db_replica\"\n  charset: \"utf8\"\n\nsources:\n  mysql:\n    db_conn:\n      host: \"192.168.56.102\"\n      port: \"3306\"\n      user: \"usr_replica\"\n      password: \"pass123\"\n      charset: 'utf8'\n      connect_timeout: 10\n    schema_mappings:\n      world_x: pgworld_x\n    limit_tables:\n#      - delphis_mediterranea.foo\n    skip_tables:\n#      - delphis_mediterranea.bar\n    grant_select_to:\n      - usr_readonly\n    lock_timeout: \"120s\"\n    my_server_id: 100\n    replica_batch_size: 10000\n    replay_max_rows: 10000\n    batch_retention: '1 day'\n    copy_max_memory: \"300M\"\n    copy_mode: 'file'\n    out_dir: \/tmp\n    sleep_loop: 1\n    on_error_replay: continue\n    on_error_read: continue\n    auto_maintenance: \"disabled\"\n    gtid_enable: No\n    type: mysql\n    skip_events:\n      insert:\n        - delphis_mediterranea.foo #omitir inserciones en la tabla delphis_mediterranea.foo\n      delete:\n        - delphis_mediterranea #omitir eliminaciones en el esquema delphis_mediterranea\n      update:<\/code><\/pre>\n<p><\/p>\n<p>El archivo de configuraci\u00f3n en este caso es un ejemplo del archivo de pg_chameleon con ligeras modificaciones de acuerdo a los entornos de origen y destino, y a continuaci\u00f3n se ofrece un resumen de las diferentes secciones del archivo de configuraci\u00f3n.<\/p>\n<p><\/p>\n<p>En el archivo de configuraci\u00f3n default.yml hay una secci\u00f3n de par\u00e1metros globales (global settings), donde se pueden gestionar configuraciones como la ubicaci\u00f3n del archivo de bloqueo, la ubicaci\u00f3n de los logs, el per\u00edodo de retenci\u00f3n de los logs, etc. A continuaci\u00f3n, hay una secci\u00f3n de sobrescritura de tipos (type override), donde se especifica un conjunto de reglas para anular tipos durante la replicaci\u00f3n. En el ejemplo por defecto se utiliza una regla de sobrescritura de tipo que convierte tinyint(1) en un valor booleano. En la siguiente secci\u00f3n, se indican los detalles de la conexi\u00f3n a la base de datos de destino. En nuestro caso, se trata de una base de datos PostgreSQL, denominada pg_conn. En la \u00faltima secci\u00f3n, especificamos los datos de las fuentes, es decir, los par\u00e1metros de conexi\u00f3n de la base de datos de origen, el mapeo de esquemas entre las bases de datos de origen y destino, las tablas a omitir, los tiempos de espera, la memoria, el tama\u00f1o del paquete. Tenga en cuenta que \"sources\" est\u00e1 en plural, lo que significa que podemos a\u00f1adir varias bases de datos de origen para una sola base de datos de destino, configurando una relaci\u00f3n de \"muchos a uno\".<\/p>\n<p><\/p>\n<p>La base de datos world_x en el ejemplo contiene 4 tablas con filas que la comunidad de MySQL ofrece como ejemplo. Se puede cargar <noindex><a rel=\"nofollow\" href=\"https:\/\/dev.mysql.com\/doc\/index-other.html\">aqu\u00ed<\/a><\/noindex>. El ejemplo de la base de datos se proporciona en forma de un archivo tar y un archivo comprimido con instrucciones sobre c\u00f3mo crear e importar filas.<\/p>\n<p><\/p>\n<p>En las bases de datos MySQL y PostgreSQL se crea un usuario especial con el mismo nombre usr_replica. En MySQL se le otorgan derechos adicionales para leer todas las tablas replicadas.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">mysql&gt; CREATE USER usr_replica ;\nmysql&gt; SET PASSWORD FOR usr_replica='pass123';\nmysql&gt; GRANT ALL ON world_x.* TO 'usr_replica';\nmysql&gt; GRANT RELOAD ON *.* to 'usr_replica';\nmysql&gt; GRANT REPLICATION CLIENT ON *.* to 'usr_replica';\nmysql&gt; GRANT REPLICATION SLAVE ON *.* to 'usr_replica';\nmysql&gt; FLUSH PRIVILEGES;<\/code><\/pre>\n<p><\/p>\n<p>En el lado de PostgreSQL se crea la base de datos db_replica, que aceptar\u00e1 cambios de la base de datos MySQL. El usuario usr_replica en PostgreSQL se configura autom\u00e1ticamente como propietario de los dos esquemas pgworld_x y sch_chameleon, que contienen las tablas replicadas reales y las tablas con cat\u00e1logos de replicaci\u00f3n, respectivamente. La configuraci\u00f3n autom\u00e1tica se controla mediante el argumento create_replica_schema, como ver\u00e1s a continuaci\u00f3n.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">postgres=# CREATE USER usr_replica WITH PASSWORD 'pass123';\nCREATE ROLE\npostgres=# CREATE DATABASE db_replica WITH OWNER usr_replica;\nCREATE DATABASE<\/code><\/pre>\n<p><\/p>\n<p>La base de datos MySQL se configura con cambios en algunos par\u00e1metros para prepararla para la replicaci\u00f3n, como se muestra a continuaci\u00f3n. Ser\u00e1 necesario reiniciar el servidor de bases de datos para que los cambios surtan efecto.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; vi \/etc\/my.cnf\nbinlog_format= ROW\nbinlog_row_image=FULL\nlog-bin = mysql-bin\nserver-id = 1<\/code><\/pre>\n<p><\/p>\n<p>Ahora es importante verificar la conexi\u00f3n a ambos servidores de bases de datos para que no surjan problemas al ejecutar comandos pg_chameleon.<\/p>\n<p><\/p>\n<p>En el nodo de PostgreSQL:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; mysql -u usr_replica -Ap'admin123' -h 192.168.56.102 -D world_x<\/code><\/pre>\n<p><\/p>\n<p>En el nodo de MySQL:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; psql -p 5433 -U usr_replica -h 192.168.56.106 db_replica<\/code><\/pre>\n<p><\/p>\n<p>Los siguientes tres comandos pg_chameleon (chameleon) preparan el entorno, a\u00f1aden la fuente e inicializan la r\u00e9plica. El argumento create_replica_schema en pg_chameleon crea el esquema por defecto (sch_chameleon) y el esquema de replicaci\u00f3n (pgworld_x) en la base de datos PostgreSQL, como ya mencionamos. El argumento add_source a\u00f1ade la base de datos de origen a la configuraci\u00f3n, leyendo el archivo de configuraci\u00f3n (default.yml), y en nuestro caso se trata de mysql, y init_replica inicializa la configuraci\u00f3n basada en los par\u00e1metros del archivo de configuraci\u00f3n.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; chameleon create_replica_schema --debug\n$&gt; chameleon add_source --config default --source mysql --debug\n$&gt; chameleon init_replica --config default --source mysql --debug<\/code><\/pre>\n<p><\/p>\n<p>Los resultados de estos tres comandos indican claramente su ejecuci\u00f3n exitosa. Todos los fallos o errores de sintaxis se indican en mensajes simples y comprensibles, con sugerencias para solucionar los problemas.<\/p>\n<p><\/p>\n<p>Finalmente, iniciemos la replicaci\u00f3n con start_replica y obtengamos un mensaje de ejecuci\u00f3n exitosa.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; chameleon start_replica --config default --source mysql \noutput: Iniciando el proceso de replicaci\u00f3n para la fuente mysql<\/code><\/pre>\n<p><\/p>\n<p>El estado de la replicaci\u00f3n se puede consultar con el argumento show_status, y los errores se pueden ver con el argumento show_errors.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/xpaste.pro\/p\/iYMdAf0b\">Resultado.<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Como ya hemos mencionado, cada funci\u00f3n de replicaci\u00f3n es gestionada por demonios. Para verlos, consultemos la tabla de procesos con el comando Linux ps, como se muestra a continuaci\u00f3n.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/xpaste.pro\/p\/59GfdvHA\">Resultado.<\/a><\/noindex><\/p>\n<p><\/p>\n<p>La replicaci\u00f3n no se considera configurada hasta que la probemos en tiempo real, como se muestra a continuaci\u00f3n. Creamos una tabla, insertamos un par de registros en la base de datos MySQL y llamamos al argumento sync_tables en pg_chameleon para actualizar a los demonios y replicar la tabla con los registros en la base de datos PostgreSQL.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">mysql&gt; create table t1 (n1 int primary key, n2 varchar(10));\nConsulta OK, 0 filas afectadas (0.01 seg)\nmysql&gt; insert into t1 values (1,'one');\nConsulta OK, 1 fila afectada (0.00 seg)\nmysql&gt; insert into t1 values (2,'two');\nConsulta OK, 1 fila afectada (0.00 seg)<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; chameleon sync_tables --tables world_x.t1 --config default --source mysql\nProceso de sincronizaci\u00f3n de tablas para la fuente mysql iniciado.<\/code><\/pre>\n<p><\/p>\n<p>Para confirmar los resultados de la prueba, consultamos la tabla de la base de datos PostgreSQL y mostramos las filas.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; psql -p 5433 -U usr_replica -d db_replica -c \"select * from pgworld_x.t1\";\n n1 |  n2\n----+-------\n  1 | one\n  2 | two<\/code><\/pre>\n<p><\/p>\n<p>Si estamos realizando una migraci\u00f3n, los siguientes comandos de pg_chameleon completar\u00e1n el proceso. Estos comandos deben ejecutarse despu\u00e9s de que nos aseguremos de que las filas de todas las tablas destino han sido replicadas, y el resultado ser\u00e1 una base de datos PostgreSQL transferida ordenadamente sin referencias a la base de datos original o al esquema de replicaci\u00f3n (sch_chameleon).<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; chameleon stop_replica --config default --source mysql \n$&gt; chameleon detach_replica --config default --source mysql --debug<\/code><\/pre>\n<p><\/p>\n<p>Opcionalmente, los siguientes comandos pueden eliminar la configuraci\u00f3n original y el esquema de replicaci\u00f3n.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; chameleon drop_source --config default --source mysql --debug\n$&gt; chameleon drop_replica_schema --config default --source mysql --debug<\/code><\/pre>\n<p><\/p>\n<h3 id=\"preimuschestva-pg_chameleon\">Ventajas de pg_chameleon<\/h3>\n<p><\/p>\n<p>Configuraci\u00f3n y configuraci\u00f3n sencillas.<br \/>\nFacilidad para solucionar problemas y detectar anomal\u00edas con mensajes de error claros.<br \/>\nSe pueden agregar tablas especiales adicionales a la replicaci\u00f3n despu\u00e9s de la inicializaci\u00f3n, sin cambiar el resto de la configuraci\u00f3n.<br \/>\nSe pueden configurar varias bases de datos de origen para un \u00fanico destino, lo cual es muy conveniente si est\u00e1s combinando datos de una o varias bases de datos MySQL en una sola base de datos PostgreSQL.<br \/>\nNo es necesario replicar las tablas seleccionadas.<\/p>\n<p><\/p>\n<h3 id=\"nedostatki-pg_chameleon\">Desventajas de pg_chameleon<\/h3>\n<p><\/p>\n<p>Solo es compatible con MySQL 5.5 y versiones posteriores como fuente y PostgreSQL 9.5 y versiones posteriores como base de datos de destino.<br \/>\nCada tabla debe tener una clave primaria o \u00fanica, de lo contrario, las tablas se inicializan en el proceso init_replica, pero no se replican.<br \/>\nLa replicaci\u00f3n unidireccional es solo de MySQL a PostgreSQL. Por lo tanto, solo es adecuada para el esquema \"activo-pasivo\".<br \/>\nLa base de datos de origen solo puede ser MySQL, y el soporte para la base de datos PostgreSQL como origen es solo experimental y limitado (para m\u00e1s informaci\u00f3n <noindex><a rel=\"nofollow\" href=\"https:\/\/pgchameleon.org\/documents\/configuration_file.html#postgresql-source-type-experimental\">aqu\u00ed<\/a><\/noindex>)<\/p>\n<p><\/p>\n<h3 id=\"itogi-po-pg_chameleon\">Resumen de pg_chameleon<\/h3>\n<p><\/p>\n<p>El m\u00e9todo de replicaci\u00f3n en pg_chameleon es excelente para la migraci\u00f3n de bases de datos de MySQL a PostgreSQL. Un inconveniente significativo es que la replicaci\u00f3n es unidireccional, por lo que los especialistas en bases de datos probablemente no querr\u00e1n usarlo para algo m\u00e1s que migraci\u00f3n. Pero el problema de la replicaci\u00f3n unidireccional se puede resolver con otra herramienta de c\u00f3digo abierto: SymmetricDS.<\/p>\n<p><\/p>\n<p>Lea m\u00e1s en la documentaci\u00f3n oficial <noindex><a rel=\"nofollow\" href=\"https:\/\/pgchameleon.org\/documents\/\">aqu\u00ed<\/a><\/noindex>. La ayuda para la l\u00ednea de comandos se puede encontrar <noindex><a rel=\"nofollow\" href=\"https:\/\/pgchameleon.org\/documents\/usage.html#https:\/\/pgchameleon.org\/documents\/usage.html\">aqu\u00ed<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h3 id=\"obzor-symmetricds\">Resumen de SymmetricDS<\/h3>\n<p><\/p>\n<p>SymmetricDS es una herramienta de c\u00f3digo abierto que replica cualquier base de datos en cualquier otra base de datos com\u00fan: Oracle, MongoDB, PostgreSQL, MySQL, SQL Server, MariaDB, DB2, Sybase, Greenplum, Informix, H2, Firebird y otros ejemplos de bases de datos en la nube, como Redshift y Azure, etc. Las funciones disponibles incluyen: sincronizaci\u00f3n de bases de datos y archivos, replicaci\u00f3n de m\u00faltiples bases de datos principales, sincronizaci\u00f3n filtrada, transformaci\u00f3n y m\u00e1s. Es una herramienta basada en Java, y se requiere la versi\u00f3n est\u00e1ndar de JRE o JDK (versi\u00f3n 8.0 o superior). Aqu\u00ed se pueden registrar los cambios de datos mediante triggers en la base de datos de origen y enviarlos a la base de datos de destino correspondiente en forma de paquetes.<\/p>\n<p><\/p>\n<h3 id=\"vozmozhnosti-symmetricds\">Caracter\u00edsticas de SymmetricDS<\/h3>\n<p><\/p>\n<p>La herramienta es independiente de la plataforma, es decir, dos o m\u00e1s bases de datos diferentes pueden intercambiar datos.<br \/>\nLas bases de datos relacionales se sincronizan mediante el registro de cambios de datos, mientras que las bases de datos basadas en sistemas de archivos utilizan la sincronizaci\u00f3n de archivos.<br \/>\nReplicaci\u00f3n bidireccional utilizando m\u00e9todos Push y Pull basados en un conjunto de reglas.<br \/>\nLa transferencia de datos es posible a trav\u00e9s de redes seguras y redes con baja capacidad de ancho de banda.<br \/>\nRecuperaci\u00f3n autom\u00e1tica al reanudar la operaci\u00f3n de nodos tras una falla y resoluci\u00f3n autom\u00e1tica de conflictos.<br \/>\nCompatibilidad con la nube y eficientes API de extensiones.<\/p>\n<p><\/p>\n<h3 id=\"primer-1\">Ejemplo<\/h3>\n<p><\/p>\n<p>SymmetricDS se puede configurar de dos maneras:<br \/>\nUn nodo principal (padre) que coordina centralmente la replicaci\u00f3n de datos entre dos nodos secundarios (hijos), y el intercambio de datos entre los nodos secundarios se realiza \u00fanicamente a trav\u00e9s del nodo principal.<br \/>\nUn nodo activo (nodo 1) puede intercambiar datos para replicaci\u00f3n con otro nodo activo (nodo 2) sin intermediarios.<\/p>\n<p><\/p>\n<p>En ambas configuraciones, el intercambio de datos se realiza mediante Push y Pull. En este ejemplo, examinaremos la configuraci\u00f3n 'activo-activo'. Describir toda la arquitectura llevar\u00eda demasiado tiempo, as\u00ed que consulte <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/doc\/3.10\/html\/user-guide.html#_architecture\">la gu\u00eda<\/a><\/noindex>, para obtener m\u00e1s informaci\u00f3n sobre SymmetricDS.<\/p>\n<p><\/p>\n<p>Instalar SymmetricDS es muy sencillo: descargue la versi\u00f3n de c\u00f3digo abierto en un archivo zip <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/download\">desde aqu\u00ed<\/a><\/noindex> y extr\u00e1igala donde desee. En la tabla a continuaci\u00f3n se incluyen detalles sobre la ubicaci\u00f3n de instalaci\u00f3n y la versi\u00f3n de SymmetricDS en este ejemplo, as\u00ed como las versiones de bases de datos, versiones de Linux, direcciones IP y puertos para ambos nodos.<\/p>\n<p><\/p>\n<p>Host<br \/>\nvm1<br \/>\nvm2<\/p>\n<p><strong>Versi\u00f3n del sistema operativo<\/strong><br \/>\nCentOS Linux 7.6 x86_64<br \/>\nCentOS Linux 7.6 x86_64<\/p>\n<p><strong>Versi\u00f3n del servidor de base de datos<\/strong><br \/>\nMySQL 5.7.26<br \/>\nPostgreSQL 10.5<\/p>\n<p><strong>Puerto de la base de datos<\/strong><br \/>\n3306<br \/>\n5832<\/p>\n<p><strong>Direcci\u00f3n IP<\/strong><br \/>\n192.168.1.107<br \/>\n192.168.1.112<\/p>\n<p><strong>Versi\u00f3n de SymmetricDS<\/strong><br \/>\nSymmetricDS 3.9<br \/>\nSymmetricDS 3.9<\/p>\n<p><strong>Ruta de instalaci\u00f3n de SymmetricDS<\/strong><br \/>\n\/usr\/local\/symmetric-server-3.9.20<br \/>\n\/usr\/local\/symmetric-server-3.9.20<\/p>\n<p><strong>Nombre del nodo SymmetricDS<\/strong><br \/>\ncorp-000<br \/>\nstore-001<\/p>\n<p><\/p>\n<p>Aqu\u00ed estamos instalando SymmetricDS en \/usr\/local\/symmetric-server-3.9.20, donde se almacenar\u00e1n varios directorios y archivos anidados. Nos interesan los directorios anidados samples y engines. En el directorio samples se encuentran ejemplos de archivos de configuraci\u00f3n con propiedades del nodo, as\u00ed como ejemplos de scripts SQL para un inicio r\u00e1pido de la demostraci\u00f3n.<\/p>\n<p><\/p>\n<p>En el directorio samples vemos tres archivos de configuraci\u00f3n con propiedades del nodo: el nombre muestra la naturaleza del nodo en un esquema determinado.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">corp-000.properties\nstore-001.properties\nstore-002.properties<\/code><\/pre>\n<p><\/p>\n<p>SymmetricDS incluye todos los archivos necesarios de configuraci\u00f3n para un esquema b\u00e1sico de 3 nodos (opci\u00f3n 1), y esos mismos archivos se pueden utilizar para un esquema de 2 nodos (opci\u00f3n 2). Copiamos el archivo de configuraci\u00f3n necesario del directorio samples al directorio engines en el host vm1. Queda as\u00ed:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; cat engines\/corp-000.properties\nengine.name=corp-000\ndb.driver=com.mysql.jdbc.Driver\ndb.url=jdbc:mysql:\/\/192.168.1.107:3306\/replica_db?autoReconnect=true&amp;useSSL=false\ndb.user=root\ndb.password=admin123\nregistration.url=\nsync.url=http:\/\/192.168.1.107:31415\/sync\/corp-000\ngroup.id=corp\nexternal.id=000<\/code><\/pre>\n<p><\/p>\n<p>Este nodo en la configuraci\u00f3n de SymmetricDS se llama corp-000, y la conexi\u00f3n a la base de datos es manejada por el controlador mysql jdbc, que utiliza la cadena de conexi\u00f3n que se mencion\u00f3 anteriormente y las credenciales de inicio de sesi\u00f3n. Nos conectamos a la base de datos replica_db, y durante la creaci\u00f3n del esquema se crear\u00e1n las tablas. sync.url muestra el lugar de conexi\u00f3n con el nodo para la sincronizaci\u00f3n.<\/p>\n<p><\/p>\n<p>El nodo 2 en el host vm2 se configura como store-001, y el resto se detalla en el archivo node.properties que se presenta a continuaci\u00f3n. El nodo store-001 ejecuta una base de datos PostgreSQL, y pgdb_replica es la base de datos para la replicaci\u00f3n. registration.url permite que el host vm2 se comunique con el host vm1 y obtenga de \u00e9l los detalles de la configuraci\u00f3n.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; cat engines\/store-001.properties\nengine.name=store-001\ndb.driver=org.postgresql.Driver\ndb.url=jdbc:postgresql:\/\/192.168.1.112:5832\/pgdb_replica\ndb.user=postgres\ndb.password=admin123\nregistration.url=http:\/\/192.168.1.107:31415\/sync\/corp-000\ngroup.id=store\nexternal.id=001<\/code><\/pre>\n<p><\/p>\n<p>El ejemplo completo de SymmetricDS contiene par\u00e1metros para configurar la replicaci\u00f3n bidireccional entre dos servidores de bases de datos (dos nodos). Los pasos a continuaci\u00f3n se realizan en el host vm1 (corp-000), que crear\u00e1 un ejemplo de esquema con 4 tablas. Luego, la ejecuci\u00f3n de create-sym-tables mediante el comando symadmin crea las tablas de cat\u00e1logos, donde se almacenar\u00e1n las reglas y la direcci\u00f3n de la replicaci\u00f3n entre los nodos. Por \u00faltimo, se cargan datos de ejemplo en las tablas.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">vm1$&gt; cd \/usr\/local\/symmetric-server-3.9.20\/bin\nvm1$&gt; .\/dbimport --engine corp-000 --format XML create_sample.xml\nvm1$&gt; .\/symadmin --engine corp-000 create-sym-tables\nvm1$&gt; .\/dbimport --engine corp-000 insert_sample.sql<\/code><\/pre>\n<p><\/p>\n<p>En el ejemplo, las tablas item e item_selling_price est\u00e1n configuradas autom\u00e1ticamente para replicarse desde corp-000 a store-001, mientras que las tablas sale (sale_transaction y sale_return_line_item) est\u00e1n configuradas autom\u00e1ticamente para replicarse desde store-001 a corp-000. Ahora creamos el esquema en la base de datos PostgreSQL en el host vm2 (store-001) para prepararla para recibir datos de corp-000.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">vm2$&gt; cd \/usr\/local\/symmetric-server-3.9.20\/bin\nvm2$&gt; .\/dbimport --engine store-001 --format XML create_sample.xml<\/code><\/pre>\n<p><\/p>\n<p>Debemos asegurarnos de que en la base de datos MySQL en vm1 haya ejemplos de tablas y las tablas de catalogaci\u00f3n de SymmetricDS. Tenga en cuenta que las tablas del sistema de SymmetricDS (con el prefijo sym_) ahora est\u00e1n disponibles solo en el nodo corp-000, porque all\u00ed ejecutamos el comando create-sym-tables y gestionaremos la replicaci\u00f3n. Adem\u00e1s, en la base de datos del nodo store-001 habr\u00e1 solo 4 tablas de ejemplo sin datos.<\/p>\n<p><\/p>\n<p>Todo. El entorno est\u00e1 listo para ejecutar los procesos del servidor sym en ambos nodos, como se muestra a continuaci\u00f3n.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">vm1$&gt; cd \/usr\/local\/symmetric-server-3.9.20\/bin\nvm1$&gt; sym 2&gt;&amp;1 &amp;<\/code><\/pre>\n<p><\/p>\n<p>Los registros de logs se env\u00edan al archivo de log en segundo plano (symmetric.log) en la carpeta de logs en el directorio donde est\u00e1 instalado SymmetricDS, as\u00ed como a la salida est\u00e1ndar. El servidor sym ahora se puede iniciar en el nodo store-001.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">vm2$&gt; cd \/usr\/local\/symmetric-server-3.9.20\/bin\nvm2$&gt; sym 2&gt;&amp;1 &amp;<\/code><\/pre>\n<p><\/p>\n<p>Si ejecutas el proceso del servidor sym en el host vm2, crear\u00e1 las tablas del directorio SymmetricDS tambi\u00e9n en la base de datos PostgreSQL. Si ejecutas el proceso del servidor sym en ambos nodos, se coordinar\u00e1n entre s\u00ed para replicar datos desde corp-000 a store-001. Si despu\u00e9s de unos segundos solicitamos las 4 tablas de ambos lados, veremos que la replicaci\u00f3n se ha realizado con \u00e9xito. O se puede enviar la carga inicial al nodo store-001 desde corp-000 con el siguiente comando.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">vm1$&gt; .\/symadmin --engine corp-000 reload-node 001<\/code><\/pre>\n<p><\/p>\n<p>En este punto, se inserta un nuevo registro en la tabla item en la base de datos MySQL en el nodo corp-000 (host: vm1), y se puede verificar su replicaci\u00f3n en la base de datos PostgreSQL en el nodo store-001 (host: vm2). Vemos la operaci\u00f3n Pull para mover los datos de corp-000 a store-001.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">mysql&gt; insert into item values ('22000002','Jelly Bean');\nQuery OK, 1 row affected (0.00 sec)<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">vm2$&gt; psql -p 5832 -U postgres pgdb_replica -c \"select * from item\"\n item_id  |   name\n----------+-----------\n 11000001 | Yummy Gum\n 22000002 | Jelly Bean\n(2 rows)<\/code><\/pre>\n<p><\/p>\n<p>Para realizar la operaci\u00f3n Push y mover datos de store-001 a corp-000, insertamos un registro en la tabla sale_transaction y verificamos que la replicaci\u00f3n se ha realizado.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/xpaste.pro\/p\/B23cJ4sP\">Resultado.<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Vemos una configuraci\u00f3n exitosa de replicaci\u00f3n bidireccional de las tablas de ejemplo entre las bases de datos MySQL y PostgreSQL. Para configurar la replicaci\u00f3n para nuevas tablas de usuario, realizamos las siguientes acciones. Creamos la tabla t1 como ejemplo y configuramos las reglas de su replicaci\u00f3n de la siguiente manera. As\u00ed configuramos la replicaci\u00f3n solo de corp-000 a store-001.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">mysql&gt; create table  t1 (no integer);\nQuery OK, 0 rows affected (0.01 sec)<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">mysql&gt; insert into sym_channel (channel_id,create_time,last_update_time) \nvalues ('t1',current_timestamp,current_timestamp);\nQuery OK, 1 row affected (0.01 sec)<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">mysql&gt; insert into sym_trigger (trigger_id, source_table_name,channel_id,\nlast_update_time, create_time) values ('t1', 't1', 't1', current_timestamp,\ncurrent_timestamp);\nQuery OK, 1 row affected (0.01 sec)<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">mysql&gt; insert into sym_trigger_router (trigger_id, router_id,\nInitial_load_order, create_time,last_update_time) values ('t1',\n'corp-2-store-1', 1, current_timestamp,current_timestamp);\nQuery OK, 1 row affected (0.01 sec)<\/code><\/pre>\n<p><\/p>\n<p>Luego, la configuraci\u00f3n recibe una notificaci\u00f3n sobre el cambio en el esquema, es decir, la adici\u00f3n de una nueva tabla, utilizando el comando symadmin con el argumento sync-triggers, que recrea los disparadores para hacer coincidir las definiciones de las tablas. Se ejecuta send-schema para enviar los cambios del esquema al nodo store-001, y la replicaci\u00f3n de la tabla t1 est\u00e1 configurada.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">vm1$&gt; .\/symadmin -e corp-000 --node=001 sync-triggers    \nvm1$&gt; .\/symadmin send-schema -e corp-000 --node=001 t1<\/code><\/pre>\n<p><\/p>\n<h3 id=\"preimuschestva-symmetricds\">Ventajas de SymmetricDS<\/h3>\n<p><\/p>\n<p>Instalaci\u00f3n y configuraci\u00f3n sencillas, incluyendo un conjunto listo de archivos con par\u00e1metros para crear un esquema con tres o dos nodos.<br \/>\nInteroperabilidad de bases de datos e independencia de la plataforma, incluyendo servidores, laptops y dispositivos m\u00f3viles.<br \/>\nReplicaci\u00f3n de cualquier base de datos a otra, localmente, en WAN o en la nube.<br \/>\nCapacidad para funcionar de manera \u00f3ptima con un par de bases de datos o con miles de ellas para facilitar la replicaci\u00f3n.<br \/>\nVersi\u00f3n de pago con interfaz gr\u00e1fica y excelente soporte.<\/p>\n<p><\/p>\n<h3 id=\"nedostatki-symmetricds\">Desventajas de SymmetricDS<\/h3>\n<p><\/p>\n<p>Es necesario definir manualmente en la l\u00ednea de comandos las reglas y la direcci\u00f3n de la replicaci\u00f3n mediante operadores SQL para cargar las tablas de cat\u00e1logos, lo que puede resultar inc\u00f3modo.<br \/>\nConfigurar muchas tablas para la replicaci\u00f3n puede ser tedioso si no se utilizan scripts para crear operadores SQL que definan las reglas y la direcci\u00f3n de la replicaci\u00f3n.<br \/>\nSe registra demasiada informaci\u00f3n en los logs, y a veces es necesario organizar el archivo de logs para que no ocupe demasiado espacio.<\/p>\n<p><\/p>\n<h3 id=\"itogi-po-symmetricds\">Conclusiones sobre SymmetricDS<\/h3>\n<p><\/p>\n<p>SymmetricDS permite configurar la replicaci\u00f3n bidireccional entre dos, tres e incluso varios miles de nodos, para realizar replicaci\u00f3n y sincronizar archivos. Esta es una herramienta \u00fanica que lleva a cabo muchas tareas de manera aut\u00f3noma, como la recuperaci\u00f3n autom\u00e1tica de datos despu\u00e9s de largos periodos de inactividad en un nodo, intercambio de datos seguro y eficiente entre nodos a trav\u00e9s de HTTPS, gesti\u00f3n autom\u00e1tica de conflictos basada en un conjunto de reglas, etc. SymmetricDS realiza replicaci\u00f3n entre cualquier base de datos, por lo que se puede usar para una variedad de escenarios, incluyendo migraci\u00f3n, actualizaci\u00f3n a una nueva versi\u00f3n, distribuci\u00f3n, filtraci\u00f3n y transformaci\u00f3n de datos en diferentes plataformas.<\/p>\n<p><\/p>\n<p>Ejemplo creado basado en la oficial <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/doc\/3.9\/html\/tutorials.html\">gu\u00eda r\u00e1pida<\/a><\/noindex> de SymmetricDS. En <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/doc\/3.9\/html\/user-guide.html\">la gu\u00eda del usuario<\/a><\/noindex> se describen detalladamente diversos conceptos relacionados con la configuraci\u00f3n de la replicaci\u00f3n utilizando SymmetricDS.<\/p>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/467313\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042f \u0432 \u043e\u0431\u0449\u0438\u0445 \u0447\u0435\u0440\u0442\u0430\u0445 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u043f\u0435\u0440\u0435\u043a\u0440\u0435\u0441\u0442\u043d\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 PostgreSQL \u0438 MySQL, \u0430 \u0435\u0449\u0435 \u043e \u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0435\u0440\u0435\u043a\u0440\u0435\u0441\u0442\u043d\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0434\u0432\u0443\u043c\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c\u0438 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u0431\u044b\u0447\u043d\u043e \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0435\u0440\u0435\u043a\u0440\u0435\u0441\u0442\u043d\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u043c\u0438, \u0438 \u044d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0421\u0423\u0411\u0414 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439. \u0411\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 PostgreSQL \u0438 MySQL \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438, \u043d\u043e \u0441 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28635,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-38146","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u042f \u0432 \u043e\u0431\u0449\u0438\u0445 \u0447\u0435\u0440\u0442\u0430\u0445 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0435\u0440\u0435\u043a\u0440\u0435\u0441\u0442\u043d\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u043c\u0435\u0436\u0434\u0443 PostgreSQL \u0438 MySQL | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042f \u0432 \u043e\u0431\u0449\u0438\u0445 \u0447\u0435\u0440\u0442\u0430\u0445 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:21:54+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:21:54+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Replicaci\u00f3n cruzada entre PostgreSQL y MySQL | ProHoster","description":"Voy a hablar de manera general sobre.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0435\u0440\u0435\u043a\u0440\u0435\u0441\u0442\u043d\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u043c\u0435\u0436\u0434\u0443 PostgreSQL \u0438 MySQL | ProHoster","og:description":"\u042f \u0432 \u043e\u0431\u0449\u0438\u0445 \u0447\u0435\u0440\u0442\u0430\u0445 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e.","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:21:54+00:00","article:modified_time":"2019-10-31T19:21:54+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"38146","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 20:38:22","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 18:59:41","updated":"2026-01-23 20:38:22","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/38146","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=38146"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/38146\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/28635"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=38146"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=38146"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=38146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}