การถ่ายโอนข้อมูล MySQL โดยแบบสอบถาม


220

เป็นไปได้ที่จะทำmysqldumpโดยเดี่ยวSQL query?

ฉันหมายถึงการถ่ายโอนฐานข้อมูลทั้งหมดเหมือนphpmyadminเมื่อคุณส่งออกไปSQL

คำตอบ:


285

ไม่ใช่ mysqldump แต่เป็น mysql ...

mysql -e "select * from myTable" -u myuser -pxxxxxxxxx mydatabase

คุณสามารถเปลี่ยนมันออกเป็นไฟล์ถ้าคุณต้องการ:

mysql -e "select * from myTable" -u myuser -pxxxxxxxx mydatabase > mydumpfile.txt

ปรับปรุง: โพสต์ต้นฉบับถามว่าเขาสามารถถ่ายโอนข้อมูลจากฐานข้อมูลด้วยแบบสอบถาม สิ่งที่เขาถามและสิ่งที่เขาหมายถึงแตกต่างกัน เขาต้องการ mysqldump ทุกตารางจริงๆ

mysqldump --tables myTable --where="id < 1000"

22
วิธีการคืนค่าไฟล์ txt ที่ถูกทิ้งนี้?
Vivek S

3
สำหรับผู้ที่พยายามใช้ mysql -e ฉันต้องปรับแต่งสคริปต์เล็กน้อยเพื่อให้เหมาะกับฉัน อันนี้คุณต้องป้อนรหัสผ่าน sql เมื่อทำงาน mysql -e "select * from table WHERE query = 'asdasd'" -u root -p --database = DBNAME> text.txt
RichardW11

13
คุณสามารถสร้างตารางใหม่สำหรับแบบสอบถาม (CREATE TABLE SELECT) จากนั้นดัมพ์ตารางนั้นด้วย mysqldump ด้วยวิธีนี้คุณสามารถกู้คืนได้อย่างง่ายดายในภายหลัง
quano

1
สำหรับผู้ที่ต้องการใช้ mysqldump และเรียกคืนไฟล์ได้ดูที่นี่: stackoverflow.com/a/2431936/411786
Syco

2
หากต้องการนำเข้าข้อมูลที่ส่งออกด้วย mysql -e พร้อมกับตัวเลือก -B เพื่อแสดงผลเป็นตัวคั่นแท็บให้เรียกใช้ mysqlimport --ignore-lines = 1 - ฟิลด์ยุติด้วย by = '\ t' ดู: stackoverflow.com/a/17071108/1676044
Kevin Borders

259

สิ่งนี้น่าจะใช้ได้

mysqldump --databases X --tables Y --where="1 limit 1000000"

4
เป็นตัวอย่างที่ดีกว่าอาจจะมีอะไรบางอย่างที่ดูเหมือนจริงที่ข้อเช่น --where = "myColumn <1000" - ล้านแถวแรกของตารางทุกดูเหมือนว่าเป็นสิ่งที่แปลกที่จะร้องขอ;)
ijw

@ijw หากสิ่งที่คุณต้องการทำคือการสำรองข้อมูลที่สามารถแทรกเข้าไปใหม่ในตารางของคุณได้อย่างง่ายดายคุณอาจไม่จำเป็นต้องใช้ส่วนคำสั่งใด ๆ นอกเหนือจากข้อ จำกัด
Thomas Ahle

3
@Sagotharan: ก็ไม่ได้เป็นแบบสอบถาม นั่นอาจเป็นเหตุผล
การแข่งขัน Lightness ใน Orbit

80
!!คำเตือน!! mysqldump เพิ่มคำสั่ง 'DROP TABLE' ที่ด้านบนของไฟล์ที่ส่งออก นั่นหมายความว่าถ้าคุณทำการส่งออกบางส่วนแล้วนำเข้าอีกครั้งคุณจะสูญเสียทุกอย่างไป ฉันก็ทำได้
Tamlyn

35
ใช่เพื่อที่จะไม่ลบข้อมูลทั้งหมดในตารางของคุณเมื่อกู้คืนจากไฟล์ข้อมูลที่บันทึกไว้ให้แน่ใจว่าคุณเพิ่มใน--no-create-infoตัวเลือก ดูคำตอบของฉันสำหรับตัวอย่าง
Gary

71

คุณสามารถทิ้งแบบสอบถามเป็น csv เช่นนี้:

SELECT * from myTable
INTO OUTFILE '/tmp/querydump.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'

8
ถ้าฉันต้องการดัมพ์หลายตาราง
SIFE

11
สิ่งนี้จะสร้างไฟล์บนเครื่องที่ฐานข้อมูล MySQL กำลังทำงานอยู่ ดังนั้นหากคุณทำการสืบค้นจากคอนโซลระยะไกลวิธีนี้จะล้มเหลว หากมีวิธีการทำจากรีโมทคอนโทรลด้วยโปรดแจ้งให้เราทราบ
dknight

2
มันจะบันทึกไฟล์ที่ไหน
Techlord

1
@dknight ฉันสมมติว่าคุณหมายถึงรีโมตคอนโซลผ่านเทอร์มินัลคอนโซลซึ่งในกรณีนี้คุณสามารถดึงไฟล์ที่ถูกทิ้งscpหลังจากผ่านการเชื่อมต่อ นี่คือตัวอย่าง scp user@remote-server.com:/tmp/querydump.csv ~/local.csv
ลุค

ดูเหมือนว่าจะไม่ปลอดภัย: # 1290 - เซิร์ฟเวอร์ MySQL กำลังทำงานกับตัวเลือก --secure-file-priv ดังนั้นจึงไม่สามารถดำเนินการตามคำสั่งนี้ได้
mikep

64

ดัมพ์ตารางโดยใช้เคียวรีที่:

mysqldump mydatabase mytable --where="mycolumn = myvalue" --no-create-info > data.sql

ดัมพ์ตารางทั้งหมด:

mysqldump mydatabase mytable > data.sql

หมายเหตุ:

  • แทนที่mydatabase, mytableและคำสั่ง where ด้วยค่าที่คุณต้องการ
  • โดยค่าเริ่มต้นmysqldumpจะรวมDROP TABLEและCREATE TABLEคำสั่งในการส่งออก ดังนั้นหากคุณไม่ต้องการลบข้อมูลทั้งหมดในตารางเมื่อกู้คืนจากไฟล์ข้อมูลที่บันทึกไว้ตรวจสอบให้แน่ใจว่าคุณใช้--no-create-infoตัวเลือก
  • คุณอาจจะต้องเพิ่มที่เหมาะสม-h, -uและ-pตัวเลือกคำสั่งตัวอย่างข้างต้นเพื่อที่จะระบุโฮสต์ฐานข้อมูลที่คุณต้องการของผู้ใช้และรหัสผ่านตามลำดับ

38

คุณสามารถใช้ตัวเลือก --where บน mysqldump เพื่อสร้างเอาต์พุตที่คุณกำลังรอ:

mysqldump -u root -p test t1 --where="1=1 limit 100" > arquivo.sql

มากที่สุด 100 แถวจาก test.t1 จะถูกทิ้งจากตารางฐานข้อมูล

ไชโยยินดี


6

หากคุณต้องการส่งออกจำนวน n ระเบียนสุดท้ายของคุณไปยังไฟล์คุณสามารถเรียกใช้สิ่งต่อไปนี้:

mysqldump -u user -p -h localhost --where "1=1 ORDER BY id DESC LIMIT 100" database table > export_file.sql

ด้านบนจะบันทึก 100 รายการล่าสุดลงใน export_file.sql สมมติว่าตารางที่คุณส่งออกมีคอลัมน์รหัสที่เพิ่มขึ้นอัตโนมัติ

คุณจะต้องเปลี่ยนค่าผู้ใช้ localhost ฐานข้อมูลและตาราง คุณสามารถเลือกที่จะเปลี่ยนแปลงคอลัมน์ id และส่งออกชื่อไฟล์


5

MySQL Workbench ยังมีคุณสมบัตินี้อย่างประณีตใน GUI เพียงเรียกใช้แบบสอบถามคลิกไอคอนบันทึกถัดจากส่งออก / นำเข้า:

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นเลือก "คำสั่ง SQL INSERT (* .sql)" ในรายการ

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนชื่อคลิกบันทึกยืนยันชื่อตารางและคุณจะมีไฟล์ดัมพ์ของคุณ


3

การรวมส่วนใหญ่ข้างบนนี้เป็นตัวอย่างการใช้งานจริงของฉันการเลือกบันทึกที่อิงจากทั้งมิเตอร์และเวลา ฉันต้องการคำสั่งนี้มาหลายปีแล้ว ดำเนินการอย่างรวดเร็วจริงๆ

mysqldump -uuser -ppassword main_dbo trHourly --where="MeterID =5406 AND TIMESTAMP<'2014-10-13 05:00:00'" --no-create-info --skip-extended-insert | grep  '^INSERT' > 5406.sql

-1

mysql ส่งออกบรรทัดคำสั่งผลลัพธ์การสืบค้น:

mysql -h120.26.133.63 -umiyadb -proot123 miya -e "select * from user where id=1" > mydumpfile.txt

มันทำงานให้ฉันใน Ubuntu, คำสั่ง: mysql -h localhost -u root -p dbname -e "เลือก * จากผู้ใช้ที่ id = 1; เลือก * จากพนักงานที่ id = 1" --xml> / var / www / html / project / backups / db.xml
Ramesh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.