天天看點

不停止 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

一、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

server-id = 3             #這個設定3 

auto-increment-increment = 1   #這兩個參數在ubuntu系統中mysql5.5以後都已經預設是1 

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 [email protected]:/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 

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 

...... 

可以看到io和sql線程均為yes,說明主從配置成功。

9. 從庫檢視weibo庫裡面的表

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 [email protected]:/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 

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. 從庫設定從這個日志點同步,并啟動

    -> master_log_pos=429; 

          read_master_log_pos: 539 

               relay_log_file: mysqld-relay-bin.000002 

                relay_log_pos: 363 

mysql> show tables; 

+---------------------------+ 

| tables_in_weibo           | 

| test_tb                   | 

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

來源:51cto