C# 读取MySql binlog

C# 读取MySql binlog,c#,mysql,mysqlbinlog,C#,Mysql,Mysqlbinlog,我不同意这个问题得到了有效的回答 我有,我认为是相同的问题:我想从c#应用程序中读取MySql Binlog,但不知道文件的格式。如何正确解析这些文件的数据?首先,我学到了: MySql的大多数源代码文件与程序集一起安装,通常位于[basedir]\include中。例如,典型的安装会将文件放在Program files\MySql\MySql 5.6\include中 mysqlbin.cc不在该文件夹中。然而,我很容易通过谷歌快速搜索得到这个文件。可以在此处找到该文件:。它有很好的文档记录,

我不同意这个问题得到了有效的回答

我有,我认为是相同的问题:我想从c#应用程序中读取MySql Binlog,但不知道文件的格式。如何正确解析这些文件的数据?

首先,我学到了:

  • MySql的大多数源代码文件与程序集一起安装,通常位于[basedir]\include中。例如,典型的安装会将文件放在Program files\MySql\MySql 5.6\include中

  • mysqlbin.cc不在该文件夹中。然而,我很容易通过谷歌快速搜索得到这个文件。可以在此处找到该文件:。它有很好的文档记录,易于阅读

  • 第二,我的解决方案:

    正如阿库兹明斯基所指出的,MySql的binlog格式可能会发生变化。但是,从mysqlbinlog.exe实用程序返回的格式是一致的。此应用程序通常包含在MySql安装中,应位于[basedir]\bin中。现在,我在c#控制台应用程序中运行这个应用程序,并解析结果。我使用以下步骤来完成此任务:

  • 在选项文件中启用MySql服务器上的binlogging。在MySql Workbench中,选中logging选项卡下的“log bin”。或者,在设置文件(通常位于[basedir]中)中键入“log bin=”。可以称为“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;
    }
    
    私有静态字符串getLogText(Liststring>LogFileName)
    {
    列表_logtext=新列表();
    字符串_basedir=GetBaseDir();
    foreach(logfilename中的字符串logfilename)
    {
    Process proc=新流程();
    proc.StartInfo.FileName=\u basedir+“\\bin\\mysqlbinlog”;
    proc.StartInfo.Arguments=string.Format(“{0}\”,日志文件);
    proc.StartInfo.UseShellExecute=false;
    proc.StartInfo.RedirectStandardInput=proc.StartInfo.RedirectStandardOutput=true;
    proc.Start();
    _添加(proc.StandardOutput.ReadToEnd());
    }
    返回日志文本;
    }
    私有静态字符串GetBaseDir()
    {
    字符串路径=”;
    使用(MySqlConnection conn=newmysqlconnection(RemoteServerConnectionString))
    {
    conn.Open();
    使用(MySqlCommand cmd1=new MySqlCommand(“显示全局变量,如'basedir',conn))
    {
    使用(MySqlDataReader=cmd1.ExecuteReader())
    {
    while(reader.Read())
    {
    path=reader.GetString(1);
    }
    }
    }
    }
    返回路径;
    }
    
  • 最后,我使用自己的逻辑解析结果(特定于我要查找的内容)。结果非常容易阅读:mysqlbinlog使用常规换行符,语句由分隔符终止,分隔符在语句之前定义(通常可以有多个分隔符)


  • 我希望这对别人有帮助

    问题不在于格式化知识。您可以从源代码中获得它。问题是格式可能随时改变,因为没有人承诺它会持续。我会用mysqlbinlog来解析它。谢谢你的回复。最后,我特别想知道如何自己解析binlog而不使用外部实用程序。您知道格式的确切位置吗?或者我如何找到它们?很抱歉我不知道如何访问(大概是MySql)源代码。同时,如果有办法从c#中使用mysqlbinlog实用程序,那么您的建议可能对启动我的应用程序有用。这可能吗?如果是,你知道怎么做吗?感谢您从./client/mysqlbinlog.cc开始。格式应该简单明了。我的C#知识几乎为零,我想一定有类似exec()的东西可以调用外部程序