MySQL/MariaDB binlog replication client for Rust
This library is a port of my C# project. For the complete documentation refer to its page MySqlCdc
Please note the lib is WIP and currently has the following limitations:
- Supports only standard auth plugins mysql_native_password
and caching_sha2_password
.
- Currently, the library doesn't support SSL encryption.
- GTID replication is work in progress.
- Doesn't handle split packets (16MB and more).
Real-time replication client works the following way. ```rust let options = ReplicaOptions { username: String::from("root"), password: String::from("Qwertyu1"), blocking: false, sslmode: SslMode::DISABLED, binlog: BinlogOptions::fromstart(), ..Default::default() };
let client = BinlogClient::new(options);
for (header, binlogevent) in client.replicate() {
println!("{:#?}", header);
println!("{:#?}", binlogevent);
}
``
A typical transaction has the following structure.
1.
GtidEventif gtid mode is enabled.
2. One or many
TableMapEventevents.
- One or many
WriteRowsEventevents.
- One or many
UpdateRowsEventevents.
- One or many
DeleteRowsEventevents.
3.
XidEvent` indicating commit of the transaction.
It's best practice to use GTID replication with the from_gtid
method. Using the approach you can correctly perform replication failover.
Note that in GTID mode from_gtid
has the following behavior:
- from_gtid(@@gtid_purged)
acts like from_start()
- from_gtid(@@gtid_executed)
acts like from_end()
In some cases you will need to read binlog files offline from the file system.
This can be done using BinlogReader
class.
```rust
let file = File::open("mysql-bin.000001").unwrap();
let reader = BinlogReader::new(file).unwrap();
for (header, binlogevent) in reader.readevents() { println!("{:#?}", header); println!("{:#?}", binlog_event); } ```