如何从一个远程服务器的表复制到另一个远程数据库的表?

3

我有两个不同服务器上的匹配数据库(MySQL复制不是一个选项)。我需要查看表2中是否缺少一条记录,如果是,则截断表2,然后从表1复制到表2。每个表位于不同的IP /服务器上。

代码:

            $pdoyd = new PDO(
                    'mysql:host=' . DB_HOST_YODA . ';dbname=' . DB_DATABASE_DNS,
                     DB_USER_DNS,
                     DB_PASSWORD
            );
            $pdoyd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $pdoyd->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
            $truntbl = array('cryptokeys', 'domains', 'records');
            foreach($truntbl as $tbl){
                    $sql = 'truncate '.$tbl;
                    $statementyd = $pdoyd->prepare($sql);
                    $useryd = $statementyd->execute();
                    var_dump($statementyd);
                    echo '<br>';
            }

如何高效地将一个服务器上的表中缺失的记录复制到另一个服务器上的表中?


请查看https://dev59.com/eWUp5IYBdhLWcg3wCD_4 - Matt
3个回答

5

您可以打开两个连接。使用一个连接从源服务器读取,另一个连接插入到目标服务器中。使用ON DUPLICATE KEY IGNORE选项可以防止在尝试覆盖现有行时出错,因此只插入缺失的行。

$pdo1 = new PDO('mysql:host=server1;dbname=xxx', $username1, $password1);
$pdo2 = new PDO('mysql:host=servrer2; dbname=xxx', $username2, $password2);

$insert_stmt = $pdo2->prepare("INSERT INTO yourTable (col1, col2, col3, ...) VALUES (:col1, :col2, :col3, ...) ON DUPLICATE KEY IGNORE");
$select_results = $pdo1->query("SELECT * FROM yourTable");
while ($row = $select_results->fetch(PDO::FETCH_ASSOC)) {
    $insert_stmt->execute($row);
}

1
fetchAll 改为 fetch。或者使用 foreach ($select_results->fetchAll(PDO::FETCH_ASSOC) as $row 替代 while - Barmar

1
如果您只需要检查缺失的记录而不是更改的记录,则有两个选项:
  1. 从两个表中提取主键到php数组中,并使用array_diff()函数获取存在于一个表中但不存在于另一个表中的主键列表。如果表中的记录不是很多,这种方法是有效的。
  2. 从一个表中提取主键,并使用批量插入或load data infile sql命令将它们插入到另一个数据库中的临时表中。然后,可以在where子句中使用left join和is null条件来获取另一个表中不可用的主键列表。
从长远来看,您可以尝试使用自动增量字段或时间戳来跟踪进度,以确定哪些记录已完全同步。您只需要检查后续记录即可。

实际上,关键字并不重要。如何在不同的服务器上将其从一个表复制到另一个表仍然是主要问题。应该只需要一行简单的SQL查询,例如“将ipaddress.database.table1复制到differentipaddress.database.table1……”关键字可以以任何顺序出现。如果有原始数据会更好,但如果没有也没关系。 - doeJ
你不能这样做,这2个服务器没有直接连接。你需要通过php传输数据。 - Shadow
显然,您可以将一个系统中的完整表导出到文件中,然后将其导入到另一个服务器中,而php仅用于传输文件。 - Shadow

0

前往您的PHPAdmin并尝试导出表格。然后在文本编辑器中打开.sql文件并查找缺失的数据。最后,删除任何重复的数据,并尝试使用.sql文件中的MySQL代码,并将其放入终端以进行目标操作。


你建议使用PDO如何处理这个问题? - Shadow
@Angus Leung,我正在处理PDO兄弟。我不想与GUI有任何关系。我要让来自Timbuktu的Joe Schmuckatelli访问我的后端数据库?o.0 这是一个自定义应用程序中的函数。但还是谢谢你。 - doeJ
太棒了!希望你成功! - Angus Leung

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接