คุณกำหนดเวอร์ชันสคีมาฐานข้อมูลของคุณได้อย่างไร [ปิด]


128

คุณเตรียม SQL deltas ของคุณอย่างไร? คุณบันทึก SQL ที่เปลี่ยนสคีมาแต่ละรายการลงในโฟลเดอร์เดลต้าด้วยตนเองหรือคุณมีกระบวนการที่แตกต่างกันโดยอัตโนมัติหรือไม่?

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

นอกจากนี้สิ่งที่ตัวเลือกสำหรับการ diffing สันดอนอยู่นอกเหนือจากDbDeploy ?

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

นอกจากนี้การกำหนดเวอร์ชันสำหรับ PHP และ MySQL หากสร้างความแตกต่าง (ไม่มีวิธีแก้ปัญหา Ruby)


ฉันใช้schemasyncเพื่อสร้างโปรแกรมแก้ไข (และสคริปต์ย้อนกลับ) สิ่งเหล่านี้จะถูกเพิ่มลงใน SVN repo มันไม่สมบูรณ์แบบ แต่ใช้ได้ดีสำหรับฉัน นอกจากนี้การปรับใช้การเปลี่ยนแปลงสคีมานั้นค่อนข้างง่ายด้วย schemasync
Jay Sidri

ลิงก์นี้ว่างเปล่า - ยังมีอยู่หรือไม่
jocull

ดูเหมือนว่ามันจะย้าย: github.com/mmatuson/SchemaSync
Jay Sidri

คำตอบ:


61

ดู

มีระบบควบคุมเวอร์ชันสำหรับการเปลี่ยนแปลงโครงสร้างฐานข้อมูลหรือไม่?

ฉันจะสร้างเวอร์ชันฐานข้อมูล MS SQL ใน SVN ได้อย่างไร

และบทความของเจฟฟ์

รับฐานข้อมูลของคุณภายใต้การควบคุมเวอร์ชัน

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

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

โดยทั่วไปฉันรู้สึกว่าไม่มีทางออกที่เพียงพอและเป็นที่ยอมรับสำหรับเรื่องนี้และฉันก็หมุนตัวเองในพื้นที่นี้


ดังที่คุณทราบจากคำถามของฉันฉันทราบถึงแนวคิดของเดลต้า คำถามของฉันเกี่ยวกับข้อตกลงในการสร้างสิ่งเหล่านั้นโดยเฉพาะอย่างยิ่งโดยอัตโนมัติ
Eran Galperin

ฉันเดาว่าฉันจะกลิ้งของตัวเองแล้ว ... ;)
Eran Galperin

คุณได้ลองใช้ DBDiff: github.com/DBDiff/DBDiffหรือไม่? เหมาะสำหรับสิ่งที่คุณกำลังมองหา @EranGalperin เนื่องจากเป็นการโยกย้ายอัตโนมัติสำหรับทั้งสคีมาและข้อมูลใน SQL การเปิดเผยข้อมูลฉันเป็นผู้พัฒนาที่อยู่เบื้องหลัง!
Jasdeep Khalsa


4

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

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

ดูข้อมูลเพิ่มเติมได้ที่ wiki: http://www.nextep-softwares.com/wiki

ปัจจุบันรองรับ Oracle, MySql และ PostgreSql และอยู่ใน java เพื่อให้ผลิตภัณฑ์ทำงานบน windows, linux และ mac


3

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

ฉันมีสคริปต์การย้ายข้อมูลที่มีคำสั่งที่สร้างตารางและคอลัมน์หากยังไม่มีและกรอกข้อมูล

สคริปต์การโอนย้ายจะทำงานเมื่อใดก็ตามที่มีการอัพเดตโค้ดการใช้งานจริงและหลังจากการติดตั้งใหม่

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

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


2

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

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

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

ฉันจะไม่แนะนำวิธีแก้ปัญหานี้บนฐานข้อมูลที่มีข้อมูลจำนวนมาก แต่ฉันอัปเดตฐานข้อมูลที่มีขนาดมากกว่า 1GB ด้วย 400 ตารางเป็นประจำ


ฟังดูค่อนข้างยุ่งยากโดยเฉพาะอย่างยิ่งเมื่อต้องติดต่อกับนักพัฒนาหลายคน นอกจากนี้กระบวนการสร้างยังฟังดูเรียกร้องและฉันอยากจะง่ายที่สุด
Eran Galperin

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

2

คุณไม่ได้พูดถึง RDBMS ที่คุณใช้ แต่ถ้าเป็น MS SQL Server SQL Compareของ Red-Gate เป็นสิ่งที่ขาดไม่ได้สำหรับเราในการสร้างเดลต้าระหว่างสคริปต์การสร้างอ็อบเจ็กต์


1
สำหรับ Mysql ฉันได้อัปเดตคำถามของฉันแล้ว
Eran Galperin

2

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

เครื่องมือนี้เรียกว่าBrazilและปัจจุบันเป็นโอเพ่นซอร์สภายใต้ใบอนุญาตของ MIT บราซิลเป็นทับทิม / ทับทิมบนรางรถไฟและสนับสนุนการปรับใช้การเปลี่ยนแปลงกับฐานข้อมูลใด ๆ ที่Ruby DBIรองรับ (MySQL, ODBC, Oracle, Postgres, SQLite)

มีการวางแผนรองรับการวางสคริปต์อัพเดตในการควบคุมเวอร์ชัน


บราซิลดูดีทีเดียวแย่มากฉันใช้ PHP เป็นหลัก เคยพิจารณาการย้ายระบบหรือไม่?
Eran Galperin


1

เรากำลังส่งออกข้อมูลไปยังรูปแบบพกพา (โดยใช้ toolchain ของเรา) จากนั้นนำเข้าสู่สคีมาใหม่ ไม่จำเป็นต้องใช้ delta SQL แนะนำเป็นอย่างยิ่ง


3
รูปแบบพกพานี้คืออะไร? และคุณจะนำเข้าสคีมาใหม่โดยใช้เฉพาะความแตกต่างจากเวอร์ชันก่อนหน้าได้อย่างไร
Eran Galperin

1

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

ฉันคิดว่าคุณสามารถค้นหาเครื่องมือ MySQL บางตัวที่มีคุณสมบัติการบันทึกเช่นเดียวกับ FlameRobin สำหรับ Firebird

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

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

ฉันเขียนกระดาษสีขาวที่สวยงามเกี่ยวกับวิธีการทำทั้งหมดนี้โดยละเอียด คุณสามารถดาวน์โหลดในรูปแบบกระดาษ .pdf พร้อมกับการสาธิต PHP สคริปต์จากที่นี่


1

ฉันยังได้พัฒนาชุดสคริปต์ PHP ที่นักพัฒนาสามารถส่งสคริปต์ deltasql ไปยังที่เก็บส่วนกลาง

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

เว็บอินเตอร์เฟสช่วยให้จัดการโครงการต่างๆ นอกจากนี้ยังสนับสนุนฐานข้อมูล "สาขา"

คุณสามารถทดสอบแอปพลิเคชันได้ที่http://www.gpu-grid.net/deltasql (หากคุณเข้าสู่ระบบในฐานะผู้ดูแลระบบด้วยรหัสผ่าน testdbsync) แอปพลิเคชันนี้เป็นโอเพ่นซอร์สและสามารถดาวน์โหลดได้ที่นี่: http://sourceforge.net/projects/deltasql

deltasql ถูกใช้อย่างมีประสิทธิผลในสวิตเซอร์แลนด์และอินเดียและเป็นที่นิยมในญี่ปุ่น


1

หลายเดือนก่อนฉันค้นหาเครื่องมือสำหรับกำหนดเวอร์ชันของสคีมา MySQL ฉันพบเครื่องมือที่มีประโยชน์มากมายเช่น Doctrine migration, RoR migration เครื่องมือบางอย่างเขียนใน Java และ Python

แต่ไม่มีใครพอใจความต้องการของฉัน

ความต้องการของฉัน:

  1. ไม่มีข้อกำหนดยกเว้น PHP และ MySQL
  2. ไม่มีไฟล์การกำหนดค่าสคีมาเช่น schema.yml ใน Doctrine
  3. สามารถอ่านสคีมาปัจจุบันจากการเชื่อมต่อและสร้างสคริปต์การโอนย้ายใหม่แทนที่จะเป็นตัวแทนของสคีมาที่เหมือนกันในการติดตั้งแอปพลิเคชันอื่น ๆ

ฉันเริ่มเขียนเครื่องมือการย้ายข้อมูลและวันนี้ฉันมีเวอร์ชันเบต้า

โปรดลองถ้าคุณมีความสนใจในหัวข้อนี้ โปรดส่งคำขอและรายงานข้อบกพร่องในอนาคตให้ฉัน

ซอร์สโค้ด: bitbucket.org/idler/mmp/src ภาพรวมเป็นภาษาอังกฤษ: bitbucket.org/idler/mmp/wiki/Home ภาพรวมเป็นภาษารัสเซีย: antonoff.info/development/mysql-migration-with-php-project


คุณยังมีเครื่องมือใหม่: DBV: stackoverflow.com/a/13837473/6309
VonC


1

ฉันสนใจในหัวข้อนี้เหมือนกัน

มีการอภิปรายบางเรื่องนี้ในวิกิพีเดีย Django

ที่น่าสนใจดูเหมือนว่าCakePHP มีการกำหนดเวอร์ชันสคีมาในตัวโดยใช้cake schema generateคำสั่งเพียง


จากสิ่งที่ฉันอ่านเกี่ยวกับวิธีแก้ปัญหาของเค้ก - มันเป็นเวอร์ชันที่มีความหมายพื้นฐานมาก แต่ก็ไม่มีความสามารถที่แตกต่างกันดังนั้นจึงไม่มีประโยชน์สำหรับฉัน
Eran Galperin

1

สำหรับ MySQL

เมื่อฉันลงบนฐานข้อมูลใหม่:

ประการแรกฉันตรวจสอบโครงสร้าง:

mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB1_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_1.sql
mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB2_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_2.sql
diff FILENAME_1.sql FILENAME_2.sql > DIFF_FILENAME.txt
cat DIFF_FILENAME.txt | less

ขอบคุณผู้ใช้ stackoverflow ฉันสามารถเขียนสคริปต์ด่วนนี้เพื่อค้นหาความแตกต่างของโครงสร้าง

src: https://stackoverflow.com/a/8718572/4457531 & https://stackoverflow.com/a/26328331/4457531

mysqldiffในขั้นตอนที่สองฉันจะตรวจสอบข้อมูลตารางโดยตารางที่มี มันค่อนข้างคร่ำครึ แต่ php loop ตามinformation_schemaข้อมูลทำให้งานแน่นอน

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

initial version : 1.0.0
                  ^ ^ ^
                  | | |
structure change: - | |
datas added: -------- |
datas updated: --------

0

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

นี่คือการใช้งานเต็มรูปแบบสำหรับ SQL Server (สามารถพัฒนาโซลูชันเดียวกันสำหรับ MySQL ได้หากจำเป็น): วิธีการดูแลเวอร์ชัน Schema ของฐานข้อมูล SQL Server


ฉันเพิ่งอ่านบทความของคุณ คุณยังคงใช้สิ่งนี้อยู่หรือเคยใช้โซลูชันแบบ off-the-shelf เช่น DBUp หรือ ReadyRoll
David Atkinson

ปัจจุบันโครงการทั้งหมดของฉันใช้ Entity Framework Code-First และฉันใช้การโอนย้ายเพื่อกำหนดเวอร์ชันฐานข้อมูล ฉันมีวิธีแก้ปัญหาจากบทความในโครงการเดิมสองสามโครงการและฉันไม่เคยแทนที่มัน ในโครงการอื่น ๆ ฉันใช้เครื่องมือ Redgate เพื่อจัดการสคีมาและการย้ายข้อมูล
Zoran Horvat

เยี่ยมมากที่คุณเป็นผู้ใช้ Redgate! หากคุณต้องการใช้เครื่องมือ Redgate ร่วมกับ EF สามารถทำได้: red-gate.com/blog/database-lifecycle-management/…
David Atkinson

ฉันจะลองใช้ในโอกาสต่อไป มันให้บริการเราได้ดี แต่ในขณะเดียวกันฉันได้เปลี่ยนทีมและตอนนี้ฉันกำลังทดลองใช้การสนับสนุน EF แบบเนทีฟก่อนที่จะผลักดันมันไปข้างหน้า
Zoran Horvat

0

หลังจากการตรวจสอบเป็นเวลานานฉันพบว่ามีเครื่องมือของบุคคลที่สามหรือประเภทโครงการ Visual Studio ที่ไม่ตรงใจฉันหรือเพียงแค่บล็อกเกี่ยวกับทฤษฎี แต่ไม่มีการนำไปใช้ ดังนั้นฉันจึงใช้ระบบการทำงานซึ่งใช้เกือบปีและอธิบายที่นี่:

http://nalgorithm.com/2015/11/09/database-versioning-part-1/

ขึ้นอยู่กับความสนใจจะเขียนต่อไป


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