原理圖如下:
簡(jiǎn)單來說,mysql的主從復(fù)制的原理就是slave把master上面執(zhí)行的 update,insert這些會(huì)使數(shù)據(jù)發(fā)生改變的sql語(yǔ)句從master上面同步過來,然后在自己的機(jī)器上再執(zhí)行一遍,那么這兩臺(tái)數(shù)據(jù)庫(kù)服務(wù)器上的數(shù)據(jù)就一模一樣了,而那些要同步的sql語(yǔ)句就存在bin-log文件里面
我這里有兩臺(tái)機(jī)器分別是192.168.1.6(master) 192.168.1.5(slave)
我們先從master機(jī)器開始配置
修改/etc/my.cnf 文件(mysql啟動(dòng)默認(rèn)是從/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
## 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復(fù)制過濾,我們不同步mysql系統(tǒng)自帶的數(shù)據(jù)庫(kù)
log-bin=master-mysql-bin 開啟logbin功能并設(shè)置logbin文件的名稱
binlog_format=mixed 混合型復(fù)制模式,默認(rèn)采用基于語(yǔ)句的復(fù)制,一旦發(fā)現(xiàn)基于語(yǔ)句的無法精確的復(fù)制時(shí),就會(huì)采用基于行的復(fù)制。
接下來重啟mysql服務(wù)并用客戶端登錄
slave想要同步master上的數(shù)據(jù)首先肯定需要權(quán)限,所以我們要在master上面開通權(quán)限
grant replication slave, replication client on *.* to 'root'@'192.168.1.5' identified by 'root';
刷新一下授權(quán)信息,然后查看當(dāng)前master的狀態(tài)
show master status,我這里解釋一下,我們知道關(guān)于對(duì)數(shù)據(jù)庫(kù)修改的sql全部記錄在了bin-log里面,那么我們就每次都把bin-log里面的sql全部執(zhí)行一遍?肯定不是,我們肯定要記錄我上次復(fù)制到哪兒里了,然后我下次再?gòu)倪@個(gè)點(diǎn)開始同步,就像我們玩單機(jī)游戲闖了3關(guān)以后要存下檔一樣,下次玩我們繼續(xù)從第三關(guān)開始玩,這是一個(gè)意思。
接下來我們隨便寫點(diǎn)測(cè)試數(shù)據(jù)到數(shù)據(jù)庫(kù)里面去
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);
接下來我們把pcx這個(gè)庫(kù)下的數(shù)據(jù)全部備份下來
首先我們要鎖表
flush tables with read lock;
最后我們把edu-master.sql發(fā)送到slave的機(jī)器上面
好了,我們接下來開始配置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
log-bin=mysql-slave-bin開啟了二進(jìn)制日志,實(shí)際上不開也沒關(guān)系,因?yàn)槲覀冞@個(gè)slave只是做slave,如果你這臺(tái)slave還有可能要做別人的master的話那么必須開啟
relay_log=mysql-relay-bin配置中繼日志,用來存放從master的bin-log那邊同步來的數(shù)據(jù)
配置好后重啟數(shù)據(jù)庫(kù)服務(wù)
service mysql restart
把我們從master那邊備份過來的數(shù)據(jù)恢復(fù)到slave中
登錄 Slave 數(shù)據(jù)庫(kù)
在mysql客戶端中輸入一下命令連接master
change master to ,
master_host='192.168.1.6' master主機(jī)的ip地址
master_user='root',
master_password='root', 我們剛剛在master有執(zhí)行過授權(quán)的賬號(hào)密碼就是這個(gè)
master_port=3306,master數(shù)據(jù)庫(kù)的端口號(hào)
master_log_file='edu-mysql-bin.000002',
master_log_pos=427, 這個(gè)是我們通過show master status看到的position
master_connect_retry=30;
使用命令查看slave狀態(tài),我們可以看到slave目前還未開始同步
show slave status\G;
開始主從同步,主要看到兩個(gè)yes就代表同步成功了
start slave;
在master機(jī)器上查看狀態(tài),可以看見slave的連接信息
show processlist\G;
接下來我們測(cè)試一下主從復(fù)制的功能
master 上原來的數(shù)據(jù)
這是我插入的記錄
我們到slave上面看看有沒有,有就代表成功了
至此mysql原生支持的主從復(fù)制搭建完畢,當(dāng)然我們說mysql的主從復(fù)制
性能上回有延遲,master上的數(shù)據(jù)不是無延遲的同步到slave上面,所以如果你對(duì)數(shù)據(jù)的一致性要求非常高的話,那么mysql官方的主從復(fù)制就不合適了,可以考慮用別的數(shù)據(jù)同步方案例如“Galera Cluster for MySQL” ,當(dāng)然也有人說mysql官方支持的主從復(fù)制只是適合在中小規(guī)模的集群下運(yùn)行。
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com