0

「失われた」情報を取得するために使用する必要のある1GMySQLbinlogファイルが7つあります。ログから特定のINSERTステートメントを取得するだけで済みます(たとえば、ステートメントが「INSERT INTO table SETfield1 =」で始まる場合)。mysqlbinlogを実行するだけで(データベースごとに--short-formを使用している場合でも)、数百メガバイトのテキストファイルが得られるため、他のプログラムで解析することはほとんど不可能です。

ログから特定のSQLステートメントを取得する方法はありますか?補助的な情報(タイムスタンプ、自動インクリメント番号など)は必要ありません。特定の文字列に一致するSQLステートメントのリストが必要です。理想的には、次のようなsqlステートメントのみをリストしたテキストファイルが必要です。

INSERT INTO table SET field1='a';
INSERT INTO table SET field1='tommy';
INSERT INTO table SET field1='2';

mysqlbinlogをテキストファイルに対して実行し、文字列に基づいて結果を解析することでそれを取得できますが、テキストファイルが大きすぎます。実行したスクリプトがタイムアウトし、テキストエディタで開くことができなくなります。

よろしくお願いします。

4

1 に答える 1

2

私は答えを受け取ったことがありませんが、私が何をしたかをお話しします。1.mysqlbinlogをテキストファイルに実行します2.fgetsを使用してログの各行を読み取るPHPスクリプトを作成しました3.各行をループしながら、スクリプトはstristr関数を使用してそれを解析します4.行が探している文字列と一致する場合というのは、行をファイルに記録するからです

mysqlbinlogとPHPスクリプトの実行にはしばらく時間がかかりますが、タイムアウトすることはなくなりました。私はもともとPHPでfreadを使用していましたが、ファイル全体がメモリに読み込まれ、大きな(1G)ログファイルでスクリプトがクラッシュしていました。現在、実行には数分かかります(max_execution_time変数も大きく設定します)が、魅力のように機能します。fgetsは一度に1行を取得するため、メモリをほとんど消費しません。

于 2010-06-16T02:15:29.417 に答える