同步本地数据库和实时站点数据库

Posted

技术标签:

【中文标题】同步本地数据库和实时站点数据库【英文标题】:Synchronize local database and live site database 【发布时间】:2019-07-21 17:03:43 【问题描述】:

我有一个本地网站,用户每天都会在其中向 mysql DB 添加项目。现在我想制作该网站的实时版本。

但是我不想将项目添加到两个数据库中,而只想添加到本地数据库中。并同步远程数据库。

本地站点使用 XAMPP。另外我不认为复制是我想要的方式。

我正在寻找更多的 php 方式来完成这项任务。

目前我不知道如何实现这一点。

你知道怎么做吗?

【问题讨论】:

“我不认为复制是我想要做的方式”你这么想的具体原因是什么? 【参考方案1】:

最快的方法是使用 MySQL,但如果您想严格使用 PHP,如果您希望实时数据仅反映本地数据,有两种方法可以解决此问题(即,您没问题删除所有数据并重新提取数据)。因为这个解决方案是用 PHP 编写的,所以您必须遍历每个单独的表。您可以运行使用 PDO 或 MySQLi 的 PHP 脚本,但您需要以下两种删除策略之一:

1) TRUNCATESELECT FROM(速度快,但有潜在的安全风险)这是一个更大的风险,因为TRUNCATE 的 MySQL 权限是 DROPALTER。不是您希望常规数据库用户有权访问的命令。这是实现它的 SQL:

TRUNCATE live_database_name.table_name

INSERT INTO live_database_name.table_name SELECT * FROM local_database_name.table_name

2) DELETE FROMSELECT FROM数据越多越慢,但更安全)。此解决方案较慢,因为您必须遍历表中的每个条目,而不是删除并重新创建表。但是,DELETE 被视为授予数据库用户更安全的权限,因为他们不能DROP 整个表。以下是你需要做的事情:

DELETE FROM live_database_name.table_name

INSERT INTO live_database_name.table_name SELECT * FROM local_database_name.table_name

【讨论】:

我正在考虑在本地数据库中保留一个表,用于记录所有表上的所有插入、更新、删除操作,然后使用它进行备份并导入远程数据库,以便我不必每次都清空数据库并再次插入所有内容。我也有与每条记录相关联的图像,所以随着时间的推移,我认为这不是每次都截断的合适方式。对此有什么想法吗?或者如何实现? 您需要将本地数据库中的每个条目与实时数据库中的每个条目进行比较(这会很慢)。做SELECT * FROM local_database_name.table_name 的东西和做SELET * FROM live_database_name.table_name 的东西。然后,您可以遍历通过唯一 ID 链接它们的行。实时数据库中不存在或已更新的任何内容,您都可以在 PHP 中的两个数组的更新上运行 SQL。【参考方案2】:

如果您不想设置复制方案,为什么不使用(2 或 3)个 cron 作业,本地转储/远程转储/使用本地转储更新远程。不,这不是最好的方法,但它确实有效......

仅使用 (2),转储本地/使用本地转储更新远程,每天运行 @ 1:00AM 转储,和 !:15AM 更新

0 1 * * * mysqldump --host="localhost" --user="user" --password="password" database_name > backup_name.sql

15 1 * * * mysql --host="remote_host" --user="user" --password="password" --port="3306" database_name < backup_name.sql

【讨论】:

本地服务器在windows上运行。

以上是关于同步本地数据库和实时站点数据库的主要内容,如果未能解决你的问题,请参考以下文章

本地主机 MAMP 与共享数据库:错误 - “无法访问此站点”

Drupal 8本地设置

htaccess 用于本地测试和实时服务器

从服务器同步时如何构建本地数据库以删除行

使用 phpMyAdmin 同步 MySQL 远程和本地数据库

Parse.com PFQueryTableViewController 本地数据存储