问题
I have an Ubuntu server with MySQL and many Stored Procedures (server A) and another Ubuntu server with MySQL (server B).
I'd like to populate the database on server B with data from the stored procedures on server A.
At this point I'd like to test the connection with no success.
I tried this on server B:
mysql> EXEC server_A_IP.DB_name.username.sp_courses();
But it gives this error:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'EXEC server_ip.db_name.owner.sp_courses()' at line 1
This is an example of what I'd like to do eventually:
On server B I have this 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)
The Stored Procedure on Server A returns data like this:
call sp_courses();-- where the parameter indicates level 1.Returns [courseID, name]
1 CS1
2 CS2
10 CS3
12 CS4
13 CS5S
Can I fill data into the table from stored procedure on a different server?
回答1:
AFAIK, you can't call a procedure stored in server A from server B.
What I'd do is:
- Modify the procedure so the output is stored in a table.
- Use
mysqldump
to dump the data of this output table and store it in the other server.
Example:
On server A, the procedure can be something like this:
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 ;
On server B, execute the following statement in the shell, not in MySQL CLI:
mysqldump <options_A> db_A temp_result --no-create-db --add-drop-table | mysql <options_B> db_B
where:
<options_A>
The options needed to connect to server A from server B:-h <IP of server A> -u <user> -p<password>
.db_A
The database in server A where the result is stored<options_B>
The options needed to connecto to server B:-h localhost -u <user> -p<password>
回答2:
There is a way to send data to a remote table using stored procedures, the trick is use federated tables. I created tables in two servers and stored procedure to reproduce your situation:
SERVER A: create table and insert some data
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);
SERVER B: create a table with structure
create table course_B ( CID int not null primary key, name varchar(50) );
SERVER A: create a remote table connected to table in server 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';
Now, whatever to do with
table_B_remote
affects directly totable_B
in SERVER B.SERVER A: Create stored procedure to send the query results from
course_A
table tocourse_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 ;
Now, test the stored procedure:
server A prompt> call sp_coursesForYear(2016); Query OK, 5 rows affected (0,00 sec)
Check if it worked:
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)
Enjoy!
Maybe you will need to alter your procedures to use the FEDERATED
tables.
No enable FEDERATED
tables see this answer.
来源:https://stackoverflow.com/questions/38798210/how-can-i-a-call-stored-procedure-on-a-remote-mysql-ubuntu-server