【问题标题】:How to back up each table from multiple MySQL databases in Windows?如何从 Windows 中的多个 MySQL 数据库备份每个表?
【发布时间】:2025-11-26 18:50:01
【问题描述】:

我在 WIndows Server 上有多个 MySQL 数据库,我想通过在相关数据库的每个表的 .SQL 文件夹中创建一个具有数据库名称的文件夹来备份所有这些数据库。这个想法是为了更容易恢复信息,因为有时我只需要恢复一个表而不是整个数据库。

我对此进行了一些研究,并找到了一个可以做到这一点的 shell 脚本。该脚本为服务器上的每个数据库创建一个文件夹,并在其中为每个表创建一个 .SQL 文件,然后将所有这些文件夹压缩为一个 .ZIP 文件,并仍将其发送到 FTP 服务器(这对我来说不是必需的)。

下面是我找到的shell脚本。

#!/bin/sh
# System + MySQL backup script
# Copyright (c) 2008 Marchost
# This script is licensed under GNU GPL version 2.0 or above
# ---------------------------------------------------------------------

#########################
######TO BE MODIFIED#####

### System Setup ###
BACKUP=YOUR_LOCAL_BACKUP_DIR

### MySQL Setup ###
MUSER="MYSQL_USER"
MPASS="MYSQL_USER_PASSWORD"
MHOST="localhost"

### FTP server Setup ###
FTPD="YOUR_FTP_BACKUP_DIR"
FTPU="YOUR_FTP_USER"
FTPP="YOUR_FTP_USER_PASSWORD"
FTPS="YOUR_FTP_SERVER_ADDRESS"

######DO NOT MAKE MODIFICATION BELOW#####
#########################################

### Binaries ###
TAR="$(which tar)"
GZIP="$(which gzip)"
FTP="$(which ftp)"
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"

### Today + hour in 24h format ###
NOW=$(date +"%d%H")

### Create hourly dir ###

mkdir $BACKUP/$NOW

### Get all databases name ###
DBS="$($MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse 'show databases')"
for db in $DBS
do

### Create dir for each databases, backup tables in individual files ###
  mkdir $BACKUP/$NOW/$db

  for i in `echo "show tables" | $MYSQL -u $MUSER -h $MHOST -p$MPASS $db|grep -v Tables_in_`;
  do
    FILE=$BACKUP/$NOW/$db/$i.sql.gz
    echo $i; $MYSQLDUMP --add-drop-table --allow-keywords -q -c -u $MUSER -h $MHOST -p$MPASS $db $i | $GZIP -9 > $FILE
  done
done

### Compress all tables in one nice file to upload ###

ARCHIVE=$BACKUP/$NOW.tar.gz
ARCHIVED=$BACKUP/$NOW

$TAR -cvf $ARCHIVE $ARCHIVED

### Dump backup using FTP ###
cd $BACKUP
DUMPFILE=$NOW.tar.gz
$FTP -n $FTPS <<END_SCRIPT
quote USER $FTPU
quote PASS $FTPP
cd $FTPD
mput $DUMPFILE
quit
END_SCRIPT

### Delete the backup dir and keep archive ###

rm -rf $ARCHIVED

来源: https://www.howtoforge.com/shell-script-to-back-up-all-mysql-databases-each-table-in-an-individual-file-and-upload-to-remote-ftp

最后,我可以使用这个脚本,但是我这里没有 Linux 机器,我也无法使用 Linux 创建任何 VM。我尝试将此脚本转换为批处理文件 (.bat),但没有成功,因为我对高级脚本不是很了解。

有满足我需求的 Windows 解决方案吗?或者是否可以将此脚本转换为在 Windows 中工作?

提前谢谢你。

【问题讨论】:

    标签: mysql windows batch-file database-backups mysql-backup


    【解决方案1】:

    如果您的要求只是为您的database instance 中的所有databases 导出数据tablewise,则以下脚本将为您带来魔力,并且它可以在 Windows 中运行。您提到的代码 sn-p 可以满足您的要求,例如发送到 FTP/zipping 等等。这似乎不是您的要求,但您也可以通过修改我在此处提供的基本短脚本来实现。

    逻辑很简单。

    • 列出所有数据库。
    • 遍历数据库,并列出所有表。
    • 遍历所有表并导出。

    适当地声明所有变量。

    ##Export all databases names to file
    mysql -h your-host -u username -pPassword your-database-name --skip-column-names --execute="SHOW DATABASES;" > databases.tmp
    echo "Start!"
    #### Look over database names
    
    #### Outter loop to get table names
    
    for /F %%A in (databases.tmp) do (
       echo "Exporting table Names for %%A"
       mysql -h your-host -u username -pPassword %%A --skip-column-names --execute="SHOW TABLES;" >"%%A_tables.tmp"
    
       mkdir %%A
    
    
    #### nested loop to create table name files per table
       for /F %%B in (%%A_tables.tmp) do (
       echo "Exporting data for %%B of %%A"
       mysqldump -h your-host -u username -pPassword %%A %%B> "%%A\%%A_%%B.sql"
       )
    )
    
    del *.tmp
    

    希望对你有用。

    【讨论】:

    • 我执行了脚本并得到了这些错误: - 'while' 不被识别为内部命令或外部命令、可运行程序或批处理文件。 -mysql: unknown option '-d'- 系统找不到指定的路径。- 'done' 不被识别为内部命令或外部、可运行程序或批处理文件。
    • @DiegoLima 我在做了一些测试后调整了我的脚本,它肯定会工作。确保您正在运行cmd,而不是powershell。它对您有用,请接受它作为正确答案并希望投票。
    • 现在可以完美运行了。请注意,在第 2 行删除“your-database-name”,因为它不是必需的,否则效果很好。谢谢!
    • 很高兴知道! !