Rumah  >  Artikel  >  pangkalan data  >  Bagaimana dengan cepat melihat pernyataan SQL asal dalam MySQL

Bagaimana dengan cepat melihat pernyataan SQL asal dalam MySQL

藏色散人
藏色散人ke hadapan
2021-11-09 16:13:212405semak imbas

Latar Belakang

Dalam proses menyelidik projek warisan baru-baru ini, untuk menentukan jadual pangkalan data yang diubah suai untuk operasi perniagaan tertentu, kami memutuskan untuk melihat penyata SQL yang direkodkan dalam binlog itu. Saya sentiasa tahu bahawa MySQL mempunyai banyak alat penghuraian binlog, tetapi saya tidak pernah menggunakannya sebelum ini. Hari ini saya akan merekodkan prosesnya.

Kali ini, selain menggunakan alat penghuraian rasmi, kami juga menggunakan alat sumber terbuka pihak ketiga.

Persediaan

Dayakan binlog

Mula-mula pastikan pelayan MySQL telah binlog didayakan, ini dalam my. cnf fail dikonfigurasikan dalam.

cat /etc/my.cnf

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

Rekod kedudukan log semasa

Untuk memudahkan ujian seterusnya, kami mula-mula merekodkan beberapa maklumat yang berkaitan tentang log MySQL.

-- Sahkan bahawa log telah didayakan dengan betul Anda juga boleh melihat laluan khusus fail log di sini

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

-- Rekod nama fail dan kedudukan mengimbangi semasa. log, dan semak proses log kemudian Anda boleh mencari dengan tepat

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

-- Anda juga boleh melihat log dengan menyatakan masa mula, jadi juga merekodkan masa semasa

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

Laksanakan DDL

Laksanakan pernyataan berikut dalam pustaka ujian Matlamat akhir kami adalah untuk memulihkan kenyataan ini dengan melihat binlog.

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

Lihat binlog

Alat rasmi mysqlbinlog

Alat analisis rasmi sangat mudah digunakan, tetapi analisis Keputusan tidak boleh dibaca. Kami menggunakan parameter no-defaults semasa panggilan untuk mengelakkan ralat 'default-character-set=utf8' pembolehubah yang tidak diketahui.

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

Hasil paparan mysqlbinlog tidak boleh dibaca Berikut adalah petikan anda boleh melihat bahawa selain penyataan DDL yang kami laksanakan direkodkan, maklumat kontekstual lain juga direkodkan.

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

Alat pihak ketiga binlog2sql

Terdapat banyak alatan sumber terbuka untuk binlog Kami menemui binlog2sql selepas mencari Google. Ia menyediakan lebih banyak fungsi daripada yang rasmi Menurut pilihan yang berbeza, anda boleh mendapatkan SQL asal, SQL balik, INSERT SQL dengan kunci utama dialih keluar, dsb. Kali ini kami hanya menggunakannya untuk melihat DDL yang dilaksanakan Untuk penggunaan yang lebih lanjut, sila rujuk dokumentasi rasmi bahasa Cina.

Alat ini dibangunkan berdasarkan Python (2.7, 3.4), jadi pasangkan kebergantungan yang berkaitan terlebih dahulu mengikut manual

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

Kaedah penggunaan adalah serupa dengan alat rasmi, memberikan offset kedudukan atau masa mula untuk kedudukan yang tepat. Jika tiada maklumat lokasi diberikan, semua maklumat akan dipaparkan dari awal.

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

Hasil paparan alat ini sangat mudah, seperti berikut

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;

Pembelajaran yang disyorkan: "tutorial video mysql"

Atas ialah kandungan terperinci Bagaimana dengan cepat melihat pernyataan SQL asal dalam MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:juejin.im. Jika ada pelanggaran, sila hubungi admin@php.cn Padam