Mysql雙主部署mysql
解釋:sql
所謂雙主備份,其實也就是互作主從複製,每臺master既是master,又是另外一臺服務器的slave。這樣,任何一方所作的變動,都會經過複製應用到另一方的數據庫中。數據庫
要求:部署Mysql雙主複製,部署期間生產服務器可正常訪問,但沒法進行登陸/註冊/退出等涉及到對Mysql寫的操做。vim
環境:centos
系統:centos 6.7安全
mysql版本:5.6.28服務器
生產環境共2臺mysql服務器(如下對兩臺mysql分別簡稱爲A B)ide
A:192.168.1.1 (master)函數
B:192.168.1.2 (slave)工具
部署前的準備
分別檢查A、B兩臺Mysql服務器是否做爲其餘master的slave,並中止複製,以避免受到影響。
#show slave status\G;
#mysql>stop slave;
開始部署
1. 同步數據:以A庫的數據爲準,同步A B數據,使AB數據保持一致。
1.1 A中導出數據
(1)對A庫加鎖,避免同步時數據發生改變:
mysql>use database_name;
mysql> flush tables with read lock; #關閉全部打開的表,同時對於全部數據庫中的表都加一個讀鎖,直到顯示地執行unlock tables,該操做經常用於數據備份的時候。也就是將全部的髒頁都要刷新到磁盤,而後對全部的表加上了讀鎖,因而這時候直接拷貝數據文件也就是安全的。爲此庫下的全部表施加讀鎖,退出會話後失效,所謂讀鎖,也就是隻能讀,不能寫。
(2)使用mysqldump工具導出數據:
mysqldump -uroot -pxxx -R database_name >database_name.sql # -R參數表示同時備份函數
(3)記下binlog日誌中Position的位置(用於slave鏈接A作複製時會用到)
mysql> show master status\G; # mysql-bin.000003 pos=443
(4)解鎖數據庫:
mysql>unlock tables;
1.2 將A備份的數據導入到B中
[root@localhost ~]# mysql -uroot -pxxx < database_name.sql
2. 配置Master(A)
(1)master中建立一個僅用於主從複製的帳號,給與REPLICATION SLAVE權限。此權限僅容許slave訪問Master的bin-log日誌。
在Master中建立一個僅用於複製的mysql用戶,並僅給與複製權限。
mysql> create user 'repl_A'@'192.168.1.2' identified by '123';
mysql> grant replication slave on *.* to 'repl_A'@'192.168.1.2';
或
mysql>grant replication slave on *.* to ‘repl_A’@ ‘192.168.1.2’ identified by ‘123’; #上面兩句能夠直接簡略爲這一句。
(2)master開啓二進制日誌
vim /etc/my.cnf 或者 vim /usr/my.cnf (在[mysqld]下添加:)
server-id=1 #指定master主機的id,不可爲0,不然拒絕全部slave鏈接。
log-bin=mysql_bin #指定bin-log文件前綴名稱,開啓binlog日誌
binlog_do_db=database_name #指定binlog日誌是記錄的是哪一個庫
replicate-do-db=database_name #指定複製哪個庫
auto-increment-increment = 2
//每次增加2
auto-increment-offset = 1
//設置自動增加的字段的偏移量,即初始值爲1
log_bin_trust_function_creators=1 #詳解以下方
expire_logs_days = 10 #保留10天的bin_log日誌,防止日誌太多佔用磁盤空間
max_binlog_size = 100M #限制每一個bin_log日誌大小最大爲100M。
log-slave-updates=1 #slave執行master的sql後,將sql記錄在binlog日誌中(默認是不記錄的)——實際生產我沒開啓這條
max_connections=600 #指定最大鏈接數
wait_timeout=5 #等待超時
#重啓mysql使配置生效。
3. 配置Slave(B)
(1)配置slave的server-id
示例:[root@iZ2z usr]# vim my.cnf
[mysqld]
server-id=2
auto-increment-increment = 2
//每次增加2
auto-increment-offset = 2
//設置自動增加的字段的偏移量,即初始值爲2
注:二都只有server_id不一樣和 auto-increment- offset不一樣
auto-increment-increment的值應設爲整個結構中服務器的總數,本案例用到兩
臺服務器,因此值設爲2。
重啓mysql使配置生效。
(2)配置鏈接master的相關信息配置。
在slave中指定master相關參數。
你能夠一行一行的配置master鏈接信息。
mysql>change master to master_host='192.168.1.1', #指定master主機IP地址
>master_user='repl_A', #指定一個(在master中)有複製權限的用戶
>master_port=3306,
>master_password='123', #指定上述有複製權限用戶的密碼
>master_log_file='mysql-bin.000003', #指定開始複製的binlog二進制文件。
>master_log_pos=443; #指定(在master二進制文件中)要開始複製的位置。#注意: master_log_pos的值無需加引號,不然報錯!
或者
將master鏈接信息配置寫在一行。
mysql>change master to master_host='192.168.1.1',master_user='repl',master_password='123',master_log_file='mysql-bin.000003',master_log_pos=443;
解釋:
鏈接master的配置信息在命令行中配置好後,默認存在/var/lib/mysql/master.info文件,可使用show master status\G;命令查看,全部就算重啓也不用擔憂鏈接master的配置丟失。
(3)開啓slave
slave中:start slave;
Slave_IO_Running和Slave_SQL_Running的狀態都是YES,說明同步開啓成功。
Master(B)配置
(1)master中建立一個僅用於主從複製的帳號
mysql> grant REPLICATION SLAVE on *.* to 'repl_B'@'192.168.1.1' identified by '123';
(2)查看B庫中binlog日誌的位置
mysql> show master status\G; # mysql_bin.000004 pos=558
(3)同步數據
mysql>change master to master_host='192.168.1.2',
>master_user='rel_B,
>master_port=3306,
>master_password='123',
>master_log_file='mysql_bin.000004',
>master_log_pos=558;
(4)開啓slave
A(slave)庫中:start slave;
(5)測試驗證
解釋:
log_bin_trust_function_creators=1
當二進制日誌啓用後,這個變量就會啓用。它控制是否能夠信任存儲函數建立者,不會建立寫入二進制日誌引發不安全事件的存儲函數。若是設置爲0(默認值),用戶不得建立或修改存儲函數,除非它們具備除CREATE ROUTINE或ALTER ROUTINE特權以外的SUPER權限。若是變量設置爲1,MySQL不會對建立存儲函數實施這些限制。 此變量也適用於觸發器的建立。
server-id=1
原理:在master中,您必須配置一個獨特的服務器ID(可能須要從新啓動服務器)和啓用二進制日誌,slave的複製基於master的二進制日誌。若是沒有使用log-bin選項啓用二進制日誌,複製是不可能的。每一個slave與master必須配置一個獨特的ID。這個ID用於識別主從服務器,並且必須是一個正整數1和(232)−1之間。
驗證:
1. ls /var/lib/mysql/ 會發現有mysql-bin.000001mysql、mysql-bin.index ,表示啓用二進制日誌成功。
mysql_bin.000001: Master記錄操做的二進制日誌文件。
mysql_bin.index: 二進制文件的索引文件,存放二進制日誌文件的名字和路徑。
2. 命令查看
#查看否開啓了bin-log mysql> show variables like '%log_bin%';
#查看bin-log相關參數 mysql> show variables like '%binlog%';
#當前mysql二進制日誌文件的默認位置 mysql> show variables like '%datadir%';
#查看mysql二進制文件名稱及大小 mysql> show binary logs;
3. Master經常使用命令
#查看Master複製狀態 mysql> show master status;
#查看二進制日誌文件事件內容 mysqlbinlog mysql-bin.xxx ---可讀性差
#查看二進制日誌文件事件內容 mysql> show binlog events in 'mysql-bin.000003';
4. 管理二進制日誌文件
#刪除二進制日誌文件
手動刪除:
語法: > PURGE {MASTER | BINARY} LOGS TO 'log_name'
> PURGE {MASTER | BINARY} LOGS BEFORE 'date'
#我使用時沒發現MASTER 和BINARY的區別,都同樣用,均可以。
mysql> purge binary logs to 'mysql_bin.000002';
//刪除mysql_bin.000002以前的二進制日誌文件,並同步刪除日誌索引文件mysql_bin.index中mysql_bin.000002以前的索引信息。注意不包含mysql_bin.000002
mysql> purge master logs before '2017-07-20 21:58:00'; //清除2017-07-20 21:58:00 以前的二進制日誌,並同步清楚日誌索引文件的信息。
自動刪除:
my.cnf中加入如下,而後重啓:
SET GLOBAL expire_logs_days = 7 \\設置二進制日誌只保留7天的
-------若是不想重啓直接mysql> SET GLOBAL expire_logs_days = 7
#重置master二進制日誌文件及內容
mysql> reset master;
或者是
mysql>flush logs;