[MySQL] 數據庫複製異常恢復之使用mysqldump導數據

環境:兩臺服務器雙機備份,數據庫採用主主複製(以下主機指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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章