Comment puis-je appeler une procédure stockée sur un serveur MySQL Ubuntu distant?

J’ai un serveur Ubuntu avec MySQL et de nombreuses procédures stockées (serveur A) et un autre serveur Ubuntu avec MySQL (serveur B).

Je voudrais remplir la firebase database sur le serveur B avec les données des procédures stockées sur le serveur A.

À ce stade, je voudrais tester la connexion sans succès.

J’ai essayé ceci sur le serveur B:

mysql> EXEC server_A_IP.DB_name.username.sp_courses(); 

Mais cela donne cette erreur:

ERROR 1064 (42000): vous avez une erreur dans votre syntaxe SQL; Consultez le manuel correspondant à votre version du serveur MySQL pour connaître la syntaxe appropriée à utiliser près de ‘EXEC server_ip.db_name.owner.sp_courses ()’ à la ligne 1

Ceci est un exemple de ce que je voudrais faire par la suite:

Sur le serveur BI a cette table:

 mysql> describe Course; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | CID | int(11) | NO | PRI | 0 | | | name | varchar(50) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) 

La procédure stockée sur le serveur A renvoie des données comme celles-ci:

 call sp_courses();-- where the parameter indicates level 1.Returns [courseID, name] 1 CS1 2 CS2 10 CS3 12 CS4 13 CS5S 

Puis-je remplir des données dans la table à partir d’une procédure stockée sur un autre serveur?

AFAIK, vous ne pouvez pas appeler une procédure stockée dans le serveur A du serveur B.

Ce que je ferais, c’est:

  1. Modifiez la procédure pour que la sortie soit stockée dans une table.
  2. Utilisez mysqldump pour vider les données de cette table de sortie et les stocker sur l’autre serveur.

Exemple:

Sur le serveur A, la procédure peut être quelque chose comme ceci:

 delimiter $$ create procedure my_procedure() begin -- Create a table to store the output: drop table if exists temp_result; create table temp_result ( CID int not null primary key, name varchar(50) ); -- Populate the table insert into temp_result select ... end $$ delimiter ; 

Sur le serveur B, exécutez l’instruction suivante dans le shell, pas dans MySQL CLI :

 mysqldump  db_A temp_result --no-create-db --add-drop-table | mysql  db_B 

où:

  • Les options nécessaires pour se connecter au serveur A depuis le serveur B:
    -h -u -p .
  • db_A La firebase database du serveur A où le résultat est stocké
  • Les options nécessaires pour se connecter au serveur B:
    -h localhost -u -p

Il existe un moyen d’envoyer des données à une table distante à l’aide de procédures stockées. L’astuce consiste à utiliser des tables fédérées. J’ai créé des tables dans deux serveurs et stocké la procédure pour reproduire votre situation:

  1. SERVEUR A: créer une table et insérer des données

     create table course_A ( CID int not null primary key, name varchar(50), year int ); insert into course_A values (1,'CS1P',2016), (2,'CS1Q',2016), (109,'CS1-CT',2016), (120,'CS1PX',2016), (121,'CS1S',2016); 
  2. SERVEUR B: créer une table avec structure

     create table course_B ( CID int not null primary key, name varchar(50) ); 
  3. SERVER A: crée une table distante connectée à la table du serveur B:

     create table course_B_remote ( CID int not null primary key, name varchar(50) ) ENGINE=FEDERATED CONNECTION='mysql://user:password@SERVER_B_IP:3306/database/course_B'; 

    Maintenant, tout ce qui concerne la table_B_remote affecte directement la table_B dans SERVER B.

  4. SERVER A: Créer une procédure stockée pour envoyer les résultats de la requête de la table course_B_remote à course_B_remote :

     delimiter $$ drop procedure if exists sp_coursesForYear$$ create procedure sp_coursesForYear(p_year int) begin /* Your procedure code... */ insert into course_B_remote (CID,name) select CID, name from course_A where year = p_year; end$$ delimiter ; 
  5. Maintenant, testez la procédure stockée:

     server A prompt> call sp_coursesForYear(2016); Query OK, 5 rows affected (0,00 sec) 
  6. Vérifiez si cela a fonctionné:

     server B prompt> select * from course_B; +-----+--------+ | CID | name | +-----+--------+ | 1 | CS1P | | 2 | CS1Q | | 109 | CS1-CT | | 120 | CS1PX | | 121 | CS1S | +-----+--------+ 5 rows in set (0.00 sec) 
  7. Prendre plaisir!

Peut-être devrez-vous modifier vos procédures pour utiliser les tables FEDERATED . Pas d’activer les tables FEDERATED voir cette réponse .