使用腳本遷移MySQL數(shù)據(jù)庫的完整代碼及使用說明
腳本源碼
#!/bin/bash
# 數(shù)據(jù)庫遷移腳本 - 導出MySQL數(shù)據(jù)庫并導入到新機器
# 支持可配置的數(shù)據(jù)庫列表和目標服務器IP地址
# 默認配置
SOURCE_HOST="127.0.0.1"
SOURCE_USER="user"
SOURCE_PASS="password"
TARGET_HOST="127.0.0.1"
TARGET_USER="user"
TARGET_PASS="password"
DB_LIST=("net" "event" "scd" "stgy" "web")
BACKUP_DIR="/tmp/mysql_backup_$(date +%Y%m%d_%H%M%S)"
COMPRESS=true
# 幫助信息
show_help() {
echo "用法: $0 [選項]"
echo "選項:"
echo " -s, --source-host 源數(shù)據(jù)庫主機地址 (默認: $SOURCE_HOST)"
echo " -u, --source-user 源數(shù)據(jù)庫用戶名 (默認: $SOURCE_USER)"
echo " -p, --source-pass 源數(shù)據(jù)庫密碼"
echo " -t, --target-host 目標數(shù)據(jù)庫主機地址 (默認: $TARGET_HOST)"
echo " -U, --target-user 目標數(shù)據(jù)庫用戶名 (默認: $TARGET_USER)"
echo " -P, --target-pass 目標數(shù)據(jù)庫密碼"
echo " -d, --databases 要遷移的數(shù)據(jù)庫列表,用逗號分隔 (默認: net,event,scd,stgyweb)"
echo " -o, --output-dir 備份目錄 (默認: /tmp/mysql_backup_時間戳)"
echo " -c, --compress 是否壓縮備份文件 (true/false,默認: true)"
echo " -h, --help 顯示此幫助信息"
echo " --export-only 僅導出數(shù)據(jù)庫,不導入"
echo " --import-only 僅導入數(shù)據(jù)庫(需指定備份目錄)"
echo ""
echo "示例:"
echo " # 使用默認配置導出導入所有數(shù)據(jù)庫到本地"
echo " $0"
echo ""
echo " # 導出到指定IP的服務器"
echo " $0 --target-host 192.168.1.100 --target-user admin --target-pass password"
echo ""
echo " # 僅導出特定數(shù)據(jù)庫"
echo " $0 --databases net,event --export-only"
echo ""
echo " # 僅導入特定備份目錄"
echo " $0 --import-only --output-dir /tmp/mysql_backup_20230101_120000"
}
# 解析命令行參數(shù)
while [[ $# -gt 0 ]]; do
case $1 in
-s|--source-host)
SOURCE_HOST="$2"
shift 2
;;
-u|--source-user)
SOURCE_USER="$2"
shift 2
;;
-p|--source-pass)
SOURCE_PASS="$2"
shift 2
;;
-t|--target-host)
TARGET_HOST="$2"
shift 2
;;
-U|--target-user)
TARGET_USER="$2"
shift 2
;;
-P|--target-pass)
TARGET_PASS="$2"
shift 2
;;
-d|--databases)
IFS=',' read -r -a DB_LIST <<< "$2"
shift 2
;;
-o|--output-dir)
BACKUP_DIR="$2"
shift 2
;;
-c|--compress)
COMPRESS="$2"
shift 2
;;
-h|--help)
show_help
exit 0
;;
--export-only)
EXPORT_ONLY=true
shift
;;
--import-only)
IMPORT_ONLY=true
shift
;;
*)
echo "未知選項: $1"
show_help
exit 1
;;
esac
done
# 檢查必要的工具
check_requirements() {
if ! command -v mysqldump &> /dev/null; then
echo "錯誤: 未找到 mysqldump 命令,請安裝 MySQL 客戶端工具。"
exit 1
fi
if ! command -v mysql &> /dev/null; then
echo "錯誤: 未找到 mysql 命令,請安裝 MySQL 客戶端工具。"
exit 1
fi
if [ "$COMPRESS" = true ] && ! command -v gzip &> /dev/null; then
echo "警告: 未找到 gzip 命令,將不壓縮備份文件。"
COMPRESS=false
fi
}
# 導出數(shù)據(jù)庫
export_databases() {
echo "開始導出數(shù)據(jù)庫..."
echo "源數(shù)據(jù)庫主機: $SOURCE_HOST"
echo "數(shù)據(jù)庫列表: ${DB_LIST[*]}"
echo "備份目錄: $BACKUP_DIR"
# 創(chuàng)建備份目錄
mkdir -p "$BACKUP_DIR"
# 導出每個數(shù)據(jù)庫
for db in "${DB_LIST[@]}"; do
echo "正在導出數(shù)據(jù)庫: $db"
# 構建導出命令
EXPORT_CMD="mysqldump -h $SOURCE_HOST -u $SOURCE_USER"
if [ -n "$SOURCE_PASS" ]; then
EXPORT_CMD="$EXPORT_CMD -p$SOURCE_PASS"
fi
# 添加--databases選項來包含創(chuàng)建數(shù)據(jù)庫的語句
EXPORT_CMD="$EXPORT_CMD --databases $db"
# 添加一些常用的選項
EXPORT_CMD="$EXPORT_CMD --single-transaction --routines --triggers --events"
# 根據(jù)是否壓縮構建完整命令
if [ "$COMPRESS" = true ]; then
EXPORT_CMD="$EXPORT_CMD | gzip > $BACKUP_DIR/${db}.sql.gz"
echo "執(zhí)行: $EXPORT_CMD"
eval "$EXPORT_CMD"
else
EXPORT_CMD="$EXPORT_CMD > $BACKUP_DIR/${db}.sql"
echo "執(zhí)行: $EXPORT_CMD"
eval "$EXPORT_CMD"
fi
# 檢查導出是否成功
if [ $? -eq 0 ]; then
echo "數(shù)據(jù)庫 $db 導出成功。"
else
echo "錯誤: 數(shù)據(jù)庫 $db 導出失??!"
export_errors=true
fi
done
# 生成配置文件記錄導出信息
cat > "$BACKUP_DIR/backup_info.txt" << EOF
備份時間: $(date '+%Y-%m-%d %H:%M:%S')
源數(shù)據(jù)庫主機: $SOURCE_HOST
源數(shù)據(jù)庫用戶名: $SOURCE_USER
數(shù)據(jù)庫列表: ${DB_LIST[*]}
是否壓縮: $COMPRESS
EOF
if [ -n "$export_errors" ]; then
echo "警告: 部分數(shù)據(jù)庫導出失?。?
return 1
else
echo "所有數(shù)據(jù)庫導出成功!"
return 0
fi
}
# 導入數(shù)據(jù)庫
import_databases() {
echo "開始導入數(shù)據(jù)庫..."
echo "目標數(shù)據(jù)庫主機: $TARGET_HOST"
echo "備份目錄: $BACKUP_DIR"
# 檢查備份目錄是否存在
if [ ! -d "$BACKUP_DIR" ]; then
echo "錯誤: 備份目錄 '$BACKUP_DIR' 不存在!"
exit 1
fi
# 檢查備份信息文件
if [ -f "$BACKUP_DIR/backup_info.txt" ]; then
echo "備份信息:"
cat "$BACKUP_DIR/backup_info.txt"
else
echo "警告: 未找到備份信息文件。"
fi
# 確定要導入的文件列表
if [ ${#DB_LIST[@]} -eq 0 ]; then
# 如果沒有指定數(shù)據(jù)庫列表,嘗試從備份目錄中讀取
if [ "$COMPRESS" = true ] || ls "$BACKUP_DIR"/*.sql.gz 1> /dev/null 2>&1; then
BACKUP_FILES=("$BACKUP_DIR"/*.sql.gz)
else
BACKUP_FILES=("$BACKUP_DIR"/*.sql)
fi
else
# 如果指定了數(shù)據(jù)庫列表,使用指定的列表
BACKUP_FILES=()
for db in "${DB_LIST[@]}"; do
if [ -f "$BACKUP_DIR/${db}.sql.gz" ]; then
BACKUP_FILES+=("$BACKUP_DIR/${db}.sql.gz")
COMPRESS=true
elif [ -f "$BACKUP_DIR/${db}.sql" ]; then
BACKUP_FILES+=("$BACKUP_DIR/${db}.sql")
else
echo "警告: 未找到數(shù)據(jù)庫 $db 的備份文件!"
fi
done
fi
# 導入每個數(shù)據(jù)庫文件
import_errors=false
for file in "${BACKUP_FILES[@]}"; do
# 提取數(shù)據(jù)庫名
db_name=$(basename "$file")
db_name=${db_name%.sql.gz}
db_name=${db_name%.sql}
echo "正在導入數(shù)據(jù)庫: $db_name"
# 構建導入命令
IMPORT_CMD="mysql -h $TARGET_HOST -u $TARGET_USER"
if [ -n "$TARGET_PASS" ]; then
IMPORT_CMD="$IMPORT_CMD -p$TARGET_PASS"
fi
# 根據(jù)文件類型構建完整命令
if [[ "$file" == *.gz ]]; then
IMPORT_CMD="gzip -dc $file | $IMPORT_CMD"
echo "執(zhí)行: $IMPORT_CMD"
eval "$IMPORT_CMD"
else
IMPORT_CMD="$IMPORT_CMD < $file"
echo "執(zhí)行: $IMPORT_CMD"
eval "$IMPORT_CMD"
fi
# 檢查導入是否成功
if [ $? -eq 0 ]; then
echo "數(shù)據(jù)庫 $db_name 導入成功。"
else
echo "錯誤: 數(shù)據(jù)庫 $db_name 導入失??!"
import_errors=true
fi
done
if [ -n "$import_errors" ]; then
echo "警告: 部分數(shù)據(jù)庫導入失??!"
return 1
else
echo "所有數(shù)據(jù)庫導入成功!"
return 0
fi
}
# 主函數(shù)
main() {
echo "========================================"
echo "MySQL數(shù)據(jù)庫遷移工具"
echo "========================================"
# 檢查必要的工具
check_requirements
# 根據(jù)參數(shù)執(zhí)行導出或?qū)?
if [ "$IMPORT_ONLY" != true ]; then
export_databases
export_result=$?
fi
if [ "$EXPORT_ONLY" != true ] && [ "$IMPORT_ONLY" != true ]; then
# 如果不是僅導出或僅導入,則在導出后進行導入
if [ $export_result -eq 0 ]; then
import_databases
else
echo "由于導出失敗,跳過導入步驟。"
exit 1
fi
elif [ "$IMPORT_ONLY" == true ]; then
# 如果是僅導入,則直接執(zhí)行導入
import_databases
fi
echo "========================================"
echo "遷移完成!"
echo "========================================"
}
# 執(zhí)行主函數(shù)
main
腳本概述
這是一個功能完整的MySQL數(shù)據(jù)庫遷移工具,支持將多個數(shù)據(jù)庫從源服務器導出并導入到目標服務器。腳本使用mysqldump進行邏輯備份,確保數(shù)據(jù)遷移的兼容性和可靠性。
主要特性:
- 支持批量遷移多個數(shù)據(jù)庫
- 可配置的源和目標服務器連接參數(shù)
- 可選擇壓縮備份以節(jié)省磁盤空間
- 支持導出/導入分離操作
- 完整的錯誤檢查和日志記錄
快速開始
基本用法
# 使用默認配置遷移所有數(shù)據(jù)庫到本地 ./mysql_migration.sh # 遷移到遠程服務器 ./mysql_migration.sh --target-host 192.168.1.100 --target-user admin --target-pass password # 僅遷移特定數(shù)據(jù)庫 ./mysql_migration.sh --databases net,event
常見用法
1.從本機遷移數(shù)據(jù)庫到指定主機
將所有數(shù)據(jù)庫遷移到指定主機
./db_migrate.sh --source-host 127.0.0.1 --target-host 10.10.110.46
僅遷移某個數(shù)據(jù)庫到指定主機
./db_migrate.sh --source-host 127.0.0.1 --target-host 10.10.110.46 -d scd
2.將其他主機數(shù)據(jù)庫遷移到指定主機
將所有數(shù)據(jù)庫遷移到指定主機
./db_migrate.sh --source-host 10.10.112.3 --target-host 10.10.110.46
僅遷移某個數(shù)據(jù)庫到指定主機
./db_migrate.sh --source-host 10.10.112.3 --target-host 10.10.110.46 -d web
參數(shù)詳解
連接參數(shù)
| 參數(shù) | 簡寫 | 默認值 | 說明 |
|---|---|---|---|
| --source-host | -s | 127.0.0.1 | 源數(shù)據(jù)庫主機地址 |
| --source-user | -u | username | 源數(shù)據(jù)庫用戶名 |
| --source-pass | -p | password | 源數(shù)據(jù)庫密碼 |
| --target-host | -t | 127.0.0.1 | 目標數(shù)據(jù)庫主機地址 |
| --target-user | -U | username | 目標數(shù)據(jù)庫用戶名 |
| --target-pass | -P | password | 目標數(shù)據(jù)庫密碼 |
功能參數(shù)
| 參數(shù) | 簡寫 | 默認值 | 說明 |
|---|---|---|---|
| --databases | -d | net,event,scd,stgy,web | 要遷移的數(shù)據(jù)庫列表(逗號分隔) |
| --output-dir | -o | 自動生成 | 備份文件存儲目錄 |
| --compress | -c | true | 是否壓縮備份文件 |
| --export-only | 無 | false | 僅執(zhí)行導出操作 |
| --import-only | 無 | false | 僅執(zhí)行導入操作(需指定備份目錄) |
使用示例
完整遷移到遠程服務器
./mysql_migration.sh \ --source-host 192.168.1.50 \ --source-user dbadmin \ --source-pass src_password \ --target-host 192.168.1.100 \ --target-user dbadmin \ --target-pass tgt_password \ --databases net,event,scd
分步執(zhí)行
# 第一步:僅導出數(shù)據(jù)庫 ./mysql_migration.sh \ --source-host 192.168.1.50 \ --export-only \ --output-dir /backup/mysql_20231213 # 第二步:將備份文件傳輸?shù)侥繕朔掌? scp -r /backup/mysql_20231213 user@target-server:/tmp/ # 第三步:在目標服務器上導入 ./mysql_migration.sh \ --target-host 192.168.1.100 \ --import-only \ --output-dir /tmp/mysql_20231213
大型數(shù)據(jù)庫優(yōu)化
對于大型數(shù)據(jù)庫,建議添加性能優(yōu)化參數(shù):
# 在腳本中的EXPORT_CMD變量添加以下參數(shù): EXPORT_CMD="$EXPORT_CMD --single-transaction --quick --skip-lock-tables"
遷移技術細節(jié)
導出參數(shù)說明
腳本使用的關鍵mysqldump參數(shù):
--single-transaction:在事務中執(zhí)行導出,確保數(shù)據(jù)一致性--routines:導出存儲過程和函數(shù)--triggers:導出觸發(fā)器--events:導出事件調(diào)度器--databases:包含創(chuàng)建數(shù)據(jù)庫語句
備份文件結構
/tmp/mysql_backup_20231213_143022/
├── net.sql.gz # 壓縮的數(shù)據(jù)庫備份
├── event.sql.gz
├── scd.sql.gz
├── stgy.sql.gz
├── web.sql.gz
└── backup_info.txt # 備份元數(shù)據(jù)信息
最佳實踐建議
1. 遷移前準備
權限檢查:確保數(shù)據(jù)庫用戶有足夠權限
-- 源數(shù)據(jù)庫用戶需要SELECT、LOCK TABLES權限 GRANT SELECT, LOCK TABLES ON source_db.* TO 'username'@'localhost'; -- 目標數(shù)據(jù)庫用戶需要CREATE、INSERT等權限 GRANT CREATE, INSERT, UPDATE ON target_db.* TO 'username'@'localhost';
版本兼容性:檢查MySQL版本兼容性,特別是5.7到8.0的遷移
2. 大數(shù)據(jù)量遷移優(yōu)化
分批次遷移:對于特大表可以考慮分批次導出
# 按條件分批導出大數(shù)據(jù)表 mysqldump --where="id BETWEEN 1 AND 1000000" large_table > part1.sql
網(wǎng)絡優(yōu)化:使用壓縮傳輸減少網(wǎng)絡帶寬占用
# 管道直接傳輸(避免中間文件) mysqldump -h source_host -u user -p db | gzip | ssh user@target_host "gunzip | mysql -u user -p db"
3. 數(shù)據(jù)一致性驗證
遷移完成后建議進行數(shù)據(jù)驗證:
# 記錄數(shù)對比 source_count=$(mysql -h source_host -u user -p -N -s -e "SELECT COUNT(*) FROM table") target_count=$(mysql -h target_host -u user -p -N -s -e "SELECT COUNT(*) FROM table") echo "Source: $source_count | Target: $target_count"
故障排除
常見問題解決
連接失敗
- 檢查防火墻設置和端口訪問(默認3306)
- 驗證用戶名和密碼是否正確
- 確認MySQL服務是否正常運行
權限錯誤
- 確保用戶有導出/導入權限
- 檢查數(shù)據(jù)庫名是否正確
字符集問題
- 添加字符集參數(shù):
--default-character-set=utf8mb4 - 統(tǒng)一源和目標數(shù)據(jù)庫的字符集設置
大數(shù)據(jù)量導出超時
- 調(diào)整超時參數(shù):
SET GLOBAL ob_query_timeout=1000000000; - 使用
--quick參數(shù)優(yōu)化大表導出
注意事項
- 業(yè)務影響:遷移期間建議停止使用源數(shù)據(jù)庫的應用程序
- 存儲空間:確保備份目錄有足夠磁盤空間
- 網(wǎng)絡穩(wěn)定性:跨網(wǎng)絡遷移需要穩(wěn)定的網(wǎng)絡連接
- 回滾方案:重要數(shù)據(jù)遷移前建議做好備份
- 觸發(fā)器處理:注意觸發(fā)器的導出和導入設置
擴展功能
如需更高級的數(shù)據(jù)庫版本控制,可以考慮集成Flyway或Liquibase等專業(yè)工具,它們提供更好的版本管理和回滾能力。
此腳本提供了MySQL數(shù)據(jù)庫遷移的基礎功能,適用于大多數(shù)遷移場景。根據(jù)具體需求可以進一步定制和優(yōu)化參數(shù)設置。
到此這篇關于使用腳本遷移MySQL數(shù)據(jù)庫的完整代碼及使用說明的文章就介紹到這了,更多相關MySQL數(shù)據(jù)庫遷移腳本內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MySQL快速禁用賬戶登入及如何復制/復用賬戶密碼(最新推薦)
這篇文章主要介紹了MySQL如何快速禁用賬戶登入及如何復制/復用賬戶密碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-01-01
MySQL建立數(shù)據(jù)庫時字符集與排序規(guī)則的選擇詳解
當數(shù)據(jù)庫需要適應不同的語言就需要有不同的字符集,下面這篇文章主要給大家介紹了關于MySQL建立數(shù)據(jù)庫時字符集與排序規(guī)則的選擇的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-06-06
mysql?8.0.29?winx64.zip安裝配置方法圖文教程
這篇文章主要為大家詳細介紹了mysql?8.0.29?winx64.zip安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06

