web-dev-qa-db-fra.com

MySQL Cross Server Sélectionnez la requête

Est-il possible d'écrire une requête de sélection de serveur Cross Server à l'aide du client MySQL. Fondamentalement, la configuration est comme suit.

Base de données IP du serveur
[.____] ---------- ---------
1.2.3.4 Test
[.____] A.B.C.D Test

Je souhaite écrire une requête qui sélectionnera des lignes d'une table dans la base de données de test sur 1.2.3.4 et insérez le résultat dans une table dans la base de données de test sur A.B.C.D
[.____] Mes serveurs sont situés des kilomètres à distance, donc je vais ouvrir un tunnel SSH pour connecter les deux.

Des pointeurs?

25
Anand Shah

mysqldump pourrait être une solution comme mentionné déjà ou que vous pourriez essayer d'utiliser le SELECT ... INTO OUTFILE puis LOAD DATA INFILE ... commandes.

MySQL a le moteur de stockage fédéré qui pourrait vous être utile. Voici une autre documentation sur celle-ci http://dev.mysql.com/doc/refman/5.0/fr/federated-storage-engine.html Je dois avouer que je n'ai pas eu d'énorme succès avec elle mais cela pourrait fonctionner pour vous.

La troisième solution serait de faire le travail dans votre application. Lisez dans les résultats de la ligne SELECT ligne par ligne et INSERT à l'autre ligne de serveur par ligne. Vous pourriez rencontrer des problèmes avec des types de données et une manipulation nulle de cette manière cependant.

8
James C

que diriez-vous d'utiliser des tables fédérées sur l'un des serveurs? Créez les tables fédératrices en fonction des tables distantes que vous utiliserez dans la requête et utilisez simplement votre requête comme si votre base de données était toutes locale. Exemple ci-dessous de Site MySQL

La procédure d'utilisation des tables fédérées est très simple. Normalement, vous avez deux serveurs fonctionnant, soit sur le même hôte, soit sur différents hôtes. (Il est possible que la table fédérée utilise une autre table gérée par le même serveur, bien qu'il n'y ait peu de points.)

Premièrement, vous devez avoir une table sur le serveur distant que vous souhaitez accéder à l'aide d'une table fédérée. Supposons que la table distante soit dans la base de données fédérées et est définie comme ceci:

CREATE TABLE test_table (
    id     INT(20) NOT NULL AUTO_INCREMENT,
    name   VARCHAR(32) NOT NULL DEFAULT '',
    other  INT(20) NOT NULL DEFAULT '0',
    PRIMARY KEY  (id),
    INDEX name (name),
    INDEX other_key (other)
)
ENGINE=MyISAM 
CHARSET=latin1;

L'exemple utilise une table myisam, mais la table pourrait utiliser n'importe quel moteur de stockage.

Ensuite, créez une table fédérée sur le serveur local pour accéder à la table distante:

CREATE TABLE federated_table (
    id     INT(20) NOT NULL AUTO_INCREMENT,
    name   VARCHAR(32) NOT NULL DEFAULT '',
    other  INT(20) NOT NULL DEFAULT '0',
    PRIMARY KEY  (id),
    INDEX name (name),
    INDEX other_key (other)
)
ENGINE=FEDERATED
DEFAULT CHARSET=latin1
CONNECTION='mysql://fed_user@remote_Host:9306/federated/test_table';

(Avant MySQL 5.0.13, utilisez un commentaire plutôt que de la connexion.)

35
Peter Carrero

Étant donné que le client MySQL ne peut se connecter qu'à un serveur à la fois, la réponse courte est née, mais il y a toujours un moyen de ...

Les versions récentes de mysqldump soutiennent un --where Paramètre pouvant être utilisé pour limiter les données larguées. Cela signifie que vous avez un moyen d'exécuter un simple SELECT (c'est-à-dire toutes les colonnes sur une table) et produisant SQL valide à INSERT it. Vous pouvez ensuite pipeler la sortie d'une telle commande mysqldump pour le serveur source à une commande mysql sur le serveur de destination.

Vous voulez probablement inclure quelques options telles que --no-create-info et --no-add-locks sur la commande mysqldump. Testez-le jusqu'à ce que la sortie soit exactement ce que vous voulez.

2
staticsan