1

在我之前的工作中,我能够使用以下语句轻松地从生产环境中复制数据:

从表名@UNIXPROD2 INSERT INTO 表名@UNIXTEST2

我目前工作的数据库不是以这种方式设置的。

所以,我对 MySQL 5.0+ 做了一些研究,因为这是我们为我们的一位客户使用的。我遇到了 FEDERATED 表,所以当我阅读时,我发现了这个(在这里):

从 MySQL 5.0.46 开始,FEDERATED 执行批量插入处理,以便将多行批量发送到远程表。这提供了性能改进。此外,如果远程表是事务性的,它使远程存储引擎能够在发生错误时正确执行语句回滚。此功能具有以下限制:

对我来说,这表明 (A) 我可以将数据从我们的 prod 数据库复制到我们的 test 数据库;(B) 在联合表上执行的任何操作也会在源表上处理,这不是我想要做的。我有一些需要运行的脚本,我想针对实际的产品数据运行它,以确保在我在产品环境中使用它之前它可以正常工作。

我的问题:我的解释正确吗?

假设是,我试过:

  • select * from database.tablename@ipaddress,但收到一条错误消息,告诉我检查我正在运行的版本的 MySQL 手册,这就是我在点击“发布您的问题”后要做的事情。

我将不胜感激在这件事上的任何帮助。

编辑:经过进一步研究,我认为可能能够使用 OUTFILE 和 INFILE 来做我需要的事情,我将在 prod 表上使用 OUTFILE,然后在测试表上使用 INFILE 这些行。想法?

4

1 回答 1

1

我的答案:

A - 正确

B - 正确。

您可以将用户权限设置为只读,但在您的情况下,我不会使用联合表,而是将整个数据库转储到文件中,然后在另一台服务器上恢复它。最简单的方法 - 使用 MySql Workbench。

以及有关联合表的一些信息:

  • 您需要仅在服务器 B 上启用联合
  • 您可以通过在 B 上创建联合表来访问 A 上的视图
  • 您可以在联合表上执行 INSERT UPDATE DELETE
  • 如果您需要只读访问权限,您可以限制用户权限

但!你不能做任何聚合函数。在将被联合的视图上(例如 COUNT()、MAX()、UNION...)(您可以,但它会滞后)

  • 请记住在您正在创建的联合表上设置 KEY。(否则它会滞后可怕。)
  • 记得在视图上使用 ALGORITHM=MERGE
  • 请记住授予对服务器 A 上 USERNAME(来自连接字符串)的访问权限

服务器 B 上的联合表示例:

delimiter $$
CREATE TABLE `schemaName`.`tableName`(
    `keyName` VARCHAR(10) NOT NULL,
    `key2Name` DATE DEFAULT '2012-01-01',
    KEY `keyName` (`keyName`) 
)
ENGINE=FEDERATED
DEFAULT CHARSET=utf8
CONNECTION='mysql://USERNAME:PASSWORD@IPADDRESS:PORTNUMBER/baseSchema/baseTable'
$$

服务器 A 上的视图:

CREATE
    ALGORITHM = MERGE
    DEFINER = `ANOTHERUSERNAME`@`%`
    SQL SECURITY DEFINER
VIEW `baseSchema`.`baseTable` AS
    SELECT
        ... AS `keyName`,
        ... AS `key2Name`
    FROM
        ...
于 2012-09-11T11:59:59.817 回答