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ę.
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
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".
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
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)
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.
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
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;
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
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