MySQL VỚI_SSL

CHÚ Ý. Kho lưu trữ này không còn được duy trì. Tôi khuyên bạn nên chuyển sang osheroff/mysql-binlog-connector-java

Trình kết nối Nhật ký nhị phân MySQL

Ban đầu, dự án được bắt đầu như một nhánh của open-replicator, nhưng cuối cùng lại được viết lại hoàn toàn. Sự khác biệt / tính năng chính

  • tên/vị trí tệp binlog tự động. độ phân giải GTID
  • nối lại ngắt kết nối
  • chiến lược chuyển đổi dự phòng có thể cắm
  • binlog_checksum=Hỗ trợ CRC32 (dành cho MySQL 5. 6. hơn 2 người dùng)
  • liên lạc an toàn qua TLS
  • thân thiện với JMX
  • số liệu thống kê thời gian thực
  • sẵn có trong Maven Central
  • không có sự phụ thuộc của bên thứ ba
  • bộ thử nghiệm trên các phiên bản khác nhau của bản phát hành MySQL

Nếu bạn đang tìm kiếm thứ gì đó tương tự trong các ngôn ngữ khác - hãy xem siddontang/go-mysql (Go), noplay/python-mysql-replication (Python)

Cách sử dụng

Nhận (các) JAR mới nhất từ ​​đây. Ngoài ra, bạn có thể bao gồm phần phụ thuộc Maven sau (có sẵn thông qua Maven Central)

<dependency>
    <groupId>com.github.shyikogroupId>
    <artifactId>mysql-binlog-connector-javaartifactId>
    <version>0.21.0version>
dependency>

Đọc tệp nhật ký nhị phân

File binlogFile = ...
EventDeserializer eventDeserializer = new EventDeserializer();
eventDeserializer.setCompatibilityMode(
    EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG,
    EventDeserializer.CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY
);
BinaryLogFileReader reader = new BinaryLogFileReader(binlogFile, eventDeserializer);
try {
    for (Event event; (event = reader.readEvent()) != null; ) {
        ...
    }
} finally {
    reader.close();
}

Khai thác vào luồng sao chép MySQL

điều kiện tiên quyết. Bất kỳ người dùng nào bạn định sử dụng cho BinaryLogClient, người đó PHẢI có đặc quyền REPLICATION Slave. Trừ khi bạn tự chỉ định binlogFilename/binlogPosition (trong trường hợp đó, độ phân giải tự động sẽ không hoạt động), bạn cũng cần được cấp REPLICATION CLIENT

BinaryLogClient client = new BinaryLogClient("hostname", 3306, "username", "password");
EventDeserializer eventDeserializer = new EventDeserializer();
eventDeserializer.setCompatibilityMode(
    EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG,
    EventDeserializer.CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY
);
client.setEventDeserializer(eventDeserializer);
client.registerEventListener(new EventListener() {

    @Override
    public void onEvent(Event event) {
        ...
    }
});
client.connect();

Bạn có thể đăng ký một người nghe cho

File binlogFile = ...
EventDeserializer eventDeserializer = new EventDeserializer();
eventDeserializer.setCompatibilityMode(
    EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG,
    EventDeserializer.CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY
);
BinaryLogFileReader reader = new BinaryLogFileReader(binlogFile, eventDeserializer);
try {
    for (Event event; (event = reader.readEvent()) != null; ) {
        ...
    }
} finally {
    reader.close();
}
8 /
File binlogFile = ...
EventDeserializer eventDeserializer = new EventDeserializer();
eventDeserializer.setCompatibilityMode(
    EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG,
    EventDeserializer.CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY
);
BinaryLogFileReader reader = new BinaryLogFileReader(binlogFile, eventDeserializer);
try {
    for (Event event; (event = reader.readEvent()) != null; ) {
        ...
    }
} finally {
    reader.close();
}
9 /
File binlogFile = ...
EventDeserializer eventDeserializer = new EventDeserializer();
eventDeserializer.setCompatibilityMode(
    EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG,
    EventDeserializer.CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY
);
BinaryLogFileReader reader = new BinaryLogFileReader(binlogFile, eventDeserializer);
try {
    for (Event event; (event = reader.readEvent()) != null; ) {
        ...
    }
} finally {
    reader.close();
}
0 /
File binlogFile = ...
EventDeserializer eventDeserializer = new EventDeserializer();
eventDeserializer.setCompatibilityMode(
    EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG,
    EventDeserializer.CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY
);
BinaryLogFileReader reader = new BinaryLogFileReader(binlogFile, eventDeserializer);
try {
    for (Event event; (event = reader.readEvent()) != null; ) {
        ...
    }
} finally {
    reader.close();
}
1 bằng cách sử dụng
File binlogFile = ...
EventDeserializer eventDeserializer = new EventDeserializer();
eventDeserializer.setCompatibilityMode(
    EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG,
    EventDeserializer.CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY
);
BinaryLogFileReader reader = new BinaryLogFileReader(binlogFile, eventDeserializer);
try {
    for (Event event; (event = reader.readEvent()) != null; ) {
        ...
    }
} finally {
    reader.close();
}
2

Theo mặc định, BinaryLogClient bắt đầu từ vị trí binlog chính hiện tại (tại thời điểm kết nối). Nếu bạn muốn bắt đầu từ một tên tệp hoặc vị trí cụ thể, hãy sử dụng

File binlogFile = ...
EventDeserializer eventDeserializer = new EventDeserializer();
eventDeserializer.setCompatibilityMode(
    EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG,
    EventDeserializer.CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY
);
BinaryLogFileReader reader = new BinaryLogFileReader(binlogFile, eventDeserializer);
try {
    for (Event event; (event = reader.readEvent()) != null; ) {
        ...
    }
} finally {
    reader.close();
}
3 +
File binlogFile = ...
EventDeserializer eventDeserializer = new EventDeserializer();
eventDeserializer.setCompatibilityMode(
    EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG,
    EventDeserializer.CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY
);
BinaryLogFileReader reader = new BinaryLogFileReader(binlogFile, eventDeserializer);
try {
    for (Event event; (event = reader.readEvent()) != null; ) {
        ...
    }
} finally {
    reader.close();
}
4

File binlogFile = ...
EventDeserializer eventDeserializer = new EventDeserializer();
eventDeserializer.setCompatibilityMode(
    EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG,
    EventDeserializer.CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY
);
BinaryLogFileReader reader = new BinaryLogFileReader(binlogFile, eventDeserializer);
try {
    for (Event event; (event = reader.readEvent()) != null; ) {
        ...
    }
} finally {
    reader.close();
}
5 đang chặn (có nghĩa là khách hàng sẽ lắng nghe các sự kiện trong chuỗi hiện tại). Mặt khác,
File binlogFile = ...
EventDeserializer eventDeserializer = new EventDeserializer();
eventDeserializer.setCompatibilityMode(
    EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG,
    EventDeserializer.CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY
);
BinaryLogFileReader reader = new BinaryLogFileReader(binlogFile, eventDeserializer);
try {
    for (Event event; (event = reader.readEvent()) != null; ) {
        ...
    }
} finally {
    reader.close();
}
6 sinh ra một chủ đề riêng biệt

Kiểm soát quá trình deserialization sự kiện

Bạn có thể cần nó vì nhiều lý do. bạn không muốn lãng phí thời gian giải tuần tự hóa các sự kiện mà bạn sẽ không cần;

File binlogFile = ...
EventDeserializer eventDeserializer = new EventDeserializer();
eventDeserializer.setCompatibilityMode(
    EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG,
    EventDeserializer.CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY
);
BinaryLogFileReader reader = new BinaryLogFileReader(binlogFile, eventDeserializer);
try {
    for (Event event; (event = reader.readEvent()) != null; ) {
        ...
    }
} finally {
    reader.close();
}
0

Hiển thị BinaryLogClient thông qua JMX

File binlogFile = ...
EventDeserializer eventDeserializer = new EventDeserializer();
eventDeserializer.setCompatibilityMode(
    EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG,
    EventDeserializer.CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY
);
BinaryLogFileReader reader = new BinaryLogFileReader(binlogFile, eventDeserializer);
try {
    for (Event event; (event = reader.readEvent()) != null; ) {
        ...
    }
} finally {
    reader.close();
}
1

Sử dụng SSL

Được giới thiệu vào năm 0. 4. 0

TLSv1. 1 & TLSv1. 2 yêu cầu JDK 7+.
Trước MySQL 5. 7. 10, MySQL chỉ hỗ trợ TLSv1 (xem Giao thức kết nối an toàn và mật mã).

Để kiểm tra xem máy chủ MySQL có được định cấu hình đúng với hỗ trợ SSL không -

File binlogFile = ...
EventDeserializer eventDeserializer = new EventDeserializer();
eventDeserializer.setCompatibilityMode(
    EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG,
    EventDeserializer.CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY
);
BinaryLogFileReader reader = new BinaryLogFileReader(binlogFile, eventDeserializer);
try {
    for (Event event; (event = reader.readEvent()) != null; ) {
        ...
    }
} finally {
    reader.close();
}
7 ("Giá trị" phải là "CÓ"). Trạng thái của phiên hiện tại có thể được xác định bằng cách sử dụng
File binlogFile = ...
EventDeserializer eventDeserializer = new EventDeserializer();
eventDeserializer.setCompatibilityMode(
    EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG,
    EventDeserializer.CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY
);
BinaryLogFileReader reader = new BinaryLogFileReader(binlogFile, eventDeserializer);
try {
    for (Event event; (event = reader.readEvent()) != null; ) {
        ...
    }
} finally {
    reader.close();
}
8 ("SSL" không được để trống)

File binlogFile = ...
EventDeserializer eventDeserializer = new EventDeserializer();
eventDeserializer.setCompatibilityMode(
    EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG,
    EventDeserializer.CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY
);
BinaryLogFileReader reader = new BinaryLogFileReader(binlogFile, eventDeserializer);
try {
    for (Event event; (event = reader.readEvent()) != null; ) {
        ...
    }
} finally {
    reader.close();
}
4

Ghi chú thực hiện

  • dữ liệu kiểu số (tinyint, v.v.) luôn được trả về có dấu (. ) bất kể định nghĩa cột có bao gồm từ khóa "không dấu" hay không
  • dữ liệu của các loại var*/*text/*blob luôn được trả về dưới dạng một mảng byte (đối với var* điều này đúng bắt đầu từ 1. 0. 0)

Các câu hỏi thường gặp

Q. Một giao dịch điển hình trông như thế nào?

A. Sự kiện GTID (nếu gtid_mode=ON) -> QUERY sự kiện với "BEGIN" là sql ->. -> sự kiện XID. QUERY sự kiện với "CAM KẾT" hoặc "ROLLBACK" dưới dạng sql

Q. EventData cho các hàng được chèn/cập nhật/xóa không có thông tin về bảng (ngoại trừ một số id lạ). Làm thế nào để tôi có ý nghĩa từ nó?

A. Mỗi sự kiện WriteRowsEventData/UpdateRowsEventData/DeleteRowsEventData được bắt đầu bởi TableMapEventData chứa lược đồ & tên bảng. Nếu vì lý do nào đó bạn cần biết tên cột (loại, v.v.). - cách dễ nhất là

File binlogFile = ...
EventDeserializer eventDeserializer = new EventDeserializer();
eventDeserializer.setCompatibilityMode(
    EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG,
    EventDeserializer.CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY
);
BinaryLogFileReader reader = new BinaryLogFileReader(binlogFile, eventDeserializer);
try {
    for (Event event; (event = reader.readEvent()) != null; ) {
        ...
    }
} finally {
    reader.close();
}
5

(vâng, nhật ký nhị phân KHÔNG bao gồm phần thông tin đó)

Bạn có thể tìm thấy đoạn mã JDBC tại đây

Tài liệu

tổng quan về API

Có hai điểm vào - BinaryLogClient (mà bạn có thể sử dụng để đọc nhật ký nhị phân từ máy chủ MySQL) và BinaryLogFileReader (để xử lý nhật ký ngoại tuyến). Cả hai đều dựa vào EventDeserializer để giải tuần tự hóa luồng sự kiện. Mỗi Sự kiện bao gồm EventHeader (chứa trong số những thứ khác tham chiếu đến EventType) và EventData. EventDeserializer đã nói ở trên có một EventHeaderDeserializer (EventHeaderV4Deserializer theo mặc định) và một bộ sưu tập EventDataDeserializer. s. Nếu không có EventDataDeserializer được đăng ký cho một số loại Sự kiện cụ thể - EventDataDeserializer mặc định sẽ khởi động (NullEventDataDeserializer)

Hướng dẫn nội bộ MySQL

Để biết thông tin chi tiết về nội bộ của MySQL, hãy xem tại đây. Các phần Giao thức máy khách/máy chủ MySQL và Nhật ký nhị phân đặc biệt hữu ích làm tài liệu tham khảo cho các gói

File binlogFile = ...
EventDeserializer eventDeserializer = new EventDeserializer();
eventDeserializer.setCompatibilityMode(
    EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG,
    EventDeserializer.CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY
);
BinaryLogFileReader reader = new BinaryLogFileReader(binlogFile, eventDeserializer);
try {
    for (Event event; (event = reader.readEvent()) != null; ) {
        ...
    }
} finally {
    reader.close();
}
9 và
BinaryLogClient client = new BinaryLogClient("hostname", 3306, "username", "password");
EventDeserializer eventDeserializer = new EventDeserializer();
eventDeserializer.setCompatibilityMode(
    EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG,
    EventDeserializer.CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY
);
client.setEventDeserializer(eventDeserializer);
client.registerEventListener(new EventListener() {

    @Override
    public void onEvent(Event event) {
        ...
    }
});
client.connect();
0

Làm cách nào để bật have_ssl trong MySQL?

Bật SSL cho MySQL/MariaDB . Sau khi vào, hãy chạy truy vấn sau. HIỂN THỊ CÁC BIẾN NHƯ '%ssl%'; Bạn sẽ thấy rằng have_ssl là CÓ và các vị trí cho tất cả các tệp quan trọng sẽ được liệt kê.

Làm cách nào để sử dụng SSL với MySQL?

Định cấu hình kết nối SSL MySQL .
Tạo thư mục để lưu trữ các khóa SSL. Để tạo thư mục chứa khóa SSL, hãy thực hiện các bước sau. .
Tạo khóa SSL. Ghi chú. .
Chỉnh sửa cấu hình MySQL. .
Kiểm tra cấu hình SSL. .
Tạo người dùng và cho phép truy cập từ xa. .
Kiểm tra kết nối MySQL từ xa

SSL cho MySQL là gì?

Theo mặc định, MySQL được cấu hình để chỉ cho phép các kết nối từ hệ thống cục bộ. Nếu bạn muốn kết nối với máy chủ MySQL từ một hệ thống từ xa, bạn nên bảo mật nó bằng SSL/TLS. Kích hoạt SSL/TLS sẽ mã hóa dữ liệu được gửi đến và từ cơ sở dữ liệu .

Làm cách nào để kiểm tra chứng chỉ SSL trong MySQL?

GIẢI PHÁP CHÍNH THỨC THEO TRANG WEB MYSQL . CHỌN * TỪ performance_schema. session_status WHERE VARIABLE_NAME IN ('Ssl_version','Ssl_cipher'); .