【问题标题】:How can I a call stored procedure on a remote MySQL Ubuntu server?如何在远程 MySQL Ubuntu 服务器上调用存储过程?
【发布时间】:2016-12-12 09:34:39
【问题描述】:

我有一个带有 MySQL 和许多存储过程的 Ubuntu 服务器(服务器 A)和另一个带有 MySQL 的 Ubuntu 服务器(服务器 B)。

我想用服务器 A 上的存储过程中的数据填充服务器 B 上的数据库。

此时我想测试连接,但没有成功。

我在服务器 B 上试过这个:

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

但它给出了这个错误:

ERROR 1064 (42000):您的 SQL 语法有错误;检查 与您的 MySQL 服务器版本相对应的手册 'EXEC 附近使用的语法 server_ip.db_name.owner.sp_courses()' 在第 1 行

这是我最终想做的一个例子:

在服务器 B 我有这张桌子:

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)

服务器 A 上的存储过程返回如下数据:

call sp_courses();-- where the parameter indicates level 1.Returns [courseID, name]

1   CS1
2   CS2
10  CS3
12  CS4
13  CS5S

我可以将数据从不同服务器上的存储过程填充到表中吗?

【问题讨论】:

  • 有一种方法,但我需要知道sp_coursesForYear 过程是否只是桌面上的选择......以及您是否可以向我们展示一些代码。

标签: mysql ubuntu stored-procedures remote-access


【解决方案1】:

AFAIK,您不能从服务器 B 调用存储在服务器 A 中的过程。

我要做的是:

  1. 修改过程,将输出存储在表中。
  2. 使用mysqldump转储此输出表的数据并存储在其他服务器中。

例子:

在服务器 A 上,过程可能是这样的:

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 ;

在服务器 B 上,在 shell 中执行以下语句,不是在 MySQL CLI 中

mysqldump <options_A> db_A temp_result --no-create-db --add-drop-table | mysql <options_B> db_B

地点:

  • &lt;options_A&gt; 从服务器 B 连接到服务器 A 所需的选项:
    -h &lt;IP of server A&gt; -u &lt;user&gt; -p&lt;password&gt;
  • db_A服务器A中存储结果的数据库
  • &lt;options_B&gt; 连接服务器 B 所需的选项:
    -h localhost -u &lt;user&gt; -p&lt;password&gt;

【讨论】:

    【解决方案2】:

    有一种方法可以使用存储过程将数据发送到远程表,诀窍是使用联合表。我在两台服务器和存储过程中创建了表来重现您的情况:

    1. SERVER A:创建表并插入一些数据

      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. SERVER B:创建具有结构的表

      create table course_B
      (
        CID int not null primary key,
        name varchar(50)
      );
      
    3. 服务器 A:创建一个连接到服务器 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';
      

      现在,与 table_B_remote 相关的任何事情都会直接影响到 SERVER B 中的 table_B

    4. 服务器 A:创建存储过程以将查询结果从 course_A 表发送到 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. 现在,测试存储过程:

      server A prompt> call sp_coursesForYear(2016);
      Query OK, 5 rows affected (0,00 sec)
      
    6. 检查它是否有效:

      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. 享受吧!

    也许您需要更改您的程序以使用FEDERATED 表。 不启用FEDERATED 表请参阅this answer

    【讨论】:

    • 谢谢。但是,我无法访问服务器 A,我只能从服务器 B 调用它的 SP。有没有只能访问服务器 B 的解决方案?干杯。
    • @Sei 你必须访问两个服务器才能配置参数
    猜你喜欢
    • 2010-11-01
    • 1970-01-01
    • 2011-07-05
    • 2015-07-18
    • 2012-02-22
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多