ฉันมีฐานข้อมูล MySQL และฉันกำลังพยายามหาวิธีส่งออกโครงสร้างเท่านั้นโดยไม่มีค่าการเพิ่มอัตโนมัติ mysqldump --no-data
เกือบจะทำงานได้ แต่จะเก็บค่า auto_increment ไว้ มีวิธีใดบ้างที่จะทำได้โดยไม่ต้องใช้ PHPMyAdmin (ที่ฉันรู้ว่ามันทำได้)
ฉันมีฐานข้อมูล MySQL และฉันกำลังพยายามหาวิธีส่งออกโครงสร้างเท่านั้นโดยไม่มีค่าการเพิ่มอัตโนมัติ mysqldump --no-data
เกือบจะทำงานได้ แต่จะเก็บค่า auto_increment ไว้ มีวิธีใดบ้างที่จะทำได้โดยไม่ต้องใช้ PHPMyAdmin (ที่ฉันรู้ว่ามันทำได้)
คำตอบ:
คุณสามารถทำได้:
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
คำตอบของ JoDev ทำงานได้อย่างสมบูรณ์แบบสำหรับฉันด้วยการปรับเปลี่ยนเล็กน้อยสำหรับนิพจน์ทั่วไป:
mysqldump -d -h localhost -u<user> -p<password> <databaseName> | sed 's/ AUTO_INCREMENT=[0-9]*//g' > databaseStructure.sql
\b
มันทำอะไรในคำสั่ง sed แต่ตามคำแนะนำของ @JohnW ที่นี่การลบสวิตช์นั้นก็เป็นเคล็ดลับสำหรับฉันเช่นกัน
เป็น --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
drop table
ชุดอักขระและอื่น ๆ
ขอบคุณโพสต์นี้ฉันสามารถตอบคำถามของฉัน:
ฉันจะควบคุมเวอร์ชันบนฐานข้อมูลของฉันได้อย่างไร
จากนั้นฉันก็สร้างสคริปต์นี้: 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 ทั้งหมดหรือไม่
--no-data
จะละเว้นค่า auto_increment ตามค่าเริ่มต้น