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:
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:
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);
SERVEUR B: créer une table avec structure
create table course_B ( CID int not null primary key, name varchar(50) );
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.
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 ;
Maintenant, testez la procédure stockée:
server A prompt> call sp_coursesForYear(2016); Query OK, 5 rows affected (0,00 sec)
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)
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 .