場景:同事傳來上百個獨立 .sql 文件(每檔含 CREATE DATABASE 與 USE),需批量導入線上庫;後續又需刪除某庫 2000+ 張表(無 DROP DATABASE 權限)。
mysql_source.sh#!/bin/bash
# author: rainysia <rainysia@gmail.com>
set -e
LC_ALL=C; LANG=C; unset TZ
file_path="/home/db/test/" # SQL 文件目錄
host="192.168.85.123"
username="dbroot"
password="db1t#2w$3r@4#t"
dbname="sample" # 佔位庫,實際由 SQL 內 CREATE DATABASE 指定
now=$(date "+%s")
mysql_source() {
for file_name in $(ls -A "$1"); do
if [ -f "$1$file_name" ]; then
seg_start=$(date "+%s")
mysql -h"${host}" -u"${username}" -p"${password}" "${dbname}" -e "source $1$file_name"
echo "source: \"$1$file_name\" is ok, took $(( $(date "+%s") - seg_start )) seconds"
fi
done
echo "All done! Total: $(( $(date "+%s") - now )) seconds"
}
echo "UTC: $(LC_ALL=C TZ=UTC0 date -R)"
echo "Local: $(date -R)"
mysql_source "$file_path"
source: "/home/db/test/hml2.sql" is ok, took 18 seconds
source: "/home/db/test/hml3.sql" is ok, took 19 seconds
source: "/home/db/test/hml4.sql" is ok, took 18 seconds
All done! Total: 55 seconds
思路:mysqldump -d --add-drop-table 導出結構 → grep 取出 DROP TABLE 語句 → 復用上述腳本執行。
# 1. 導出結構(含 DROP TABLE)
mysqldump -udbroot -p cs_china_1111 -d --add-drop-table > cs_china_1111.sql
# 2. 過濾 DROP TABLE 語句
find . -name "cs_china_1111.sql" | xargs grep "DROP TABLE IF" > cs_china_1111_drop_table.sql
# 3. 修改腳本 dbname 為目標庫,執行導入即可批量刪除
set -e)。--defaults-extra-file 更安全。source 命令在 mysql 客戶端執行,支援單檔多語句。