กลไกในการติดตามการเปลี่ยนแปลงสคีมา DB [ปิด]


135

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

แพคเกจซอฟต์แวร์ยอดนิยมจำนวนมากมีสคริปต์อัพเดตอัตโนมัติซึ่งตรวจจับเวอร์ชัน DB และใช้การเปลี่ยนแปลงที่จำเป็น นี่เป็นวิธีที่ดีที่สุดในการทำสิ่งนี้แม้ในระดับที่ใหญ่ขึ้น (ในหลายโครงการและบางครั้งก็มีหลายสภาพแวดล้อมและภาษา) หรือไม่ ถ้าเป็นเช่นนั้นมีโค้ดที่มีอยู่ซึ่งทำให้กระบวนการง่ายขึ้นหรือดีที่สุดเพียงแค่ม้วนโซลูชันของเราเอง? มีใครนำสิ่งที่คล้ายกันมาก่อนและรวมเข้ากับ Subversion post-commits hooks หรือนี่เป็นความคิดที่ไม่ดี?

แม้ว่าโซลูชันที่รองรับหลายแพลตฟอร์มจะดีกว่า แต่เราจำเป็นต้องสนับสนุนสแต็ก Linux / Apache / MySQL / PHP อย่างแน่นอนเนื่องจากงานส่วนใหญ่ของเราอยู่บนแพลตฟอร์มนั้น

คำตอบ:


56

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

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

คู่มือ Oracle สำหรับการโอนย้าย Railsนี้ครอบคลุมการย้ายข้อมูลได้ค่อนข้างดี

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


1
Ruckusing FTW - เราปรับให้เข้ากับระบบ db ของเราและค่อนข้างพอใจกับมัน
Piskvor ออกจากอาคาร

ตอนนี้อยู่ที่ github: github.com/ruckus/ruckusing-migrations

50

เราใช้สิ่งที่คล้ายกับ bcwoord เพื่อให้ schemata ฐานข้อมูลของเราซิงโครไนซ์กับการติดตั้งที่แตกต่างกัน 5 แบบ (การผลิตการจัดเตรียมและการติดตั้งเพื่อการพัฒนาบางส่วน) และสำรองข้อมูลในการควบคุมเวอร์ชันและทำงานได้ค่อนข้างดี ฉันจะอธิบายรายละเอียดเล็กน้อย:


ในการซิงโครไนซ์โครงสร้างฐานข้อมูลเรามีสคริปต์เดียว update.php และไฟล์จำนวนหนึ่งที่มีหมายเลข 1.sql, 2.sql, 3.sql เป็นต้นสคริปต์ใช้ตารางพิเศษหนึ่งตารางเพื่อจัดเก็บหมายเลขเวอร์ชันปัจจุบันของ ฐานข้อมูล. ไฟล์ N.sql สร้างขึ้นด้วยมือเพื่อเปลี่ยนจากเวอร์ชัน (N-1) เป็นเวอร์ชัน N ของฐานข้อมูล

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

สคริปต์การอัปเดตทำงานดังนี้:

  • เชื่อมต่อกับฐานข้อมูล
  • ทำการสำรองฐานข้อมูลปัจจุบัน (เนื่องจากข้อมูลจะผิดพลาด) [mysqldump]
  • สร้างตารางการทำบัญชี (เรียกว่า _meta) หากไม่มีอยู่
  • อ่าน VERSION ปัจจุบันจากตาราง _meta สมมติว่า 0 หากไม่พบ
  • สำหรับไฟล์. sql ทั้งหมดที่มีหมายเลขสูงกว่า VERSION ให้ดำเนินการตามลำดับ
  • หากไฟล์ใดไฟล์หนึ่งเกิดข้อผิดพลาด: ย้อนกลับไปที่ข้อมูลสำรอง
  • มิฉะนั้นให้อัปเดตเวอร์ชันในตารางการทำบัญชีเป็นไฟล์. sql สูงสุดที่ดำเนินการ

ทุกอย่างเข้าสู่การควบคุมแหล่งที่มาและทุกการติดตั้งจะมีสคริปต์สำหรับอัปเดตเป็นเวอร์ชันล่าสุดด้วยการเรียกใช้สคริปต์เดียว (เรียก update.php ด้วยรหัสผ่านฐานข้อมูลที่เหมาะสมเป็นต้น) SVN อัปเดตสภาพแวดล้อมการจัดเตรียมและการใช้งานจริงผ่านสคริปต์ที่เรียกสคริปต์อัพเดตฐานข้อมูลโดยอัตโนมัติดังนั้นการอัปเดตโค้ดจึงมาพร้อมกับการอัปเดตฐานข้อมูลที่จำเป็น

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


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

ระวังเมื่อวางแบบสอบถามจาก phpMyAdmin! คำค้นหาที่สร้างขึ้นเหล่านี้มักจะมีชื่อฐานข้อมูลซึ่งคุณไม่ต้องการอย่างแน่นอนเพราะมันจะทำลายสคริปต์ของคุณ! mydbสิ่งที่ต้องการสร้างตาราง newtable(... ) จะล้มเหลวหากฐานข้อมูลในระบบไม่เรียกว่า mydb เราได้สร้างเบ็ด SVN ล่วงหน้าที่จะไม่อนุญาตไฟล์. sql ที่มีmydbสตริงซึ่งเป็นสัญญาณว่ามีคนคัดลอก / วางจาก phpMyAdmin โดยไม่มีการตรวจสอบที่เหมาะสม


คุณรับมือกับการชนกันอย่างไร? นักพัฒนาหลายคนเปลี่ยนองค์ประกอบเดียวกันในฐานข้อมูลเช่นกระบวนงานที่เก็บไว้? สิ่งนี้สามารถเกิดขึ้นได้หากคุณทำงานที่เดียวกันในสาขาเดียวกันหรือคุณมีสายการพัฒนาสองสาย (สองสาขา)
Asaf Mesika

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

12

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

ในการเปลี่ยนจากรุ่นหนึ่งไปยังรุ่นถัดไปคุณเพียงแค่เรียกใช้ชุดของสคริปต์การเปลี่ยนแปลงและฐานข้อมูลของคุณเป็นข้อมูลล่าสุดและคุณยังมีข้อมูลทั้งหมด อาจไม่ใช่วิธีที่ง่ายที่สุด แต่ได้ผลแน่นอน


1
คุณเขียนสคริปต์การเปลี่ยนแปลงทั้งหมดอย่างไร
Smith

10

ปัญหาที่นี่ทำให้นักพัฒนาสามารถเขียนสคริปต์การเปลี่ยนแปลงในเครื่องของตนเองลงในการควบคุมแหล่งที่มาเพื่อแชร์กับทีมได้อย่างง่ายดาย ฉันประสบปัญหานี้มาหลายปีแล้วและได้รับแรงบันดาลใจจากการทำงานของ Visual Studio สำหรับผู้เชี่ยวชาญด้านฐานข้อมูล หากคุณต้องการเครื่องมือโอเพนซอร์สที่มีคุณสมบัติเหมือนกันลองทำสิ่งนี้: http://dbsourcetools.codeplex.com/ ขอให้สนุก - นาธาน


10

หากคุณยังคงมองหาแนวทางแก้ไข: เราขอเสนอเครื่องมือที่เรียกว่า neXtep designer เป็นสภาพแวดล้อมการพัฒนาฐานข้อมูลที่คุณสามารถวางฐานข้อมูลทั้งหมดของคุณภายใต้การควบคุมเวอร์ชัน คุณทำงานกับที่เก็บเวอร์ชันที่มีการควบคุมซึ่งสามารถติดตามการเปลี่ยนแปลงทุกอย่างได้

เมื่อคุณต้องการออกการอัปเดตคุณสามารถคอมโพเนนต์ของคุณและผลิตภัณฑ์จะสร้างสคริปต์อัพเกรด SQL จากเวอร์ชันก่อนหน้าโดยอัตโนมัติ แน่นอนคุณสามารถสร้าง SQL นี้จาก 2 เวอร์ชันใดก็ได้

จากนั้นคุณมีตัวเลือกมากมาย: คุณสามารถนำสคริปต์เหล่านั้นไปใส่ไว้ใน SVN ของคุณพร้อมกับโค้ดแอพของคุณเพื่อให้กลไกที่คุณมีอยู่นั้นใช้งานได้ อีกทางเลือกหนึ่งคือการใช้กลไกการนำส่งของ neXtep: สคริปต์จะถูกส่งออกในสิ่งที่เรียกว่า "แพ็กเกจการจัดส่ง" (สคริปต์ SQL + ตัวอธิบาย XML) และตัวติดตั้งสามารถเข้าใจแพ็กเกจนี้และปรับใช้กับเซิร์ฟเวอร์เป้าหมายในขณะเดียวกันก็มั่นใจได้ถึงความสอดคล้องกันของ strcutural การพึ่งพา ตรวจสอบการลงทะเบียนเวอร์ชันที่ติดตั้ง ฯลฯ

ผลิตภัณฑ์นี้เป็น GPL และใช้ Eclipse ดังนั้นจึงทำงานบน Linux, Mac และ windows นอกจากนี้ยังรองรับ Oracle, Mysql และ Postgresql ในขณะนี้ (กำลังสนับสนุน DB2) ดูวิกิที่คุณจะพบข้อมูลรายละเอียดเพิ่มเติม: http://www.nextep-softwares.com/wiki


ดูน่าสนใจดี มีอินเทอร์เฟซบรรทัดคำสั่งด้วยหรือมีการวางแผนไว้?
Piskvor ออกจากอาคาร

8

Scott Ambler จัดทำชุดบทความที่ยอดเยี่ยม (และร่วมเขียนหนังสือ ) เกี่ยวกับการปรับโครงสร้างฐานข้อมูลโดยมีแนวคิดว่าคุณควรใช้หลักการและแนวปฏิบัติ TDD เป็นหลักในการดูแลรักษาสคีมาของคุณ คุณตั้งค่าชุดของโครงสร้างและการทดสอบหน่วยข้อมูลเมล็ดพันธุ์สำหรับฐานข้อมูล จากนั้นก่อนที่คุณจะเปลี่ยนแปลงอะไรคุณแก้ไข / เขียนการทดสอบเพื่อสะท้อนการเปลี่ยนแปลงนั้น

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

ปรากฎว่าบางครั้งนักพัฒนาปรับแต่งฐานข้อมูลแซนด์บ็อกซ์และละเลยที่จะอัปเดตไฟล์สคีมาใน SVN จากนั้นรหัสจะขึ้นอยู่กับการเปลี่ยนแปลงฐานข้อมูลที่ยังไม่ได้เช็คอินข้อบกพร่องประเภทนั้นอาจยากที่จะปักหมุดลง แต่ชุดทดสอบจะหยิบขึ้นมาทันที นี่เป็นสิ่งที่ดีอย่างยิ่งหากคุณสร้างไว้ในแผนบูรณาการต่อเนื่องที่ใหญ่ขึ้น


7

ทิ้งสคีมาของคุณลงในไฟล์และเพิ่มลงในตัวควบคุมแหล่งที่มา จากนั้นความแตกต่างง่ายๆจะแสดงให้คุณเห็นว่ามีอะไรเปลี่ยนแปลง


1
การถ่ายโอนข้อมูลต้องอยู่ใน SQL เช่น mysqldump การถ่ายโอนข้อมูลของ Oracle เป็นไบนารี
Osama Al-Maadeed

7
นอกจากนี้ยังมีปัญหาพื้นฐานเพิ่มเติมเกี่ยวกับความแตกต่างของสคีมา คุณแยกคอลัมน์ดร็อป + เพิ่มจากการเปลี่ยนชื่อคอลัมน์อย่างไร คำตอบนั้นง่ายมาก: คุณทำไม่ได้ นี่คือเหตุผลที่คุณต้องบันทึกการดำเนินการเปลี่ยนแปลงสคีมาจริง
psp

ความแตกต่างจะแสดงว่าคอลัมน์หนึ่งหายไปในขณะที่อีกคอลัมน์หนึ่งปรากฏขึ้น (เว้นแต่จะมีชื่อเดียวกัน) และส่วนใหญ่ก็เพียงพอแล้ว การเขียนสคริปต์การเปลี่ยนแปลงสคีมาทุกครั้งเป็นวิธีที่ดีแน่นอน: ใน Drupal สิ่งนี้ได้รับการจัดการโดยตะขอพิเศษเช่น
deadprogrammer

6

K. สก็อตอัลเลนมีบทความที่เหมาะสมหนึ่งหรือสองบทความเกี่ยวกับการกำหนดเวอร์ชันของสคีมาซึ่งใช้แนวคิดการอัปเดตสคริปต์ / การย้ายข้อมูลเพิ่มเติมที่อ้างอิงในคำตอบอื่น ดูhttp://odetocode.com/Blogs/scott/archive/2008/01/31/11710.aspx


5

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

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

ด้วยสคริปต์นี้คุณสามารถรวมเข้ากับ DBUnit หรือ build script บางประเภทได้ดังนั้นดูเหมือนว่ามันจะเข้ากันได้กับกระบวนการอัตโนมัติของคุณอยู่แล้ว


ใช่นั่นคือสิ่งที่เรามีอยู่ในตอนนี้ น่าเสียดายที่ไม่ได้ให้วิธีง่ายๆแก่เราในการแก้ไขฐานข้อมูลที่มีอยู่ - สคริปต์ SQL ที่สร้างโดย mysqldump ถือว่าคุณกำลังสร้างตารางตั้งแต่เริ่มต้น (หรือเขียนทับตารางหากมีอยู่) เราต้องการบางสิ่งที่ไฮเทคมากขึ้นเนื่องจากจำเป็นต้องใช้ลำดับของคำสั่ง ALTER TABLE กับฐานข้อมูลและเพื่อที่จะดำเนินการดังกล่าวได้อย่างถูกต้องจำเป็นต้องตระหนักถึงสถานะปัจจุบันของฐานข้อมูล
pix0r

5

หากคุณใช้ C # ให้ดูที่ Subsonic ซึ่งเป็นเครื่องมือ ORM ที่มีประโยชน์มาก แต่ยังสร้างสคริปต์ sql เพื่อสร้างโครงร่างและ \ หรือข้อมูลของคุณขึ้นมาใหม่ จากนั้นสคริปต์เหล่านี้สามารถใส่ลงในคอนโทรลซอร์สได้

http://subsonicproject.com/


ดูเหมือนว่าจะเป็น URL ที่ตายแล้ว ณ จุดนี้
Mark Schultheiss

5

ฉันใช้โครงสร้างโครงการฐานข้อมูลต่อไปนี้ใน Visual Studio สำหรับหลายโครงการและทำงานได้ดี:

ฐานข้อมูล

เปลี่ยนสคริปต์

0.PreDeploy.sql

1.SchemaChanges.sql

2.DataChanges.sql

3.Permissions.sql

สร้างสคริปต์

Sprocs

ฟังก์ชั่น

มุมมอง

จากนั้นระบบสร้างของเราจะอัปเดตฐานข้อมูลจากเวอร์ชันหนึ่งไปยังเวอร์ชันถัดไปโดยเรียกใช้สคริปต์ตามลำดับต่อไปนี้:

1.PreDeploy.sql

2.SchemaChanges.sql

เนื้อหาของโฟลเดอร์ Create Scripts

2.DataChanges.sql

3.Permissions.sql

นักพัฒนาซอฟต์แวร์แต่ละรายจะตรวจสอบการเปลี่ยนแปลงเพื่อหาจุดบกพร่อง / คุณลักษณะเฉพาะโดยการต่อท้ายโค้ดไว้ที่ส่วนท้ายของแต่ละไฟล์ เมื่อเวอร์ชันหลักเสร็จสมบูรณ์และแยกย่อยในการควบคุมแหล่งที่มาเนื้อหาของไฟล์. sql ในโฟลเดอร์ Change Scripts จะถูกลบ


5

เราใช้วิธีง่ายๆ แต่ได้ผล

สำหรับการติดตั้งใหม่เรามีไฟล์ metadata.sql ในที่เก็บซึ่งเก็บ DB schema ทั้งหมดจากนั้นในขั้นตอนการสร้างเราจะใช้ไฟล์นี้เพื่อสร้างฐานข้อมูล

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

ดังนั้นในซอฟต์แวร์ของเราเรามีสิ่งนี้:

RegisterUpgrade(1, 'ALTER TABLE XX ADD XY CHAR(1) NOT NULL;');

รหัสนี้จะตรวจสอบว่าฐานข้อมูลอยู่ในเวอร์ชัน 1 หรือไม่ (ซึ่งถูกเก็บไว้ในตารางที่สร้างขึ้นโดยอัตโนมัติ) หากเป็นข้อมูลที่ล้าสมัยคำสั่งจะดำเนินการ

ในการอัปเดต metadata.sql ในที่เก็บเราเรียกใช้การอัปเกรดนี้ภายในเครื่องจากนั้นแยกข้อมูลเมตาของฐานข้อมูลแบบเต็ม

สิ่งเดียวที่เกิดขึ้นทุก ๆ ครั้งคือการลืมยอมรับ metadata.sql แต่นี่ไม่ใช่ปัญหาใหญ่เพราะง่ายต่อการทดสอบในกระบวนการสร้างและสิ่งเดียวที่อาจเกิดขึ้นคือการติดตั้งใหม่ด้วย ฐานข้อมูลที่ล้าสมัยและอัปเกรดเมื่อใช้งานครั้งแรก

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


4

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

หากลูกค้าหรือลูกค้าโทรหาคุณด้วยปัญหาเกี่ยวกับเวอร์ชัน 1.0.1 และคุณกำลังใช้ 1.0.2 การนำฐานข้อมูลกลับไปที่เวอร์ชันของเขาจะไม่เป็นปัญหา

ในฐานข้อมูลของคุณสร้างตารางที่เรียกว่า "สคีมา" ที่คุณใส่ไว้ในฐานข้อมูลเวอร์ชันปัจจุบัน จากนั้นการเขียนโปรแกรมที่สามารถอัปเกรดหรือดาวน์เกรดฐานข้อมูลให้กับคุณก็เป็นเรื่องง่าย

เช่นเดียวกับที่โจอี้พูดถ้าคุณอยู่ในโลกแห่ง Rails ให้ใช้การย้ายข้อมูล :)


3

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

จากนั้นเรามีสคริปต์ที่เรียกว่า "Migration_watcher" ซึ่งในขณะที่เราอยู่ในเวอร์ชันก่อนอัลฟาปัจจุบันทำงานในทุกการโหลดหน้าเว็บและตรวจสอบว่ามีไฟล์ migration_XX.sql ใหม่หรือไม่โดยที่ XX มีขนาดใหญ่กว่าเวอร์ชันการย้ายข้อมูลปัจจุบันหรือไม่ หากเป็นเช่นนั้นมันจะเรียกใช้ไฟล์ migration_XX.sql ทั้งหมดจนถึงจำนวนที่มากที่สุดเทียบกับฐานข้อมูลและ voila! การเปลี่ยนแปลงสคีมาเป็นไปโดยอัตโนมัติ

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


3

ฉันขอแนะนำให้ใช้ Ant (แพลตฟอร์มข้าม) สำหรับด้าน "สคริปต์" (เนื่องจากสามารถพูดคุยกับฐานข้อมูลใด ๆ ผ่าน jdbc ได้) และการโค่นล้มสำหรับที่เก็บซอร์ส Ant จะให้คุณ "สำรอง" ฐานข้อมูลของคุณไปยังไฟล์ในเครื่องก่อนที่จะทำการเปลี่ยนแปลง 1. สำรอง db schema ที่มีอยู่ไปยังไฟล์ผ่าน Ant 2. การควบคุมเวอร์ชันไปยังที่เก็บ Subversion ผ่าน Ant 3. ส่งคำสั่ง sql ใหม่ไปยัง db ผ่าน Ant


3

Toad for MySQL มีฟังก์ชันที่เรียกว่า schema Compare ซึ่งช่วยให้คุณสามารถซิงโครไนซ์ฐานข้อมูล 2 ฐานข้อมูล เป็นเครื่องมือที่ดีที่สุดที่ฉันเคยใช้มา


3

ฉันชอบวิธีที่Yiiจัดการกับการย้ายฐานข้อมูล โยกย้ายเป็นพื้น PHP CDbMigrationสคริปต์การดำเนินการ CDbMigrationกำหนดupวิธีการที่มีตรรกะการโยกย้าย นอกจากนี้ยังเป็นไปได้ที่จะใช้downวิธีการเพื่อสนับสนุนการย้อนกลับของการย้ายข้อมูล อีกวิธีหนึ่งsafeUpหรือsafeDownสามารถใช้เพื่อให้แน่ใจว่าการโอนย้ายเสร็จสิ้นในบริบทของธุรกรรม

เครื่องมือบรรทัดคำสั่งของ Yii yiicรองรับการสร้างและดำเนินการย้ายข้อมูล การย้ายข้อมูลสามารถนำไปใช้หรือย้อนกลับได้ทีละรายการหรือเป็นกลุ่ม การสร้างการย้ายข้อมูลจะส่งผลให้โค้ดสำหรับการใช้งานคลาส PHPCDbMigrationซึ่งตั้งชื่อโดยไม่ซ้ำกันตามการประทับเวลาและชื่อการย้ายข้อมูลที่ระบุโดยผู้ใช้ การย้ายข้อมูลทั้งหมดที่ใช้กับฐานข้อมูลก่อนหน้านี้จะถูกเก็บไว้ในตารางการย้ายข้อมูล

สำหรับข้อมูลเพิ่มเติมโปรดดูบทความการย้ายฐานข้อมูลจากคู่มือ



2

การย้ายข้อมูล IMHO มีปัญหาใหญ่:

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

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


0

มีเครื่องมือmysql-diff ของบรรทัดคำสั่งที่เปรียบเทียบสกีมาฐานข้อมูลโดยที่สกีมาสามารถเป็นฐานข้อมูลแบบสดหรือสคริปต์ SQL บนดิสก์ เหมาะสำหรับงานย้ายสคีมาส่วนใหญ่

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