1. 程式人生 > >MySQL 基於主主備份

MySQL 基於主主備份

mysql

在兩個服務器上都要開啟二進制日誌和中繼日誌

如果兩個服務器的數據庫id啟動自動增長功能,要在配置文件中設置一個的id為奇數,另外一個的id為偶數,或者一個的id為偶數,另外一個的id為奇數,因為如果不這樣設置,有可能兩個服務器上同時都有用戶在寫的時候會產生相同的id號造成沖突,所以一般情況下不建議數據庫的id號啟用自動增長功能,或者用id生成器進行生成。

一、環境說明:

IP

主機名

數據庫名

連接用戶

密碼

192.168.47.179

Mariadb01

retail

server01

server01

192.168.47.178

Mariadb02

retail

server02

server02

二、搭建步驟

2.1 創建數據的連接用戶

Mariadb01上面創建連接用戶server01,並且只能通過192.168.47.178進行連接;

腳本:mariadb[none]> GRANT REPLICATION SLAVE ON*.* TO‘server01‘@‘192.168.47.178‘ IDENTIFIED BY ‘server01‘;

Mariadb02上面創建連接用戶server02,並且只能通過192.168.47.149進行連接;

腳本:mariadb[none]> GRANT REPLICATION SLAVE ON*.* TO‘server02‘@‘192.168.47.179‘IDENTIFIED BY ‘server02‘;

mariadb[none]> select user,password,host from mysql.user; ---查看一下是否有授權的用戶用於主從復制

2.2 修改mysql的參數文件

修改Mariadb01的參數文件,在MySQL的主配置文件默認為/etc/my.cnf,修改/添加如下內容

[mysql]

skip_name_resolve = on
innodb_file_per_table = on
max_connections = 20000
log_bin = bin-log ---開啟二級制日誌
relay_log = relay-log ---開啟中繼日誌
server_id = 1
auto_increment_offset = 1 ---表示id號從1開始

auto_increment_increment = 2 ---表示以2為步進,即為奇數

修改之後,重啟msyql生效:servicemysqld restart

修改Mariadb02的參數文件,在MySQL的主配置文件默認為/etc/my.cnf,修改/添加如下內容

[mysql]
skip_name_resolve = on
innodb_file_per_table = on
max_connections = 20000
server_id = 2
relay_log = relay-log
log_bin = bin-log
auto_increment_offset = 2
auto_increment_increment = 2

參數說明:

a、server_id數據庫的進行數據同步的時候用於標識該語句最初是從哪個server寫入的,在進行主主或主從的搭建中,都需要填寫;

b、auto_increment_increment:在數據庫應用,我們經常要用到唯一編號,以標識記錄。在MySQL中可通過數據列的AUTO_INCREMENT屬性來自動生成。為避免兩臺主數據庫生成的編碼重復了,所以需要設置該值

2.3復制其中的一臺服務器的數據庫到另外一臺服務器

因為環境是全新搭建的,所以兩個的環境都是一樣的,並需要進行數據的初始化工作;

需要的話可以通過以下步驟進行操作,以Mariadb01為源數據庫進行同步,如下操作:

2.3.1.鎖定Mariadb01數據庫,查看狀態

mariadb[none]> FLUSH TABLES WITH READ LOCK;

Query OK, 0 rows affected(0.00 sec)

mariadb[none]> SHOW MASTER STATUS;

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

| File | Position |Binlog_Do_DB | Binlog_Ignore_DB |

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

| mysql-bin.000008 | 107| | |

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

1 row in set (0.00 sec)

顯示源數據庫處於8號binlog的107位置;

2.3.2.備份數據庫

[root@Mariadb01~]# mysqldump--all-databases --lock-tables --flush-logs> /tmp/retail.sql

[root@Mariadb01 ~]# scp /tmp/retail.sql 192.168.47.178:/tmp/

2.3.3.在mysql02暫停二進制日誌, 進行導入操作;

mariadb[none]< set @@session.sql_log_bin=0;

[root@Mariadb02 ~]# < /tmp/retail.sql#導入retail數據庫

mariadb[none]< set @@session.sql_log_bin=1;

mariadb[none]> FLUSH TABLES WITH READ LOCK;

2.4.鎖定mysql02數據庫並查看狀態

mysql> SHOW MASTERSTATUS;

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

| File | Position |Binlog_Do_DB | Binlog_Ignore_DB |

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

| mysql-bin.000009 | 107| | |

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

1 row in set (0.00 sec)

顯示備份文件位於9號binlog的107位置;

2.5 進行主主的通信連接;

a、在Mariadb01上面進行用戶和binlog的確認

mysql> CHANGE MASTERTOMASTER_HOST=‘192.168.47.178‘,MASTER_USER=‘server02‘,MASTER_PASSWORD=‘server02‘,MASTER_LOG_FILE=‘mysql-bin.000008‘,MASTER_LOG_POS=107;

mysql>start slave;

mysql> showslave status\G

b、在Mariadb02上面進行用戶和binlog的確認

mysql> CHANGE MASTERTOMASTER_HOST=‘192.168.47.179‘,MASTER_USER=‘server01‘,MASTER_PASSWORD=‘server01‘,MASTER_LOG_FILE=‘mysql-bin.000009‘,MASTER_LOG_POS=107;

mysql>start slave;

mysql> showslave status\G

主要這兩項:

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

分別解鎖Mariadb01Mariadb02數據庫

mariadb[none]> UNLOCK TABLES;

測試

在mysql01寫入在mysql02上有顯示

在mysql02寫入在mysql01上有顯示

復制時應該註意的問題:

1、從服務設定為“只讀”:在從服務器啟動read_only,但僅對非SUPER權限的用戶有效;

要想阻止所有用戶可以申請一個全局讀鎖:mysql>FLUSH TABLES WITH READ LOCK;

2、盡量確保復制時的事務安全

在master節點啟用參數:sync_binlog=ON,表示只要當前節點有事物提交時就立即從內存緩沖區保存到二進制日誌中,避免從服務器復制時二進制日誌中沒有這個提交操作主服務器就壞了,這樣從服務器就不知道這個事物該不該提交了

如果用到的是InnoDB存儲引擎:

innodb_flush_logs_at_trx_commit=ON ---每當事物提交時就同步到事物日誌中

innodb_support_xa=ON 讓innodb支持分布式事物

3、從服務器意外中止時盡量避免自動啟動復制線程,假如從服務器在復制一個事件的時候復制到一半的時候從服務器意外終止了,如果重新啟動,復制功能實是會自動開啟的,因為在/var/lib/mysql/master.info文件中記錄了連接到主服務器的信息,所以啟動mariadb服務時會自動啟動復制線程,這樣就會造成問題,因為終止前的事物復制到一半,不知道該不該提交,為了避免這種事情發生,我們要把網斷掉,查看一下是否有復制到一半的事物,如果有手動刪除,然後手動加changemaster to 指向意外終止時主服務器二進制日誌的位置,或者重新備份恢復後啟動復制功能

4、從節點:設置參數

sync_master_info=ON

sync_relay_log_info=ON


本文出自 “13147015” 博客,請務必保留此出處http://13157015.blog.51cto.com/13147015/1981101

MySQL 基於主主備份