Rumah > Artikel > pangkalan data > Bagaimana dengan cepat melihat pernyataan SQL asal dalam MySQL
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!