環境:兩臺服務器雙機備份,數據庫採用主主複製(以下主機指HA集羣的主機)
1、停止 HA 集羣服務
2、分別在主、備機上關閉 MySQL 主從複製和 MySQL 事件調度器。
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)
mysql> stop slave io_thread;
Query OK, 0 rows affected (0.07 sec)
mysql> set global event_scheduler=0;
Query OK, 0 rows affected (0.00 sec)
mysql> select @@event_scheduler;
+-------------------+
| @@event_scheduler |
+-------------------+
| OFF |
+-------------------+
1 row in set (0.00 sec)
3、使用mysqldump導出主機數據庫裏的數據。
說明:可以使用一個腳本封裝導出、導入數據的命令。
4、以 root 用戶分別登錄主、備機,清空主、備數據庫中的數據。
說明:可以導入一個初始建庫.sql腳本
5、把主、備機上的 MySQL 數據庫的日誌清空。
# rm -rf mysql-bin.*
# rm -rf *relay-bin*
6、重啓主、備機上的 MySQL。
7、MySQL 啓動後,分別關閉主、備機上 MySQL 的事件調度器,並重置和開啓 MySQL 的主從複製。
mysql> set global event_scheduler=0;
Query OK, 0 rows affected (0.00 sec)
mysql> select @@event_scheduler;
+-------------------+
| @@event_scheduler |
+-------------------+
| OFF |
+-------------------+
1 row in set (0.00 sec)
mysql> reset slave;
Query OK, 0 rows affected (0.00 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
8、檢查主、備機 MySQL 數據庫的同步狀態,正常則開始執行數據導入。
9、在主機上使用mysqldump導入步驟3 導出的數據,此時備機會自動同步主機數據庫中導入的數據。
10、檢查主、備機 MySQL 數據同步狀態,確認主、備機數據庫狀態爲如下顯示。
mysql> show slave status\G;
(返回內容有省略,關注以下行即可)
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
11、分別在主、備機上打開 MySQL 的事件調度器。
mysql> set global event_scheduler=1;
Query OK, 0 rows affected (0.00 sec)
mysql> select @@event_scheduler;
+-------------------+
| @@event_scheduler |
+-------------------+
| ON |
+-------------------+
1 row in set (0.00 sec )
12、在主機上啓動 HA 集羣服務。
附:步驟3和9,使用mysqldump導出、導入數據可以使用一個腳本完成(遍歷所有表、打印日誌),如下ImExportData.sh
#!/bin/bash
MYSQL_PATH='/somedir/mysql/bin/'
getTime(){
timestamp=`date +'%Y-%m-%d %H:%M:%S'`
echo "[$timestamp]: "
}
exportAction(){
exportPath=$1
echo "Exporting table..."
if [ ! -d $exportPath ]; then
mkdir -p $exportPath
echo "`getTime`make file path $exportPath"
fi
for tableName in 'tbl tbl2 tbl3'
do
echo "`getTime`Exporting table $tableName"
$MYSQL_PATH/mysqldump -u$user -p$pwd -q -e somedb $tableName > $exportPath/${tableName// /#}.sql 2>/dev/null
echo "`getTime`Exporting table $tableName done"
done
echo "Export table done"
}
importAction(){
importPath=$1
echo "Importing table..."
if [ ! -d $importPath ]; then
echo "`getTime`can not find $importPath"
return
fi
allFiles=`ls $importPath`
for file in $allFiles
do
table=${file//#/ }
table=${table/%.sql/}
echo "`getTime`Importing table $table"
$MYSQL_PATH/mysql -u$user -p$pwd somedb < $importPath/$file 2>/dev/null
echo "`getTime`Importing table $table done"
done
}
printHelp(){
echo "Usage: ./ImportExportData.sh <dbuser> <dbpasswd> <operation> <filePath>"
echo " <operation> : import (insert the exported data to db)"
echo " : export (dump the data from db)"
echo " <filePath> : data file path"
}
#check user validation
user=`whoami`
if [ "$user" != "root" ]; then
echo "The login user should be root."
exit
fi
#check db status
dbpid=`ps -ef | grep mysqld| grep -v grep | grep -v mysqld_safe | awk '{print $2}'`
if [ "$dbpid" == "" ];then
echo "mysqld isn't running, please start it..."
exit
fi
user=$1
passwd=$2
op=$3
path=$4
if [ "$op" == "export" -a "$path" != "" ]; then
exportAction $path
elif [ "$op" == "import" -a "$path" != "" ]; then
importAction $path
else
printHelp
fi