ฉันจะสำรองโครงสร้างตารางได้อย่างไร แต่ไม่ใช่ข้อมูลใน MySQL


20

ฉันใช้ผู้ดูแลระบบ MySQL เพื่อทำการสำรองฐานข้อมูลของฉัน ฉันสามารถสำรองฐานข้อมูลทั้งหมดได้อย่างสมบูรณ์แบบด้วยตารางทั้งหมด มีบางตารางที่มีขนาดใหญ่มากดังนั้นฉันสงสัยว่าฉันสามารถสำรองโครงสร้างของตาราง (เฉพาะองค์ประกอบของพวกเขา) แต่ไม่ใช่ข้อมูลของพวกเขา

คำตอบ:


40

ใช้--no-dataสวิตช์กับ mysqldump เพื่อบอกว่าจะไม่ถ่ายโอนข้อมูลเพียงโครงสร้างตาราง

สิ่งนี้จะแสดงผลคำสั่ง CREATE TABLE สำหรับตาราง

บางสิ่งเช่นนี้

mysqldump --no-data -h localhost -u root -ppassword mydatabase > mydatabase_backup.sql

หากต้องการกำหนดเป้าหมายตารางเฉพาะให้ป้อนพวกเขาหลังชื่อฐานข้อมูล

mysqldump --no-data -h localhost -u root -ppassword mydatabase table1 table2 > mydatabase_backup.sql

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_no-data

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html


+1 ดูถูกต้อง
David Pashley

ขอบคุณ LukeR ฉันสามารถจัดการกับที่ ในขณะที่เขียนฉันไม่รู้อะไรเลยเกี่ยวกับ mysqldump แต่ฉันสามารถแก้ปัญหาด้วยสวิตช์ --no-data จากนั้นฉันก็พบผู้ดูแลระบบ MySQL ว่า "CREATE SCRIPT" ของตารางนั้นดังนั้นฉันสามารถแก้ไขปัญหานี้ด้วยทางเลือกนี้ได้เช่นกัน

3

ดังที่ LukeR กล่าวว่าตัวเลือก --no-data ของ mysqldump จะทำสิ่งที่คุณต้องการ

เพื่อเพิ่มที่นี่เป็นสคริปต์สำรองฉันเขียนที่ทิ้งฐานข้อมูล mysql ทั้งหมดไปยังไฟล์ข้อความธรรมดาและสร้างการถ่ายโอนไฟล์แยกต่างหากสำหรับตาราง schema และฐานข้อมูลของแต่ละฐานข้อมูล (เป็นเรื่องปกติที่ต้องการกู้คืนหรือสร้างตารางบนเซิร์ฟเวอร์ mysql อื่น ข้อมูลและง่ายมากที่จะทำเมื่อคุณมีไฟล์ขนาดเล็กที่มีเพียงคำสั่ง CREATE TABLE / CREATE INDEX เป็นต้น)

#! / bin / ทุบตี

# backup-mysql.sh
#
# Craig Sanders <cas@taz.net.au>
# สคริปต์นี้อยู่ในโดเมนสาธารณะ ทำสิ่งที่คุณต้องการด้วย

MYUSER = "ชื่อผู้ใช้"
MYPWD = "PASSWD"

ARGS = "- การทำรายการเดียว - ล้างบันทึก - การแทรกแบบสมบูรณ์"

DATABASES = $ (mysql -D mysql --skip-column-names -B -e 'แสดงฐานข้อมูล;' | egrep -v 'information_schema');


BackupDir = / var / การสำรองข้อมูล / MySQL

YEAR = $ (วันที่ + "% Y")
MONTH = $ (วันที่ + "% m")
DAY = $ (วันที่ + "% d")

วัน = "$ YEAR- $ ต่อเดือน / $ YEAR- $ MONTH- $ DAY"

mkdir -p $ BACKUPDIR / $ DATE
cd $ BACKUPDIR / $ DATE

สำหรับฉันใน $ DATABASES ทำ
  echo -n "สำรองข้อมูล $ i: schema ... "
  mysqldump $ ARGS - ไม่มีข้อมูล -u $ MYUSER -p $ MYPWD $ i> $ i.schema.sql

  echo -n "data ... "
  mysqldump $ ARGS - opt-opt - no-create-db - no-create-info -u $ MYUSER -p $ MYPWD $ i> $ i.data.sql

  echo -n "กำลังบีบอัด ... "
  gzip -9fq $ i.schema.sql $ i.data.sql
  echo "เสร็จสิ้น"
เสร็จแล้ว

# ลบไฟล์สำรองข้อมูลที่เก่ากว่า 30 วัน
OLD = $ (ค้นหา $ BACKUPDIR -type d -mtime +30)
ถ้า [-n "$ OLD"]; แล้วก็
        echo ลบไฟล์สำรองข้อมูลเก่า: $ OLD
        echo $ OLD | xargs rm -rfv
Fi

ขอบคุณ Craig มากสำหรับคำตอบของคุณ! ฉันแค่เลือกคำตอบของ LukeR เหมือนครั้งแรก ขอบคุณสำหรับสคริปต์มันเป็นข้อมูลอ้างอิงที่ดี

ฉันขอแนะนำให้เพิ่ม--routinesสคริปต์สคีมาหรือไม่
Jonathan

0

คุณสามารถทำได้ด้วยตนเองผ่านmysqlอินเตอร์เฟสบรรทัดคำสั่งโดยทำDESCRIBE <tablename>และคัดลอก / วางผลลัพธ์


DESCRIBE จะไม่ให้สิ่งที่คุณสามารถคัดลอกและวางได้ แสดงตารางจะ
David Pashley

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