linuxcentos下mysql數據庫的主從復制環境搭建_MySQL

有兩臺mysql數據庫服務器master和slave,master為主服務器,slave為從服務器,初始狀態時,master和slave中的數據信息相同,當master中的數據發生變化時,slave也跟著發生相應的變化,使得master和slave的數據信息同步,達到備份的目的。

原理圖如下:

linuxcentos下mysql數據庫的主從復制環境搭建_MySQL

簡單來說,mysql的主從復制的原理就是slave把master上面執行的 update,insert這些會使數據發生改變的sql語句從master上面同步過來,然后在自己的機器上再執行一遍,那么這兩臺數據庫服務器上的數據就一模一樣了,而那些要同步的sql語句就存在bin-log文件里面

我這里有兩臺機器分別是192.168.1.6(master) 192.168.1.5(slave)

linuxcentos下mysql數據庫的主從復制環境搭建_MySQL

我們先從master機器開始配置

修改/etc/my.cnf 文件(mysql啟動默認是從/etc/my.cnf讀取的,所以你別的地方有配置文件的話建議直接移到/etc目錄下)

?

 [client] port = 3306 socket = /usr/local/mysql/mysql.sock  [mysqld] character-set-server = utf8 collation-server = utf8_general_ci  skip-external-locking skip-name-resolve  user = mysql port = 3306 basedir = /usr/local/mysql datadir = /home/mysql/data tmpdir = /home/mysql/temp # server_id = ..... socket = /usr/local/mysql/mysql.sock log-error = /home/mysql/logs/mysql_error.log pid-file = /home/mysql/mysql.pid  open_files_limit = 10240  back_log = 600 max_connections=500 max_connect_errors = 6000 wait_timeout=605800  #open_tables = 600 #table_cache = 650 #opened_tables = 630  max_allowed_packet = 32M  sort_buffer_size = 4M join_buffer_size = 4M thread_cache_size = 300 query_cache_type = 1 query_cache_size = 256M query_cache_limit = 2M query_cache_min_res_unit = 16k  tmp_table_size = 256M max_heap_table_size = 256M  key_buffer_size = 256M read_buffer_size = 1M read_rnd_buffer_size = 16M bulk_insert_buffer_size = 64M  lower_case_table_names=1  default-storage-engine = INNODB  innodb_buffer_pool_size = 2G innodb_log_buffer_size = 32M innodb_log_file_size = 128M innodb_flush_method = O_DIRECT  ##################### thread_concurrency = 32 long_query_time= 2 slow-query-log = on slow-query-log-file = /home/mysql/logs/mysql-slow.log    ## replication server_id=6 binlog-ignore-db=mysql log-bin=master-mysql-bin binlog_cache_size=1M binlog_format=mixed expire_logs_days=7 slave_skip_errors=1062  [mysqldump] quick max_allowed_packet = 32M  [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid 

這里主要的配置就是和復制相關的這段配置,其它配置是mysql源碼安裝時配置,里面具體參數代表什么意思可以網上搜一下,文檔很多的

?

?

 ## replication server_id=6 binlog-ignore-db=mysql log-bin=master-mysql-bin binlog_cache_size=1M binlog_format=mixed expire_logs_days=7 slave_skip_errors=1062

我簡單解釋一下,復制有關的參數

?

serverid 全局唯一的

binlog-ignore-db=mysql復制過濾,我們不同步mysql系統自帶的數據庫

log-bin=master-mysql-bin 開啟logbin功能并設置logbin文件的名稱

binlog_format=mixed 混合型復制模式,默認采用基于語句的復制,一旦發現基于語句的無法精確的復制時,就會采用基于行的復制。

接下來重啟mysql服務并用客戶端登錄

linuxcentos下mysql數據庫的主從復制環境搭建_MySQL

slave想要同步master上的數據首先肯定需要權限,所以我們要在master上面開通權限

?

 grant replication slave, replication client on *.* to 'root'@'192.168.1.5' identified by 'root';

賬號和密碼都是root ,允許192.168.1.5這臺機器向master發送同步請求,當然你可以設成別的,我這里只是為了方便記憶,設了太多不同的密碼容易忘記

?

linuxcentos下mysql數據庫的主從復制環境搭建_MySQL

刷新一下授權信息,然后查看當前master的狀態

linuxcentos下mysql數據庫的主從復制環境搭建_MySQL

show master status,我這里解釋一下,我們知道關于對數據庫修改的sql全部記錄在了bin-log里面,那么我們就每次都把bin-log里面的sql全部執行一遍?肯定不是,我們肯定要記錄我上次復制到哪兒里了,然后我下次再從這個點開始同步,就像我們玩單機游戲闖了3關以后要存下檔一樣,下次玩我們繼續從第三關開始玩,這是一個意思。

接下來我們隨便寫點測試數據到數據庫里面去

?

 create database if not exists pcx default charset utf8 collate utf8_general_ci; use pcx; DROP TABLE IF EXISTS `fruits`; CREATE TABLE fruits ( f_id    char(10)     	NOT NULL, s_id    INT        	NOT NULL, f_name  char(255)  	NOT NULL, f_price decimal(8,2)  	NOT NULL, PRIMARY KEY(f_id)  )ENGINE=InnoDB DEFAULT CHARSET=utf8 ;  INSERT INTO fruits (f_id, s_id, f_name, f_price)      VALUES('a1', 101,'apple',5.2),      ('b1',101,'blackberry', 10.2),      ('bs1',102,'orange', 11.2),      ('bs2',105,'melon',8.2),      ('t1',102,'banana', 10.3),      ('t2',102,'grape', 5.3),      ('o2',103,'coconut', 9.2),      ('c0',101,'cherry', 3.2),      ('a2',103, 'apricot',2.2),      ('l2',104,'lemon', 6.4),      ('b2',104,'berry', 7.6),      ('m1',106,'mango', 15.6),      ('m2',105,'xbabay', 2.6),      ('t4',107,'xbababa', 3.6),      ('m3',105,'xxtt', 11.6),      ('b5',107,'xxxx', 3.6);

linuxcentos下mysql數據庫的主從復制環境搭建_MySQL

?

接下來我們把pcx這個庫下的數據全部備份下來

首先我們要鎖表

?

 flush tables with read lock;

接下來用mysql的備份命令進行備份

?

linuxcentos下mysql數據庫的主從復制環境搭建_MySQL

最后我們把edu-master.sql發送到slave的機器上面

好了,我們接下來開始配置slave(192.168.1.5)

同樣打開my.cnf文件開始配置

?

 vi /etc/my.cnf

?

?

 [client] port = 3306 socket = /usr/local/mysql/mysql.sock  [mysqld] character-set-server = utf8 collation-server = utf8_general_ci  skip-external-locking skip-name-resolve  user = mysql port = 3306 basedir = /usr/local/mysql datadir = /home/mysql/data tmpdir = /home/mysql/temp # server_id = ..... socket = /usr/local/mysql/mysql.sock log-error = /home/mysql/logs/mysql_error.log pid-file = /home/mysql/mysql.pid  open_files_limit = 10240  back_log = 600 max_connections=500 max_connect_errors = 6000 wait_timeout=605800  #open_tables = 600 #table_cache = 650 #opened_tables = 630  max_allowed_packet = 32M  sort_buffer_size = 4M join_buffer_size = 4M thread_cache_size = 300 query_cache_type = 1 query_cache_size = 256M query_cache_limit = 2M query_cache_min_res_unit = 16k  tmp_table_size = 256M max_heap_table_size = 256M  key_buffer_size = 256M read_buffer_size = 1M read_rnd_buffer_size = 16M bulk_insert_buffer_size = 64M  lower_case_table_names=1  default-storage-engine = INNODB  innodb_buffer_pool_size = 2G innodb_log_buffer_size = 32M innodb_log_file_size = 128M innodb_flush_method = O_DIRECT  ##################### thread_concurrency = 32 long_query_time= 2 slow-query-log = on slow-query-log-file = /home/mysql/logs/mysql-slow.log     ## replication server_id=5 binlog-ignore-db=mysql log-bin=mysql-slave-bin binlog_cache_size = 1M binlog_format=mixed expire_logs_days=7 slave_skip_errors=1062 relay_log=mysql-relay-bin log_slave_updates=1 read_only=1   [mysqldump] quick max_allowed_packet = 32M  [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid 

配置文件和master的差不多,主要差別在一下幾點

?

log-bin=mysql-slave-bin開啟了二進制日志,實際上不開也沒關系,因為我們這個slave只是做slave,如果你這臺slave還有可能要做別人的master的話那么必須開啟

relay_log=mysql-relay-bin配置中繼日志,用來存放從master的bin-log那邊同步來的數據

配置好后重啟數據庫服務

?

 service mysql restart

我們首先要創建一下數據庫,因為我們備份下來的數據庫文件里面是不包含創建數據庫的命令的,所以我們要手動創建一下

?

linuxcentos下mysql數據庫的主從復制環境搭建_MySQL

把我們從master那邊備份過來的數據恢復到slave中

linuxcentos下mysql數據庫的主從復制環境搭建_MySQL

登錄 Slave 數據庫

linuxcentos下mysql數據庫的主從復制環境搭建_MySQL

在mysql客戶端中輸入一下命令連接master

linuxcentos下mysql數據庫的主從復制環境搭建_MySQL

change master to ,
master_host=’192.168.1.6′ master主機的ip地址

master_user=’root’,

master_password=’root’, 我們剛剛在master有執行過授權的賬號密碼就是這個

master_port=3306,master數據庫的端口號

master_log_file=’edu-mysql-bin.000002′,

master_log_pos=427, 這個是我們通過show master status看到的position

?

master_connect_retry=30;

?

使用命令查看slave狀態,我們可以看到slave目前還未開始同步

?

  show slave statusG;

linuxcentos下mysql數據庫的主從復制環境搭建_MySQL

?

開始主從同步,主要看到兩個yes就代表同步成功了

?

 start slave;

linuxcentos下mysql數據庫的主從復制環境搭建_MySQL

?

在master機器上查看狀態,可以看見slave的連接信息

?

 show processlistG;

linuxcentos下mysql數據庫的主從復制環境搭建_MySQL

?

接下來我們測試一下主從復制的功能

master 上原來的數據

linuxcentos下mysql數據庫的主從復制環境搭建_MySQL

這是我插入的記錄

linuxcentos下mysql數據庫的主從復制環境搭建_MySQL

我們到slave上面看看有沒有,有就代表成功了

linuxcentos下mysql數據庫的主從復制環境搭建_MySQL

至此mysql原生支持的主從復制搭建完畢,當然我們說mysql的主從復制

性能上回有延遲,master上的數據不是無延遲的同步到slave上面,所以如果你對數據的一致性要求非常高的話,那么mysql官方的主從復制就不合適了,可以考慮用別的數據同步方案例如“Galera Cluster for MySQL” ,當然也有人說mysql官方支持的主從復制只是適合在中小規模的集群下運行。

?

?

?

? 版權聲明
THE END
喜歡就支持一下吧
點贊15 分享