Heim  >  Artikel  >  Datenbank  >  So zeigen Sie schnell die ursprüngliche SQL-Anweisung in MySQL an

So zeigen Sie schnell die ursprüngliche SQL-Anweisung in MySQL an

藏色散人
藏色散人nach vorne
2021-11-09 16:13:212432Durchsuche

Hintergrund

Bei der kürzlich durchgeführten Recherche zu einem Legacy-Projekt haben wir beschlossen, die im Binlog aufgezeichneten SQL-Anweisungen einzusehen, um festzustellen, welche Datenbanktabellen für einen bestimmten Geschäftsvorgang geändert wurden. Ich wusste immer, dass MySQL über viele Binlog-Analysetools verfügt, aber ich habe sie noch nie verwendet. Heute werde ich den Prozess aufzeichnen.

Dieses Mal haben wir zusätzlich zum offiziellen Parsing-Tool auch ein Open-Source-Tool eines Drittanbieters verwendet.

Vorbereitung

Binlog aktivieren

Stellen Sie zunächst sicher, dass auf dem MySQL-Server Binlog aktiviert ist. Dies ist in der Datei my.cnf konfiguriert.

cat /etc/my.cnf

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

Zeichnen Sie die aktuelle Protokollposition auf

Um spätere Tests zu erleichtern, zeichnen wir zunächst einige relevante Informationen des MySQL-Protokolls auf.

-- Bestätigen Sie, dass das Protokoll korrekt aktiviert wurde. Sie können hier auch den spezifischen Pfad der Protokolldatei anzeigen

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                              |
+---------------------------------+---------------------------------+

-- Notieren Sie sich den Dateinamen und die Offset-Position des aktuellen Protokolls, damit Sie es währenddessen genau lokalisieren können Anschließende Protokollanzeige

mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| mysqld-bin.000001 |     2425 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+

-- Sie können das Protokoll auch anzeigen, indem Sie die Startzeit angeben, also auch die aktuelle Zeit aufzeichnen

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2018-08-02 09:59:43 |
+---------------------+

DDL ausführen

Führen Sie schließlich die folgenden Anweisungen in der Testbibliothek aus Stellen Sie diesen Teil der Anweisungen wieder her, indem Sie das Binlog anzeigen.

-- 建表
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;

Binlog anzeigen

Offizielles Tool mysqlbinlog

Das bereitgestellte offizielle Parsing-Tool ist sehr einfach zu verwenden, aber die Lesbarkeit der analysierten Ergebnisse ist nicht gut. Wir haben während des Aufrufs den Parameter no-defaults verwendet, um Fehler durch unbekannte Variablen „default-character-set=utf8“ zu vermeiden.

mysqlbinlog --no-defaults  /var/lib/mysql/mysqld-bin.000001 --start-position=2425

Die Anzeigeergebnisse von mysqlbinlog sind nicht lesbar. Hier ist ein Auszug. Sie können sehen, dass zusätzlich zu den von uns ausgeführten DDL-Anweisungen auch andere Kontextinformationen aufgezeichnet werden.

# 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')
/*!*/;

Drittanbieter-Tools binlog2sql

Es gibt viele Open-Source-Tools für binlog. Nach der Suche bei Google haben wir binlog2sql gefunden. Es bietet mehr Funktionen als das offizielle. Je nach Option können Sie Original-SQL, Rollback-SQL, INSERT-SQL mit entferntem Primärschlüssel usw. erhalten. Dieses Mal verwenden wir es nur, um die ausgeführte DDL anzuzeigen. Für eine erweiterte Verwendung lesen Sie bitte die offizielle chinesische Dokumentation.

Dieses Tool wurde auf Basis von Python (2.7+, 3.4+) entwickelt. Installieren Sie daher zuerst die relevanten Abhängigkeiten gemäß dem Handbuch. Wenn keine Standortinformationen angegeben werden, werden alle Informationen von Anfang an angezeigt.

git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql
pip install -r requirements.txt

Die Anzeigeergebnisse dieses Tools sind sehr einfach, wie folgt:

# 使用偏移位置
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

Empfehlen Sie das Lernen: „

MySQL-Video-Tutorial

Das obige ist der detaillierte Inhalt vonSo zeigen Sie schnell die ursprüngliche SQL-Anweisung in MySQL an. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.im. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen