网址
这里先附上几个网址
1.canal的官网
2.canal启动报错解决办法
版本对应
mysql-8.0.31-winx64
canal.deployer-1.1.4.tar.gz
监控的代码
public class IEController : ApiController
{
[HttpGet]
public void start()
{
//canal 配置的 destination,默认为 example
var destination = "example";
//创建一个简单 CanalClient 连接对象(此对象不支持集群)传入参数分别为 canal 地址、端口、destination、用户名、密码
var connector = CanalConnectors.NewSingleConnector("127.0.0.1", 11111, destination, "", "");
//连接 Canal
connector.Connect();
//订阅,同时传入 Filter。Filter是一种过滤规则,通过该规则的表数据变更才会传递过来
//允许所有数据 .*\\..*
//允许某个库数据 库名\\..*
//允许某些表 库名.表名,库名.表名
connector.Subscribe(".*\\..*");
while (true)
{
//获取数据 1024表示数据大小 单位为字节
var message = connector.Get(1024);
//批次id 可用于回滚
var batchId = message.Id;
if (batchId == -1 || message.Entries.Count <= 0)
{
Thread.Sleep(300);
continue;
}
PrintEntry(message.Entries);
}
}
/// <summary>
/// 输出数据
/// </summary>
/// <param name="entrys">一个entry表示一个数据库变更</param>
private static void PrintEntry(List<Entry> entrys)
{
Console.WriteLine("监控到改动,进入监控输出。");
foreach (var entry in entrys)
{
if (entry.EntryType == EntryType.Transactionbegin || entry.EntryType == EntryType.Transactionend)
{
continue;
}
RowChange rowChange = null;
try
{
//获取行变更
rowChange = RowChange.Parser.ParseFrom(entry.StoreValue);
}
catch (Exception ex)
{
//_logger.LogError(ex.ToString());
}
if (rowChange != null)
{
//变更类型 insert/update/delete 等等
EventType eventType = rowChange.EventType;
//输出binlog信息 表名 数据库名 变更类型
//_logger.LogInformation(
// $"================> binlog[{entry.Header.LogfileName}:{entry.Header.LogfileOffset}] , name[{entry.Header.SchemaName},{entry.Header.TableName}] , eventType :{eventType}");
Console.WriteLine("改变的数据库名:" + entry.Header.SchemaName);
//输出 insert/update/delete 变更类型列数据
foreach (var rowData in rowChange.RowDatas)
{
if (eventType == EventType.Delete)
{
deleteAction(rowData.BeforeColumns.ToList(), entry.Header.TableName);
}
else if (eventType == EventType.Insert)
{
addAction(rowData.AfterColumns.ToList(), entry.Header.TableName);
}
else
{
updateAction(rowData.AfterColumns.ToList(), entry.Header.TableName);
}
}
}
}
}
本文用于转载记录使用。