Як ви mysqldump конкретні таблиці (и)?


Відповіді:


540

Якщо ви скидаєте таблиці t1, t2 і t3 з mydb

mysqldump -u... -p... mydb t1 t2 t3 > mydb_tables.sql

Якщо у mydb є тонна таблиця, і ви хочете скинути все, крім t1, t2 та t3, зробіть це:

DBTODUMP=mydb
SQL="SET group_concat_max_len = 10240;"
SQL="${SQL} SELECT GROUP_CONCAT(table_name separator ' ')"
SQL="${SQL} FROM information_schema.tables WHERE table_schema='${DBTODUMP}'"
SQL="${SQL} AND table_name NOT IN ('t1','t2','t3')"
TBLIST=`mysql -u... -p... -AN -e"${SQL}"`
mysqldump -u... -p... ${DBTODUMP} ${TBLIST} > mydb_tables.sql

Спробувати !!!

ОНОВЛЕННЯ 2014-03-06 10:15 EST

@RoryDonohue вказував на мене, що функція GROUP_CONCAT повинна збільшити максимальну довжину. Я додав змінну сесії group_concat_max_len до своєї відповіді довжиною максимум 10 К. Дякую, @RoryDonohue.


43
Щоб виключити лише кілька таблиць, ви можете використовувати --ignore-table = Таблиця1 --ignore-table =
Таблиця2 --ignore

@codecowboy, ви можете змінити SQL="${SQL} AND table_name NOT IN ('t1','t2','t3')"до SQL="${SQL} AND table_name NOT LIKE 'foo\_%'". Я просто перевірив це, і він працює. Ви можете змінити умову на "% foo%", щоб отримати всі таблиці, що містять "foo" в будь-якому місці їхніх назв (включаючи "їжу", "дурень" тощо).
Buttle Butkus

1
Хіба підхід до виключення таблиць тут не є надмірним та зайвим, враховуючи існування --ignore-tableаргументу? І якщо так, то чи не було б краще відірвати свій скрипт від відповіді, а просто рекомендувати --ignore-tableзамість цього?
Марк Амері

@codewaggle Це дає помилку, Illegal use of option --ignore-table=<database>.<table>якщо я не вказав таблицю як schemaname.tablename.
WAF

класні речі, будь-яка причина змінна SQL не є багаторядковою?
sdkks

72

Примітка для розширення відповіді від RolandoMySQLDBA .

Сценарій, який він включив, - це чудовий підхід для включення ( and table_name in) або виключення ( and table_name NOT in) списку таблиць.

Якщо вам потрібно виключити одну або дві таблиці, ви можете виключити їх окремо за допомогою --ignore-tableпараметра:

mysqldump -u -p etc. --ignore-table=Database.Table1 --ignore-table=Database.Table2 > dump_file.sql

29

Коли у вас більше декількох таблиць, набагато краще виконати щось подібне:

mysql databasename -u [user] -p[password] -e 'show tables like "table_name_%"' 
       | grep -v Tables_in 
       | xargs mysqldump [databasename] -u [root] -p [password] > [target_file]

Або дещо так подумайте:

mysqldump -u [user] -p[password] databasename `echo "show tables like 'table_name_%';" 
       | mysql -u[user] -p[password] databasename 
       | sed '/Tables_in/d'` > [target_file]

Пам'ятайте, що ці команди повинні бути введені лише в одному рядку.


11

Зробити це можна просто за допомогою команди нижче:

mysqldump -uusername -ppassword dbname \
  --ignore-table=schema.tablename1    \
  --ignore-table=schema.tablename2    \
  --ignore-table=schema.tablename3 > mysqldump.sql

4
--ignore-table - це виключити певні таблиці з mysqldump, не включати. :)
Praveen Prasannan

3
І все ж можна було перелічити всі таблиці, які потрібно виключити, і це скине лише ті, що залишилися :-)
Colin 't Hart
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.