Utilitzant PHP, com copio els registres seleccionats d’una base de dades mysql a una altra en diferents amfitrions (per tant, diferents connexions) – PHP – SitePoint Forums

utilitzant PHP, com copio els registres seleccionats d’una base de dades mysql a una altra en diferents amfitrions (per tant, connexions diferents)?

  • He codificat connexions mysqli separades
  • Les bases de dades tenen la mateixa estructura

Estic utilitzant aquest nou script per seleccionar certs registres de sourceDB.table i copiar-los a targetDB.table si el seu número de registre encara no existeix. El que m’ha perplex són les connexions separades.

Alguna cosa com això (o el que suggereixi), però amb la gestió de les connexions mysqli separades:

INSERT INTO targetDB.table
SELECT sourceDB.table.*
FROM
sourceDB.table
LEFT JOIN targetDB.table USING(id)
WHERE
targetDB.table.id IS NULL


No, això no és possible amb dues bases de dades separades físicament. Heu de fer una selecció a la font dB, buscar les dades i fer una inserció a l’altre dB.



1 M’agrada

Per tant, recupereu-lo de la font i, a continuació, repetiu-lo per fer les insercions a l’objectiu.

En realitat és possible. Tot i que em preocupa que hi hagi un problema més gran sobre per què s’està fent això.

OP, pots explicar el que estàs passant. Esteu intentant sincronitzar els dos DB? Si és així, com vas arribar a un lloc així?

És un exercici d’una vegada?



1 M’agrada

Sempre sospito d’aprendre alguna cosa nova. Així que si us plau, digueu-me com funciona això…



1 M’agrada

Tenim una base de dades de producció amb milions de registres. Estic construint una base de dades de desenvolupament/entrenament amb un subconjunt d’aquests registres. Trauré dades que comencen amb un registre i, finalment, recopilaré i copiaré tots els registres associats en altres taules per a aquest registre inicial. (Imagineu-vos seleccionar en un edifici d’un campus universitari i després haver d’aconseguir totes les classes en aquest edifici i després tots els estudiants inscrits en aquestes classes i després els registres d’assistència d’aquests estudiants juntament amb les seves qualificacions.)

No és una cosa única, les especificacions d’aquesta tasca em fan treure registres per omplir la nova base de dades tal com se sol·licita. Però mai seran tots els discos de producció, només els seleccionats com a mostra.

Estic “Jumping the Shark” i mostro una solució MySQLI.

Exempció de responsabilitat: hi ha una millor manera de fer-ho amb els extractes i transaccions preparats.



1 M'agrada

Estàs fent el que t'he explicat amb dues consultes. Un per buscar i un altre per inserir.

L'OP va demanar una solució utilitzant només una consulta i això no és possible...



1 M'agrada

@Thallius, he llegit malament la teva resposta. Tot i que OP no va demanar una sola consulta, el seu exemple és una sola consulta. : somrient:

Tot i així, és possible utilitzar una sola consulta mitjançant TAULES FEDERADES.

FEDERATED El motor d'emmagatzematge us permet accedir a dades des d'una base de dades MySQL remota sense utilitzar tecnologia de rèplica o clúster. Consultant un local FEDERATED La taula extreu automàticament les dades de les taules remotes (federades).

https://dev.mysql.com/doc/refman/8.0/en/federated-storage-engine.html

Tutorial breu sobre la configuració



1 M'agrada

OP, com que ho fareu amb regularitat i tracteu amb milions de registres al servidor de producció, us recomanaria que configureu les taules FEDERATED per copiar les vostres dades des del servidor de producció remot a la base de dades de formació. Seria la configuració més neta i podeu utilitzar una sola consulta per fer la feina.

IMPORTANT: No editeu les dades de les taules FEDERADES de la vostra base de dades de formació o faràs aquests canvis a la base de dades de producció. Les taules FED són només dreceres remotes a la base de dades de producció.

Copieu les dades localment així...

INSERT IGNORE INTO trainingDB.usersTable (username, email)
(SELECT username, email FROM `federated_table` WHERE username="xx");

Aquí hi ha una mostra d'SQL que vaig utilitzar per provar el codi. (La taula FED CREATE ha de coincidir amb l'estructura de la taula remota)


CREATE SERVER federatedTablelink
FOREIGN DATA WRAPPER mysql
OPTIONS (USER 'remoteUser', HOST 'remoteDbIP', DATABASE 'yourRemoteDbNAme', Password 'remoteDbPassword');


CREATE TABLE federated_table (
    username   VARCHAR(32) NOT NULL DEFAULT '',
    email  VARCHAR(20) NOT NULL DEFAULT '',
    INDEX username (username)
)
ENGINE=FEDERATED
DEFAULT CHARSET=latin1
CONNECTION='federatedTablelink/users';



1 M'agrada

Mai recomanaria utilitzar dades de producció amb finalitats de prova. Fins i tot no només per llegir...



1 M'agrada

L'operador no està fent proves. Estan fent formació des d'una base de dades independent que no sigui la producció, utilitzant una còpia d'un subconjunt de dades de producció. Inicialment em va preocupar aquest procés mentre vaig publicar fins que vaig parlar amb l'operador en privat.



2 m'agrada

Aquest tema es va tancar automàticament 91 dies després de la darrera resposta. Ja no es permeten noves respostes.

Leave a Comment

Your email address will not be published. Required fields are marked *