เปิดใช้งานโหมดไบนารีขณะกู้คืนฐานข้อมูลจากการถ่ายโอนข้อมูล SQL


96

ฉันใหม่มากสำหรับ MySQL และกำลังใช้งานบน Windows ฉันพยายามกู้คืนฐานข้อมูลจากไฟล์ดัมพ์ใน MySQL แต่ได้รับข้อผิดพลาดต่อไปนี้:

$ >mysql -u root -p -h localhost -D database -o < dump.sql
ERROR: ASCII '\0' appeared in the statement, but this is not allowed unless option --binary-mode is enabled and mysql is run in non-interactive mode. Set --binary-mode to 1 if ASCII '\0' is expected. Query: 'SQLite format 3'.

ฉันได้ลองใส่--binary-modeไฟล์ ini แล้ว แต่ก็ยังให้ข้อผิดพลาดเหมือนเดิม ฉันควรทำอย่างไรดี? กรุณาช่วย.

อัปเดต

ตามที่ Nick แนะนำในความคิดเห็นของเขาฉันลองแล้ว$ > mysql -u root -p -h localhost -D database --binary-mode -o < dump.sqlแต่มันให้สิ่งต่อไปนี้แก่ฉันERROR at line 1: Unknown command '\☻'. มันเป็นไฟล์ดัมพ์ 500 Mb และเมื่อฉันดูเนื้อหาโดยใช้ gVIM สิ่งที่ฉันเห็นคือนิพจน์และข้อมูลที่ไม่สามารถเข้าใจได้


mysql -u root -p -h localhost -D database --binary-mode -o <dump.sql
Nick

ที่ให้ ERROR ที่บรรทัดที่ 1: Unknown command '\ ☻'
user1434997

ฉันได้รับข้อผิดพลาดนี้ แต่ได้รับการถ่ายโอนข้อมูล MySQL ใหม่และลองนำเข้าใหม่และใช้งานได้ดี การถ่ายโอนข้อมูล MySQL ของเรามีสองส่วนซิปที่ต้องเชื่อมต่อกันแล้วคลายซิป ฉันคิดว่าการคลายซิปครั้งแรกถูกขัดจังหวะส่งผลให้.sqlไฟล์มีอักขระแปลก ๆ และการเข้ารหัส ความพยายามครั้งที่สองทำงานได้ดี
Joshua Pinter

คำตอบ:


217

คลายซิปไฟล์แล้วนำเข้าอีกครั้ง


12
อัจฉริยะ ขอบคุณ!
klm123

2
คุณหมายถึง zip แล้วคลายซิป?
J86

13
นี่คือวิธีการทำงานสำหรับฉันคลายซิป db.sql.gz คุณจะได้รับ db.sql เปลี่ยนชื่ออีกครั้งเป็น db.sql.gz ไม่ต้อง zip เพียงแค่เปลี่ยนชื่อจากนั้นคลายซิปอีกครั้งเป็น db.sql และตอนนี้คุณจะได้รับไฟล์ที่ถูกต้องเพื่อนำเข้า
MotsManish

@MotsManish อย่างจริงจัง? ฉันคิดว่านี่เป็นเรื่องตลก ฉันจะลองดูว่าได้ผลไหม
Joshua Pinter

3
face palm 🤦‍♀️🤦‍♀️🤦‍♀️🤦‍♀️
Rambatino

53

ฉันพบปัญหาเดียวกันใน windows กู้คืนไฟล์ดัมพ์ ไฟล์ดัมพ์ของฉันถูกสร้างขึ้นด้วย windows powershell และ mysqldump เช่น:

mysqldump db > dump.sql

ปัญหามาจากการเข้ารหัสเริ่มต้นของ powershell คือ UTF16 ที่จะมองลึกลงไปในนี้เราสามารถใช้ "ไฟล์" ยูทิลิตี้ GNU และมีอยู่ Windows รุ่นที่นี่
ผลลัพธ์ของไฟล์ดัมพ์ของฉันคือ:

ข้อความยูนิโคด UTF-16 แบบลิตเติ้ลเอนด์ที่มีบรรทัดยาวมากโดยมีตัวยุติบรรทัด CRLF

จากนั้นจำเป็นต้องมีการแปลงระบบการเข้ารหัสและมีซอฟต์แวร์หลายตัวที่สามารถทำได้ ตัวอย่างเช่นใน emacs

M-x set-buffer-file-coding-system

จากนั้นใส่ระบบเข้ารหัสที่จำเป็นเช่น utf-8

และในอนาคตเพื่อให้ได้ผลลัพธ์ mysqldump ที่ดีขึ้นให้ใช้:

mysqldump <dbname> -r <filename>

จากนั้นเอาต์พุตจะถูกจัดการด้วยmysqldumpตัวเอง แต่ไม่ใช่การเปลี่ยนเส้นทางของ powershell

อ้างอิง: /dba/44721/error- ขณะ-restoring-a-database-from-an-sql-dump


mysqldump <dbname> -r <filename> ทุกคนที่ใช้ระบบ Windows หรือ DOS นี่คือทางออก การแปลงไฟล์ UTF-8 เป็นสิ่งที่ทำให้ไขว้เขว ใช้อ็อพชัน -r ซึ่งนำเอาต์พุตไปยังชื่อไฟล์และจัดการ CRLF carriage return linefeed (\ r \ n) ที่ windows ใส่ไว้ในไฟล์นี่คือจุดที่มีปัญหา ขอบคุณสำหรับโซลูชันที่ยอดเยี่ยม!
Timothy LJ Stewart

4
ในทางปฏิบัติฉันได้รับสิ่งนี้หลังจากสร้างไฟล์ใน Powershell โดยการแปลงไฟล์ที่สร้างขึ้นเป็น UTF-8 โดยใช้ Notepad ++
Peter Majeed

คำตอบนี้ถ้าฉันไม่ได้ขุดมันจะช่วยฉันได้หลายชั่วโมงในการค้นหาคำตอบที่ถูกต้อง หวังว่าฉันจะโหวตได้มากกว่าหนึ่งครั้ง
sam452

ฉันทำเช่นเดียวกับ @PeterMajeed การแปลงและบันทึกอย่างรวดเร็วด้วย NotePad ++ ทำให้ฉันสามารถกู้คืนไฟล์ที่มีอยู่ได้
Stephen R

18

ในเครื่อง Windows โปรดปฏิบัติตามขั้นตอนก่อนหน้านี้

  1. เปิดไฟล์ใน notepad
  2. คลิกที่บันทึกเป็น
  3. เลือกประเภทการเข้ารหัส UTF-8

ตอนนี้แหล่งข้อมูลฐานข้อมูลของคุณ


สิ่งนี้ใช้ได้ผลสำหรับฉันสำหรับไฟล์สำรองข้อมูล SQL ที่สร้างขึ้นโดยเรียกใช้ mysqldump ผ่าน Powershell เอาต์พุต Poweshell คือ UTF-16 การเปลี่ยนเป็น UTF-8 ช่วยแก้ปัญหาและอนุญาตให้ฉันกู้คืน detabase จากไฟล์สำรอง
Harry Mantheakis

9

แตกไฟล์ของคุณด้วย Tar archiving tool คุณสามารถใช้วิธีนี้:

tar xf example.sql.gz

1
นี่คือคำตอบสำหรับฉัน ในตอนแรกฉันบีบไฟล์. sql.gz ซึ่งทำให้เกิดข้อผิดพลาด "ไบนารี" เมื่อนำเข้า ปรากฎว่าไฟล์เป็น tar / gzipped ดังนั้นฉันต้องtar xvfไฟล์ก่อนจากนั้นให้ฉันนำเข้า
seanbreeden

8

คุณได้ลองเปิดใน notepad ++ (หรือโปรแกรมแก้ไขอื่น) แล้วแปลง / บันทึกเราเป็น UTF-8 หรือไม่?

ดู: notepad ++ การแปลงไฟล์ที่เข้ารหัส ansi เป็น utf-8

อีกทางเลือกหนึ่งอาจใช้ textwrangle เพื่อเปิดและบันทึกไฟล์เป็น UTF-8: http://www.barebones.com/products/textwrangler/


3
ขอบคุณ. นี้ได้เคล็ดลับสำหรับฉัน. เปิดไฟล์ใน NotePad ++ การเข้ารหัส> แปลงเป็น UTF 8
Abhijeet Nagre

นอกจากนี้โปรดสังเกตการเปลี่ยนแปลงขนาดไฟล์อย่างมีนัยสำคัญหลังจากที่คุณ 'บันทึกเป็น' ไฟล์. sql ที่มีอยู่ด้วยการเข้ารหัส utf-8! เกือบครึ่งหนึ่งของขนาดเมื่อเทียบกับไฟล์ที่ระบุ ในกรณีของฉัน mysqldump ถูกถ่ายโดยใช้ Windows Power Shell โปรแกรมนั้นทำให้การเข้ารหัสยุ่งเหยิง
tusar

6

ฉันมีข้อผิดพลาดนี้หนึ่งครั้งหลังจากทำงานmysqldumpบน Windows PowerShell ดังนี้:

mysqldump -u root p my_db --no-data --no-create-db --no-create-info --routines --triggers --skip-opt --set-gtid-purged=OFF > db_objects.sql

สิ่งที่ฉันทำคือเปลี่ยนเป็นสิ่งนี้ (ไปป์แทนเป็น Set-Content):

mysqldump -u root p my_db --no-data --no-create-db --no-create-info --routines --triggers --skip-opt --set-gtid-purged=OFF | Set-Content db_objects.sql

และปัญหาก็หายไป!


ฉันได้รับ mysqldump: Got errno 32 บน
Radu

ดูว่าเธรดนี้อาจช่วยคุณได้หรือไม่: stackoverflow.com/questions/22288271/…
Ifedi Okonkwo

ขอบคุณ. ปัญหาคือฉันส่งออกฐานข้อมูลด้วย phpmyadmin เวอร์ชันเก่าบนเซิร์ฟเวอร์ mysql เก่า ไม่แน่ใจว่าทำไม แต่ฐานข้อมูลครึ่งหนึ่งถูกส่งออกเป็นข้อความที่ชัดเจนและอีกครึ่งหนึ่งของ gzip-ed
Radu

5

อาจเป็น dump.sql ของคุณมีอักขระขยะอยู่ที่จุดเริ่มต้นของไฟล์ของคุณหรือมีบรรทัดว่างในการเริ่มต้น


5

หากคุณมีพื้นที่ไม่เพียงพอหรือไม่ต้องการเสียเวลาในการคลายการบีบอัดให้ลองใช้คำสั่งนี้

gunzip < compressed-sqlfile.gz | mysql -u root -p

อย่าลืมแทนที่บีบอัด sqlfile.gz ด้วยชื่อไฟล์บีบอัดของคุณ

.gz restore จะไม่ทำงานหากไม่มีคำสั่งที่ฉันให้ไว้ข้างต้น


3

คุณต้องส่งปัญหาไฟล์ dump.sql ใช้ Sequel Pro ตรวจสอบการเข้ารหัสไฟล์ของคุณควรเป็นอักขระขยะใน dump.sql ของคุณ


3

ฉันมีปัญหาเดียวกัน แต่พบว่าไฟล์ดัมพ์เป็นข้อมูลสำรองของเซิร์ฟเวอร์ MSSQL ไม่ใช่ MySQL

บางครั้งไฟล์สำรองแบบเดิมก็เล่นตลกกับเรา ตรวจสอบไฟล์ดัมพ์ของคุณ

บนหน้าต่างเทอร์มินัล:

~$ cat mybackup.dmp 

ผลลัพธ์คือ:

TAPE??G?"5,^}???Microsoft SQL ServerSPAD^LSFMB8..... etc...

ในการหยุดประมวลผลคำสั่ง cat:

CTRL + C


1

ไฟล์ที่คุณพยายามนำเข้าเป็นไฟล์ zip คลายซิปไฟล์แล้วลองนำเข้าอีกครั้ง


1

ภายใต้ linux Ungzip ไฟล์ของคุณโดยใช้ gunzip แก้ไขไฟล์ unzip sql ของคุณโดยใช้

vi unzipsqlfile.sql

ลบไบนารีบรรทัดแรกด้วย esc dd ไปที่ด้านล่างของไฟล์ด้วย esc shift g ลบไบนารีบรรทัดสุดท้ายด้วย dd บันทึกไฟล์ esc x: จากนั้นนำเข้าใหม่ไปยัง mysql ด้วย:

mysql -u ชื่อผู้ใช้ -p new_database <unzipsqlfile.sql

ฉันทำสิ่งนั้นด้วยไฟล์ 20go sql จากข้อมูลสำรอง jetbackup cpanel mysql อดทนรอ vi ทำงานสำหรับไฟล์ขนาดใหญ่



0

คุณสามารถใช้สิ่งนี้เพื่อแก้ไขข้อผิดพลาด:

zcat {address_sql_database(.tar.gz)} | mysql -u root -p {database_name} --binary-mode

2
ทำไม? โปรดอธิบายว่ามันตอบคำถามอย่างไร
Yunnosch

0

ฉันรู้ว่าคำถามของโปสเตอร์ต้นฉบับได้รับการแก้ไขแล้ว แต่ฉันมาที่นี่ผ่าน Google และในที่สุดคำตอบต่างๆก็ทำให้ฉันพบว่า SQL ของฉันถูกทิ้งด้วยชุดอักขระเริ่มต้นที่แตกต่างจากที่ใช้ในการนำเข้า ฉันได้รับข้อผิดพลาดเดียวกันกับคำถามเดิม แต่เนื่องจากการถ่ายโอนข้อมูลของเราถูกส่งไปยังไคลเอนต์ MySQL อื่นเราจึงไม่สามารถไปเส้นทางการเปิดด้วยเครื่องมืออื่นและบันทึกได้แตกต่างกัน

สำหรับเราแก้ปัญหาเปิดออกมาเป็น--default-character-set=utf8mb4ตัวเลือกที่จะใช้ทั้งในการเรียกร้องของเช่นเดียวกับการเรียกร้องให้นำเข้าผ่านทางmysqldump mysqlแน่นอนว่าค่าของพารามิเตอร์อาจแตกต่างกันไปสำหรับผู้อื่นที่ประสบปัญหาเดียวกันสิ่งสำคัญคือต้องเก็บไว้เหมือนเดิมเนื่องจากการตั้งค่าเริ่มต้นของเซิร์ฟเวอร์ (หรือเครื่องมือ) อาจเป็นชุดอักขระใดก็ได้


คุณช่วยแบ่งปันสตริงทั้งหมดที่คุณเขียนได้ไหม ขณะที่ฉันมีสถานการณ์เช่นเดียวกับคุณ แม้ว่าฉันจะยังไม่แน่ใจว่าทำไมมันถึงไม่ได้ผลสำหรับฉัน มันอยู่บนเซิร์ฟเวอร์เดียวกันพยายามสร้างการจัดเตรียมเว็บไซต์โดยmysqldump -uUSER -p user_db | gzip > user_db_$(date +"%Y%m%d_%H%M").sql.gzพยายามนำเข้าโดยใช้gunzip -c user_db_datetime.sql.gz | mysql -uUSER -p user_db
โรมิโอแพทริค

สตริงของเราจะไม่เป็นประโยชน์กับคุณเนื่องจากเป็นการตั้งค่าแบบกำหนดเองต่างๆมากมาย วิธีที่คุณอธิบายสถานการณ์ของคุณคำตอบของฉันใช้ไม่ได้: ปัญหาของฉันเกิดจากคอมพิวเตอร์ที่ทิ้ง / การเชื่อมต่อเป็นการตั้งค่าที่แตกต่างจากการกู้คืนดังนั้นเราจึงจำเป็นต้องระบุชุดอักขระเริ่มต้นเพื่อบังคับให้เหมือนกัน
Torque

0

เก่า แต่มีคุณค่า!

บน MacOS (Catalina 10.15.7) มันค่อนข้างแปลก: ฉันต้องเปลี่ยนชื่อdump.sqlเป็นdump.zipและหลังจากนั้นฉันต้องใช้ finder (!) เพื่อคลายซิป ในเทอร์มินัลunzip dump.zipอื่น ๆtar xfz dump.sql[or .gz .tar ...]นำไปสู่ข้อความแสดงข้อผิดพลาด

ในที่สุด Finder ได้คลายซิปออกโดยสมบูรณ์หลังจากนั้นฉันสามารถนำเข้าไฟล์ได้โดยไม่มีปัญหา

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