การอัพเกรดฐานข้อมูลวีโอไอพีเกิดขึ้นใน“ ธุรกรรม” หรือไม่?


12

เรามีปัญหานี้ atm:

ลูกค้าได้รับร้านค้าของเขาอัพเกรดจาก CE 1.4 เป็น CE 1.8 การอัปเกรดไฟล์เป็นไปด้วยดีและการอัปเกรดฐานข้อมูลยังทำได้ดีบนเครื่องพัฒนาของเรา

เมื่อเราพยายามอัพเกรด live-db ของไคลเอ็นต์บนเครื่องสดของเขา (เชื่อมต่อ 1.8-Magento ไปยังฐานข้อมูลและเปิดในเบราว์เซอร์) กระบวนการดูเหมือนว่าจะทำงานชั่วขณะหนึ่งและสิ้นสุดลงในข้อผิดพลาด 500

บันทึกข้อผิดพลาด PHP ว่างเปล่า; เนื่องจากเป็นโฮสต์ที่ใช้ร่วมกันเราจึงไม่สามารถเปลี่ยนการตั้งค่า apache หรือ mysql ได้ hoster ถึงแม้ว่า "special im magento hosting" ไม่ต้องการเปลี่ยนการตั้งค่าและบอกฉันว่าฉันสามารถอัพเกรดฐานข้อมูลให้เสร็จได้โดยการรีเฟรชหน้าต่างเบราว์เซอร์ซ้ำ ๆ เมื่อเกิดข้อผิดพลาด 500 เนื่องจาก magento จะได้รับการอัพเกรดในขั้นตอนเล็ก ๆ . อาจใช้เวลาหลายชั่วโมง

คำถามของฉันตอนนี้คือ:
- จริงหรือไม่ ฉันคิดว่า sql-statement สำหรับการอัพเกรดฐานข้อมูลจะถูกรวมอยู่ในธุรกรรมดังนั้นพวกเขาจึงสามารถย้อนกลับได้ถ้ามีอะไรผิดพลาด
- คำตอบสามารถให้คำแนะนำที่ฉันสามารถดูรหัสเพื่อค้นหาคำตอบสำหรับคำถามนี้ได้หรือไม่

ขอบคุณที่สละเวลา!


2
อาจมีความเกี่ยวข้อง: คำสั่ง n98-magenrun ใหม่ที่จะช่วยให้คุณเรียกใช้สคริปต์การย้ายข้อมูลทีละรายการ github.com/netz98/n98-magerun/pull/274
Alan Storm

คำตอบ:


8

มันเป็นเรื่องจริงเหรอ? ฉันคิดว่า sql-statement สำหรับการอัพเกรดฐานข้อมูลจะถูกรวมอยู่ในธุรกรรมดังนั้นพวกเขาสามารถย้อนกลับได้ถ้ามีอะไรผิดพลาด

สัญชาตญาณทางวิศวกรรมของคุณนั้นฟังดูดี แต่สิ่งที่เกิดขึ้นในโลกแห่งความเป็นจริงของการเขียนโปรแกรมเริ่มต้นธุรกิจมีความซับซ้อน / น่าเกลียด

ระบบการตั้งค่าทรัพยากรของ Magento ไม่ได้ห่อสคริปต์แต่ละรายการไว้ในธุรกรรม ยังมีอีกหลายเหตุผลนี้ แต่ฉันได้เสมอสันนิษฐานหนึ่งหลักคือวีโอไอพีเริ่มต้นชีวิตผูกติดอยู่อย่างชัดเจนกับ MySQL และ / ที่สุดข้อมูล definition งบจำนวนมาก ( ALTER TABLEฯลฯ ) ใน MySQL สาเหตุนัยกระทำ

ในขณะที่คุณจะพบทรัพยากรการตั้งค่าส่วนบุคคลบางครั้งใช้ธุรกรรม

#File: app/code/core/Mage/Sales/sql/sales_setup/mysql4-upgrade-1.3.99-1.4.0.0.php
$installer->getConnection()->beginTransaction();
$installer->run("
        UPDATE {$installer->getTable('sales_flat_order')} AS o, {$installer->getTable('sales_order_entity_varchar')} AS od
    //...    

ระบบจะใช้งานสคริปต์และหวังว่าจะดีที่สุด

หากคุณสนใจโค้ดที่เรียกใช้ทรัพยากรเหล่านี้จุดเริ่มต้นที่ดีที่สุดน่าจะเป็นที่นี่

#File: app/code/core/Mage/Core/Model/Resource/Setup.php
protected function _modifyResourceDb($actionType, $fromVersion, $toVersion)
{
    //...
}

_modifyResourceDbวิธีการเป็นคนที่มีการติดตั้งสคริปต์ทรัพยากรที่เกิดขึ้นจริง

#File: app/code/core/Mage/Core/Model/Resource/Setup.php
case 'php':
    $conn   = $this->getConnection();
    $result = include $fileName;
    break;
case 'sql':
    $sql = file_get_contents($fileName);
    if (!empty($sql)) {

        $result = $this->run($sql);
    } else {
        $result = true;
    }
    break;

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

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


คำตอบที่ดี & ความเข้าใจที่ยอดเยี่ยมขอบคุณ; ยังสำหรับเคล็ดลับวิธีการแก้ปัญหาของฉัน ฉันลงเอยด้วยการอัพเกรดฐานข้อมูลบน dev. -server และนำเข้า "พร้อม" db เข้าสู่ระบบใหม่
simonthesorcerer

2
FWIW ว่าโครงการ "อาจจะสักวัน" กลายเป็นระบบ: การติดตั้ง: คำสั่งเพิ่มเติมใน n98-magerun magerun.net
Alan Storm

ให้ฉันรู้ว่าเมื่อคุณได้ว่าสคริปต์ @AlanStorm พร้อม;)
fkoessler

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