Überspringen Sie bestimmte Tabellen mit mysqldump

558

Gibt es eine Möglichkeit, bestimmte Tabellen mit dem Befehl mysqldump einzuschränken?

Zum Beispiel würde ich die folgende Syntax verwenden, um nur Tabelle1 und Tabelle2 zu sichern:

mysqldump -u username -p database table1 table2 > database.sql

Aber gibt es eine ähnliche Möglichkeit, alle Tabellen außer Tabelle1 und Tabelle2 zu sichern? Ich habe in der mysqldump-Dokumentation nichts gefunden. Ist Brute-Force (Angabe aller Tabellennamen) der einzige Weg?

Zac
quelle

Antworten:

940

Sie können die Option --ignore-table verwenden . Also könntest du es tun

mysqldump -u USERNAME -pPASSWORD DATABASE --ignore-table=DATABASE.table1 > database.sql

Es gibt kein Leerzeichen danach -p(dies ist kein Tippfehler).

Wenn Sie mehrere Tabellen ignorieren möchten, können Sie ein einfaches Skript wie dieses verwenden

#!/bin/bash
PASSWORD=XXXXXX
HOST=XXXXXX
USER=XXXXXX
DATABASE=databasename
DB_FILE=dump.sql
EXCLUDED_TABLES=(
table1
table2
table3
table4
tableN   
)

IGNORED_TABLES_STRING=''
for TABLE in "${EXCLUDED_TABLES[@]}"
do :
   IGNORED_TABLES_STRING+=" --ignore-table=${DATABASE}.${TABLE}"
done

echo "Dump structure"
mysqldump --host=${HOST} --user=${USER} --password=${PASSWORD} --single-transaction --no-data --routines ${DATABASE} > ${DB_FILE}

echo "Dump content"
mysqldump --host=${HOST} --user=${USER} --password=${PASSWORD} ${DATABASE} --no-create-info --skip-triggers ${IGNORED_TABLES_STRING} >> ${DB_FILE}
Paul Sheldrake
quelle
4
Vielen Dank! Hat perfekt funktioniert ... Ich weiß nicht, wie ich das verpasst habe.
Zac
20
Gibt es eine Möglichkeit, den Tabelleninhalt einfach zu überspringen? Die Struktur, die ich sichern möchte.
Andres SK
5
Sie können die Option --no-data = true verwenden, aber ich weiß nicht, ob Sie dies auf Tabellenebene tun können.
Brian Fisher
60
Wenn der Datenbankname nicht für jede --ignore-Tabelle festgelegt ist, wird der Fehler "Unzulässige Verwendung der Option --ignore-table = <Datenbank>. <Tabelle>" angezeigt. Stellen Sie sicher, dass Sie die Datenbank immer deklarieren!
Supajb
26
Wenn Sie einige Tabellendaten ignorieren möchten, aber dennoch ihre Struktur sichern möchten, können Sie mysqldump erneut für diese Tabellen ausführen und es mit dem soeben erstellten Backup verketten
carpii
119

Aufbauend auf der Antwort von @ Brian-Fisher und der Beantwortung der Kommentare einiger Leute in diesem Beitrag habe ich eine Reihe großer (und unnötiger) Tabellen in meiner Datenbank, daher wollte ich deren Inhalt beim Kopieren überspringen, aber die Struktur beibehalten ::

mysqldump -h <host> -u <username> -p <schema> --no-data > db-structure.sql
mysqldump -h <host> -u <username> -p <schema> --no-create-info --ignore-table=schema.table1 --ignore-table=schema.table2 > db-data.sql

Die resultierenden zwei Dateien sind strukturell einwandfrei, aber die ausgegebenen Daten sind jetzt ~ 500 MB anstatt 9 GB, viel besser für mich. Ich kann diese beiden Dateien jetzt zu Testzwecken in eine andere Datenbank importieren, ohne mir Gedanken über die Bearbeitung von 9 GB Daten oder den Speicherplatz machen zu müssen.

DuffJ
quelle
Getestet und verwendet unter MySQL 5.5.43 (für debian-linux-gnu (x86_64)) Danke
Abdel
Einfach und elegant. Eine großartige Lösung.
Greg Glockner
4
tolle Lösung. Ich musste --skip-triggers zur zweiten Anweisung hinzufügen, damit der Dump später funktioniert (vorausgesetzt, Sie haben Trigger), aber ansonsten: perfekt
Rainer Mohr
Danke, das funktioniert und ist sehr nützlich.
Himalaya Garg
59

für mehrere Datenbanken:

mysqldump -u user -p --ignore-table=db1.tbl1 --ignore-table=db2.tbl1 --databases db1 db2 ..
user1219736
quelle
5
Es gibt bereits eine Antwort auf diesen Thread, die das besser sagt.
Alxgb
19
Das ist richtig, aber diese Lösung funktioniert mit mehreren Datenbanken.
Alex
Interessant - ich dachte zuerst mysqldund mysqldumpwürde die gleichen Programme sein.
Martin Thoma
4
das ist es, wonach ich suche - eine einzeilige Antwort mit der Lösung, die mich nicht zwingt, 2-3
Minuten lang
43

Ein weiteres Beispiel zum Ignorieren mehrerer Tabellen

/usr/bin/mysqldump -uUSER -pPASS --ignore-table={db_test.test1,db_test.test3} db_test> db_test.sql

Verwenden --ignore-tableund Erstellen eines Arrays von Tabellen mit Syntax wiedatabase.table

--ignore-table={db_test.table1,db_test.table3,db_test.table4}

Links mit Informationen, die Ihnen helfen werden

Ausgabe komprimieren mysqldump

Hinweis: Getestet auf einem Ubuntu-Server mit MySQL Ver 14.14 Distrib 5.5.55

Datenbank importieren

 mysql -uUSER  -pPASS db_test < db_test.sql

Einfaches Skript zum Ignorieren von Tabellen

#!/bin/bash

#tables to ignore
_TIGNORE=(
my_database.table1
my_database.table2
my_database.tablex
)

#create text for ignore tables
_TDELIMITED="$(IFS=" "; echo "${_TIGNORE[*]/#/--ignore-table=}")"

#don't forget to include user and password
/usr/bin/mysqldump -uUSER -pPASSWORD --events ${_TDELIMITED} --databases my_database | gzip -v > backup_database.sql.gz
DarckBlezzer
quelle
Gute Möglichkeit, die Verwendung eines Skripts zu vermeiden, wenn Sie mehrere Tabellen ignorieren möchten. Diese Antwort sollte mehr "+1" erhalten
svfat
perfekte Antwort!!! +1 machte meinen Tag :)
SagarPPanchal
7

Um einige Tabelle ausschließen Daten , aber nicht die Tabellenstruktur . So mache ich das:

Speichern Sie die Datenbankstruktur aller Tabellen ohne Daten:

mysqldump -u user -p --no-data database > database_structure.sql

Speichern Sie dann die Datenbank mit Daten, mit Ausnahme der ausgeschlossenen Tabellen, und sichern Sie die Struktur nicht:

mysqldump -u user -p --no-create-info \
    --ignore-table=database.table1 \
    --ignore-table=database.table2 database > database_data.sql

So laden Sie es in eine neue Datenbank:

mysql -u user -p newdatabase < database_structure.sql
mysql -u user -p newdatabase < database_data.sql
Benedikt Köppel
quelle
1

Sie können den mysqlpumpBefehl mit dem verwenden

--exclude-tables=name

Befehl. Es gibt eine durch Kommas getrennte Liste von Tabellen an, die ausgeschlossen werden sollen.

Die Syntax von mysqlpump ist mysqldump sehr ähnlich, aber viel leistungsfähiger. Weitere Informationen zur Verwendung der Ausschlussoption finden Sie hier: https://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html#mysqlpump-filtering

ThorstenC
quelle
0

Speichern Sie alle Datenbanken mit allen Tabellen, überspringen Sie jedoch bestimmte Tabellen

auf github: https://github.com/rubo77/mysql-backup.sh/blob/master/mysql-backup.sh

#!/bin/bash
# mysql-backup.sh

if [ -z "$1" ] ; then
  echo
  echo "ERROR: root password Parameter missing."
  exit
fi
DB_host=localhost
MYSQL_USER=root
MYSQL_PASS=$1
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
#MYSQL_CONN=""

BACKUP_DIR=/backup/mysql/

mkdir $BACKUP_DIR -p

MYSQLPATH=/var/lib/mysql/

IGNORE="database1.table1, database1.table2, database2.table1,"

# strpos $1 $2 [$3]
# strpos haystack needle [optional offset of an input string]
strpos()
{
    local str=${1}
    local offset=${3}
    if [ -n "${offset}" ]; then
        str=`substr "${str}" ${offset}`
    else
        offset=0
    fi
    str=${str/${2}*/}
    if [ "${#str}" -eq "${#1}" ]; then
        return 0
    fi
    echo $((${#str}+${offset}))
}

cd $MYSQLPATH
for i in */; do
    if [ $i != 'performance_schema/' ] ; then 
    DB=`basename "$i"` 
    #echo "backup $DB->$BACKUP_DIR$DB.sql.lzo"
    mysqlcheck "$DB" $MYSQL_CONN --silent --auto-repair >/tmp/tmp_grep_mysql-backup
    grep -E -B1 "note|warning|support|auto_increment|required|locks" /tmp/tmp_grep_mysql-backup>/tmp/tmp_grep_mysql-backup_not
    grep -v "$(cat /tmp/tmp_grep_mysql-backup_not)" /tmp/tmp_grep_mysql-backup

    tbl_count=0
    for t in $(mysql -NBA -h $DB_host $MYSQL_CONN -D $DB -e 'show tables') 
    do
      found=$(strpos "$IGNORE" "$DB"."$t,")
      if [ "$found" == "" ] ; then 
        echo "DUMPING TABLE: $DB.$t"
        mysqldump -h $DB_host $MYSQL_CONN $DB $t --events --skip-lock-tables | lzop -3 -f -o $BACKUP_DIR/$DB.$t.sql.lzo
        tbl_count=$(( tbl_count + 1 ))
      fi
    done
    echo "$tbl_count tables dumped from database '$DB' into dir=$BACKUP_DIR"
    fi
done

Mit ein wenig Hilfe von https://stackoverflow.com/a/17016410/1069083

Es verwendet lzop, das viel schneller ist, siehe: http://pokecraft.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO

rubo77
quelle
Das von Ihnen freigegebene Dokument besagt, dass gzip schneller als lzop ist.
Jrosell
0

Ich mag die Lösung von Rubo77, ich hatte sie nicht gesehen, bevor ich Pauls modifiziert habe. Dieser wird eine einzelne Datenbank sichern, mit Ausnahme aller Tabellen, die Sie nicht möchten. Es wird dann gzip und löscht alle Dateien, die älter als 8 Tage sind. Ich werde wahrscheinlich 2 Versionen davon verwenden, die einmal am Tag eine vollständige (Minus-Protokoll-Tabelle) erstellen, und eine andere, die nur die wichtigsten Tabellen sichert, die sich stündlich am meisten ändern, mit ein paar Cron-Jobs.

#!/bin/sh
PASSWORD=XXXX
HOST=127.0.0.1
USER=root
DATABASE=MyFavoriteDB

now="$(date +'%d_%m_%Y_%H_%M')"
filename="${DATABASE}_db_backup_$now"
backupfolder="/opt/backups/mysql"
DB_FILE="$backupfolder/$filename"
logfile="$backupfolder/"backup_log_"$(date +'%Y_%m')".txt

EXCLUDED_TABLES=(
logs
)
IGNORED_TABLES_STRING=''
for TABLE in "${EXCLUDED_TABLES[@]}"
do :
   IGNORED_TABLES_STRING+=" --ignore-table=${DATABASE}.${TABLE}"
done

echo "Dump structure started at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
mysqldump --host=${HOST} --user=${USER} --password=${PASSWORD} --single-transaction --no-data --routines ${DATABASE}  > ${DB_FILE} 
echo "Dump structure finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
echo "Dump content"
mysqldump --host=${HOST} --user=${USER} --password=${PASSWORD} ${DATABASE} --no-create-info --skip-triggers ${IGNORED_TABLES_STRING} >> ${DB_FILE}
gzip ${DB_FILE}

find "$backupfolder" -name ${DATABASE}_db_backup_* -mtime +8 -exec rm {} \;
echo "old files deleted" >> "$logfile"
echo "operation finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
echo "*****************" >> "$logfile"
exit 0
Alan
quelle
0

Der Vollständigkeit halber ist hier ein Skript, das tatsächlich ein Einzeiler sein kann, um ein Backup von einer Datenbank zu erhalten, wobei alle Ansichten ausgeschlossen (ignoriert) werden. Es wird angenommen, dass der Datenbankname Mitarbeiter ist:

ignore=$(mysql --login-path=root1 INFORMATION_SCHEMA \
    --skip-column-names --batch \
    -e "select 
          group_concat(
            concat('--ignore-table=', table_schema, '.', table_name) SEPARATOR ' '
          ) 
        from tables 
        where table_type = 'VIEW' and table_schema = 'employees'")

mysqldump --login-path=root1 --column-statistics=0 --no-data employees $ignore > "./backups/som_file.sql"   

Sie können die Logik der Abfrage aktualisieren. Im Allgemeinen können Sie mit group_concatund concatfast jeden gewünschten String- oder Shell-Befehl generieren.

hpaknia
quelle