數據備份&還原
- 說明
- 執行
- db_backup_cover.sh腳本
說明
- 環境準備:來源數據庫(服務器A);目標數據庫(服務器B)
- dbInfo.sh腳本記錄基本信息
-
來源庫、目標庫的ip、port及執行路徑
# MySQL 客戶端和 mysqldump 的路徑 MYSQL_CLIENT="/work/oracle/mysql-8.4.4/bin/mysql" MYSQL_DUMP="/work/oracle/mysql-8.4.4/bin/mysqldump"# 源數據庫信息 source_ip="17.2.10.166" source_port="3308"# 目標數據庫信息 target_ip="17.2.10.167" target_port="3308"
-
- db_backup_cover.sh腳本步驟
- 登錄源庫,需要手動輸入賬戶,給出指令是否繼續執行
- 鎖定原理庫
- dump導出指定庫數據,忽略視圖和日志表能
- 登目標庫,需要手動輸入賬戶,給出指令是否繼續執行
- 如果數據量大,執行source會花費些時間
執行
db_backup_cover.sh腳本
```
#!/bin/bash# 備份文件名
current_date=$(date +%F)
system_ip=$(hostname -I | awk '{print $1}') # 獲取系統的主IP地址# 加載配置文件
if [ -f "dbInfo.sh" ]; thensource dbInfo.sh
elseecho "配置文件 config.sh 不存在!"exit 1
fi# 打印配置文件中的變量值
echo "--------------------------------------------------"
echo "配置文件變量:"
echo "MySQL 客戶端路徑: ${MYSQL_CLIENT}"
echo "mysqldump 路徑: ${MYSQL_DUMP}"
echo "源數據庫 IP: ${source_ip}"
echo "源數據庫端口: ${source_port}"
echo "目標數據庫 IP: ${target_ip}"
echo "目標數據庫端口: ${target_port}"
echo "--------------------------------------------------"# 函數:等待用戶確認
wait_for_confirmation() {read -p "請輸入 yes 繼續或 no 取消: " confirmif [ "$confirm" != "yes" ]; thenecho "操作已取消。"unlock_tablesexit 1fi
}# 函數:解鎖數據庫
unlock_tables() {echo "正在解鎖數據庫..."${MYSQL_CLIENT} -h "${source_ip}" -P "${source_port}" -u "${source_user}" -p"${source_password}" -e "UNLOCK TABLES;"if [ $? -ne 0 ]; thenecho "解鎖數據庫失敗!"elseecho "數據庫已解鎖。"fi
}# 輸入源數據庫用戶名和密碼
read -p "請輸入源數據庫用戶名: " source_user
read -s -p "請輸入源數據庫密碼: " source_password
echo# 1. 鎖定數據庫
echo "準備執行 FLUSH TABLES WITH READ LOCK 鎖定數據庫..."
wait_for_confirmation${MYSQL_CLIENT} -h "${source_ip}" -P "${source_port}" -u "${source_user}" -p"${source_password}" -e "FLUSH TABLES WITH READ LOCK;"
if [ $? -ne 0 ]; thenecho "鎖定數據庫失敗!"exit 1
fi
echo "數據庫已成功鎖定。"# 2. 備份Dev數據表及數據
echo "準備開始備份Dev數據..."
wait_for_confirmationbackup_file="/home/sie-srmdb-${source_port}-${system_ip}-${current_date}.sql"${MYSQL_DUMP} -h "${source_ip}" -P "${source_port}" -u "${source_user}" -p"${source_password}" \
--single-transaction \
--quick \
--add-drop-table \
--set-gtid-purged=OFF \
--compression-algorithms=zlib \
--ignore-table=db-dev.operate_logs \
--ignore-table=db-dev.test_view \
--databases db-dev > "${backup_file}"# 檢查備份是否成功
if [ $? -ne 0 ]; thenecho "備份Dev數據失敗!"unlock_tablesexit 1
fi
echo "備份Dev數據完成,文件已保存到: ${backup_file}"# 此時不解鎖數據庫,以便建立復制關系
echo "數據庫保持鎖定狀態,以便建立復制關系。"# 準備目標數據庫信息
echo "備份成功,準備登錄目標數據庫進行數據覆蓋。"
read -p "請輸入目標數據庫用戶名: " target_user
read -s -p "請輸入目標數據庫密碼: " target_password
echo
read -p "執行前請再次確認,輸入 yes 繼續: " confirm
if [ "$confirm" != "yes" ]; thenecho "操作已取消。"unlock_tablesexit 1
fi# 登錄目標數據庫并切換數據庫
echo "準備登錄目標數據庫并切換數據庫..."
wait_for_confirmation# 登錄目標數據庫并切換數據庫
# 在 << EOF 和 EOF 之間的內容將作為 mysql 客戶端的輸入,即要執行的 SQL 命令
read -p "請輸入要切換的數據庫名: " target_db
${MYSQL_CLIENT} -h "$target_ip" -P "$target_port" -u "$target_user" -p"$target_password" << EOF
USE $target_db;
SOURCE $backup_file;
EOFif [ $? -ne 0 ]; thenecho "切換數據庫或執行 source 命令失敗!"unlock_tablesexit 1
fi
echo "數據庫切換成功且備份數據已導入到目標數據庫。"echo "操作完成!數據庫保持鎖定狀態,記得在建立好復制關系后手動解鎖。"```