天天看點

線上建立或重做mysql主從複制架構方法(傳統模式和GTID模式)

mysql主從複制架構,是mysql資料庫主要特色之一,絕大多數公司都有用到。

而GTID模式是基于事務的複制模式的意思,發展到現在也是越來越多人用。

以前很多文章,介紹搭建mysql主從複制架構,是需要停止應用服務來做的,對于生産環境,怎麼可能讓你随便停服務?是以必須做到線上做,不影響業務,那才是最實際的。

先說明,案例分兩種方案,實作的意義是一樣的,一種是mysqldump方式,一種是xtrabackup方式,視乎實際情況,因為有些業務不一定能用xtrabackup,例如阿裡雲RDS,騰訊CDB.

配置和授權(通用前置步驟)

如果沒有開GTID模式,主從庫不用做些什麼特别配置,主從之間注意server-id不要一樣就可以了,這個坑很容易掉進去.

當然了,binlog是必須開的,主從就靠這個來複制的,不開就是白搭.

還有binlog_format推薦用row,原則上mixed也沒啥大問題,但是很多情況下實際上都會自動轉成row模式的,而且row模式是三種模式中,最少可能丢資料的模式,即使丢資料也是極個别的極端情況,例如斷網.

事務隔離界别transaction_isolation推薦REPEATABLE-READ或READ-COMMITTED都可以,視乎你對資料一緻性要求高不高,但不代表那種會資料不準确.

========================================

開啟GTID模式,那就要設定下面兩個參數,而且一做就要全做,各主從伺服器都要做,并需要重新開機mysql服務才能生效

<code>#這個不能線上開啟,要寫到配置檔案my.cnf裡面,還要重新開機才生效。</code>

<code>#不然就是下面的報錯</code>

<code>mysql&gt; </code><code>set</code> <code>gtid_mode = 1;</code>

<code>ERROR 1238 (HY000): Variable </code><code>'gtid_mode'</code> <code>is a </code><code>read</code> <code>only variable</code>

<code>#是以我們要編輯my.cnf來開啟</code>

<code>vim my.cnf</code>

<code>#GTID模式,5.6的新功能,新的複制驗證方式,需要就打開,binlog建議改成row</code>

<code>gtid_mode = on</code>

<code>binlog_format = row</code>

<code>#強制GTID的一緻性,一般和上面參數一起使用,但是開啟後隻允許能夠保障事務安全,并且能夠被日志記錄的SQL語句被執行,</code>

<code>#像create table ... select 和 create temporarytable語句,以及同時更新事務表和非事務表的SQL語句或事務都不允許執行。</code>

<code>enforce_gtid_consistency = 1</code>

<code>#然後重新開機mysql程序</code>

<code>service mysqld restart</code>

擴充一下,在gtid模式下,出現不支援的語句需要自己去修改,不然會報錯或不記錄,例如下面這樣.

<code>CREATE TABLE ... SELECT</code>

<code>可以改為下面這樣分成兩句:</code>

<code>CREATE TABLE</code>

<code>INSERT ... SELECT</code>

因為GTID模式要重新開機才能生效,對于一些大庫要慎重更改使用gtid(重新開機失敗那就悲劇了),一定要用的話,主庫要找個月黑風高,夜深人靜的時候設定完再重新開機,從庫就沒所謂啦.

==========================================

然後我們還要關注一些參數,在從庫可以選擇性開啟,主庫加不加都不影響使用,

<code>#用來配置從伺服器的更新是否寫入二進制日志,如果有層級從庫就必須開,沒有的話建議關閉,能有效提高性能</code>

<code>log_slave_updates</code>

<code>#設定從庫SQL線程并行重放events(事務)的worker線程數量,預設值為0,最大值為1024.在5.6.x版本中設定這個參數大于0時,</code>

<code>#則SQL線程充當worker線程的協調者,在多個worker線程之間分發基于庫級别的events,也就是庫級别并行複制,</code>

<code>#5.7.x版本的并行複制可以設定基于組送出事務的并行複制,更加好用.</code>

<code>slave_parallel_workers = 8</code>

<code>#5.7新參數,指定并行複制方式,為了相容5.6的模式,預設的并行複制方式是基于庫級别的,即預設值是:DATABASE,</code>

<code>#我們要設定成5.7支援的基于組送出事務的并行複制方式,則需要設定成:LOGICAL_CLOCK,速度更快。</code>

<code>#slave_parallel_type = LOGICAL_CLOCK</code>

題外話,這個看需求來開啟,有個别從庫會再搭從庫來挂載,如果不開這個參數,那就做不了,如果沒有這種需求,不開也沒什麼,反而增加性能.

配置修改完了,我還還需要在主庫授權一下主從複制使用者的權限,這裡說的授權是指主庫對從庫授權讀寫binlog權限.

<code>mysql&gt;grant replication slave on *.* to </code><code>'rep'</code><code>@</code><code>'%'</code> <code>identified by </code><code>'password'</code><code>;</code>

因為我貪友善,直接用的root使用者,後面請見諒了.

mysqldump方式

因為mysql自帶,不需要再做些什麼,比較友善易用,不過需要強調一下,資料量太大的話,mysqldump就略顯不足了,因為是邏輯備份和導入,導出導入時間耗費巨大,各位自己衡量.

第一步,資料的導出與導入和初始化從庫(以下操作,先在主庫操作,後在從庫操作)

導出和導入,如果庫太大,就會多花點時間,也正如我們開頭說的,先用的是mysqldump來,具體參數我就不多說了,有興趣就去查一下,直接看指令就好了.

首先,我們先從主庫備份個整庫備份:

<code>mysqldump -uroot -p123123 --opt --default-character-</code><code>set</code><code>=utf8 --triggers -R --hex-blob --single-transaction --no-autocommit --master-data=2 -A &gt;test2.sql</code>

就這樣,我們就得到全庫備份檔案test2.sql,

對于有沒有必要做全庫備份的問題,要看實際情況,如果你是做MHA,PXC之類的叢集,你必然要保持主從資料完全一緻,不隻是業務庫,系統庫也需要.如果你從庫一開始就不打算拿來用,那确實隻操作業務庫就好了,還有其他什麼忽略不需要複制到從庫的參數,這個按你需求實際情況來做,這裡就不再細說了.

需要強調一下的是,為什麼能做到線上建立和重做主從,就是因為這個參數,

--master-data=2

後面會詳細說說這個參數會有些什麼特别的地方.

轉回正題,備份做完了,那就是要拷到從庫恢複了,怎麼傳輸過去,這裡就不細說了,什麼scp,rsync,http,ftp什麼的,你喜歡就好了,而我這裡,用的是scp

<code>scp</code> <code>-o StrictHostKeyChecking=no [email protected]:</code><code>/data/ttt/test2</code><code>.sql </code><code>/data/ttt</code>

指令僅供參考,你們自己喜歡怎麼改都行

再然後,要初始化一下從庫的mysql。

雖然說現在是測試,不過一般來說,建立和重做主從,必然是因為他本來就是空白機,或者是主從失效了,需要重做,原因我不說了,反正類似pt-osc工具也沒用的,就是必須重做的架勢,至于怎麼安裝mysql我就不多說了.

簡單說說怎麼初始化,具體可以看我另一篇文章

<code>#這個隻是5.6的初始化方式</code>

<code>service mysqld stop</code>

<code>rm</code> <code>-rf </code><code>/data/mysql/data/</code><code>*</code>

<code>/usr/local/mysql/scripts/mysql_install_db</code> <code>--defaults-</code><code>file</code><code>=</code><code>/usr/local/mysql/my</code><code>.cnf --basedir=</code><code>/usr/local/mysql/</code> <code>--datadir=</code><code>/data/mysql/data</code> <code>--user=mysql &gt; </code><code>/dev/null</code> <code>2&gt;&amp;1</code>

<code>service mysqld start</code>

<code>/usr/local/mysql/bin/mysqladmin</code> <code>-u root password </code><code>'123123'</code>

<code>#5.7的和這個不一樣,請看我另一篇文章</code>

簡單幾個指令就完成了初始化,然後準備導入,為什麼要說準備呢,當然是因為還有些準備工作,例如是如果要開GTID的話

<code>#使用GTID模式的執行個體的導入,需要目标執行個體的GTID記錄是空的,不然會報錯,就類似這樣:</code>

<code>[root@pingtest1 ttt]</code><code># mysql -uroot -p123123 &lt; test2.sql </code>

<code>Warning: Using a password on the </code><code>command</code> <code>line interface can be insecure.</code>

<code>ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be </code><code>set</code> <code>when @@GLOBAL.GTID_EXECUTED is empty.</code>

<code>#提示GTID_EXECUTED為非空,不能導入.</code>

<code>#是以導入前要先重置下binlog</code>

<code>mysql&gt;reset master;</code>

<code>#重置了binlog那就沒問題了,重新執行</code>

<code>mysql -uroot -p123123 -e </code><code>'reset master'</code>

<code>mysql -uroot -p123123 &lt; test2.sql</code>

<code>#好了,導入完成後,我們檢查一下,gtid模式要看看這個</code>

<code>mysql&gt;show variables like </code><code>"%gtid%"</code><code>;</code>

<code>gtid_purged    |    16fdabc7-30f9-11e6-9234-0800273e5680:1-3216</code>

看到上面這個就行了.

第二步,配置主從同步(以下操作,都是在從庫操作)

在說怎麼配置之前,我先說一下為什麼能線上不停應用服務來做主從的原因,還記得我上面說的那個參數嗎?,沒錯,就是--master-data=2,意思是記錄備份目前的binlog資訊.

有不少人以前做主從,都是從主庫show master status檢視binlog位置,然後change master to.....是以必須把應用服務停了,不然binlog位置變了後,在做主從期間中間那些語句就執行不了,最終導緻資料不同步.

而加了--master-data=2之後,test2.sql這個檔案會記錄目前binlog的位置,這樣我們就不用理會做主從期間中間的那些資料,隻需要把binlog位置直接指向sql檔案裡面的binlog位置就可以了,然後資料就會自己同步到最新位置.

來看看我的test2.sql的binlog位置,就檔案的前30行,要是你覺得檔案太大很難打開,more或者head -30都可以,就不要vim了,隻看關鍵字

<code>SET @@GLOBAL.GTID_PURGED=</code><code>'16fdabc7-30f9-11e6-9234-0800273e5680:1-3216'</code><code>;</code>

<code>--</code>

<code>-- Position to start replication or point-</code><code>in</code><code>-</code><code>time</code> <code>recovery from</code>

<code>-- CHANGE MASTER TO MASTER_LOG_FILE=</code><code>'mysql-bin.000019'</code><code>, MASTER_LOG_POS=1856541;</code>

看到了,目前binlog位置是mysql-bin.000019,Position位置是1856541,gtid位置是16fdabc7-30f9-11e6-9234-0800273e5680:1-3216.

知道了這些資訊,那麼我們就可以開幹了

一般模式直接change master to就可以了,主要就是mysql-bin.000019和Position位置是1856541,用來告訴主庫,我這些語句執行過了,不需要理會GTID的東西(其實主庫沒開GTID就不會存在這個資料)

<code>#做之前,别忘記先清空一下主從結構的記錄</code>

<code>mysql&gt;reset slave all;</code>

<code>#然後再執行操作</code>

<code>mysql&gt;change master to</code>

<code>master_host=</code><code>'10.0.2.6'</code><code>,</code>

<code>master_user=</code><code>'repl'</code><code>,</code>

<code>master_password=</code><code>'*****'</code><code>,</code>

<code>master_port=3306,</code>

<code>master_log_file=</code><code>'mysql-bin.000019'</code><code>,</code>

<code>master_log_pos=1856541;</code>

====================================

GTID模式下,則還需要多做一步,就是執行那個語句,設定gtid編号,用來告訴主庫,我這些語句執行過了,

<code>mysql&gt;SET @@GLOBAL.GTID_PURGED=</code><code>'16fdabc7-30f9-11e6-9234-0800273e5680:1-3216'</code><code>;</code>

就是跳過之前已經複制過的事務,因為GTID記錄的事務是從1開始的,隻會增加或變更UUID,不會重置計數器,是以就要手動設定跳過之前執行過(已經在備份裡的結果)的事務.然後change master to一下,

<code>master_user=</code><code>'root'</code><code>,</code>

<code>master_password=</code><code>'123123'</code><code>,</code>

<code>MASTER_AUTO_POSITION = 1;</code>

在這一步GTID簡單很多,這也是為什麼越來越多人用的原因,已經不用理會pos跑到哪裡,他會自己去找.

要注意的是,主庫開了GTID複制模式,從庫就用不了舊的模式來做複制了,會提示報錯,是以從庫必須也使用GTID模式來做從庫才可以.

======================================

<code>然後啟動從庫複制</code>

<code>mysql&gt;start slave;</code>

<code>最後檢查一下</code>

<code>mysql&gt;show slave status\G</code>

<code>          </code><code>Master_Log_File: mysql-bin.000019</code>

<code>          </code><code>Read_Master_Log_Pos: 4980238</code>

<code>               </code><code>Relay_Log_File: pingtest1-relay-bin.000002</code>

<code>                </code><code>Relay_Log_Pos: 3124105</code>

<code>        </code><code>Relay_Master_Log_File: mysql-bin.000019</code>

<code>             </code><code>Slave_IO_Running: Yes</code>

<code>            </code><code>Slave_SQL_Running: Yes</code>

<code>                    </code><code>.</code>

<code>          </code><code>Exec_Master_Log_Pos: 4980238</code>

<code>        </code><code>Retrieved_Gtid_Set: 16fdabc7-30f9-11e6-9234-0800273e5680:3217-4885</code>

<code>            </code><code>Executed_Gtid_Set: 16fdabc7-30f9-11e6-9234-0800273e5680:1-4885</code>

如何證明主從複制正常了呢?主要看下面這些值:

Slave_IO_Running和Slave_SQL_Running的雙yes:    證明io線程和sql線程都正常,如果不是雙yes,這個主從複制架構就是失敗的,不能使用。

Master_Log_File=Relay_Master_Log_File:     證明從庫執行的binlog檔案和主庫的是一緻的,不一緻就是不同步了,有一定延時,但還可以用,關鍵看你能不能接受這個延時(跨binlog檔案一般算比較大的延時了)。

Read_Master_Log_Pos=Exec_Master_Log_Pos:    證明從庫執行binlog的pos位置是和主庫一緻的,如果是操作太頻繁的庫,有一些不一緻是正常的,如果太大,就代表資料有延時,但不影響從庫使用。

Seconds_Behind_Master:    表示slave上SQL thread與IO thread之間的延遲,也就是看到還有多少資料還沒寫進去。在MySQL的複制環境中,slave先從master上将binlog拉取到本地(通過IO thread),然後通過SQL thread将binlog重放,而Seconds_Behind_Master表示本地relaylog中未被執行完的那部分的內插補點。

因為我資料比較少,很容易就追上了,看不到差異,但是可以很肯定和你們說,我主庫沒停過應用服務,然後從庫就做好了。

再看看主庫上面的線程如何

<code>mysql&gt;show processlist;</code>

<code>9172 | root  | 10.0.2.5:57506  | NULL | Binlog Dump GTID |   75 | Master has sent all binlog to slave; waiting </code><code>for</code> <code>binlog to be updated</code>

線程也在,可以确定整套複制都正常了.

xtrabackup方式

也正如我開頭說的,某些庫很大,幾十G幾百G什麼的也不用很意外,如果還用mysqldump就不科學了,導出導入耗費時間巨大,這個時候就必須靠xtrabackup這種實體拷貝的備份還原工具,加快速度進行,另一方面來說,從備份原理得出的結果來看,mysqldump備份得到的結果是備份開始時間的資料結果,而xtrabackup備份得到的結果是備份結束時間的資料結果,是屬于比較新的資料,對于操作頻繁的庫用xtrabackup來做也是優勢明顯.

第一步目的和上面一緻,隻是用了軟體,而用xtrabackup恢複不需要初始化mysql(以下操作,先在主庫操作,後在從庫操作)

至于怎麼安裝xtrabackup就不多說了,各位可以看我另一篇文章,介紹怎麼安裝xtrabackup和介紹怎麼使用xtrabackup,指令我就簡單貼出來,然後說一下用途就算了.

先在主庫備份全庫(想隻備份特定庫的還請自己想辦法,這裡就不延伸了)

<code>innobackupex --defaults-</code><code>file</code><code>=</code><code>"/usr/local/mysql/my.cnf"</code>  <code>--user=root --password=</code><code>'123123'</code> <code>--stream=</code><code>tar</code>  <code>"/data/ttt"</code> <code>2&gt; </code><code>/data/ttt/backup</code><code>.log | </code><code>gzip</code> <code>&gt; </code><code>/data/ttt/test2</code><code>.tgz</code>

意思就是把/usr/local/mysql/my.cnf配置檔案裡标明的全庫拷貝出來,并通過gzip壓縮成一個檔案.

拷貝到從庫機器

<code>scp</code>  <code>-o StrictHostKeyChecking=no [email protected]:</code><code>/data/ttt/test2</code><code>.tgz ./</code>

然後在從庫伺服器操作,拷貝到一個檔案夾解壓

<code>mkdir</code> <code>test2back</code>

<code>mv</code> <code>test2.tgz test2back/</code>

<code>cd</code> <code>test2back/</code>

<code>tar</code> <code>xf test2.tgz</code>

在從庫開始恢複備份

<code>#關閉mysql服務</code>

<code>/etc/init</code><code>.d</code><code>/mysqld</code> <code>stop</code>

<code>#先删了舊的資料檔案</code>

<code>#然後先apply-log</code>

<code>innobackupex --defaults-</code><code>file</code><code>=</code><code>'/usr/local/mysql/my.cnf'</code> <code>--apply-log </code><code>/data/ttt/test2back/</code>

<code>#然後開始恢複</code>

<code>innobackupex --defaults-</code><code>file</code><code>=</code><code>'/usr/local/mysql/my.cnf'</code> <code>--copy-back </code><code>/data/ttt/test2back/</code>

<code>#恢複完成後看一下,做完收尾工作</code>

<code>ll </code><code>/data/mysql/data</code>

<code>chown</code> <code>-R mysql.mysql data/</code>

<code>#啟動mysql服務</code>

<code>/etc/init</code><code>.d</code><code>/mysqld</code> <code>start</code>

<code>#嘗試登陸一下,ok就完成了</code>

<code>mysql -uroot -p123123</code>

相對來說,速度快了一些,操作也還是簡單一些,就是多安裝了一個軟體.

實際上和上面用mysqldump的思維是一樣,因為xtrabackup備份完成時會生成一個檔案xtrabackup_binlog_info,裡面就記錄了binlog位置和GTID值,故而也能做到不停應用服務來做主從,而且用xtrabackup資料還比較新.

我們來打開這個檔案看一下

<code>vim xtrabackup_binlog_info</code>

<code>mysql-bin.000020        8454162 16fdabc7-30f9-11e6-9234-0800273e5680:1-22037</code>

非常直覺,就這三個值,如果你還有興趣留意,其實xtrabackup_info也有記錄,不過兩者還是有一些差異.

大多數時候用xtrabackup_binlog_info就可以了,但是特殊情況下用xtrabackup_binlog_pos_innodb會好一些,因為xtrabackup_binlog_info中記錄的位置包含非innodb引擎的資料變化位置,但是對于innodb引擎,redo log裡邊本身是包含了binlog pos的,如果你apply log,那麼事務的前滾,復原可能造成這個位置有變動,如果你是做主備複制,複制搭建之後,同步的資料包含非innodb表,那這個xtrabackup_binlog_pos_innodb中的位置就不可靠,反之如果你的同步不涉及到非innodb表,那麼可以使用它。

也正如我上面第二步說的,備份恢複完之後,這個從庫就可以用了,設定的方法也和上面mysqldump沒差别,如果是非GTID的話,直接change master to 就可以用了,

<code>master_log_file=</code><code>'mysql-bin.000020'</code><code>,</code>

<code>master_log_pos=8454162;</code>

如果是GTID模式的話,那就先set一下,跳過之前已經執行過的事務

<code>mysql&gt;SET @@GLOBAL.GTID_PURGED=</code><code>'16fdabc7-30f9-11e6-9234-0800273e5680:1-22037'</code><code>;</code>

然後看一下狀态

<code>mysql&gt; show variables like </code><code>'%gtid%'</code><code>;</code>

<code>gtid_purged                     | 16fdabc7-30f9-11e6-9234-0800273e5680:1-22037 |</code>

再執行change master to 來完成

然後啟動從庫複制

<code>          </code><code>Master_Log_File: mysql-bin.000020</code>

<code>                </code><code>Relay_Log_Pos: 17522575</code>

<code>        </code><code>Relay_Master_Log_File: mysql-bin.000020</code>

<code>          </code><code>Exec_Master_Log_Pos: 17522575</code>

<code>        </code><code>Retrieved_Gtid_Set: 16fdabc7-30f9-11e6-9234-0800273e5680:22038-26950</code>

<code>            </code><code>Executed_Gtid_Set: 16fdabc7-30f9-11e6-9234-0800273e5680:1-26950</code>

還是太快,看不到差異,不過可以肯定複制是完成了,主從架構完成,主庫依然沒有停過.

<code>32718 | root  | 10.0.2.5:54224  | NULL | Binlog Dump GTID |   162 | Master has sent all binlog to slave; waiting </code><code>for</code> <code>binlog to be updated</code>

擴充閱讀:

說起了主從複制延時,就不得不強調,一般的主從複制,是屬于異步複制的,即主庫不需要理會從庫是否執行,或者知否追得上複制的速度,隻管自己跑,如果有漏了什麼也是不管的,這也是我們常說的主從不一緻的根本原因。

為了解決這個問題,就有了半同步複制,和完全同步複制的概念。

半同步的意思是一個事務在主庫執行完還不行,必須在至少一個從庫成功寫入資料,事務才算真正送出成功,而其他還沒寫入的從庫則執行異步操作,後續再寫入。這時主庫不能再把從庫狀态棄之不顧,必須知道至少一個從庫寫入成功才能完成,減少複制失敗的事情,但風險還有一些,因為還有一些異步複制的從庫。

完全同步就更加嚴格,要所有從庫傳回寫入成功,這個事務才能算送出成功,嚴格來說,隻有一台從庫的半同步架構,也和完全同步的概念相等。

實作半同步的方式很簡單,mysql有自帶半同步插件,隻是一般沒有使用,我的另一篇文章有說明,配置起來也不難。

實作完全同步方式則大多數是靠叢集軟體實作,例如很出名的PXC叢集軟體,必須所有主從都要寫入成功,事務才算送出完成。

但是論性能,半同步和完全同步,必然會比異步降低得很明顯,資料一緻性要求和系統性能,永遠都是背道而馳。

問題彙總:

    有些朋友做的從庫,可能有一種情況,就是除同步賬戶外,本身并不知道主庫的其他使用者密碼,這就造成一種尴尬的情況,如果需要管理從庫的時候,就顯得很不友善,是以逼着要去破解從庫的密碼.

    還有另一種情況,就是主庫和從庫版本不一緻,資料表結構可能會有一些版本造成的差異,如果主庫這些表有更改,就會在從庫報錯,算是一個隐性坑,是以我們最好忽略這些表或庫的同步語句.

 1.   先來看怎麼破解密碼:

<code>#先關閉mysql</code>

<code>#進入安全模式</code>

<code>/usr/local/mysql/bin/mysqld_safe</code> <code>--skip-grant-tables --skip-networking&amp;</code>

<code>#此時就免密碼登陸了</code>

<code>/usr/local/mysql/bin/mysql</code> <code>-uroot</code>

<code>#更改密碼,密碼和使用者可選,</code>

<code>#這是5.6及之前的方式</code>

<code>update mysql.user </code><code>set</code> <code>password=PASSWORD(</code><code>'新密碼'</code><code>) where user=</code><code>'root'</code> <code>and host=</code><code>'root'</code> <code>or host=</code><code>'localhost'</code><code>or host=</code><code>'localhost.localdomain'</code><code>or host=</code><code>'127.0.0.1'</code><code>;</code>

<code>#5.7之後要用新的字段</code>

<code>update mysql.user </code><code>set</code> <code>authentication_string=password(</code><code>'新密碼'</code><code>) where user=</code><code>'root'</code>

<code>#重新整理政策</code>

<code>flush privileges;</code>

<code>#重新開機mysql</code>

<code>/etc/init</code><code>.d</code><code>/mysqld</code> <code>restart</code>

<code>#正常登陸</code>

<code>/usr/local/mysql/bin/mysql</code> <code>-uroot  -p</code><code>'新密碼'</code>

<code>#如果有需要就更新下版本,例如5.6主庫,5.7主庫這種情況</code>

<code>mysql_upgrade --defaults-</code><code>file</code><code>=</code><code>/usr/local/mysql/my</code><code>.cnf -uroot -p</code><code>'新密碼'</code> <code>-h127.0.0.1</code>

<code>#測試功能是否正常</code>

<code>mysql&gt; show databases;</code>

2.    然後是第二種情況,忽略某些表和庫的同步,忽略同步的方式可以在主庫做,也可以在從庫做,不過從一些解析起來很麻煩的坑來說(這裡就不說太多了),在從庫做是最好的.

<code>#在5.6版本之前需要在配置檔案my.cnf操作,當然是要重新開機才生效</code>

<code>vim </code><code>/usr/local/mysql/my</code><code>.cnf</code>

<code>#隻執行某個庫或某個表的同步語句</code>

<code>replicate_wild_do_table=</code><code>test</code><code>.%,mysql.user</code>

<code>#忽略掉某個庫或某個表的同步語句</code>

<code>replicate_wild_ignore_table=mysql.%,</code><code>test</code><code>.fucking</code>

<code>#在5.7之後的版本,新加入了一個動态修改的指令,不用重新開機了</code>

<code>#這次不用理會配置檔案了,當然後面加一下我覺得還是有必要,避免重新開機後還原的報錯</code>

<code>mysql &gt; change replication filter replicate_wild_do_table=(</code><code>''</code><code>test</code><code>.%</code><code>','</code><code>'mysql.user'</code><code>);</code>

<code>mysql &gt; change replication filter replicate_wild_ignore_table=(</code><code>''</code><code>test</code><code>.%</code><code>','</code><code>'mysql.user'</code><code>);</code>

    提醒下,忽略同步的庫和表要走心,考慮多一些情況.

3. 在停止多元複制環境時要注意并行複制的進度,例如出現下面這種情況,就先等一等再停止。

<code>#請關注Executed_Gtid_Set:項</code>

<code>show slave status\G</code>

<code>    </code><code>.</code>

<code>             </code><code>Master_Server_Id: 2721321239</code>

<code>                  </code><code>Master_UUID: 4cdc2a74-6299-11e6-95ce-008cfaf595bc</code>

<code>             </code><code>Master_Info_File: mysql.slave_master_info</code>

<code>                    </code><code>SQL_Delay: 0</code>

<code>          </code><code>SQL_Remaining_Delay: NULL</code>

<code>      </code><code>Slave_SQL_Running_State: Reading event from the relay log</code>

<code>           </code><code>Master_Retry_Count: 86400</code>

<code>                  </code><code>Master_Bind: </code>

<code>      </code><code>Last_IO_Error_Timestamp: </code>

<code>     </code><code>Last_SQL_Error_Timestamp: </code>

<code>               </code><code>Master_SSL_Crl: </code>

<code>           </code><code>Master_SSL_Crlpath: </code>

<code>           </code><code>Retrieved_Gtid_Set: 4cdc2a74-6299-11e6-95ce-008cfaf595bc:50007036-50049107</code>

<code>            </code><code>Executed_Gtid_Set: 09cb91bf-2669-11e7-8b70-00163e0835ff:1-47551250,</code>

<code>3edae34c-6299-11e6-95cd-8038bc0c67be:1-6758,</code>

<code>4cdc2a74-6299-11e6-95ce-008cfaf595bc:1-50010063:50010080-50010093:50010099-50010101:50010108:50010130-50010139:50010145-50010148:50010158:50010179-50010184:50010190-50010200:50010207:50010215-50010221:50010227-50010236:50010243:50010276-50010285:50010291-50010293:50010300:50010308-50010312:50010326-50010328:50010371-50010373:50010391-50010393:50010403-50010405:50010427-50010429:50010464-50010466:50010480-50010482:50010490-50010496:50010518-50010520:50010538-50010540:50010551-50010553:50010574</code>

<code>                </code><code>Auto_Position: 1</code>

<code>         </code><code>Replicate_Rewrite_DB: </code>

<code>                 </code><code>Channel_Name: al_rds</code>

<code>           </code><code>Master_TLS_Version: </code>

<code>*************************** 2. row ***************************</code>

<code>               </code><code>Slave_IO_State: Waiting </code><code>for</code> <code>master to send event</code>

那是因為你這麼一停止,并行複制就中途停止了,就有可能出現有些資料復原不了,或者有些資料複制錯誤,然後後續你還想把他起來就很大可能會報錯了,是以甯願先等一等,再停止。

當然了,如果是線上環境,究竟要等到什麼時候?是以最好就是資料庫不繁忙的時候再做。要麼,你就是準備好重做的心态了,那就來吧。

     本文轉自arthur376 51CTO部落格,原文連結:http://blog.51cto.com/arthur376/1792551,如需轉載請自行聯系原作者

上一篇: git筆記
下一篇: Spring MVC應用