我不同意这个问题得到了有效的回答:decode mysqlbinlog in C#。
我有,我认为是同样的问题:我想从一个c#应用程序中读取MySql binlogs,但不知道文件的格式。如何正确分析这些文件的数据?
最佳答案
首先,我学到了:
MySql的大多数源代码文件都与程序集一起安装,通常位于[basedir]\include中。例如,典型的安装会将文件放在Program files\MySql\MySql 5.6\include中。
mysqlbin.cc不在该文件夹中。不过,我很容易通过谷歌搜索得到这个文件。文件可以在这里找到:https://code.google.com/p/mg-common-utils/source/browse/trunk/myreplicator/src/mysqlbinlog.cc?r=4。它有很好的文档和容易阅读。
第二,我的解决方案:
正如akuzminsky所指出的,MySql的binlog格式可能会发生变化。但是,从mysqlbinlog.exe实用程序返回的格式是一致的。此应用程序通常包含在MySql安装中,应位于[basedir]\bin中。我现在从一个c#控制台应用程序中运行这个应用程序并分析结果。我使用了以下步骤来完成此任务:
从选项文件中启用MySql服务器上的binlogging。在MySql Workbench中,选中logging选项卡下的log bin。或者,在设置文件中键入“log bin=”(通常位于[basedir]中)。可能叫“my.ini”或“my.cnf”之类的。通常使用.cnf或.ini扩展名)。不需要文件名。如果没有指定,MySql将自动为日志创建文件名。但是,请查看MySql文档,了解与此相关的可能问题。
在客户机应用程序中,我查询服务器以获取每个二进制日志的路径(可能有许多)。为此:
query show global variables like 'datadir' //returns the data directory.
query show binary logs //returns the filename of each binary log, along with its file size (helpful for reading).
将这些内容一起解析可获得每个二进制日志的路径。
由于mysqlbinlog.exe位于[basedir]\bin中,因此我查询服务器以获取基本目录的路径:
query show global variables like 'basedir'
然后,我用'\bin\mysqlbinlog.exe'分析结果
我使用Process类创建一个新进程,使用mysqlbinlog.exe执行每个二进制日志,并将每个文件的结果读入一个字符串变量:
private static string GetLogTexts(Liststring> logfilenames)
{
List<string> _logtexts = new List<string>();
string _basedir = GetBaseDir();
foreach(string logfilename in logfilenames)
{
Process proc = new Process();
proc.StartInfo.FileName = _basedir + "\\bin\\mysqlbinlog";
proc.StartInfo.Arguments = string.Format("\"{0}\"", logfile);
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardInput = proc.StartInfo.RedirectStandardOutput = true;
proc.Start();
_logtexts.Add(proc.StandardOutput.ReadToEnd());
}
return _logtexts;
}
private static string GetBaseDir()
{
string path = "";
using (MySqlConnection conn = new MySqlConnection(RemoteServerConnectionString))
{
conn.Open();
using (MySqlCommand cmd1 = new MySqlCommand("show global variables like 'basedir'", conn))
{
using (MySqlDataReader reader = cmd1.ExecuteReader())
{
while (reader.Read())
{
path = reader.GetString(1);
}
}
}
}
return path;
}
最后,我使用自己的逻辑分析结果(特定于我要查找的内容)。结果非常容易阅读:mysqlbinlog使用常规换行符,语句由一个分隔符终止,该分隔符在语句之前定义(通常,可以有多个分隔符)。
我希望这能帮助别人!