联邦表澄清

时间:2012-08-08 16:39:34

标签: mysql

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

来自tablename @ UNIXPROD2的

INSERT INTO tablename @ UNIXTEST2

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

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

  

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

对我而言,这表明(A)我可以将数据从我们的prod数据库复制到我们的测试数据库; (B)在联合表上执行的任何操作也将在源表上处理,这是我想要做的事情。我有一些脚本需要运行,我想针对实际的prod数据运行它,以确保它在我在prod环境中使用之前有效。

我的问题:我的解释是否正确?

假设是,我试过了:

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

我很感激这方面的任何帮助。

编辑:经过进一步研究,我认为可以使用OUTFILE和INFILE做我需要的工作,我会在prod表上使用OUTFILE,然后在测试中输入那些行表(一个或多个)。想法?

1 个答案:

答案 0 :(得分: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
        ...