web-dev-qa-db-ja.com

Mysqlbinlogステートメントの読み取り

スナップショットとmysqlのトランザクションログを使用して、特定のデータベースで特定の時点を実行しようとしています。スナップショットの時点からリカバリの時点までステートメントをプルするために、以下を使用しています。

mysqlbinlog --database=**database** --start-datetime="$start_datetime" --stop-datetime="$stop_datetime" list_of_binlog_file_names

Mysqlbinlogが生成する結果のステートメントには、次の形式の別のデータベースのINSERT/UPDATE/DELETEステートメントが含まれます。

INSERT INTO **database**_reporting.tablename VALUES (data);

したがって、機能的には、2つの異なるデータベースからステートメントを取得しています。1つは本番データベースで、もう1つはレポートデータベースであり、「_ reporting」によって命名法で区別されています。アプリケーションがプライマリデータベースを使用しながらセカンダリデータベースに挿入しているように見え、binlogは両方のステートメントをプライマリデータベースに関連付けます。

MysqlbinlogがUSE primary_database;の後に実行される限り、両方のデータベースのステートメントを読み取るのは正しいですか? mysqlbinlogを使用してレポートデータベース用のものを分離する方法はありますか?私はかなり検索しました-私はここで間違った木を吠えているかもしれません。質問を明確にできるかどうか教えてください。

1
Stephen

-database オプションは、データベースにテーブルを明示的に指定するクエリを除外しないため、それをgrepにリダイレクトして、primary_databaseとINSERT、UPDATE、DELETEを見つける必要があります。

mysqlbinlog --database=**database** --start-datetime="$start_datetime" --stop-datetime="$stop_datetime" list_of_binlog_file_names | grep "primary_database\." | grep "[IUD][NPE][SDL][EA][RT][TE]"

これは完璧な解決策ではないかもしれません。おそらく良いPerlまたはpythonスクリプトで、これを釘付けにします。

0
RolandoMySQLDBA