阅读MySql binlog

时间:2014-02-17 19:51:14

标签: c# mysql mysqlbinlog

我不同意这个问题得到有效回答:decode mysqlbinlog in C#

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

1 个答案:

答案 0 :(得分:2)

首先,我学到了什么:

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

  2. mysqlbin.cc不在该文件夹中。但是,我可以通过快速谷歌搜索轻松获取该文件。该文件可在此处找到:https://code.google.com/p/mg-common-utils/source/browse/trunk/myreplicator/src/mysqlbinlog.cc?r=4。它有详细记录且易于阅读。

  3. 其次,我的解决方案:

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

    1. 在选项文件中启用MySql服务器上的binlogging。在MySql Workbench中,选中logging选项卡下的'log-bin'。或者,在设置文件中键入'log-bin ='(通常位于[basedir]中。可以称为'my.ini'或'my.cnf'或其他。通常,扩展名为.cnf或.ini)。不需要文件名。如果未指定,MySql将自动为日志创建文件名。但是,请查看有关此问题的MySql文档。

    2. 在我的客户端应用程序中,我查询服务器以获取每个二进制日志的路径(可能有很多)。要做到这一点:

      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).
      
      • 将这些解析在一起得到每个二进制日志的路径
    3. 由于mysqlbinlog.exe位于[basedir] \ bin中,我查询服务器以获取基目录的路径:

      query show global variables like 'basedir'
      

      然后,我用'\ bin \ mysqlbinlog.exe'

    4. 解析结果
    5. 我使用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;
      }
      
    6. 最后,我使用自己的逻辑解析结果(具体针对我要查找的内容)。结果非常容易理解:mysqlbinlog使用常规换行符,语句由分隔符终止,分隔符在语句之前定义(通常,可以有多个分隔符)。

    7. 我希望这有助于某人!