MySQL 中有一個 federated 的 table type,其實應該出來滿久了,但最近有個狀況需要用到,所以就研究,紀錄了一下。
其實這種情境還是挺多的,就是在 Production 上有一個 Master / Slave 的 DB,但為了一些報表需求,又不想吃掉,或是佔用了系統資源,可是報表計算量又特別大,所以就設計了一個這樣的方案,利用 federated 達到目的。
8dc5afa979c5708b54592dcdff47e86b.png
 
如上圖,拉一個 Read only 出來就是為了不要影響到 M/S 的效能。但 read only 就沒辦法產生一些 statistics 的 table,所以就建立另一個 reporting DB,透過 federated 的方式去把資料計算後存到 reporting 的 DB,這樣不僅不會影響到 M/S 的效能,還可以取得 near realtime 的資料庫。
  • 確認是否有啟用 federated 引擎
    用這個指令就能確認是否有啟用 FEDERATED engine 了
    show engines; 
  • 建立伺服器連線
    為了方便後面表格的建立,所以先產生一個伺服器的 alias,把帳號密碼都放進去,這樣後面件表格就會輕鬆很多
     
    CREATE SERVER readonly_db
    FOREIGN DATA WRAPPER mysql
    OPTIONS (USER 'remote_account', HOST '192.168.1.1', DATABASE 'store', PASSWORD 'passwd');
  • 建立 Federated Table 
    如果要將某個 table (shopping) 映射到 read only 那台 DB 的 shopping 的話,就只要這樣做就行
    CREATE TABLE shopping (id INT, item VARCHAR(255))
    ENGINE=FEDERATED CONNECTION='readonly_db';
    
Facebook 討論區載入中...