Как сделать резервную копию каждой таблицы из нескольких баз данных MySQL в Windows?
У меня есть несколько баз данных MySQL на WIndows Server, и я хотел бы сделать резервную копию всех этих баз данных, создав папку с именем базы данных и внутри папки файлов.SQL для каждой таблицы соответствующей базы данных. Идея состоит в том, чтобы упростить восстановление информации, потому что иногда мне просто нужно восстановить таблицу вместо всей базы данных.
Я придумал некоторое исследование по этому вопросу и нашел сценарий оболочки, который делает именно это. Этот сценарий создает папку для каждой базы данных на сервере и внутри него создает файл.SQL для каждой таблицы, затем он уплотняет все эти папки в один файл.ZIP и по-прежнему отправляет его на FTP-сервер (это мне не нужно).
Ниже приведен скрипт оболочки, который я нашел.
#!/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
Наконец, я мог бы использовать этот сценарий, однако у меня нет Linux-машины и я не могу создать виртуальную машину с Linux. Я пытался преобразовать этот сценарий в пакетный файл (.bat), но мне это не удалось, потому что я не очень разбираюсь в продвинутых сценариях.
Есть ли решение для Windows, которое отвечает моим потребностям? Или есть возможность конвертировать этот скрипт для работы в Windows?
Заранее спасибо.
1 ответ
Если ваше требование только для экспорта данных tablewise
для всех databases
в вашем database instance
, следующий скрипт сделает волшебство за вас, и он будет работать в Windows. Фрагмент кода, который вы упомянули в вопросе, выполняет гораздо больше ваших требований, таких как отправка на FTP/ ZIP, а что нет. Это не кажется вашим требованием, но вы также можете достичь этого, изменив основной короткий сценарий, который я предоставляю здесь.
Логика проста.
- Список всех баз данных.
- Переберите базу данных и перечислите все таблицы.
- Перебрать все таблицы и экспортировать.
Сделайте объявление всех переменных соответствующим образом.
##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
Надежда работает на вас.