MySQL 存储过程是否能够插入/更新到远程备份 MySQL 服务器?

Bob*_*anz 4 mysql stored-procedures database-backup federated

是否可以创建一个 MySQL 存储过程,该过程可以执行给定的插入或更新,然后还可以连接到第二台服务器并运行相同的命令?我想基本上调用一台服务器并实时将其备份到第二台服务器。除非您有一个或两个方便的链接或其他解决方案,否则只需一个 yah 或 ney 就足够了。

感谢您的时间。亚伦

Rol*_*DBA 5

您可以,但只能在 3 个特定条件下:

您在另一台服务器上更新的第二个表是:

  1. 一个 MyISAM 表
  2. 与第一台服务器相同的表结构
  3. 在第一台服务器中的 MySQL 中表示为存储引擎 FEDERATED

首先,确保您在 MySQL 中启用了 FEDERATED 引擎
只需运行SHOW ENGINES;

如果 FEDERATED 存储引擎不存在或被禁用,请不要进一步阅读。

否则,您可以尝试将其编写为 INSERT AFTER 和 UPDATE AFTER 触发器。

对于这个例子:

  • SERVER1 有this_db带表的数据库this_table
  • SERVER2 有that_db带表的数据库that_table
  • SERVER2 有 IP 地址 10.20.30.250

表结构如下所示:

CREATE TABLE `this _table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `fruit` char(10) NOT NULL,
  `number` int(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM;
Run Code Online (Sandbox Code Playgroud)
  1. 首先,确保表结构是 MyISAM 并且相同......
    在第一台服务器上,做SHOW CREATE TABLE this_db.this_table\G
    在另一台服务器上,做SHOW CREATE TABLE that_db.that_table\G

  2. 在第一台服务器上,运行:

    CREATE TABLE this_db.that_table LIKE this_db.this_table;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在第一台服务器上,运行:

    ALTER TABLE this_db.that_table ENGINE=FEDERATED
    CONNECTION='mysql://10.20.30.250/that_db/that_table';
    
    Run Code Online (Sandbox Code Playgroud)
  4. 在第一台服务器上,针对this_db.this_table以下对象创建一个 INSERT AFTER 触发器:

    use this_db
    DELIMITER $$
    CREATE TRIGGER this_table afterinsert AFTER INSERT ON this_table 
      FOR EACH ROW
        INSERT INTO that_table (id,fruit,number) 
        VALUES (NEW.id,NEW.fruit,NEW.number);
    $$
    DELIMITER ;
    
    Run Code Online (Sandbox Code Playgroud)
  5. 在第一台服务器上,针对this_db.this_table以下对象创建 UPDATE AFTER 触发器:

    use this_db
    DELIMITER $$
    CREATE TRIGGER this_table afterupdate AFTER UPDATE ON this_table 
      FOR EACH ROW
        UPDATE that_table SET fruit=NEW.fruit,number=NEW.number WHERE id=OLD.id;
    $$
    DELIMITER ;
    
    Run Code Online (Sandbox Code Playgroud)

就是这样。

试一试!!!