情况如下:
我在远程服务器上有一个mySQL数据库。我需要它的4个表中的数据。有时,这些表的模式会发生更改(会添加新字段,但不会删除)。目前,这些表格有300000多条记录。
此数据需要导入到localhostmySQL实例中。存在这4个相同的表(具有相同的名称),但所需的字段是远程数据库表中字段的子集。这些本地表中的数据被认为是只读的,永远不会被写入。所有的数据都需要在事务中运行,所以本地表中总是有一些数据,即使它是一天以前的数据。localhost表由活动网站使用,因此整个过程需要尽快完成,以最大限度地减少停机时间。
这个过程每天运行一次。
我看到的选项:
-
获取远程表的结构/数据的mysqldump并保存到文件中。删除localhost表,然后运行转储的sql脚本。然后在4个表上重新创建所需的索引。
-
截断localhost表。在PHP中的远程数据库上运行SELECT查询,只检索所需的字段,而不是整行。然后对结果进行循环,并根据这些数据创建INSERT语句。
我的问题:
- 性能方面,哪一个是我的最佳选择
- 哪一个完成得最快
- 会给服务器增加更大的负载吗
- 将索引表在两个选项中花费的时间相同
如果没有充分的理由让本地d/b成为远程的子集,请使结构相同,并在所需的表上启用数据库复制。复制的工作原理是,主设备跟踪所做的所有更改,并管理每个从属d/b指向更改的指针。每个奴隶都说给我自上次请求以来的所有更改。对于一个相当大的数据库,这比您选择的任何替代方案都要高效得多。它的成本很低。
至于模式更改,我认为alter
信息是由主服务器记录的,所以从服务器也可以复制这些信息。该机制肯定复制了drop table ... if exists
和create table ... select
,所以alter
在逻辑上应该遵循,但我没有尝试过
这里是:确认alter
已正确复制。