ตาราง mysqldump คุณเป็นอย่างไร


403

ฉันจะดัมพ์ตารางเฉพาะหรือชุดของตารางโดยไม่รวมตาราง db ที่เหลือได้อย่างไร?


คำตอบ:


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ในคำตอบของฉันด้วยความยาวสูงสุด 10K ขอบคุณ @RoryDonohue


43
หากต้องการยกเว้นเพียงไม่กี่ตารางคุณสามารถใช้ --ignore-table = Table1 --ignore-table = Table2 --ignore-table = Table3 ฯลฯ
codewaggle

@codecowboy คุณสามารถเปลี่ยนไปSQL="${SQL} AND table_name NOT IN ('t1','t2','t3')" SQL="${SQL} AND table_name NOT LIKE 'foo\_%'"ฉันเพิ่งทดสอบและใช้งานได้ คุณสามารถเปลี่ยนเงื่อนไขเป็น '% foo%' เพื่อรับตารางทั้งหมดที่มี 'foo' ที่ใดก็ได้ในชื่อของพวกเขา (รวมถึง 'อาหาร', 'คนโง่' ฯลฯ )
Buttle Butkus

1
วิธีการยกเว้นตารางที่นี่ซ้ำซ้อนและ overkill ไม่ใช่เพราะการมีอยู่ของ--ignore-tableอาร์กิวเมนต์? และถ้าเป็นเช่นนั้นจะดีกว่าไหมที่จะทำให้สคริปของคุณเสียจากคำตอบและเพียงแนะนำ--ignore-tableแทน?
Mark Amery

@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
แต่หนึ่งได้รายการตารางทั้งหมดเพื่อยกเว้นและมันจะถ่ายโอนข้อมูลเพียงแค่คนที่เหลือ :-)
โคลิน 'T ฮาร์ท
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.