利用 MySQL 複製聚合多個庫到同一個數據庫

由於微服務分庫導致無法跨庫(忽略 db_name.table_name 方式)統計查詢,因此利用 MySQL 主從複製的方式,將主服務器上的多個數據庫同步到從服務器上的單個數據庫上,從庫設置只讀,僅用於統計查詢。

假設主服務器上有以下數據庫:

  • db_a:
    • table_a1
    • table_a2
  • db_b:
    • table_b1
  • db_c
    • table_c1
    • table_c2

下面是簡要步驟。

首先,全量備份主庫數據,記下 MASTER_LOG_FILE='mysql-bin.000025', MASTER_LOG_POS=313352823 的值。

然後,還原備份到從庫。

主從基本配置參考:MySQL 主從配置以及 Docker 方式演練

從庫上還原完成後,假設要將 Master 上的所有表同步到 Slave 的 db_full 數據庫中。繼續下面的配置:

[mysqld]
# 其他配置
# ...

# 只讀 https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_read_only
read-only=1

# 複製配置
# 將數據庫名變成另一個,通過這種方式把不同的庫合併到一起
replicate-rewrite-db=db_a->db_full
replicate-rewrite-db=db_b->db_full
replicate-rewrite-db=db_c->db_full

# 如果想排除表,一定用改名後的數據庫名
# 例如下面
replicate-ignore-table=db_full.table_c2

# 排除以下數據庫
replicate-ignore-db=information_schema
replicate-ignore-db=mysql
replicate-ignore-db=performance_schema
replicate-ignore-db=sys

上述配置是在從庫配置,binlog 文件是全的,只是 sql 線程執行時應用上面的策略。
在主庫上可以通過 binlog-do-db=db_namebinlog-ignore-db=db_name 配置同步數據庫的信息。

在開啓從庫同步前,先在 Slave 數據庫上創建 db_full 數據庫,然後手動將其他幾個還原庫的表複製到 db_full 庫中,複製完後還原的表 db_a\b\c 都可以刪除。

在從庫上通過下面 SQL 設置同步:

-- 注意修改參數值
CHANGE MASTER TO
         MASTER_HOST='IP',
         MASTER_USER='slave',
         MASTER_PASSWORD='密碼',
		 MASTER_LOG_FILE='mysql-bin.000025', MASTER_LOG_POS=313352823;

然後通過 start slave; 開啓同步。

正常情況下,同步過來的數據都會在 db_full 數據庫中。通過這種簡單方式就實現了聚合數據庫的操作。

如果要將多個服務器上的數據同步到一個服務器的表中,可以參考 MySQL 多源複製

注意!

db_full 執行 sql 優化時,如果需要對索引進行增刪改時,要在 Master 服務器進行操作,避免在從庫(只讀)進行修改操作。

如果從庫同步出錯,可以參考: How to Repair MySQL Replication

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章