mysql 复制方式_MySQL复制方法
MySQL的二進制日志,MySQL復制原理,MySQL主從模式搭建,MySQL雙主模式搭建,MySQL級聯模式搭建,MySQL半同步模式復制
一、二進制日志
1、概念
MySQL的二進制日志(binary log)是一個二進制文件,主要用于記錄修改數據或有可能引起數據變更的MySQL語句。二進制日志(binary log)中記錄了對MySQL數據庫執行更改的所有操作,并且記錄了語句發生時間、執行時長、操作數據等其它額外信息,但是它不記錄SELECT、SHOW等那些不修改數據的SQL語句。二進制日志(binary log)主要用于數據庫恢復和主從復制,以及審計(audit)操作。
2、二進制日志特點
1、記錄導致數據改變或潛在導致數據改變的SQL語句
2、記錄已提交的日志
3、不依賴于存儲引擎類型
4、可通過“重放”日志文件中的事件來生成數據副本
3、二進制日志相關的服務器變量
默認服務器變量配置文件為/etc/my.cnf,可以在此文件中設置相關變量的值
(1)、sql_log_bin=ON|OFF:是否記錄二進制日志,默認ON,所以不需要設置,可以在mysql運行的過程中通過修改變量參數來臨時關閉記錄二進制日志
mysql> set sql_log_bin=off
(2)、log_bin=/PATH/BIN_LOG_FILE:指定文件位置;默認OFF。要想開啟服務器的二進制日志功能必須設置此項,有兩種設置方式
log_bin
不指定文件的位置,會默認二進制日志默認放在mysql的datadir目錄中(不推薦)
log_bin=/data/mysql/logs/log_bin
指定文件的位置,生成的二進制文件就會在/data/mysql/logs/目錄中,二進制文件名為log_bin.000001, log_bin.000002以此類推。數據庫每次一重啟服務,就會生成一個新的二進制文件,編號以此類推
(3)、max_binlog_size=1073741824:單個二進制日志文件的最大體積(單位:字節),到達最大值會自動滾動,默認為1G
(4)、binlog_format=STATEMENT|ROW|MIXED:二進制日志記錄的格式,默認STATEMENT。建議設置為ROW,這樣刪除數據的時候不記錄刪除語句,而是刪除的行每條都記錄
4、二進制管理的語句
(1)、查看mariadb自行管理使用中的二進制日志文件列表,及大小,所有二進制日志
SHOW ?MASTER LOGS 或者 SHOW BINARY LOGS
(2)、查看使用中的二進制日志文件,當前正在使用的二進制日志
SHOW MASTER STATUS
(3)、查看二進制文件中的指定內容
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
示例:SHOW BINLOG EVENTS IN 'mariadb.000002' FROM 6516 LIMIT 2,3
(4)、清除指定二進制日志
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }
示例:
PURGE BINARY LOGS TO ‘mariadb-bin.000003’; #不包括該文件
PURGE BINARY LOGS BEFORE '2017-01-23';
PURGE BINARY LOGS BEFORE '2017-03-22 09:25:30';
(5)、刪除所有二進制日志,index文件重新記數,慎重操作
RESET MASTER
(6)、切換日志文件:會生成新的二進制文件
FLUSH LOGS;
5、mysqlbinlog命令用法
mysqlbinlog二進制日志的客戶端命令工具
mysqlbinlog [OPTIONS] log_file…
--start-position=????? # 指定開始位置
--stop-position=?????? # 指定結束位置
--start-datetime=
--stop-datetime=
命令用法示例
# mysqlbinlog --start-position=6787 --stop-position=7527 /var/lib/mysql/mariadb-bin.000003 -v
# mysqlbinlog --start-datetime="2018-01-30 20:30:10" --stop-datetime="2018-01-30 20:35:22" mariadb-bin.000003 -vvv
二、MySQL復制原理
主節點Master:
1、dump 線程:當從節點通過I/O線程連接主節點時,主節點會創建一個dump 線程,用于發送bin-log的內容。在讀取bin-log中的操作時,此線程會對bin-log加鎖,當讀取完成,鎖會被釋放。
從節點Slave:
1、I/O 線程:當從節點上執行`start slave`命令之后,從節點會創建一個I/O線程用來連接主節點,請求主庫中更新的bin-log。I/O線程接收到主節點binlog dump 進程發來的更新之后,保存在本地中繼日志relay-log中。
2、SQL線程:從中繼日志中讀取日志事件,在本地完成重放
對于每一個主從連接,都需要三個進程來完成。當主節點有多個從節點時,主節點會為每一個當前連接的從節點建一個binary log dump 進程,而每個從節點都有自己的I/O進程,SQL進程。從節點用兩個線程將從主庫拉取更新和執行分成獨立的任務,這樣在執行同步數據任務的時候,不會降低讀操作的性能。比如,如果從節點沒有運行,此時I/O進程可以很快從主節點獲取更新,盡管SQL進程還沒有執行。如果在SQL進程執行之前從節點服務停止,至少I/O進程已經從主節點拉取到了最新的變更并且保存在本地relay日志中,當服務再次起來之后,就可以完成數據的同步。
三、主從同步方法
1、從0搭建主從模式
適用于項目未開始時,數據庫剛剛安裝完畢,沒有任何數據情況。
假設A服務器(192.168.1.100)為主數據庫,B服務器(192.168.1.200)為從數據庫
主節點A配置:
1、編輯mysql的配置文件/etc/my.cnf
[mysqld]
# 打開2進制日志選項
log_bin
# 配置server_id,要求主從必須不一樣,可以采用ip地址的尾號形式
server_id=100
2、登錄mysql數據庫,創建同步賬號
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.1.%' IDENTIFIED BY '123456';3、查看二進制日志的位置節點mysql >SHOW MASTER STATUS->;+--------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------+----------+--------------+------------------+
| mysql.000002 | 402| | |
+--------------+----------+--------------+------------------+
從節點B配置:
1、編輯mysql的配置文件/etc/my.cnf
[mysqld]
# 配置server_id,要求主從必須不一樣,可以采用ip地址的尾號形式
server_id=200
2、配置同步屬性
mysql>CHANGE MASTER TO
MASTER_HOST='192.168.1.200',
MASTER_USER='repluser',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql.000001',
MASTER_LOG_POS=402;3、打開同步進程
mysql>START SLAVE4、查看同步狀態
mysql> SHOW SLAVE STATUS
2、數據庫A上已有數據
此模式更為普遍,通常是原業務中已有單臺數據庫服務器,業務需要進行主從同步
假設A服務器(192.168.1.100)為主數據庫,B服務器(192.168.1.200)為從數據庫
主節點A配置:
1、編輯mysql的配置文件/etc/my.cnf
[mysqld]
# 打開2進制日志選項
log_bin
# 配置server_id,要求主從必須不一樣,可以采用ip地址的尾號形式
server_id=100
2、登錄mysql數據庫,創建同步賬號
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.1.%' IDENTIFIED BY '123456';
3、通過mysqldump導出數據庫
# mysqldump –uroot-A -F -E -R -x --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob >/tmp/backup.sql4、將備份的數據庫拷貝到B主機上# scp /tmp/backup.sql 192.168.1.200:/tmp
從節點B配置:
1、編輯mysql的配置文件/etc/my.cnf
[mysqld]
#配置server_id,要求主從必須不一樣,可以采用ip地址的尾號形式
server_id=200
2、啟動B主機的數據庫
# systemctl start mariadb3、導入已備份的數據庫
# mysql< /tmp/backup.sql4、查看備份到的位置less /tmp/backup.sql
。。。。省略。。。。
CHANGE MASTER TO MASTER_LOG_FILE='mysql.000003', MASTER_LOG_POS=245;
。。。。省略。。。。5、配置同步屬性
mysql>CHANGE MASTER TO
MASTER_HOST='192.168.1.200',
MASTER_USER='repluser',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql.000003',
MASTER_LOG_POS=245;6、打開同步進程
mysql> START SLAVE
四、雙主同步方法
建議從0開始配置
假設A服務器(192.168.1.100)為主數據庫,B服務器(192.168.1.200)為第二主數據庫
主節點A配置:
1、編輯mysql的配置文件/etc/my.cnf
[mysqld]
#打開2進制日志選項
log_bin
#配置server_id,要求主從必須不一樣,可以采用ip地址的尾號形式
server_id=100# 配置自增ID的起始點,和增長幅度
auto_increment_offset=1auto_increment_increment=2
2、登錄mysql數據庫,創建同步賬號
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.1.%' IDENTIFIED BY '123456';3、查看數據庫當前二進制位置,給B使用的
mysql>SHOW MASTER STATUS;+--------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------+----------+--------------+------------------+
|mysql.000001| 407 | | |
+--------------+----------+--------------+------------------+
4、配置同步屬性
注意:此處的日志位置是B通過SHOW MASTER STATUS查看到的日志位置
mysql>CHANGE MASTER TO
MASTER_HOST='192.168.1.200',
MASTER_USER='repluser',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql.000001',
MASTER_LOG_POS=407;5、打開同步進程
mysql> START SLAVE
另一主節點B配置:
1、編輯mysql的配置文件/etc/my.cnf
[mysqld]
#打開2進制日志選項
log_bin
#配置server_id,要求主從必須不一樣,可以采用ip地址的尾號形式
server_id=200# 配置自增ID的起始點,和增長幅度
auto_increment_offset=2auto_increment_increment=2
2、登錄mysql數據庫,創建同步賬號
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.1.%' IDENTIFIED BY '123456';3、查看數據庫當前二進制位置,給A使用的
mysql>SHOW MASTER STATUS;+--------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------+----------+--------------+------------------+
| mysql.000001 | 407 | | |
+--------------+----------+--------------+------------------+
4、配置同步屬性
注意:此處的日志位置是A通過SHOW MASTER STATUS查看到的日志位置
mysql>CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='repluser',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql.000001',
MASTER_LOG_POS=407;5、打開同步進程
mysql> START SLAVE
5、級聯復制方法
級聯復制是將主庫的數據同步到級聯庫,然后級聯庫把自己的數據同步到從庫上,這樣可以減少主庫的壓力
主庫配置:
1、修改主庫配置文件
# vim/etc/my.cnf
server-id=100log-bin2、創建復制的用戶
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.1.%' IDENTIFIED BY '123456';3、將主庫的數據進行全備份
# mysqldump-A --single-transaction --master-data=1 -F > /data/all.sql4、把備份數據拷貝到從庫
#scp /data/all.sql 192.168.1.200:/data
級聯庫配置:
1、修改配置文件
# vim/etc/my.cnfserver-id=200
log-bin
# 將中繼日志同步到二進制日志中↓
log_slave_updates
2、修改主庫的的全備份文件,在文件的首頁
把 CHANGE MASTER TO MASTER_LOG_FILE='***', MASTER_LOG_POS=***;語句修改為如下。注意***的地方數據不變
# vim/data/all.sql
CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='repluser',
MASTER_PASSWORD='123456',MASTER_PORT=3306,
MASTER_LOG_FILE='***', MASTER_LOG_POS=***;3、導入數據庫
mysql> source /date/all.sql4、刷新權限
mysql>FLUSH PRIVELEGES;5、開啟同步
mysql> start slave;
6、級聯庫數據進行全備份
mysqldump -A --single-transaction --master-data=1? -F > /data/all.sql
7、級聯庫數據拷貝到從庫1,和從庫2
scp /data/all.sql 192.168.1.201:/data
scp /data/all.sql 192.168.1.202:/data
從庫1配置:
1、修改配置文件
# vim/etc/my.cnf
server-id=201
2、修改級聯庫的全備份文件,在文件的首頁
把 CHANGE MASTER TO MASTER_LOG_FILE='***', MASTER_LOG_POS=***;語句修改為如下。注意***的地方數據不變
# vim/data/all.sql
CHANGE MASTER TO
MASTER_HOST='192.168.1.200',
MASTER_USER='repluser',
MASTER_PASSWORD='123456',MASTER_PORT=3306,
MASTER_LOG_FILE='***', MASTER_LOG_POS=***;3、導入數據庫
mysql> source /date/all.sql4、刷新權限
mysql>FLUSH PRIVELEGES;5、開啟同步
mysql> start slave;
從庫2配置與從庫1類似
6、半同步復制
默認情況下,MySQL的復制功能是異步的,異步復制可以提供最佳的性能,主庫把binlog日志發送給從庫即結束,并不驗證從庫是否接收完畢。這意味著當主庫或從庫發生故障時,有可能從庫沒有接收到主庫發送過來的binlog日志,這就會造成主庫和從庫的數據不一致,甚至在恢復時造成數據的丟失。
在開啟了半同步復制機制后,主庫只有當有任意一臺從庫已經接收到主庫的數據后,告訴主庫。主庫收到從庫同步成功的信息后,才繼續后面的操作。
主庫配置:
主數據庫A(192.168.1.100),從數據庫B(192.168.1.201),從數據庫B(192.168.1.202)
1、修改配置文件# vim /etc/my.cnf
[mysqld]
server-id=100
log-bin
2、創建同步用戶賬戶mysql>grant replication slave on *.* to repluser@'192.168.1.%' identified by '123456';
3、主庫全備份,并將備份數據傳送給從庫# mysqldump -A --single-transaction --master-data=1 -F > /data/all.sql
# scp /data/all.sql 192.168.1.201:/tmp
4、主庫安裝半同步模塊,并開啟該功能
mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql>set global rpl_semi_sync_master_enabled=on;
可以放到服務器啟動參數里
# vim /etc/my.cnfrpl_semi_sync_master_enabled=1
5、半同步狀態查詢參考命令
mysql>SHOW GLOBAL VARIABLES LIKE '%semi%';
mysql>SHOW GLOBAL STATUS LIKE '%semi%';
從庫B配置:
1、修改配置文件
# vim/etc/my.cnf
[mysqld]
server-id=201
2、修改主庫的的全備份文件,在文件的首頁
把 CHANGE MASTER TO MASTER_LOG_FILE='***', MASTER_LOG_POS=***;語句修改為如下。注意***的地方數據不變
# vim/data/all.sql
CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='repluser',
MASTER_PASSWORD='123456',MASTER_PORT=3306,
MASTER_LOG_FILE='***', MASTER_LOG_POS=***;3、導入數據庫
mysql> source /date/all.sql4、刷新權限
mysql>FLUSH PRIVELEGES;5、從庫安裝半同步模塊(與主庫模塊不同,注意)
mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql>SET GLOBAL rpl_semi_sync_slave_enabled=1;
可以放到服務器啟動參數里
# vim/etc/my.cnf
rpl_semi_sync_slave_enabled=1
6、開啟主從同步
mysql>start slave;
從庫C配置類似
總結
以上是生活随笔為你收集整理的mysql 复制方式_MySQL复制方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: suse linux 11 HBA信息,
- 下一篇: java里面add报错_java.uti