Chcę zachować kopię zapasową wszystkich moich baz danych MySQL. Mam ponad 100 baz danych MySQL. Chcę wyeksportować je wszystkie jednocześnie i ponownie zaimportować je wszystkie na mój serwer MySQL jednocześnie. Jak mogę to zrobić?
Chcę zachować kopię zapasową wszystkich moich baz danych MySQL. Mam ponad 100 baz danych MySQL. Chcę wyeksportować je wszystkie jednocześnie i ponownie zaimportować je wszystkie na mój serwer MySQL jednocześnie. Jak mogę to zrobić?
Odpowiedzi:
mysqldump -u root -p --all-databases > alldb.sql
Przejrzyj dokumentację mysqldump . Możesz skorzystać z niektórych opcji wymienionych w komentarzach:
mysqldump -u root -p --opt --all-databases > alldb.sql
mysqldump -u root -p --all-databases --skip-lock-tables > alldb.sql
mysql -u root -p < alldb.sql
Inne rozwiązanie:
Tworzy kopie zapasowe każdej bazy danych w innym pliku
#!/bin/bash
USER="zend"
PASSWORD=""
#OUTPUT="/Users/rabino/DBs"
#rm "$OUTPUTDIR/*gz" > /dev/null 2>&1
databases=`mysql -u $USER -p$PASSWORD -e "SHOW DATABASES;" | tr -d "| " | grep -v Database`
for db in $databases; do
if [[ "$db" != "information_schema" ]] && [[ "$db" != "performance_schema" ]] && [[ "$db" != "mysql" ]] && [[ "$db" != _* ]] ; then
echo "Dumping database: $db"
mysqldump -u $USER -p$PASSWORD --databases $db > `date +%Y%m%d`.$db.sql
# gzip $OUTPUT/`date +%Y%m%d`.$db.sql
fi
done
ExcludeDatabases="Database|information_schema|performance_schema|mysql"
[następna linia] databases=`-u $USER -p$PASWORD -e "SHOW DATABASES;" | tr -d "| " | egrep -v $ExcludeDatabases`
i usuń całkowicie linie if
i fi
. W zmiennej ExcludeDatabases
przechowujesz nazwy baz danych, których nie należy zrzucać [zwykle systemowe bazy danych].
-Bse "show databases"
aby uniknąć dodatkowych wyników formatowania, a tym samym możesz usunąć | tr -d "| " | grep -v Database
. W moim skrypcie eksportu wiersz ten brzmidatabases=`mysql -u $USER -p$PASSWORD -Bse "SHOW DATABASES;"
U+200C U+200B
między „c” i „h” słowa „schemat” . To łamie kopiowanie i wklejanie tego bitu. Więcej dyskusji na ten temat tutaj: meta.stackexchange.com/questions/170970/…
Wszystkie odpowiedzi, które widzę na to pytanie, mogą mieć problemy z zestawami znaków w niektórych bazach danych z powodu problemu przekierowania wyjścia mysqldump
do pliku w operatorze powłoki >
.
Aby rozwiązać ten problem, wykonaj kopię zapasową za pomocą takiego polecenia
mysqldump -u root -p --opt --all-databases -r backup.sql
Aby wykonać dobre przywracanie BD bez problemów z zestawami znaków. Oczywiście możesz zmienić domyślny zestaw znaków, jak potrzebujesz.
mysql -uroot -p --default-character-set=utf8
mysql> SET names 'utf8';
mysql> SOURCE backup.sql;
Na podstawie tych odpowiedzi stworzyłem skrypt, który tworzy kopie zapasowe wszystkich baz danych w osobne pliki, ale następnie kompresuję je w jednym archiwum z datą jako nazwą.
To nie poprosi o hasło, może być używane w cron. Aby zapisać hasło, .my.cnf
sprawdź tę odpowiedź https://serverfault.com/a/143587/62749
Wykonane również z komentarzami dla tych, którzy nie są zbyt dobrze zaznajomieni ze skryptami bash.
#!/bin/bash
# This script will backup all mysql databases into
# compressed file named after date, ie: /var/backup/mysql/2016-07-13.tar.bz2
# Setup variables used later
# Create date suffix with "F"ull date format
suffix=$(date +%F)
# Retrieve all database names except information schemas. Use sudo here to skip root password.
dbs=$(sudo mysql --defaults-extra-file=/root/.my.cnf --batch --skip-column-names -e "SHOW DATABASES;" | grep -E -v "(information|performance)_schema")
# Create temporary directory with "-d" option
tmp=$(mktemp -d)
# Set output dir here. /var/backups/ is used by system,
# so intentionally used /var/backup/ for user backups.
outDir="/var/backup/mysql"
# Create output file name
out="$outDir/$suffix.tar.bz2"
# Actual script
# Check if output directory exists
if [ ! -d "$outDir" ];then
# Create directory with parent ("-p" option) directories
sudo mkdir -p "$outDir"
fi
# Loop through all databases
for db in $dbs; do
# Dump database to temporary directory with file name same as database name + sql suffix
sudo mysqldump --defaults-extra-file=/root/.my.cnf --databases "$db" > "$tmp/$db.sql"
done
# Go to tmp dir
cd $tmp
# Compress all dumps with bz2, discard any output to /dev/null
sudo tar -jcf "$out" * > "/dev/null"
# Cleanup
cd "/tmp/"
sudo rm -rf "$tmp"
Zachowaj ostrożność podczas eksportowania zi importowania do różnych wersji MySQL, ponieważ tabele mysql mogą mieć różne kolumny. Jeśli nie masz szczęścia, uprawnienia do grantu mogą nie działać. Stworzyłem ten skrypt (mysql_export_grants.sql), aby zrzucić granty na import do nowej bazy danych, na wszelki wypadek:
#!/bin/sh
stty -echo
printf 'Password: ' >&2
read PASSWORD
stty echo
printf "\n"
if [ -z "$PASSWORD" ]; then
echo 'No password given!'
exit 1
fi
MYSQL_CONN="-uroot -p$PASSWORD"
mysql ${MYSQL_CONN} --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql ${MYSQL_CONN} --skip-column-names -A | sed 's/$/;/g'
Podczas zrzutu całej bazy danych. Oczywiście ma duże dane. Możesz więc wybrać poniżej dla lepszego:
Tworzenie kopii zapasowej:
mysqldump -u [user] -p[password]--single-transaction --quick --all-databases | gzip > alldb.sql.gz
Jeśli błąd
- Ostrzeżenie: Pomijanie danych tabeli mysql.event. Podaj jawnie opcję --events.
Posługiwać się:
mysqldump -u [user] -p --events --single-transaction --quick --all-databases | gzip > alldb.sql.gz
Przywracanie kopii zapasowej:
gunzip < alldb.sql.gz | mysql -u [user] -p[password]
Mam nadzieję, że to pomoże :)
Napisałem ten komentarz już ponad 4 lata temu i postanowiłem teraz udzielić odpowiedzi.
Skrypt z jruzafa może być nieco uproszczona:
#!/bin/bash
USER="zend"
PASSWORD=""
#OUTPUT="/Users/rabino/DBs"
#rm "$OUTPUTDIR/*gz" > /dev/null 2>&1
ExcludeDatabases="Database|information_schema|performance_schema|mysql"
databases=`mysql -u $USER -p$PASSWORD -e "SHOW DATABASES;" | tr -d "| " | egrep -v $ExcludeDatabases`
for db in $databases; do
echo "Dumping database: $db"
mysqldump -u $USER -p$PASSWORD --databases $db > `date +%Y%m%d`.$db.sql
# gzip $OUTPUT/`date +%Y%m%d`.$db.sql
done
Uwaga:
ExcludeDatabases
mysqldump -uroot -proot - wszystkie bazy danych> allDB.sql
Uwaga: -u „twoja nazwa użytkownika” -p „twoje hasło”