dump di tutte le tabelle mysql in file separati automaticamente?

Mi piacerebbe ottenere il cumulo di rifiuti di ogni tabella di mysql, in un file separato. Il manuale indica che la sintassi è la seguente

mysqldump [options] db_name [tbl_name ...]

Che indica che si conoscono i nomi di tabella di prima mano. Ho potuto impostare lo script che conosce il nome di ogni tabella, ma ora posso dire di aggiungere una nuova tabella in fondo alla strada e dimenticare di aggiornare il dump di script. Poi mi manca discariche per uno o più tabella.

C’è un modo per automagicamente dump ogni tabella esistente in un file separato? O sono io che vado a fare un po ‘ di script-fu; query di database, ottenere tutti i nomi di tabella e di dump con il loro nome.

Se vado script-fu percorso, cosa scripting lingue può accedere a un database mysql?

InformationsquelleAutor user151841 | 2010-09-08

 

9 Replies
  1. 57

    Il comando mysqldump linea di programma che fa per voi – anche se la documentazione sono molto chiaro su questo.

    Una cosa da notare è che ~/uscita/dir deve essere scrivibile dall’utente che possiede mysqld. Su Mac OS X:

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

    Dopo l’esecuzione di quanto sopra, si avrà un tablename.file sql che contiene ogni schema di tabella (create table) e tablename.txt il file contenente i dati.

    Se si desidera un dump con solo schema, aggiungere l’opzione –no-dati di bandiera:

    mysqldump --user=dbuser --password --no-data --tab=~/output/dir dbname
    
    • Beh, io veramente vorrei teh tabella dump dei dati da SQL inserisce anche :Þ
    • Ma questo è abbastanza vicino.
    • mysqlimport può essere utilizzato per importare i dati risultanti file txt. Anche eventuali nomi di tabella contenente un periodo (.) ad esempio: my.table solo risultato in un file di dati con lo stesso nome (senza .estensione txt). dev.mysql.com/doc/refman/5.0/en/… Inoltre, questo sembra essere l’unico modo per eseguire un --single-transaction tabella per il file di dump.
    • Si noti che questa soluzione richiede la FILE privilegio sul server, e scrivere il file su disco sul server.
    • –scheda non genera inserti, che sarebbe necessario se si desidera unire manualmente i database su due macchine, per esempio
  2. 58

    Ecco uno script che esegue il dump della tabella di dati di SQL comandi separati, file compressi. Non richiede di essere sul server MySQL, non codificare la password nella finestra script, ed è solo per uno specifico db, non tutti i db sul 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"
    
    • la soluzione migliore imo… sto usando una versione modificata di questo script che permette di passare la password come variabile env. Se qualcuno ha bisogno di questa funzionalità: sprunge.noi/fBDL?bash
    • imho la soluzione migliore anche : + mysqldump –extended-insert=FALSE -u “$utente_mysql” -p”$mysql_user_pw” “$db” $t \ | gzip > “$tables_dump_dir/$t.sql.gz” un po ‘ più lento , ma funziona su qualsiasi data e qualsiasi riga di dati di lunghezza …
    • thx! Ho usato la tua idea per generare uno script di backup backup di tutti i database: github.com/rubo77/mysql-backup.sh/blob/master/mysql-backup.sh
    • Purtroppo, questo non può essere fatto come una singola transazione, in modo che non è necessariamente ottenere una serie di file che possono essere caricati senza alcuna FK errori.
    • probabilmente si desidera aggiungere un po ‘ più argomenti come mysqldump --extended-insert=FALSE --order-by-primary --complete-insert
    • super utile. Grazie
    • Grande risposta, con voto positivo!
    • Grazie per i suggerimenti su ulteriori mysqldump opzioni di interesse. Si noti che, poiché il --opt gruppo di opzioni è attiva per impostazione predefinita, è possibile ignorare il tutto utilizzando --skip-opt o selettivamente saltare quelli che non si desidera, ad esempio,--skip-extended-insert. Vedere la documentazione per opzione gruppi.

  3. 17

    È possibile effettuare questa operazione:

    1. Ottenere l’elenco dei database mysql
    2. dump ogni database con 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
    • non funziona quando database di nome si dispone di spazio 🙁
    • Ho aggiunto le virgolette intorno a “$db”, provare che.
    • La domanda era su ogni tabella in un file separato, non ogni database in un file separato.
    • non è esattamente quello che è stato messo in discussione, ma esattamente quello che stavo cercando 🙂
  4. 5

    Qui è il corrispondente di importazione.

    #!/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'"
    
    • Non appena il codice di dump; si prega di fornire qualche spiegazione di cosa fa il codice.
    • Ecco come usarlo: ./import-files-mysql.sh host_name dbname db ./ Si assume tutti i tuoi file gz sono nella cartella corrente, si prega di sostituire il db informazioni di accesso di conseguenza, lo script vi chiederà di inserire la password dopo il comando.
  5. 2
    #!/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
    
    • Si può aggiungere una spiegazione di come funziona?
    • Un comando e questo è tutto gente ! Questo è grande !
  6. 1

    Sembra che tutti qui si è dimenticato di autocommit=0;SET unique_checks=0;SET foreign_key_checks=0; che è supponiamo di accelerare il processo di importazione …

    #!/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
    
  7. 0

    Io non sono bash master, ma mi basta farlo con uno script bash. Senza colpire MySQL, con conoscenza dei dati di directory e il nome del database, si potrebbe semplicemente la scansione per tutti .frm file (uno per ogni tabella nel db/directory) per un elenco di tabelle.

    Sono sicuro che ci sono modi per renderlo impermeabile e di accettare argomenti, o quant’altro, ma questo ha funzionato bene per me.

    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
    

    Compila il [opzioni] e desiderato outfile convenzione di cui hai bisogno, e rimuovere il commento le ultime mysqldump linea.

    • questo codice quando ho eseguito mostra questo messaggio di errore: errore di Sintassi: “(” inaspettato (forse la sua linea n.: 9 ).qualsiasi suggerimento
  8. 0

    Se Si desidera scaricare tutte le tabelle da tutti i database basta combinare Elias Torres Arroyo e Trutane risposta:
    E se non volete dare la Vostra password nel terminale, basta memorizzare le password in un file di configurazione (chmod 0600)- vedere Mysqldump lanciato da cron e la password di protezione

    #!/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"
    
  9. -1

    Vedere il seguente articolo da Pauli Marcus:

    Howto dividere un database SQL dump in tabella-saggio file

    Dividere un file sql che contiene un intero database, in ogni tabella file
    è abbastanza facile: Grep l’ .sql per eventuali occorrenze di DROP TABLE. Generare
    il nome del file dal nome della tabella che è incluso nel DROP TABLE
    istruzione. Eco l’output in un file. Ecco un piccolo script che
    si aspetta un .sql file come input:

    #!/bin/bash
    
    file=$1 # the input file
    directory="$file-splitted" # the output directory
    output="$directory/header" # the first file containing the header
    GREP="DROP TABLE" # what we are looking for
    
    mkdir $directory # create the output directory
    
    while read line
    do
       # if the current line contains the wanted statement
       if [ $(echo "$line" | grep -c "$GREP") == "1" ]
       then
          # extract the file name
          myfile=$(echo $line | awk '{print $5}' | sed -e 's/`//g' -e 's/;//g')
          # set the new file name
          output="$directory/$myfile"
       fi
           echo "$line" >> $output # write to file
    done < $file
    
    • Che cosa succede se una riga contiene la stringa DROP TABLE? Questa non è una soluzione sicura.

Lascia un commento