mysqldump - โครงสร้างการส่งออกเท่านั้นโดยไม่มีการเพิ่มอัตโนมัติ


88

ฉันมีฐานข้อมูล MySQL และฉันกำลังพยายามหาวิธีส่งออกโครงสร้างเท่านั้นโดยไม่มีค่าการเพิ่มอัตโนมัติ mysqldump --no-dataเกือบจะทำงานได้ แต่จะเก็บค่า auto_increment ไว้ มีวิธีใดบ้างที่จะทำได้โดยไม่ต้องใช้ PHPMyAdmin (ที่ฉันรู้ว่ามันทำได้)


ดูเหมือนกับ MySQL 5.5 (เซิร์ฟเวอร์) --no-dataจะละเว้นค่า auto_increment ตามค่าเริ่มต้น
Joey Adams

@JoeyAdams แน่ใจเหรอ? ที่ไม่ได้เป็นประสบการณ์พฤติกรรมฉัน
Aland

2
@JoeyAdams MySQL 5.7. * ของ mysqldump ไม่ยอมรับการเพิ่มอัตโนมัติเมื่อใช้ - ไม่มีข้อมูล
Tiberiu-Ionuț Stan

คำตอบ:


70

คุณสามารถทำได้:

mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*\b//' > <filename>.sql

ดังที่ผู้อื่นกล่าวไว้หากคุณต้องการsedทำงานอย่างถูกต้องให้เพิ่มพารามิเตอร์g(สำหรับg lobal replacement) ดังนี้:

mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*\b//g' > <filename>.sql

(นี้จะทำงานเฉพาะถ้าคุณมีเครื่องมือ GUI ติดตั้งmysqldump --skip-auto-increment)

ปรับปรุงใหม่ขอบคุณความคิดเห็น

\bจะไม่ได้ผลและบางครั้งจะทำลายคำสั่ง ดูหัวข้อ SO นี้สำหรับคำอธิบาย ดังนั้นคำตอบที่ดีที่สุดคือ:

mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*//g' > <filename>.sql

11
ฉันไม่คิดว่า--skip-auto-incrementเป็นตัวเลือกที่แท้จริง ฉันไม่สามารถหาได้ในเอกสาร ทั้งสองข้อบกพร่อง MySQL สำหรับปัญหานี้พูดถึงมัน: 20786 , 30957 mysqldump รุ่นใดมีตัวเลือกนี้
รวย

1
--skip-auto-incrementเป็นตัวเลือกที่เพิ่มเข้ามาใน MySQL GUI Tools หากจำไม่ผิด (ไม่แน่ใจ ^^) อันที่จริงมันไม่ใช่วิธีแก้ปัญหา! แต่คำสั่งอินไลน์ที่สองนั้นถูกต้องฉันพบที่นี่โดยที่หัวข้อพูดถึงปัญหาการเพิ่มอัตโนมัติและให้แนวคิดในการsedกรอง!
JoDev

4
ตัวเลือก Sed จะไม่ลบการเพิ่มอัตโนมัติทั้งหมดหากคุณส่งออกหลายตารางโดยเป็นตารางสุดท้ายเท่านั้น นอกจากนี้ --skip-auto-Increment ไม่ใช่ตัวเลือกที่มีอยู่ คำตอบนี้ได้รับคะแนนสูงขนาดนี้ได้อย่างไร?
Lex

3
คุณต้องใช้ ag ในตอนท้ายของคำสั่ง sed: sed 's /.../.../ g' เพื่อแทนที่เหตุการณ์ทั้งหมด
p91paul

คำสั่งนี้ไม่ถูกต้อง --skip-auto-Increment ไม่มีอยู่ นิพจน์ทั่วไปไม่ถูกต้อง ตามที่ p91paul ระบุว่าต้องเพิ่มตัวปรับแต่ง g เพื่อแทนที่เหตุการณ์ทั้งหมด ใช้โซลูชัน @JohnW แทน
Aalex Gabi

52

คำตอบของ JoDev ทำงานได้อย่างสมบูรณ์แบบสำหรับฉันด้วยการปรับเปลี่ยนเล็กน้อยสำหรับนิพจน์ทั่วไป:

mysqldump -d -h localhost -u<user> -p<password> <databaseName> | sed 's/ AUTO_INCREMENT=[0-9]*//g' > databaseStructure.sql

1
ใช่ฉันไม่แน่ใจว่า\bมันทำอะไรในคำสั่ง sed แต่ตามคำแนะนำของ @JohnW ที่นี่การลบสวิตช์นั้นก็เป็นเคล็ดลับสำหรับฉันเช่นกัน
เดวิด

4

เป็น --create-options ซึ่งมาพร้อมกับ --opt โดยค่าเริ่มต้นซึ่งสร้างนิยามตาราง AUTO_INCREMENT

หากคุณต้องการเฉพาะตารางพื้นฐาน

mysql -hlocalhost -uuser -ppass --skip-column-names --batch \
    -e "select table_name from tables where table_type = 'BASE TABLE' and table_schema = 'schemaname'" INFORMATION_SCHEMA \
| xargs mysqldump -hlocalhost -uuser -ppass \
    --no-data --skip-triggers --skip-opt --no-create-db \
    schemaname

หากคุณต้องการมุมมองทริกเกอร์และกิจวัตรด้วย

mysqldump -hlocalhost -uuser -ppass \
    --skip-opt --events --routines --no-data \
    schemaname

3
โปรดทราบว่าสิ่งนี้จะลดฟิลด์การเพิ่มอัตโนมัติdrop tableชุดอักขระและอื่น ๆ
Deanna

2

ขอบคุณโพสต์นี้ฉันสามารถตอบคำถามของฉัน:

ฉันจะควบคุมเวอร์ชันบนฐานข้อมูลของฉันได้อย่างไร

จากนั้นฉันก็สร้างสคริปต์นี้: db_bkp.sh

#!/bin/sh
filename="db_structure.sql"
backupfolder="/var/www/"
fpath="$backupfolder/$filename"
usr="DBUSER"
pass="DBPASS"
db="DBNAME"
mysqldump --user=$usr --password=$pass --no-data $db | sed 's/ AUTO_INCREMENT=[0-9]*//g' > "$fpath"

จากนั้นฉันเพิ่มสิ่งนี้ใน crontab:

30 5 * * * sh /home/scripts/db_bkp.sh

จากนั้นใน repo ของฉันฉันเพิ่มผลลัพธ์db_structure.sqlเป็นคอมไพล์และก่อนที่จะผลักดันการเปลี่ยนแปลงไปยัง prod ฉันมักจะตรวจสอบว่ามีการเปลี่ยนแปลงโครงสร้างใด ๆ ที่ฉันลืมทำกับ dbs ทั้งหมดหรือไม่


-1

mysqldump -u [USER] -p [PASSWORD] -d --skip-opt - single-transaction [DB_SCHEMA]> [FILE.ESTENSIONE]


6
การดำเนินการนี้จะลบค่าสถานะ auto_increment ในช่องที่เปิดใช้งานไม่ใช่แค่ค่า auto_increment ในตอนท้าย
Aquarion

--skip-optพูดถึงที่นี่และที่นี่
คริส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.