2

この質問が効果的に回答されたことに同意しません: decode mysqlbinlog in C#

私は、同じ質問だと思います。ac# アプリケーション内から MySql binlog を読みたいのですが、ファイルの形式がわかりません。これらのファイルのデータを正しく解析するにはどうすればよいですか?

4

1 に答える 1

2

まず、私が学んだこと:

  1. MySql のソース コード ファイルのほとんどは、アセンブリと共にインストールされ、通常は [basedir]\include にあります。たとえば、通常のインストールでは、ファイルは Program Files\MySql\MySql 5.6\include に配置されます。

  2. mysqlbin.cc はそのフォルダーにありませんでした。ただし、簡単な Google 検索を実行することで、ファイルを簡単に取得できました。ファイルは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 に配置する必要があります。ここで、ac# コンソール アプリケーション内からこのアプリケーションを実行し、結果を解析します。これを達成するために、次の手順を使用しました。

  1. オプション ファイル内からの MySql サーバーでの binlogging を有効にしました。MySql Workbench で、ログ タブの下の「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. 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;
    }
    
  5. 最後に、独自のロジック (探しているものに固有) を使用して結果を解析します。結果は非常に読みやすいです: mysqlbinlog は通常の改行を使用し、ステートメントはステートメントの前に定義された区切り文字で終了します (通常、複数の区切り文字が存在する可能性があります)。

これが誰かに役立つことを願っています!

于 2014-02-18T17:36:54.007 に答える