博客园  :: 首页  :: 新随笔  :: 订阅 订阅  :: 管理

PHP MYSQL单向同步方案

Posted on 2016-02-03 18:07  PHP-张工  阅读(976)  评论(0编辑  收藏  举报

项目上有个需求,需要从外网服务器的MYSQL同步到本地服务器上。

思路如下:

1 在外网MYSQL中创建表 table_change_log ,记录表中数据的更改记录。

DROP TABLE IF EXISTS `table_change_log`;
CREATE TABLE `table_change_log` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `table_name` varchar(20) NOT NULL DEFAULT '' COMMENT '表名',
  `table_op` varchar(20) NOT NULL DEFAULT '' COMMENT '操作',
  `table_id` int(11) NOT NULL DEFAULT '0' COMMENT '表ID',
  `add_time` datetime NOT NULL COMMENT '添加时间',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT='表操作记录';

2 外网MYSQL需要同步的表中,添加触发器(添加时、修改时、删除时)

DROP TRIGGER IF EXISTS `tg_{0}_insert`;
CREATE TRIGGER `tg_{0}_insert` AFTER INSERT ON `{0}`
FOR EACH ROW INSERT INTO table_change_log (`table_name`, `table_op`, `table_id`, `add_time`) VALUES('{0}', 'insert', new.id, now());

DROP TRIGGER IF EXISTS `tg_{0}_update`;
CREATE TRIGGER `tg_{0}_update` AFTER UPDATE ON `{0}`
FOR EACH ROW INSERT INTO table_change_log (`table_name`, `table_op`, `table_id`, `add_time`) VALUES('{0}', 'update', old.id, now());

DROP TRIGGER IF EXISTS `tg_{0}_delete`;
CREATE TRIGGER `tg_{0}_delete` AFTER DELETE ON `{0}`
FOR EACH ROW INSERT INTO table_change_log (`table_name`, `table_op`, `table_id`, `add_time`) VALUES('{0}', 'delete', old.id, now());

3 本地服务器从外网拉取同步的PHP代码并执行。

$url="http://xxx.xxx/sync/client.php";
$html = file_get_contents($url); 

if ($html === FALSE)
{
    exit("NET ERROR!");
}

file_put_contents("sync_exe.php", $html);
include "sync_exe.php";

4 获取外网的更改记录,更新到本地服务器MYSQL中。

源码下载:https://files.cnblogs.com/files/zjfree/PHP_MYSQL_sync.rar