Mysql

執行 mysql 轉儲文件會觸發複製嗎?

  • March 11, 2022

我有兩台伺服器A,並且B設置了源/副本複制。我需要從另一台伺服器帶來一個新數據庫,比如 server C。如果我創建它的轉儲文件,然後在 server 上執行轉儲文件A,所有這些相同的語句也會在 server 上執行B嗎?

我假設由於轉儲文件只是一堆 SQL 語句,這些命令也將在我的從屬伺服器上執行,但要確保我不會破壞複製過程。

我只是在此處引用 MySQL (8.0) 文件,因此您可能要等到有更好理解的人出現。就是說,這裡…

MySQL 參考資料

MySQL 文件中有一節專門介紹17.5.1 Replication Features and Issues。它包含有關複製內容的各個部分。其中兩個有趣的部分是:

17.5.1.6 CREATE … IF NOT EXISTS 語句的複制(MySQL Docs)

上述文件指出:

MySQL 在複製各種 CREATE … IF NOT EXISTS 語句時應用這些規則:

  • 每個 CREATE DATABASE IF NOT EXISTS 語句都會被複製,無論數據庫是否已經存在於源上。
  • 同樣,每個沒有 SELECT 的 CREATE TABLE IF NOT EXISTS 語句都會被複製,無論源上是否已經存在該表。這包括 CREATE TABLE IF NOT EXISTS … LIKE。CREATE TABLE IF NOT EXISTS … SELECT 的複制遵循一些不同的規則;有關更多資訊,請參閱第 17.5.1.7 節,“CREATE TABLE … SELECT 語句的複制”。
  • CREATE EVENT IF NOT EXISTS 總是被複製,無論語句中指定的事件是否已經存在於源上。
  • CREATE USER 僅在成功時才會寫入二進制日誌。如果語句包含 IF NOT EXISTS,則認為成功,只要創建了至少一個在語句中命名的使用者,就會被記錄;在這種情況下,該聲明被記錄為書面;這包括對未創建的現有使用者的引用。有關詳細資訊,請參閱創建使用者二進制日誌記錄。
  • (MySQL 8.0.29 及更高版本:) CREATE PROCEDURE IF NOT EXISTS、CREATE FUNCTION IF NOT EXISTS 或 CREATE TRIGGER IF NOT EXISTS,如果成功,則將其全部寫入二進制日誌(包括 IF NOT EXISTS 子句),無論是否該語句是否由於對象(過程、函式或觸發器)已經存在而引發警告。

17.5.1.7 CREATE TABLE … SELECT 語句的複制(MySQL Docs)

上述部分指出:

MySQL 在 CREATE TABLE … SELECT 語句被複製時應用這些規則:

  • CREATE TABLE … SELECT 總是執行隱式送出(第 13.3.3 節,“導致隱式送出的語句”)。

+ 如果目標表不存在,日誌記錄如下。IF NOT EXISTS 是否存在並不重要。 + STATEMENT 或 MIXED 格式:語句以書面形式記錄。 + ROW 格式:該語句記錄為 CREATE TABLE 語句,後跟一系列插入行事件。

在 MySQL 8.0.21 之前,該語句被記錄為兩個事務。從 MySQL 8.0.21 開始,在支持 atomic DDL 的儲存引擎上,它被記錄為一個事務。有關更多資訊,請參閱第 13.1.1 節,“原子數據定義語句支持”。

  • 如果 CREATE TABLE … SELECT 語句失敗,則不會記錄任何內容。這包括目標表存在且未給出 IF NOT EXISTS 的情況。
  • 如果目標表存在並且給出了 IF NOT EXISTS,則 MySQL 8.0 完全忽略該語句;沒有插入或記錄任何內容。MySQL 8.0 不允許 CREATE TABLE … SELECT 語句對該語句創建的表以外的表進行任何更改。

另請注意有關複製的措辭變化。MySQL 已切換到非種族主義副本條款。

基於 MariaDB 評論的附加資訊

DML 和 DDL 的複制也在 MariaDB 中複製。以下文件包含相關資訊部分。

複製概述(MariaDB 文件)

複製中使用的主要機制是二進制日誌。如果啟用了二進制日誌記錄,則對數據庫的所有更新(****數據操作數據定義)都將作為二進制日誌事件寫入二進制日誌。> 副本從每個主節點讀取二進制日誌,以便訪問要複製的數據。在副本上創建中繼日誌,使用與二進制日誌相同的格式,用於執行複制。不再需要時刪除舊的中繼日誌文件。

回答你的問題

執行 mysql 轉儲文件會觸發複製嗎?

如果您的轉儲文件包含一個/相應的語句/s,那麼它將被執行,然後從(MySQL)/(MariaDB) 複製到副本,假設您使用的是目前版本的 MySQL/MariaDB。

基於 MySQL 和 MariaDB 的版本及其兼容性,存在一些限制。因此,如果您在這些系統之間進行複制,請查看Replication Compatibility (MariaDB Docs)。

引用自:https://dba.stackexchange.com/questions/308591