688 Stimmen

Bestimmte Tabellen mit mysqldump überspringen

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

Ich würde zum Beispiel die folgende Syntax für einen Dump verwenden nur Tabelle1 und Tabelle2:

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

Aber gibt es eine ähnliche Möglichkeit, alle Tabellen zu löschen? sauf Tabelle1 und Tabelle2? Ich habe in der mysqldump-Dokumentation nichts gefunden. Ist also Brute-Force (Angabe aller Tabellennamen) der einzige Weg, den ich gehen kann?

4voto

ThorstenC Punkte 1175

Sie können die mysqlpump mit dem Befehl

--exclude-tables=name

Befehl. Er gibt eine durch Kommata getrennte Liste der auszuschließenden Tabellen an.

Die Syntax von mysqlpump ist der von mysqldump sehr ähnlich, ist aber wesentlich leistungsfähiger. Weitere Informationen über die Verwendung der Option exclude finden Sie hier: https://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html#mysqlpump-filtering

1voto

Alan Punkte 1884

Die Lösung von Rubo77 gefällt mir, ich hatte sie noch nicht gesehen, bevor ich die von Paul abänderte. Mit dieser Lösung wird eine einzelne Datenbank gesichert, wobei alle Tabellen, die Sie nicht benötigen, ausgeschlossen werden. Dann wird sie gzipiert und alle Dateien, die älter als 8 Tage sind, werden gelöscht. Ich werde wahrscheinlich zwei Versionen davon verwenden, die einmal am Tag eine Vollsicherung (abzüglich der Protokolltabellen) durchführen, und eine weitere, die nur die wichtigsten Tabellen, die sich am meisten ändern, stündlich mit ein paar Cron-Jobs sichert.

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

1voto

hpaknia Punkte 2521

Der Vollständigkeit halber hier ein Skript, das eigentlich ein Einzeiler sein könnte, um ein Backup von einer Datenbank zu erhalten, wobei alle Ansichten ausgeschlossen (ignoriert) werden. Der Name der Datenbank wird als "Mitarbeiter" angenommen:

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 verwenden group_concat y concat können Sie fast jede gewünschte Zeichenkette oder jeden Shell-Befehl erzeugen.

1voto

mpoletto Punkte 951

Im Allgemeinen sollten Sie diese Funktion verwenden, wenn Sie keine Zeit oder keine Lust haben, sich mit einer großen Tabelle zu beschäftigen. Wenn das Ihr Fall ist, ist es besser, die Option --where von mysqldump zur Begrenzung der Ergebnismenge zu benutzen. Zum Beispiel, mysqldump -uuser -ppass database --where="1 = 1 LIMIT 500000" > resultset.sql .

0voto

rubo77 Punkte 17467

Alle Datenbanken mit allen Tabellen dumpen, aber bestimmte Tabellen auslassen

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X