MySQL で元の SQL ステートメントをすばやく表示する方法

藏色散人
リリース: 2021-11-10 17:11:53
転載
2409 人が閲覧しました

背景

最近レガシー プロジェクトを調査する過程で、特定の業務運営のためにどのデータベース テーブルが変更されたかを判断するために、バイナリログ。 MySQL には多くの binlog 解析ツールがあることは以前から知っていましたが、これまで使用したことがなかったので、今日はそのプロセスを記録します。

今回は、公式の解析ツールに加えて、サードパーティのオープンソース ツールも使用しました。

準備

binlog を有効にする

まず、MySQL サーバーで binlog が有効になっていることを確認します。 cnf ファイルで構成されています。

cat /etc/my.cnf

# 取消log_bin的注释即可,这里可以提供一个具体的路径,否则就使用默认地址
log_bin
# 高版本MySQL需要server-id这个参数,提供一个集群中不重复的id值即可
server-id=1
# 重新启动服务器
service mysqld restart
ログイン後にコピー

現在のログの位置を記録します

後続のテストを容易にするために、まず MySQL ログの関連情報をいくつか記録します。

-- ログが正しく有効になっていることを確認します。ここでログ ファイルの特定のパスを表示することもできます。

mysql> show variables like '%log_bin%';
+---------------------------------+---------------------------------+
| Variable_name                   | Value                           |
+---------------------------------+---------------------------------+
| log_bin                         | ON                              |
| log_bin_basename                | /var/lib/mysql/mysqld-bin       |
| log_bin_index                   | /var/lib/mysql/mysqld-bin.index |
| log_bin_trust_function_creators | OFF                             |
| log_bin_use_v1_row_events       | OFF                             |
| sql_log_bin                     | ON                              |
+---------------------------------+---------------------------------+
ログイン後にコピー

-- 現在のログのファイル名とオフセット位置を記録しますログは後で表示できます。正確な位置情報

mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| mysqld-bin.000001 |     2425 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
ログイン後にコピー

-- 開始時刻を指定してログを表示することもできるので、現在時刻も記録してください

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2018-08-02 09:59:43 |
+---------------------+
ログイン後にコピー

DDLを実行

次のステートメントはテスト ライブラリで実行されます。最終的な目標は、バイナリログを表示してこれらのステートメントを復元することです。

-- 建表
create table aaa(id int, title varchar(100));
-- 插入初始化数据
insert into aaa(id, title) values (1, '测试1');
insert into aaa(id, title) values (2, '测试2');
insert into aaa(id, title) values (3, '测试3');
-- 更新/删除
update aaa set title='修改' where id=2;
delete from aaa where id=1;
ログイン後にコピー

View binlog

公式ツール mysqlbinlog

公式解析ツールは使い方が非常に簡単ですが、解析された結果はあまり読みにくくなります。不明な変数「default-character-set=utf8」エラーを回避するために、呼び出し中に no-defaults パラメーターを使用しました。

mysqlbinlog --no-defaults  /var/lib/mysql/mysqld-bin.000001 --start-position=2425
ログイン後にコピー

mysqlbinlog の表示結果は読み取れません。以下に抜粋します。実行した DDL ステートメントに加えて、他のコンテキスト情報も記録されていることがわかります。

# at 2425
#180802 10:05:32 server id 1  end_log_pos 2553 CRC32 0x77e80f22 Querythread_id=70exec_time=0error_code=0
use `aaaa`/*!*/;
SET TIMESTAMP=1533175532/*!*/;
SET @@session.pseudo_thread_id=70/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1075838976/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8mb4 *//*!*/;
SET @@session.character_set_client=45,@@session.collation_connection=45,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
-- 建表
create table aaa(id int, title varchar(100))
/*!*/;
# at 2553
#180802 10:05:32 server id 1  end_log_pos 2632 CRC32 0x2bcb9bbd Querythread_id=70exec_time=0error_code=0
SET TIMESTAMP=1533175532/*!*/;
BEGIN
/*!*/;
# at 2632
#180802 10:05:32 server id 1  end_log_pos 2779 CRC32 0x8414086d Querythread_id=70exec_time=0error_code=0
SET TIMESTAMP=1533175532/*!*/;
-- 插入初始化数据
insert into aaa(id, title) values (1, '测试1')
/*!*/;
ログイン後にコピー

サードパーティ ツール binlog2sql

binlog にはオープン ソース ツールが多数あり、Google で検索すると binlog2sql が見つかりました。公式よりも多くの機能を提供しており、オプションによりオリジナルSQL、ロールバックSQL、主キーを削除したINSERT SQLなどを取得することができます。今回は実行された DDL を表示するためだけに使用しますが、より高度な使用方法については、中国語の公式ドキュメントを参照してください。

このツールは Python (2.7, 3.4) をベースに開発されているため、マニュアルに従って関連する依存関係をインストールしてください。

git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql
pip install -r requirements.txt
ログイン後にコピー

使用方法は公式ツールと同様で、オフセット位置や開始時間、正確な位置決め。位置情報が入力されていない場合は、最初からすべての情報が表示されます。

# 使用偏移位置
python binlog2sql.py -h127.0.0.1 -P3306 -uroot -p'root' --start-file='mysqld-bin.000001' --start-pos=2425 -d aaaa
# 同样功能,使用时间戳
python binlog2sql.py -h127.0.0.1 -P3306 -uroot -p'root' --start-file='mysqld-bin.000001' --start-datetime='2018-08-02 10:00:00' -d aaaa
ログイン後にコピー

このツールの表示結果は次のように非常にシンプルです

USE aaaa;
-- 建表
create table aaa(id int, title varchar(100));
USE aaaa;
-- 插入初始化数据
insert into aaa(id, title) values (1, '测试1');
USE aaaa;
insert into aaa(id, title) values (2, '测试2');
USE aaaa;
insert into aaa(id, title) values (3, '测试3');
USE aaaa;
-- 更新/删除
update aaa set title='修改' where id=2;
USE aaaa;
delete from aaa where id=1;
ログイン後にコピー

推奨学習:「mysql ビデオ チュートリアル

以上がMySQL で元の SQL ステートメントをすばやく表示する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:juejin.im
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!