MySQL 快速為線上運作的 Master 增加 SLAVE(設定 Replication)

已經在線上運作的 MySQL Master, 希望能在最短的時間內做 mysqldump, 然後馬上就讓他還原上線, 所以主要就是利用 --master-data, 然後短暫的 READ LOCK, mysqldump, UNLOCK 的動作, 希望把時間降到最短囉~ 🙂

註: 如果有完整的 mysql bin log 的話, 可以直接設好 replication 即可, 就會自動開始從 binlog 最前面開始抓, 連停機都不用了. 😛

操作步驟

  1. ssh master.hostname # 先設 MASTER
  2. $ mysql -u root
  3. mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'repl_password'; # 先假設 帳號 repl, 密碼 repl_password
  4. mysql> FLUSH TABLES WITH READ LOCK;
  5. 另外開一個 Terminal, ssh master.hostname # 做 mysqldump
  6. $ mysqldump -u root DATABASE_NAME --master-data > DATABASE_NAME.sql
    # 若不加 --master-data, 就需要用 show master status 來記下要組合出下述語法:
    # CHANGE MASTER TO MASTER_HOST='MASTER_HOSTNAME', MASTER_USER='repl', MASTER_PASSWORD='repl_passord', MASTER_LOG_FILE='mysql-bin.000014', MASTER_LOG_POS=232;
  7. dump 完後就離開此 Terminal, 回到剛剛的 MySQL
  8. mysql> UNLOCK TABLES;
  9. mysql> quit
  10. # 到此 MASTER 設定就算完工, 也已經恢復上線了, 再下來就是 SLAVE 囉~
  11. ssh slave.hostname
  12. $ scp master.hostname:DATABASE_NAME.sql
  13. $ mysql -u root
  14. mysql> CREATE DATABASE DATABASE_NAME;
  15. mysql> use DATABASE_NAME;
  16. mysql> source DATABASE_NAME.sql;
    # 因為上述有加入 --master-data 的命令, 所以 CHANGE MASTER 等, 已經有自動加在檔案的開頭, 不過此 CHANGE MASTER 並沒有寫 MASTER 主機的資訊, 所以可於下述 /etc/my.cnf 設定, 或者去修改 DATABASE_NAME.sql, 將 CHANGE MASTER 加入主機資訊. (在此採用修改 /etc/my.cnf 的作法)
  17. mysql> quit
  18. $ vim /etc/my.cnf

    log-bin=mysql-bin
    server-id   = 3
    master-host     =   MASTER_DB.HOSTNAME
    master-user     =   repl
    master-password =   repl_password
    master-port     =  3306

  19. $ sudo /usr/local/etc/rc.d/mysql-server restart # BSD 預設路徑
  20. $ mysql -u root
  21. mysql> start slave;
  22. mysql> show slave status \G

會看到若 MASTER 有增加資料, Exec_Master_Log_Pos 這個值就會跟著增加. (Exec_Master_Log_Pos: 執行 MASTER LOG 的 POSITION), 在此任何 MASTER 的 新增/修改 都應該會自動 replication 過來 SLAVE 囉~ (中間中斷的時間, 資料也會自動補上, 因為 --master-data 已經將當時的 POSITION 記下來了, 只要倒回去, 就會自動將資料補回來)

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

在〈MySQL 快速為線上運作的 Master 增加 SLAVE(設定 Replication)〉中有 5 則留言

  1. 請問一下大大
    假設我的DB A 在下午兩點 dump並匯入DB B
    那我的DB B可以從DB A下午一點的log開始replicative嗎?

    我記得同步機制是
    IOthread從master抓log並寫入本機的relaylog
    而SQLthread會將本機的relaylog寫入DB裡

    那DB B的relay log是否可以從新抓取更早之前的log檔呢?

    1. 我會用set global sql_slave_skip_counter=1跳過重複的sql
      確保資料齊全
      因為某些狀況 db不能被鎖定
      感謝您 😀

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料