MySQL主從同步錯誤狀況下的全量備份恢復

一個Web系統有一主兩從的小型MySQL集羣,經過Amoeba調度。近日發現主從之間的同步發生異常,從庫沒法更新數據。試了多種方法沒法恢復後,決定從新創建從庫數據。方法以下。mysql

假設主庫爲server1,兩個從庫爲server2和server3sql

主庫server1的IP地址是192.168.0.2數據庫

從庫server2的IP地址是192.168.0.3bash

從庫server3的IP地址是192.168.0.4服務器

1、中止Amoeba的主從調度,將全部數據庫讀寫導向主庫server1app

進入Amoeba的conf目錄,打開dbServers.xml文件socket

<amoeba:dbServers xmlns:amoeba="http://amoeba.meidusa.com/">

		<!-- 
			Each dbServer needs to be configured into a Pool,
			If you need to configure multiple dbServer with load balancing that can be simplified by the following configuration:
			 add attribute with name virtual = "true" in dbServer, but the configuration does not allow the element with name factoryConfig
			 such as 'multiPool' dbServer   
		-->
		
	<dbServer name="abstractServer" abstractive="true">
		<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
			<property name="connectionManager">${defaultManager}</property>
			<property name="sendBufferSize">640</property>
			<property name="receiveBufferSize">1280</property>
				
			<!-- mysql port -->
			<property name="port">3306</property>
			
			<!-- mysql schema -->
			<property name="schema">appdb</property>
			
			<!-- mysql user -->
			<property name="user">amoeba</property>
			
			<property name="password">moocsakai</property>
		</factoryConfig>

		<poolConfig class="com.meidusa.toolkit.common.poolable.PoolableObjectPool">
			<property name="maxActive">1200</property>
			<property name="maxIdle">500</property>
			<property name="minIdle">100</property>
			<property name="minEvictableIdleTimeMillis">600000</property>
			<property name="timeBetweenEvictionRunsMillis">600000</property>
			<property name="testOnBorrow">true</property>
			<property name="testOnReturn">true</property>
			<property name="testWhileIdle">true</property>
		</poolConfig>
	</dbServer>

	<dbServer name="server1"  parent="abstractServer">
		<factoryConfig>
			<!-- mysql ip -->
			<property name="ipAddress">192.168.0.2</property>
		</factoryConfig>
	</dbServer>
	
	<dbServer name="server2"  parent="abstractServer">
		<factoryConfig>
			<!-- mysql ip -->
			<property name="ipAddress">192.168.0.3</property>
		</factoryConfig>
	</dbServer>
			 
	<dbServer name="server3"  parent="abstractServer">
		<factoryConfig>
			<property name="ipAddress">192.168.0.4</property>
		</factoryConfig>
	</dbServer>
	
	<dbServer name="multiPool" virtual="true">
		<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
			<!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
			<property name="loadbalance">1</property>
			
			<!-- Separated by commas,such as: server1,server2,server1 -->
			<property name="poolNames">server2,server3</property>
		</poolConfig>
	</dbServer>
		
</amoeba:dbServers>

定位到XML文件內容<dbServer name="multiPool" virtual="true">位置,將其中的server2,server3改成server1,server2後,保存xml文件,再進入Amoeba的bin目錄使用以下命令重啓amoeba.net

./shutdown
./launcher

通過這一步驟後,Amoeba將全部的讀寫請求定向到server1,server2和server3被旁路開了。日誌

2、備份主庫server1code

進入server1,使用以下命令備份主庫的日誌到目錄/mooc/databackup

innobackupex --user=root --password=abc /mooc/databackup/ -socket=/tmp/mysql.sock

備份成功後,會在目錄/mooc/databackup下生成新的目錄2016-07-15_12-29-39,其中包含了數據庫中全部數據操做日誌文件

3、全量恢復從庫server2和server3。以server2爲例,server3方法相同

一、拷貝主庫的備份日誌文件到從庫某目錄下,假設/moocmysql

scp -r /mooc/databackup/2016-07-15_12-29-39 root@server2:/moocmysql

二、登陸到從庫server2機器,將日誌文件在從庫恢復

innobackupex  --defaults-file=/etc/my.cnf  --apply-log /moocmysql/2016-07-15_12-29-39

三、中止從庫服務器,並刪除其中全部數據,假設server2的數據保存在/moocmysql/data目錄下

service mysqld stop
rm -rf /moocmysql/data/*

四、全量恢復從庫的數據到/moocmysql/data/

innobackupex --defaults-file=/etc/my.cnf --copy-back /mooc/databackup/2016-07-15_12-29-39

五、設置數據訪問權限

chown -R mysql:mysql /moocmysql/data

六、啓動mysql

service mysqld start

七、找到本次全量更新的新的同步點

cat /moocmysql/data/xtrabackup_binlog_pos_innodb

返回兩個信息

master-bin.000297    248684412

八、進入mysql的控制檯,設置新的同步點爲這兩個信息

中止slave

stop slave;

改變同步參數

change master to master_host='10.128.18.162',master_user='mooc2',master_password='moocsakai',master_log_file='master-bin.000297',master_log_pos=248684412;

啓動slave

start slave

查看主從設置狀態

show slave status\G;

看到信息Slave_IO_Running: Yes和Slave_SQL_Running: Yes就表示設置成功了。

4、恢復Amoeba的主從調度,修改dbServer.xml,定位到XML文件內容<dbServer name="multiPool" virtual="true">位置,將其中的server1,server1改回server2,server3後,保存xml文件,再進入Amoeba的bin目錄使用以下命令重啓amoeba

./shutdown
./launcher

至此,操做應該完成。

 

注意可能發生的錯誤

若是啓動mysql從庫時報錯pid不存在,則應作以下查看:

一、查看經過scp命令拷貝數據的時候,是否全部日誌文件都所有拷貝完成,能夠經過比較文件個數和目錄大小查看。

二、查看是否修改了數據的訪問權限

相關文章
相關標籤/搜索