MySQL importuje bazę danych, ale ignoruje określoną tabelę

Mam duży plik SQL z jedną bazą danych i około 150 tabel. Chciałbym użyć mysqlimport do importowania tej bazy danych, jednak chciałbym, aby proces importu ignorował lub pomijał kilka tabel. Jaka jest właściwa składnia importowania wszystkich tabel, ale ignorowania niektórych z nich? Dziękuję.

Author: DanielAttard, 2013-05-24

8 answers

mysqlimport nie jest właściwym narzędziem do importowania poleceń SQL. To narzędzie jest przeznaczone do importowania sformatowanych plików tekstowych, takich jak CSV. To, co chcesz zrobić, to przesłać swój zrzut sql bezpośrednio do klienta mysql za pomocą polecenia takiego jak ta:

bash > mysql -D your_database < your_sql_dump.sql

Ani mysql ani mysqlimport nie zapewniają funkcji, której potrzebujesz. Twoją najlepszą szansą będzie importowanie całego zrzutu, a następnie upuszczanie tabel, których nie chcesz.

Jeśli masz dostęp do serwera, z którego pochodzi zrzut, możesz utworzyć nowy zrzut z mysqldump --ignore-table=database.table_you_dont_want1 --ignore-table=database.table_you_dont_want2 ....


sprawdź tę odpowiedź, aby obejść obejście pominięcia importowania tabeli

 12
Author: RandomSeed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-02 11:50:06

Zaakceptowana odpowiedź przez RandomSeed może zająć dużo czasu! Importowanie tabeli (aby ją później upuścić) może być bardzo marnotrawne w zależności od rozmiaru.

Dla pliku utworzonego za pomocą

mysqldump -u user -ppasswd --opt --routines DBname > DBdump.sql

Obecnie dostaję plik około 7GB, z czego 6GB to dane do tabeli logów, których nie "potrzebuję", aby tam być; przeładowanie tego pliku zajmuje kilka godzin. Jeśli muszę przeładować (w celach programistycznych lub jeśli kiedykolwiek jest to wymagane do odzyskiwania na żywo), przeglądam plik w ten sposób:

sed '/INSERT INTO `TABLE_TO_SKIP`/d' DBdump.sql > reduced.sql

I przeładuj z:

mysql -u user -ppasswd DBname < reduced.sql

To daje mi kompletną bazę danych, z" niechcianą " tabelą utworzoną, ale pustą. Jeśli naprawdę nie chcesz tabel w ogóle, po prostu upuść puste tabele po zakończeniu ładowania.

Dla wielu tabel można zrobić coś takiego:

sed '/INSERT INTO `TABLE1_TO_SKIP`/d' DBdump.sql | \
sed '/INSERT INTO `TABLE2_TO_SKIP`/d' | \
sed '/INSERT INTO `TABLE3_TO_SKIP`/d' > reduced.sql

Istnieje' gotcha '- uważaj na procedury w Twoim zrzutu, które mogą zawierać "INSERT INTO TABLE_TO_SKIP".

 138
Author: Don,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-10 10:41:20

Dla każdego, kto pracuje z .sql.pliki gz; okazało się, że następujące rozwiązanie jest bardzo przydatne. Nasza baza danych była 25GB+ i musiałem usunąć tabele dziennika.

gzip -cd "./mydb.sql.gz" | sed -r '/INSERT INTO `(log_table_1|log_table_2|log_table_3|log_table_4)`/d' | gzip > "./mydb2.sql.gz"

Dzięki odpowiedzi Don i komentarz Xosofox i ten powiązany post: Użyj zcat i sed lub awk do edycji skompresowanej .plik tekstowy gz

 7
Author: feskr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-23 08:06:33

Trochę stary, ale może się przydać...

I liked @Don ' s answer ( https://stackoverflow.com/a/26379517/1446005 ), ale okazało się to bardzo irytujące, że trzeba najpierw napisać do innego pliku...
W moim konkretnym przypadku zajęłoby to zbyt dużo czasu i miejsca na dysku

Więc napisałem mały skrypt Basha:

#!/bin/bash

tables=(table1_to_skip table2_to_skip ... tableN_to_skip)


tableString=$(printf "|%s" "${tables[@]}")
trimmed=${tableString:1}
grepExp="INSERT INTO \`($trimmed)\`"

zcat $1 | grep -vE "$grepExp" | mysql -uroot -p

To nie generuje nowego skryptu sql, ale wysyła go bezpośrednio do bazy danych
ponadto tworzy tabele, po prostu nie importuje dane (co było problemem, który miałem z ogromnymi tabelami logów)

 2
Author: dGo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-26 12:23:40

Jeśli nie zignorowałeś tabel podczas zrzutu za pomocą mysqldump --ignore-table=database.unwanted_table, musisz użyć jakiegoś skryptu lub narzędzia, aby odfiltrować dane, których nie chcesz importować z pliku zrzutu, zanim przekażesz je do klienta mysql.

Oto funkcja bash / SH, która wykluczałaby niechciane tabele z Zrzutu SQL w locie (przez rurę):

# Accepts one argument, the list of tables to exclude (case-insensitive).
# Eg. filt_exclude '%session% action_log %_cache'
filt_exclude() {
    local excl_tns;
    if [ -n "$1" ]; then
        # trim & replace /[,;\s]+/ with '|' & replace '%' with '[^`]*'
        excl_tns=$(echo "$1" | sed -r 's/^[[:space:]]*//g; s/[[:space:]]*$//g; s/[[:space:]]+/|/g; s/[,;]+/|/g; s/%/[^\`]\*/g');

        grep -viE "(^INSERT INTO \`($excl_tns)\`)|(^DROP TABLE (IF EXISTS )?\`($excl_tns)\`)|^LOCK TABLES \`($excl_tns)\` WRITE" | \
        sed 's/^CREATE TABLE `/CREATE TABLE IF NOT EXISTS `/g'        
    else
        cat
    fi
}

Załóżmy, że masz tak utworzony zrzut:

MYSQL_PWD="my-pass" mysqldump -u user --hex-blob db_name | \
pigz -9 > dump.sql.gz

I chcesz wykluczyć niechciane tabele przed importem:

pigz -dckq dump.sql.gz | \
filt_exclude '%session% action_log %_cache' | \
MYSQL_PWD="my-pass" mysql -u user db_name

Or you could przed zaimportowaniem do pliku lub innego narzędzia do pliku DB.

 2
Author: DUzun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-11 11:34:11

Jeśli chcesz, możesz zrobić tę jedną tabelę na raz:

mysqldump -p sourceDatabase tableName > tableName.sql
mysql -p -D targetDatabase < tableName.sql
 1
Author: Domenic D.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-26 02:13:45

Oto mój skrypt do wykluczenia niektórych tabel z Zrzutu mysql Używam go do przywracania DB, gdy trzeba zachować dane zamówień i płatności

Exclude_tables_from_dump.sh

#!/bin/bash

if [ ! -f "$1" ];
then
    echo "Usage: $0 mysql_dump.sql"
    exit
fi

declare -a TABLES=(
user
order
order_product
order_status
payments
)

CMD="cat $1"
for TBL in "${TABLES[@]}";do
    CMD+="|sed 's/DROP TABLE IF EXISTS \`${TBL}\`/# DROP TABLE IF EXIST \`${TBL}\`/g'"
    CMD+="|sed 's/CREATE TABLE \`${TBL}\`/CREATE TABLE IF NOT EXISTS \`${TBL}\`/g'"
    CMD+="|sed -r '/INSERT INTO \`${TBL}\`/d'"
    CMD+="|sed '/DELIMITER\ \;\;/,/DELIMITER\ \;/d'"
done

eval $CMD

Zapobiega upuszczaniu i odtwarzaniu tabel oraz wstawianiu danych do tych tabel. Ponadto usuwa wszystkie funkcje i procedury, które są przechowywane między DELIMITER ;; i DELIMITER;

 1
Author: Alexey Muravyov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-30 14:11:09

Nie użyłbym go do produkcji, ale gdybym musiał szybko zaimportować jakąś kopię zapasową, która zawiera wiele mniejszych tabel i jedną wielką tabelę potwora, która może zająć wiele godzin, prawdopodobnie " grep-v unwanted_table_name original.SQL > reduced.sql

A następnie mysql - f

 0
Author: Zoran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-08 03:48:46