การตั้งค่า mysqldump ที่ดีที่สุดคืออะไร [ปิด]


14

หลังจากการค้นหาบางอย่างฉันลงเอยด้วยการตั้งค่าต่อไปนี้:

    mysqldump\
    --host=localhost\
    --port=3306\
    --databases ****\
    --user=****\
    --password=****\
    --default-character-set=utf8\
    --add-drop-database\
    --add-drop-table\
    --add-locks\
    --complete-insert\
    --extended-insert\
    --lock-all-tables\
    --create-options\
    --disable-keys\
    --quick\
    --order-by-primary\
    --set-charset\
    --tz-utc\
    > dump/test.sql

จนถึงตอนนี้ดีมาก แต่ฉันมีคำถามบางอย่างเกี่ยวกับพารามิเตอร์เช่นเดียวกับการดำเนินการ

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

เกี่ยวกับคอนเสิร์ตครั้งที่สองของฉันฉันอยากรู้วิธีที่จะได้รับแจ้งเมื่อคำสั่งนั้นผิดพลาดและถ้าเกิดข้อยกเว้น

ความคิดใด ๆ

แก้ไข

นี่คือคำสั่ง mysqldump ที่อัปเดตของฉันโดยอิงตามความคิดเห็นของ RolandoMySQLDBA

mysqldump\
--host=localhost\
--port=3306\
--databases ****\
--user=****\
--password=****\
--default-character-set=utf8\
--opt\
--single-transaction\
--routines\
--triggers\
--events\
--add-drop-database\
--add-drop-table\
--complete-insert\
--delayed-insert\
--tz-utc\
> dump/test.sql

อ่านแต่ละข้อโต้แย้งและผลประโยชน์ของมันแล้วเลือกว่าอะไรที่เหมาะกับคุณ ทำความรู้จักกับการเขียนสคริปต์เพื่อกระตุ้นความล้มเหลว
Mannoj

เย็น. แต่นี่ไม่ได้ตอบคำถามของฉัน ตัวอย่างเช่นคุณใช้ชุดไหนของพวกเขา
user706838

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

คำตอบ:


30

คุณจะได้พบกับการตกตะลึงนี้ แต่คุณต้องการเพียงหนึ่งตัวเลือกที่สำคัญ: --opt

--optคืออะไร

ตัวเลือกนี้จะเปิดใช้งานโดยค่าเริ่มต้นคือชวเลขสำหรับการรวมกันของ--add วางตาราง --add ล็อค --create ตัวเลือก --disable คีย์ --extended แทรก --lock ตาราง --quick - ตั้ง มันให้การถ่ายโอนข้อมูลที่รวดเร็วและสร้างไฟล์ดัมพ์ที่สามารถโหลดซ้ำลงในเซิร์ฟเวอร์ MySQL ได้อย่างรวดเร็ว

เนื่องจากตัวเลือก - --opt ถูกเปิดใช้งานโดยค่าเริ่มต้นคุณจะระบุเฉพาะการสนทนา --skip-opt เพื่อปิดการตั้งค่าเริ่มต้นหลายรายการ ดูการอภิปรายของกลุ่มตัวเลือก mysqldump สำหรับข้อมูลเกี่ยวกับการเลือกเปิดใช้งานหรือปิดการใช้งานชุดย่อยของตัวเลือกที่ได้รับผลกระทบจาก --opt

ตั้งแต่--optถูกเปิดใช้งานแล้วคุณจะไม่จำเป็นต้องระบุ--opt อย่างไรก็ตามคุณอาจต้องการตัวเลือกที่จำเป็นบางอย่างซึ่งไม่รวมอยู่ด้วย

เรียกใช้แบบสอบถามนี้บนฐานข้อมูลของคุณ

SELECT engine,COUNT(1) TableCount
FROM information_schema.tables
WHERE engine IN ('InnoDB','MyISAM')
AND table_schema NOT IN ('information_schema','mysql','performance_schema')
GROUP BY engine;

ถ้าคุณมีตาราง InnoDB ทั้งหมดแล้วคุณจะต้องระบุ--single ธุรกรรม สิ่งนี้จะปิดใช้งานโดยอัตโนมัติ- ล็อคตารางและอนุญาตให้คุณถ่ายโอนข้อมูลตารางทั้งหมดในเวลาเดียวกันและอนุญาตให้เขียนใหม่ได้ในเวลาเดียวกัน

ถ้าคุณมีหนึ่งหรือมากกว่าหนึ่งตาราง MyISAM แล้วคุณจะต้องระบุ--lock ทุกตาราง- สิ่งนี้จะปิดใช้งานโดยอัตโนมัติ- ล็อคตารางปิดใช้งาน- ธุรกรรมเดี่ยวล็อกตารางทั้งหมดในฐานข้อมูลทั้งหมดจากนั้นสร้างการถ่ายโอนข้อมูล การเขียนลงในตาราง InnoDB ยังคงเกิดขึ้นได้ แต่จะมีการรอคิวจนกว่าจะมีการปลดล็อค การเชื่อมต่อฐานข้อมูลใด ๆ ที่พยายามเขียนไปยังตาราง MyISAM ใด ๆ จะถูกระงับจริง ๆ จนกว่าจะมีการปลดล็อคทั้งหมด

เรียกใช้แบบสอบถามนี้: SELECT COUNT(1) Number_Of_Stored_Procedures FROM mysql.proc;

หากNumber_Of_Stored_Proceduresมีค่ามากกว่าศูนย์ใช้--routines

เรียกใช้แบบสอบถามนี้: SELECT COUNT(1) Number_Of_Triggers FROM information_schema.triggers;

หากNumber_Of_Triggersมีค่ามากกว่าศูนย์ใช้--triggers

ถ้ำ : โปรดอย่าใช้- จัดลำดับตามหลักสำหรับการถ่ายโอนฐานข้อมูลทั้งหมดเนื่องจากอาจทำให้ดัชนี BTREE ค่อนข้างจะค่อนข้างรีโหลด - ลำดับโดยหลักควรใช้เฉพาะเมื่อทิ้งตารางแต่ละตัวที่คุณรู้ว่ามีคีย์หลักจำนวนเต็มและจะมีช่วงสแกนจำนวนมากจากใบสมัครของคุณ

หากคุณต้องการการสำรองข้อมูล mysqldump ประเภทอื่น ๆ ให้ดูที่โพสต์เก่าของฉันฉันจะเพิ่มประสิทธิภาพ mysqldump ของฐานข้อมูลขนาดใหญ่ได้อย่างไร .

โปรดอ่านทุกตัวเลือกสำหรับ mysqldump

อัปเดต 2014-12-29 09:44 EST

ฉันได้อัปเดตคำสั่ง mysqldump ของฉัน (โปรดดูการแก้ไขของฉัน) ฉันมีคำถามสุดท้ายว่า คุณคิดว่ามันจะคุ้มค่าหากใช้อาร์กิวเมนต์ต่อไปนี้ทั้งหมดหรือไม่ - เพิ่ม - ลด - ฐานข้อมูล \ - เพิ่ม - ลดลงตาราง \ - สมบูรณ์แทรก - - ล่าช้าแทรก - - tz-utc

ดูความคิดเห็นของคุณและการแก้ไขล่าสุดของคุณลองมาดูตัวเลือกเหล่านี้แล้วดูว่าคุณต้องการอะไรบ้าง

  • - ตัวเลือก : ฉันได้กล่าวไปแล้วว่าคุณไม่จำเป็นต้องระบุเพราะเปิดใช้งานตามค่าเริ่มต้น
  • - ล่าช้าแทรก : ฉันยืนกรานอยู่ห่างจากนี้ด้วยฐานข้อมูล InnoDB ทั้งหมด จริงๆแล้วฉันอยู่ห่างจากระยะเวลานี้ !!! . ตั้งแต่ 1) เป็นไปได้ที่ INSERT DELAYED จะสูญเสียข้อมูล 2) มันถูกแปลงเป็น INSERT สำหรับ MySQL Replication slaves, 3) มีรายงานบั๊กเปิดเกี่ยวกับการใช้กับทริกเกอร์ย้อนกลับใน MySQL 5.6 และไม่ถือว่าเป็นข้อผิดพลาด 4 ) เลิกใช้แล้วใน MySQL 5.6 และ 5) Morgan Tocker (รู้จักกันดีในนามของกูรู MySQL) เห็นว่ามีการคัดค้านย้อนกลับไปในปี 2555คุณควรลืมตัวเลือกนี้ ไม่เคยใช้ (อนันต์) เลย !!!
  • --complete แทรก : นี้จะใช้แทนINSERT INTO tblname (colnam_1,colnam_2,...colnam_n) VALUES ... INSERT INTO tblname VALUES ...สิ่งนี้สามารถขยาย mysqldump หากมีคอลัมน์จำนวนมากในคำจำกัดความของตารางและหลายแถวในตาราง อย่าใช้มัน
  • - เพิ่มตารางลดลง : เนื่องจาก--optเปิดใช้งานสำหรับคุณคุณไม่จำเป็นต้องระบุ
  • - เพิ่มฐานข้อมูลหล่น : ถ้าคุณวาง- เพิ่มฐานข้อมูลมันเพียงทำให้DROP TABLE IF EXISTS(ซึ่งถูกเพิ่มโดย-เพิ่มตารางลดลง ) ไปเร็วขึ้น ไม่ได้ใช้เพียงแค่ช่วยให้DROP TABLE IF EXISTSเกิดขึ้นสำหรับแต่ละตาราง ดังนั้นการใช้--add-drop-databaseเป็นเรื่องของการเลือกส่วนบุคคล
  • --tz-UTC : ถ้าคุณวางแผนที่จะเรียกคืนข้อมูลไปยังเซิร์ฟเวอร์เดียวกับที่คุณสำรองข้อมูลจากคุณไม่จำเป็นต้อง--tz-UTC หากคุณกู้คืนข้อมูลไปยังศูนย์ข้อมูลอื่นในเขตเวลาที่แตกต่างและ ...
    • ถ้าคุณต้องการที่จะให้เขตเวลาเดียวกับที่คุณสำรองข้อมูลจากคุณไม่จำเป็นต้อง--tz-UTC
    • ถ้าคุณต้องการข้อมูลที่จะใช้เขตเวลาของศูนย์ข้อมูลใหม่คุณต้อง--tz-UTC
    • ตัวอย่าง: สมมติว่าคุณสำรองฐานข้อมูลในนิวยอร์ก นั่นคือ EST หากคุณมีศูนย์ข้อมูลอื่นในซีแอตเทิลนั่นคือ PST หากคุณต้องการสำรองนิวยอร์กจะได้รับการบูรณะในซีแอตเติและคุณต้องการ timestamps ในฐานข้อมูลที่จะยังคงเป็นตัวแทนของ New York, คุณไม่ต้องการที่จะใช้--tz-UTC
  • --default-ตัวตั้ง
    • หากคุณกำลังกู้คืนการถ่ายโอนข้อมูลไปยังเซิร์ฟเวอร์เดียวกันคุณไม่จำเป็นต้อง--default-ตัวตั้ง
    • หากคุณมีฐานข้อมูล InnoDB ทั้งหมดคุณไม่จำเป็นต้อง--default-character-set
    • เนื่องจาก utf8 เป็นค่าเริ่มต้นคุณไม่จำเป็นต้อง--default-character-set

ปรับการแก้ไขล่าสุดของคุณนี่คือสิ่งที่คุณต้องการโดยเฉพาะ

mysqldump\
--host=localhost\
--port=3306\
--databases ****\
--user=****\
--password=****\
--single-transaction\
--routines\
--triggers\
--events\
--add-drop-database\
> dump/test.sql

อีกครั้งผมบอกว่าโปรดอ่านทุกตัวเลือกสำหรับ mysqldump


เกี่ยวกับ --add-drop-database: สิ่งนี้ไม่ได้ทำให้แน่ใจได้ว่าไม่มีตารางสุ่มอื่น ๆ ในฐานข้อมูลของคุณที่ไม่ได้อยู่ในการถ่ายโอนข้อมูลของคุณ? หากใครบางคนสร้างตารางทดสอบแบบสุ่มในฐานข้อมูลของคุณด้วยตนเองมันจะยังคงอยู่หลังจากที่โหลดซ้ำจากการถ่ายโอนข้อมูลโดยไม่มีตัวเลือกนี้ ดังนั้นมันขึ้นอยู่กับว่าคุณต้องการหรือไม่ ขวา?
jschultz410

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