如何使用Node.js或PHP实时监听MySQL数据库更改

时间:2017-05-05 15:13:25

标签: php mysql node.js amazon-web-services binlog

我需要创建一个包含多个数据库的系统,其中一个是master数据库,这个数据库只需要复制其他数据库的结构更改,例如:

当我在系统中注册新用户时,系统会自动创建主数据库的结构副本,但是此数据库不会将插入的寄存器或更新发送到主数据库,只有主数据库更新时才会将所有结构更改发送到因此,我需要创建一个脚本或实现工具来捕获数据库更新,以便实时执行所有从站上的更新。

我向AWS支持人员发送了一个问题,他们建议我实施一个phyton脚本或集成另一个允许执行binlog流的库,以便将这些更改复制到从属数据库中。

AWS支持回答:

  

您可以在此处遵循本指南[1],您可以跳过Kinesis(AWS服务)部分并直接编写代码,而不是将其放入Kinesis流中。您需要在数据库集群上启用binlog并侦听日志。根据您可以在逻辑中添加的事件,以在子数据库上执行数据库更新。为了复制master数据库模式,我建议在任何子数据库需要配置和导入该模式之前,使用mysqldump CLI工具导出master数据库的模式。然后使用binlog脚本将更改推送到子数据库,具体取决于您编写的逻辑。

[1] https://aws.amazon.com/blogs/database/streaming-changes-in-a-database-with-amazon-kinesis/

1 个答案:

答案 0 :(得分:2)

我解决了将Zongji整合到npm软件包中的问题,Zongji检测到binlog上的更改并捕获执行的查询,我使用这个软件包来监听binlog事件并将这些更改应用到slave数据库,这里我是&#39 ; ll是我脚本的一个例子。

Zongji存储库:https://github.com/nevill/zongji



var ZongJi = require('zongji');
var mysql = require('mysql');

var query;

var connection = mysql.createConnection({
  host: '192.168.1.18',
  port: '3310',
  user: 'root',
  password: 'admin'
});

var zongji = new ZongJi({
  host: '192.168.1.18',
  port: '3310',
  user: 'root',
  password: 'admin'
});

zongji.on('binlog', function(evt) {

  if (evt.query != 'BEGIN') {

    query = evt.query

    query = query.replace(/`tuadmin`/g, '`demo`');

    connection.query(query, function(error, results, fields) {

    });

    console.log(query);
  }
});

zongji.start({
  includeEvents: ['query']
});

process.on('SIGINT', function() {
  console.log('Got SIGINT.');
  zongji.stop();
  process.exit();
});