it-swarm.com.de

alle MySQL-Tabellen automatisch in separate Dateien ausgeben?

Ich möchte Dumps jeder Mysql-Tabelle in separaten Dateien erhalten. Das Handbuch gibt an, dass die Syntax dafür lautet 

mysqldump [options] db_name [tbl_name ...]

Was bedeutet, dass Sie die Tabellennamen vorher kennen. Ich könnte jetzt ein Skript einrichten, das jeden Tabellennamen kennt, aber ich sage, ich füge eine neue Tabelle hinzu und vergesse das Dump-Skript zu aktualisieren. Dann fehlen mir Dumps für eine oder mehrere Tabellen. 

Gibt es eine Möglichkeit, jede vorhandene Tabelle automatisch in eine separate Datei zu sichern? Oder muss ich ein Skript-Fu machen? Fragen Sie die Datenbank ab, rufen Sie alle Tabellennamen ab und geben Sie sie nach Namen aus.

Welche Scripting-Sprachen können auf eine MySQL-Datenbank zugreifen, wenn ich die Script-Fu-Route betrete?

56
user151841

Das Befehlszeilenprogramm mysqldump erledigt dies für Sie - obwohl die docs darüber sehr unklar sind.

Zu beachten ist, dass ~/output/dir von dem Benutzer, der mysqld besitzt, beschreibbar sein muss. Unter Mac OS X:

Sudo chown -R _mysqld:_mysqld ~/output/dir
mysqldump --user=dbuser --password --tab=~/output/dir dbname

Nach dem Ausführen des obigen haben Sie eine tablename.sql -Datei, die das Schema jeder Tabelle (create table-Anweisung) und die tablename.txt-Datei mit den Daten enthält.

Wenn Sie nur einen Speicherauszug mit Schema erstellen möchten, fügen Sie das Flag --no-data hinzu:

mysqldump --user=dbuser --password --no-data --tab=~/output/dir dbname
54
Salient Digital

Hier ist ein Skript, das Tabellendaten als SQL-Befehle in separate, komprimierte Dateien ablegt. Es ist nicht erforderlich, sich auf dem MySQL-Serverhost zu befinden, das Kennwort im Skript nicht fest zu codieren und gilt nur für eine bestimmte Datenbank, nicht für alle Datenbankbits auf dem Server:

#!/bin/bash

# dump-tables-mysql.sh
# Descr: Dump MySQL table data into separate SQL files for a specified database.
# Usage: Run without args for usage info.
# Author: @Trutane
# Ref: http://stackoverflow.com/q/3669121/138325
# Notes:
#  * Script will Prompt for password for db access.
#  * Output files are compressed and saved in the current working dir, unless DIR is
#    specified on command-line.

[ $# -lt 3 ] && echo "Usage: $(basename $0) <DB_Host> <DB_USER> <DB_NAME> [<DIR>]" && exit 1

DB_Host=$1
DB_user=$2
DB=$3
DIR=$4

[ -n "$DIR" ] || DIR=.
test -d $DIR || mkdir -p $DIR

echo -n "DB password: "
read -s DB_pass
echo
echo "Dumping tables into separate SQL command files for database '$DB' into dir=$DIR"

tbl_count=0

for t in $(mysql -NBA -h $DB_Host -u $DB_user -p$DB_pass -D $DB -e 'show tables') 
do 
    echo "DUMPING TABLE: $DB.$t"
    mysqldump -h $DB_Host -u $DB_user -p$DB_pass $DB $t | gzip > $DIR/$DB.$t.sql.gz
    tbl_count=$(( tbl_count + 1 ))
done

echo "$tbl_count tables dumped from database '$DB' into dir=$DIR"
53
Trutane

Sie können dies erreichen durch:

  1. Rufen Sie die Liste der Datenbanken in mysql ab
  2. sichern Sie jede Datenbank mit mysqldump
# Optional variables for a backup script
MYSQL_USER="root"
MYSQL_PASS="something"
BACKUP_DIR=/srv/backup/$(date +%Y-%m-%dT%H_%M_%S);
test -d "$BACKUP_DIR" || mkdir -p "$BACKUP_DIR"
# Get the database list, exclude information_schema
for db in $(mysql -B -s -u $MYSQL_USER --password=$MYSQL_PASS -e 'show databases' | grep -v information_schema)
do
  # dump each database in a separate file
  mysqldump -u $MYSQL_USER --password=$MYSQL_PASS "$db" | gzip > "$BACKUP_DIR/$db.sql.gz"
done
17

Hier ist der entsprechende Import.

#!/bin/bash

# import-files-mysql.sh
# Descr: Import separate SQL files for a specified database.
# Usage: Run without args for usage info.
# Author: Will Rubel
# Notes:
#  * Script will Prompt for password for db access.

[ $# -lt 3 ] && echo "Usage: $(basename $0) <DB_Host> <DB_USER> <DB_NAME> [<DIR>]" && exit 1

DB_Host=$1
DB_user=$2
DB=$3
DIR=$4

DIR=$DIR/*


echo -n "DB password: "
read -s DB_pass
echo
echo "Importing separate SQL command files for database '$DB' into '$DB'"

file_count=0


for f in $DIR

do 
    echo "IMPORTING FILE: $f"

    gunzip -c $f | mysql -h $DB_Host -u $DB_user -p$DB_pass $DB

    (( file_count++ ))
done

echo "$file_count files importing to database '$DB'"
5
WillRubel
#!/bin/bash

for i in $(mysql -uUser -pPASSWORD DATABASE -e "show tables;"|grep -v Tables_in_);do mysqldump -uUSER -pPASSWORD DATABASE $i > /backup/dir/$i".sql";done

tar -cjf "backup_mysql_"$(date +'%Y%m%d')".tar.bz2" /backup/dir/*.sql
2
djadk

Es sieht so aus, als hätte hier jeder autocommit=0;SET unique_checks=0;SET foreign_key_checks=0; vergessen, der den Importprozess beschleunigen soll ...

#!/bin/bash
MYSQL_USER="USER"
MYSQL_PASS="PASS"

if [ -z "$1" ]
  then
    echo "Dumping all DB ... in separate files"
    for I in $(mysql -u $MYSQL_USER --password=$MYSQL_PASS -e 'show databases' -s --skip-column-names); 
    do 
      echo "SET autocommit=0;SET unique_checks=0;SET foreign_key_checks=0;" > "$I.sql"
      mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $I >> "$I.sql"; 
      echo "SET autocommit=1;SET unique_checks=1;SET foreign_key_checks=1;commit;" >> "$I.sql"
      gzip "$I.sql"
    done
    echo "END."
else
      echo "Dumping $1 ..."
      echo "SET autocommit=0;SET unique_checks=0;SET foreign_key_checks=0;" > "$1.sql"
      mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $1 >> "$1.sql"; 
      echo "SET autocommit=1;SET unique_checks=1;SET foreign_key_checks=1;commit;" >> "$1.sql"
      gzip "$1.sql"
fi
1
WonderLand

Wenn Sie alle Tabellen aus allen Datenbanken sichern möchten, kombinieren Sie einfach die Antwort von Elias Torres Arroyo und Trutane: Und wenn Sie Ihr Passwort nicht am Terminal eingeben möchten, speichern Sie Ihr Passwort einfach in einer zusätzlichen Konfigurationsdatei (chmod 0600) - siehe Mysqldump wird von cron und password security gestartet

#!/usr/bin/env bash

# this file
# a) gets all databases from mysql
# b) gets all tables from all databases in a)
# c) creates subfolders for every database in a)
# d) dumps every table from b) in a single file

    # this is a mixture of scripts from Trutane (http://stackoverflow.com/q/3669121/138325) 
    # and Elias Torres Arroyo (https://stackoverflow.com/a/14711298/8398149)

[ $# -lt 3 ] && echo "Usage: $(basename $0) <DB_Host> <DB_USER> <DIR>" && exit 1

DB_Host=$1
DB_user=$2
BACKUP_DIR=$3/$(date +%Y-%m-%dT%H_%M_%S);

test -d "$BACKUP_DIR" || mkdir -p "$BACKUP_DIR"
# Get the database list, exclude information_schema
database_count=0
tbl_count=0

for db in $(mysql --defaults-extra-file=/yourfile/config.cnf -B -s -u $DB_user -e 'show databases' | grep -v information_schema)
do
    # dump each database in a separate file
    (( database_count++ ))
    DIR=$BACKUP_DIR/$db
    [ -n "$DIR" ] || DIR=.

    test -d $DIR || mkdir -p $DIR

    echo
    echo "Dumping tables into separate SQL command files for database '$db' into dir=$DIR"

    for t in $(mysql --defaults-extra-file=/yourfile/config.cnf -NBA -h $DB_Host -u $DB_user -D $db -e 'show tables')
    do
        echo "DUMPING TABLE: $db.$t"
        mysqldump --defaults-extra-file=/yourfile/config.cnf -h $DB_Host -u $DB_user $db $t  > $DIR/$db.$t.sql
        tbl_count=$(( tbl_count + 1 ))
    done

    echo "Database $db is finished"

done


echo "Backup completed"
0
sneaky

Ich bin kein Bash-Meister, aber ich würde es einfach mit einem Bash-Skript machen. Ohne MySQL zu treffen, können Sie mit Kenntnis des Datenverzeichnisses und des Datenbanknamens einfach nach allen .frm-Dateien (eine für jede Tabelle in diesem Verzeichnis db /) nach einer Liste von Tabellen suchen. 

Ich bin sicher, dass es Wege gibt, um es schlanker zu machen und Argumente oder so weiter zu akzeptieren, aber das hat gut für mich funktioniert.

tables_in_a_db_to_sql.sh

#!/bin/bash

database="this_is_my_database"
datadir="/var/lib/mysql/"
datadir_escaped="\/var\/lib\/mysql\/"

all_tables=($(ls $datadir$database/*.frm | sed s/"$datadir_escaped$database\/"/""/g | sed s/.frm//g))

for t in "${all_tables[@]}"; do
        outfile=$database.$t.sql
        echo "-- backing up $t to $outfile"
        echo "mysqldump [options] $database $t > $outfile"
        # mysqldump [options] $database $t > $outfile
done

Füllen Sie bei Bedarf die Optionen [options] und die gewünschte outfile-Konvention aus und kommentieren Sie die letzte mysqldump-Zeile aus.

0
Riedsio