scaricare tutte le tabelle mysql in file separati automaticamente?

Mi piacerebbe ottenere i dump di ogni tabella mysql in file separati. Il manuale indica che la syntax per questo è

mysqldump [options] db_name [tbl_name ...] 

Il che indica che conosci i nomi delle tabelle in anticipo. Potrei creare lo script che conosce il nome di ogni tabella ora, ma dire che aggiungo un nuovo tavolo in fondo alla strada e dimentico di aggiornare lo script dump. Quindi mi mancano i dump per uno o più tavoli.

C’è un modo per scaricare automaticamente ogni tabella esistente in un file separato? O dovrò fare qualche script-fu; interrogare il database, ottenere tutti i nomi delle tabelle e scaricarli per nome.

Se passo alla via dello script, quali linguaggi di scripting possono accedere a un database mysql?

Il programma della riga di comando mysqldump lo fa per te, anche se i documenti non sono chiari su questo.

Una cosa da notare è che ~ / output / 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 aver eseguito quanto sopra, si avrà un file tablename.sql contenente lo schema di ogni tabella (creare la dichiarazione della tabella) e il file tablename.txt contenente i dati.

Se vuoi un dump con solo schema, aggiungi il flag –no-data:

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

Ecco uno script che scarica i dati della tabella come comandi SQL in file compressi separati. Non richiede di essere sull’host del server MySQL, non codifica la password nello script, ed è solo per un db specifico, 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)    []" && 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" 

Puoi farlo attraverso:

  1. Ottieni l’elenco dei database in mysql
  2. scaricare 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 

Ecco l’importazione corrispondente.

 #!/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)    []" && 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'" 
 #!/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 

Sembra che tutti qui autocommit=0;SET unique_checks=0;SET foreign_key_checks=0; dimenticato di autocommit=0;SET unique_checks=0;SET foreign_key_checks=0; supponiamo che acceleri 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 

Non sono un padrone di bash, ma lo farei solo con uno script bash. Senza colpire MySQL, con la conoscenza della directory dei dati e del nome del database, è ansible eseguire la scansione di tutti i file .frm (uno per ogni tabella in quella directory db /) per un elenco di tabelle.

Sono sicuro che ci sono modi per renderlo più fluido e accettare argomenti o cose del genere, 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 

Compilare le [opzioni] e la convenzione desiderata per lo outfile quando necessario, e rimuovere il commento dall’ultima linea mysqldump.

Vedi il seguente articolo di Pauli Marcus:

Come dividere un dump di database SQL in file table-wise

La suddivisione di un file sql contenente un intero database in file per tabella è abbastanza semplice: Grep il .sql per qualsiasi occorrenza di DROP TABLE. Generare il nome del file dal nome della tabella incluso nell’istruzione DROP TABLE. Eco l’output in un file. Ecco un piccolo script che si aspetta un file .sql 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