この質問が効果的に回答されたことに同意しません: decode mysqlbinlog in C#。
私は、同じ質問だと思います。ac# アプリケーション内から MySql binlog を読みたいのですが、ファイルの形式がわかりません。これらのファイルのデータを正しく解析するにはどうすればよいですか?
この質問が効果的に回答されたことに同意しません: decode mysqlbinlog in C#。
私は、同じ質問だと思います。ac# アプリケーション内から MySql binlog を読みたいのですが、ファイルの形式がわかりません。これらのファイルのデータを正しく解析するにはどうすればよいですか?
まず、私が学んだこと:
MySql のソース コード ファイルのほとんどは、アセンブリと共にインストールされ、通常は [basedir]\include にあります。たとえば、通常のインストールでは、ファイルは Program Files\MySql\MySql 5.6\include に配置されます。
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# コンソール アプリケーション内からこのアプリケーションを実行し、結果を解析します。これを達成するために、次の手順を使用しました。
オプション ファイル内からの MySql サーバーでの binlogging を有効にしました。MySql Workbench で、ログ タブの下の「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 は通常の改行を使用し、ステートメントはステートメントの前に定義された区切り文字で終了します (通常、複数の区切り文字が存在する可能性があります)。
これが誰かに役立つことを願っています!