不停止 MySQL 服務增加從庫的兩種方式

jopen 9年前發布 | 14K 次閱讀 MySQL 數據庫服務器

現在生產環境MySQL數據庫是一主一從,由于業務量訪問不斷增大,故再增加一臺從庫。前提是不能影響線上業務使用,也就是說不能重啟MySQL服務,為了避免出現其他情況,選擇在網站訪問量低峰期時間段操作。

 一般在線增加從庫有兩種方式,一種是通過mysqldump備份主庫,恢復到從庫,mysqldump是邏輯備份,數據量大時,備份速度會很慢,鎖表的時間也會很長。另一種是通過xtrabackup工具備份主庫,恢復到從庫,xtrabackup是物理備份,備份速度快,不鎖表。為什么不鎖表?因為自身會監控主庫日志,如果有更新的數據,就會先寫到一個文件中,然后再回歸到備份文件中,從而保持數據一致性。

不停止 MySQL 服務增加從庫的兩種方式

服務器信息:

  • 主庫:192.168.18.212(原有)
  • 從庫1:192.168.18.213(原有)
  • 從庫2:192.168.18.214(新增)
  • 數據庫版本:MySQL5.5
  • 存儲引擎:Innodb
  • 測試庫名:weibo
  • </ul>

    一、mysqldump方式

    MySQL主從是基于binlog日志,所以在安裝好數據庫后就要開啟binlog。這樣好處是,一方面可以用binlog恢復數據庫,另一方面可以為主從做準備。

    原有主庫配置參數如下:

    # vi my.cnf
    server-id = 1             #id要唯一
    log-bin = mysql-bin         #開啟binlog日志
    auto-increment-increment = 1   #在Ubuntu系統中MySQL5.5以后已經默認是1
    auto-increment-offset = 1 
    slave-skip-errors = all      #跳過主從復制出現的錯誤

    1. 主庫創建同步賬號

    mysql> grant all on *.* to 'sync'@'192.168.18.%' identified by 'sync';

    2. 從庫配置MySQL

    # vi my.cnf
    server-id = 3             #這個設置3
    log-bin = mysql-bin         #開啟binlog日志
    auto-increment-increment = 1   #這兩個參數在Ubuntu系統中MySQL5.5以后都已經默認是1
    auto-increment-offset = 1 
    slave-skip-errors = all      #跳過主從復制出現的錯誤

    3. 備份主庫

    # mysqldump -uroot -p123 --routines --single_transaction --master-data=2 --databases weibo > weibo.sql

    參數說明:

    --routines:導出存儲過程和函數

    --single_transaction:導出開始時設置事務隔離狀態,并使用一致性快照開始事務,然后unlock tables;而lock-tables是鎖住一張表不能寫操作,直到dump完畢。

    --master-data:默認等于1,將dump起始(change master to)binlog點和pos值寫到結果中,等于2是將change master to寫到結果中并注釋。

    4. 把備份庫拷貝到從庫

    # scp weibo.sql root@192.168.18.214:/home/root

    5. 在主庫創建test_tb表,模擬數據庫新增數據,weibo.sql是沒有的

    mysql> create table test_tb(id int,name varchar(30));

    6. 從庫導入備份庫

    # mysql -uroot -p123 -e 'create database weibo;'

    mysql -uroot -p123 weibo < weibo.sql</pre>

    7. 在備份文件weibo.sql查看binlog和pos值

    # head -25 weibo.sql
    -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107;   #大概22行

    8. 從庫設置從這個日志點同步,并啟動

    mysql> change master to master_host='192.168.18.212',
        -> master_user='sync',
        -> master_password='sync',
        -> master_log_file='mysql-bin.000001',
        -> master_log_pos=107;
    mysql> start slave;

    mysql> show slave status\G; ERROR 2006 (HY000): MySQL server has gone away No connection. Trying to reconnect... Connection id: 90 Current database: NONE *** 1. row *** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.18.212 Master_User: sync Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 358 Relay_Log_File: mysqld-relay-bin.000003 Relay_Log_Pos: 504 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes ......</pre>

    9. 從庫查看weibo庫里面的表

    可以看到IO和SQL線程均為YES,說明主從配置成功。

    mysql> show tables;
    +---------------------------+
    | Tables_in_weibo           |
    +---------------------------+
    | test_tb                   |

    發現剛才模擬創建的test_tb表已經同步過來!

    二、xtrabackup方式(推薦)

    在上面配置基礎上做實驗,先刪除掉從庫配置:

    mysql> stop slave;         #停止同步
    mysql> reset slave;        #清除從連接信息
    mysql> show slave status\G;   #再查看從狀態,可以看到IO和SQL線程都為NO
    mysql> drop database weibo;   #刪除weibo庫

    此時,從庫現在和新裝的一樣,繼續前進!

    1. 主庫使用xtrabackup備份

    # innobackupex --user=root --password=123 ./

    生成一個以時間為命名的備份目錄:2015-07-01_16-49-43

    # ll 2015-07-01_16-49-43/
    total 18480
    drwxr-xr-x 5 root root     4096 Jul  1 16:49 ./
    drwx------ 4 root root     4096 Jul  1 16:49 ../
    -rw-r--r-- 1 root root      188 Jul  1 16:49 backup-my.cnf
    -rw-r----- 1 root root 18874368 Jul  1 16:49 ibdata1
    drwxr-xr-x 2 root root     4096 Jul  1 16:49 mysql/
    drwxr-xr-x 2 root root     4096 Jul  1 16:49 performance_schema/
    drwxr-xr-x 2 root root    12288 Jul  1 16:49 weibo/
    -rw-r--r-- 1 root root       21 Jul  1 16:49 xtrabackup_binlog_info
    -rw-r----- 1 root root       89 Jul  1 16:49 xtrabackup_checkpoints
    -rw-r--r-- 1 root root      563 Jul  1 16:49 xtrabackup_info
    -rw-r----- 1 root root     2560 Jul  1 16:49 xtrabackup_logfile

    2. 把備份目錄拷貝到從庫上

    # scp -r 2015-07-01_16-49-43 root@192.168.18.214:/home/root

    3. 從庫上把MySQL服務停掉,刪除datadir目錄,將備份目錄重命名為datadir目錄

    # sudo rm -rf /var/lib/mysql/

    sudo mv 2015-07-01_16-49-43/ /var/lib/mysql

    sudo chown mysql.mysql -R /var/lib/mysql

    sudo /etc/init.d/mysql start

    ps -ef |grep mysql #查看已經正常啟動

    mysql 8832 1 0 16:55 ? 00:00:00 /usr/sbin/mysqld</pre>

    4. 在主庫創建test_tb2表,模擬數據庫新增數據

    mysql> create table test_tb2(id int,name varchar(30));

    5. 從備份目錄中xtrabackup_info文件獲取到binlog和pos位置

    # cat /var/lib/mysql/xtrabackup_info 
    uuid = 201af9db-1fce-11e5-96b0-525400e4239d
    name = 
    tool_name = innobackupex
    tool_command = --user=root --password=... ./
    tool_version = 1.5.1-xtrabackup
    ibbackup_version = xtrabackup version 2.2.11 based on MySQL server 5.6.24 Linux (x86_64) (revision id: )
    server_version = 5.5.43-0ubuntu0.12.04.1-log
    start_time = 2015-07-01 16:49:43
    end_time = 2015-07-01 16:49:46
    lock_time = 1
    binlog_pos = filename 'mysql-bin.000001', position 429    #這個位置
    innodb_from_lsn = 0
    innodb_to_lsn = 1598188
    partial = N
    incremental = N
    format = file
    compact = N
    compressed = N

    6. 從庫設置從這個日志點同步,并啟動

    mysql> change master to master_host='192.168.18.212',
        -> master_user='sync',
        -> master_password='sync',
        -> master_log_file='mysql-bin.000001',
        -> master_log_pos=429;
    mysql> start slave;

    mysql> show slave status\G; *** 1. row *** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.18.212 Master_User: sync Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 539 Relay_Log_File: mysqld-relay-bin.000002 Relay_Log_Pos: 363 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes ......</pre>

    7. 從庫查看weibo庫里面的表

    可以看到IO和SQL線程均為YES,說明主從配置成功。

    mysql> show tables;
    +---------------------------+
    | Tables_in_weibo           |
    +---------------------------+
    | test_tb                   |
    | test_tb2                  |

    發現剛才模擬創建的test_tb2表已經同步過來。

    來源: http://lizhenliang.blog.51cto.com/7876557/1669829

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!