แตกต่างกันสำหรับการจัดเก็บไฟล์ที่คล้ายกันสูง?


18

ที่ทำงานเราทำการถ่ายโอนฐานข้อมูล mysql ของเราทุกคืน จากวันต่อวันฉันจะแขกที่ใกล้ถึง 90-95% ของข้อมูลที่ซ้ำกันเพิ่มขึ้นเมื่อเวลาผ่านไป (Heck ณ จุดนี้บางคนอาจจะ 99%)

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

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

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

เป็นไปได้หรือไม่ ด้วยเครื่องมืออะไร


แก้ไขฉันไม่ได้ถามวิธีการสำรองข้อมูล mysql ลืม mysql สักครู่ มันเป็นปลาเฮอริ่งแดง สิ่งที่ฉันอยากรู้คือวิธีการทำชุดของการกลิ้งแตกต่างจากชุดของไฟล์ ทุกคืนเราจะได้รับไฟล์ (ซึ่งเกิดขึ้นเป็นไฟล์ mysqldump ) ที่ 99% คล้ายกับไฟล์ก่อนหน้า ใช่เรา gzip พวกเขาทั้งหมด แต่มันซ้ำซ้อนที่จะมีความซ้ำซ้อนนั้นในตอนแรก สิ่งที่ฉันต้องการจริงๆคือความแตกต่างจากเมื่อคืนก่อน ... ซึ่งเพียง 1% แตกต่างจากเมื่อคืนก่อน ... และอื่น ๆ ดังนั้นสิ่งที่ฉันตามมาคือการสร้างซีรีส์ที่แตกต่างดังนั้นฉันต้องการเพียงแค่เก็บ 1% ในแต่ละคืน

คำตอบ:


14

สองเครื่องมือการสำรองข้อมูลที่สามารถเก็บ diffs ไบนารีrdiff สำรองข้อมูลและการตีสองหน้า ทั้งสองมีพื้นฐานมาจากlibrsyncเหนือสิ่งอื่นใด การสำรองข้อมูลของ Rdiff จะเก็บสำเนาและการย้อนกลับล่าสุดในขณะที่ความซ้ำซ้อนจะเก็บส่วนต่างที่เพิ่มขึ้นแบบดั้งเดิม เครื่องมือทั้งสองนี้ยังมีคุณสมบัติต่อพ่วงที่แตกต่างกัน


1
IIUC การสำรองข้อมูล rdiff นั้นมีความน่าสนใจมากกว่าเพราะจะช่วยให้ผู้ใช้สามารถเรียกดูข้อมูลสำรองตามปกติในขณะที่ความซ้ำซ้อนมีเพียงสำเนาเก่าเท่านั้น
tshepang

ฉันรู้ว่าคำถาม + คำถามนั้นค่อนข้างเก่า แต่คุณสามารถเพิ่มตัวอย่างของคำสั่งที่แสดงวิธีใช้งานได้หรือไม่ ตัวอย่างเช่น backup201901.tar.gz, backup201902.tar.gz, ... , backup201912.tar.gz, backup202001.tar.gz สิ่งนี้จะเป็นประโยชน์สำหรับการอ้างอิงในอนาคต
Basj

ครั้งสุดท้ายที่ฉันติดตาม rdiff-backup devs หลักย้ายไปอยู่และโปรเจ็กต์หยุดนิ่งไม่รู้ว่าจะมีการเปลี่ยนแปลงหรือไม่ มันก็ช้าอย่างเหลือเชื่อผ่านเครือข่ายถ้าเรื่องนั้น
Lizardx

13

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

สคริปต์สำรองของฉันคร่าวๆ:

cd /where/I/keep/backups && \
mysqldump > backup.sql && \
git commit -q -m "db dump `date '+%F-%T'`" backup.sql

ร้านค้านี้เท่านั้นแตกต่าง
user394

2
ใช่. มันสะดวกมาก! คุณสามารถ "ตรวจสอบ" ไฟล์จากจุดใดก็ได้และคอมไพล์จะรวม diffs โดยอัตโนมัติเพื่อให้ไฟล์ทั้งหมดตามที่มีอยู่ในเวลานั้น
sep332

1
โพสต์บล็อกนี้ (ไม่ใช่ของฉัน) จะเข้าไปดูรายละเอียดเพิ่มเติม: viget.com/extend/backup-your-database-in-git ความคิดเห็นได้มากขึ้นเกี่ยวกับข้อดีข้อเสียและข้อ จำกัด ฉันจะเพิ่มด้วยถ้าคุณใช้คอมไพล์คุณจะได้มากกว่าแค่การย้อนกลับเวอร์ชัน นอกจากนี้คุณยังสามารถติดแท็กทิ้งหรือแยกสาขา (dev / prod) วิธีที่ฉันมองว่ามันคือคอมไพล์ (หรือแทรกระบบควบคุมเวอร์ชันที่คุณโปรดปราน) ทำงานได้ดีกว่าที่ฉันสามารถทำได้โดยการใช้ diff / gzip 'solution' ของตัวเอง หนึ่งคำเตือนเกี่ยวกับบทความนี้: อย่าผลักดันการถ่ายโอนข้อมูลของคุณไปยัง GitHub เว้นแต่คุณจะต้องการให้พวกเขาเป็นสาธารณะ (หรือจ่ายเงินเพื่อซื้อคืนภาคเอกชน)
แช่

1
Git ไม่เพียง แต่เก็บความแตกต่าง ในความเป็นจริงส่วนใหญ่จะเก็บภาพรวมเต็มรูปแบบของการแก้ไขแต่ละครั้ง แต่มีการเพิ่มประสิทธิภาพต่างๆ ดูคำตอบที่ดีเยี่ยมนี้และคำถามของมัน
tremby

3

คุณสามารถทำสิ่งนี้ (พร้อมa.sqlสำรองข้อมูลรายสัปดาห์ของคุณ)

mysqldump > b.sql
diff a.sql b.sql > a1.diff
scp a1.diff backupserver:~/backup/

ไฟล์ต่างของคุณจะใหญ่ขึ้นในช่วงปลายสัปดาห์

แม้ว่าข้อเสนอแนะของฉันเป็นเพียง gzip มัน (ใช้gzip -9สำหรับการบีบอัดสูงสุด) เราทำสิ่งนี้ในขณะนี้และให้ใช้ไฟล์ 59MB gz ในขณะที่ต้นฉบับคือ 639MB


เรารวบรวม gzipping แล้ว :)
user394

1

มีวิธีที่เป็นไปได้หลายวิธีที่สามารถทำได้ขึ้นอยู่กับขนาดและความคล้ายคลึงกันของข้อความจริงของการทิ้งฐานข้อมูล:

  1. ใช้โปรแกรมสำรองข้อมูลซ้ำซ้อนที่ใช้การตรวจสอบย้อนกลับเป็นคำขอ OP เช่น restic ( https://restic.net/ ) หรือ borgbackup ( https://borgbackup.readthedocs.io/ ) ในการทิ้งที่ไม่ได้แก้ไข ทั้งสองระบบอนุญาตให้ติดตั้งเวอร์ชันการสำรองข้อมูลบางอย่างผ่านทาง FUSE และทำงานในลักษณะที่เพิ่มขึ้นแบบ socalled ตลอดไป
  2. โครงสร้างฐานข้อมูล Decouple จากเนื้อหาคล้ายกับวิธีที่พวก NCBI ทำเพื่อฐานข้อมูลพันธุศาสตร์ที่ค่อนข้างใหญ่ นั่นคือ: คุณจะสร้างสคริปต์ SQL สำหรับสร้างสกีมาฐานข้อมูล (เช่นftp://ftp.ncbi.nlm.nih.gov/snp/organisms/human_9606_b151_GRCh38p7/database/organism_schema/ ) แยกเก็บเนื้อหาในตาราง cleartext หรือรูปแบบไบนารีที่บีบอัดโดยไม่มีคำสั่งแทรก (เช่นทำในftp://ftp.ncbi.nlm.nih.gov/snp/organisms/human_9606_b151_GRCh38p7/database/organism_data/) เช่นเป็นแท็บหรือค่าที่คั่นด้วยเครื่องหมายจุลภาค แน่นอนว่าต้องมีชุดคำสั่งการนำเข้าแยกต่างหากที่จะสร้างคำสั่งแทรกในเวลาสำหรับการนำเข้าข้อมูลกลับสู่ฐานข้อมูลเช่นการกู้คืนจากการสำรองข้อมูล ในกรณีที่ DBMS ของคุณนำเข้าไฟล์ csv คุณสามารถละเว้นข้อกำหนดของสคริปต์เพิ่มเติมข้างต้นได้ จากนั้นไฟล์ข้อความที่หดจึงสามารถป้อนเข้าไปในโปรแกรมการสำรองข้อมูลตามปกติหรือโปรแกรมสำรองอื่น ๆ เช่น rdiff-backup
  3. เลือกโซลูชันที่โครงสร้างและเนื้อหามีการเชื่อมโยงกันอย่างหลวม ๆ โดยใช้รูปแบบเช่นไฟล์ arff ที่ WEKA กำลังใช้ ( https://www.cs.waikato.ac.nz/ml/weka/arff.html ): โครงสร้างและชนิดข้อมูลของ คอลัมน์จะถูกประกาศในส่วนหัวของไฟล์และเนื้อหาจริงจะตามมาคั่นด้วยคำสั่ง @DATA อีกครั้งในรูปแบบ csv เครื่องมือ ETL จำนวนมากในปัจจุบันมีตัวอ่าน arff นอกเหนือจากตัวเชื่อมต่อฐานข้อมูล ไฟล์นั้นสามารถป้อนเข้าสู่โปรแกรมสำรองข้อมูลได้อีกครั้ง

คำตอบนี้ตอบคำถาม "ทำอย่างไรจึงจะทำการสำรองข้อมูลของฐานข้อมูลทิ้ง" แต่ไม่ใช่คำถามทั่วไป "วิธีสำรองข้อมูลของข้อมูลสำรองที่คล้ายกันมาก" ซึ่งเป็นสิ่งที่ฉันถาม
394

สุจริตฉันสงสัยว่าสิ่งที่คุณต้องการบรรลุคือการขจัดความซ้ำซ้อนซึ่งกล่าวถึงในแนวทางที่ 1 บางทีคุณอาจต้องการดูrestic.net/blog/2015-09-12/restic-foundation1-cdcที่มีการอธิบายและบางทีคุณอยากลองดูบ้างไหม?
jf1

ความคิดเห็นนี้ซึ่งแสดงรายละเอียดอย่างชัดเจนจะทำให้ได้คำตอบที่ตรงประเด็นมากกว่าคำตอบปัจจุบันของคุณ
user394

-3

(ฉันไม่ได้ทำสิ่งนี้ในการผลิต)

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


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