2009-05-05 31 views
21

Tôi có một ứng dụng trong PHP/MySQL. Tôi đang tìm kiếm một cách tự động nâng cấp cơ sở dữ liệu phía sau ứng dụng. Tôi không cần phải có khả năng tương thích với các phiên bản cũ hơn khi nó được nâng cấp.Cách tự động hóa di chuyển (lược đồ và dữ liệu) cho ứng dụng PHP/MySQL

Tôi đã đọc jeff'sK. Scott Allen's bài viết về điều này.

Tôi vẫn không chắc chắn cách triển khai điều này cho ứng dụng PHP/MySQL.

Có quy trình đơn giản và tốt cho việc này không?

Trả lời

16

Tôi có một "Schema" đối tượng mà tôi sử dụng - nhưng bạn có thể làm như vậy mà không cần lớp ..

Những gì bạn muốn làm là tạo ra một 'db_schema_versions' bảng:

CREATE TABLE db_schema_versions (
    `table` varchar(255) NOT NULL PRIMARY KEY, 
    `version` INT NOT NULL 
) 

Sau cơ sở dữ liệu của bạn có thể theo dõi phiên bản nào đang bật - nó có thể tự động nâng cấp SQL.

Bạn nên khóa bảng lược đồ trong khi nâng cấp giản đồ. Bằng cách này bạn sẽ không có hai yêu cầu tại cùng một thời điểm cố gắng để nâng cấp lược đồ của bạn.

Vì vậy, - theo dõi các phiên bản bạn đang nâng cấp từ - xây dựng một công tắc lớn - một cái gì đó như thế này:

class SNTrack_Db_Schema extends MW_Db_Schema_Abstract { 
    protected $table = "sntrack_db_schema"; 
    protected $version = 5; 

    protected function upgrade($fromVersion) { 
    // don't break 
    switch($fromVersion) { 
     case 0: 
     $this->db->query('CREATE TABLE sntrack_inbound_shipment (
      `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
      `from` VARCHAR(255) NOT NULL, 
      `date` DATE NOT NULL, 
      `invoice` VARCHAR(255) NOT NULL, 
      `notes` TEXT 
     )'); 
     $this->setVersion(1); 
     case 1: 
     $this->db->query('ALTER TABLE sntrack_details ADD `shipment_id` INT'); 
     $this->db->query('ALTER TABLE sntrack_product ADD `inventory` INT NOT NULL DEFAULT 0'); 
     $this->db->query('CREATE TABLE sntrack_inventory_shipment (
      `shipment_id` INT NOT NULL, 
      `product_id` INT NOT NULL, 
      `qty` INT NOT NULL, 
      PRIMARY KEY (`shipment_id`, `product_id`) 
     )'); 
     $this->setVersion(2); 
...etc 
+0

nếu người dùng nâng cấp từ phiên bản 2 lên phiên bản 6. Bạn có lặp lại từng phiên bản 2-6 và chạy từng SQL trong chuyển đổi 2,3,4,5 và 6 để mỗi nâng cấp trong chuyển đổi chỉ là sql để nâng cấp từ phiên bản trước? – JasonDavis

0

Một cách bạn có thể thực hiện là đổ dữ liệu vào một tệp sql lớn bằng mysqldump. Chỉ cần lấy tập tin đó và nguồn nó trong cài đặt mới.

4

Tương tự như của gnarf đề nghị tôi sẽ chạy như sau:

  • Đối mọi thay đổi đối với lược đồ tạo một tệp SQL khi chạy sẽ đưa bạn từ phiên bản cũ sang phiên bản mới (đây có thể là một tệp cho mỗi phiên bản chính hoặc nhiều thay đổi nhỏ hơn).
  • Tạo tệp riêng lẻ liệt kê từng tên tệp SQL theo thứ tự chúng phải được áp dụng (cũ nhất ở trên cùng, mới nhất ở dưới cùng)
  • Tạo bảng "phiên bản" đơn giản (tất cả những gì cần là một VARCHAR cột) trong cơ sở dữ liệu của bạn

Bây giờ bạn cần phải viết một kịch bản đơn giản mà làm việc theo cách sau:

  • Query bảng phiên bản cho tên của tập tin cập nhật SQL cuối cùng áp dụng
  • Nếu có được file SQL thay đổi mới hơn để chạy thực hiện chúng theo thứ tự
  • ghi lại tên của file SQL mới nhất áp dụng

Tôi hy vọng rằng có ý nghĩa

+0

+1 cho logic tốt. Nhưng làm thế nào để bạn thực thi các tệp sql từ PHP? SOURCE file.sql không hoạt động với mysqli_real_query! Hoặc làm thế nào để bạn kịch bản? – Sabya

+0

Có lẽ bạn sẽ phải phát nổ; để tìm các câu lệnh (nhưng điều này sẽ dễ dàng phá vỡ). Một số loại triển khai không tốt đẹp của 'cat /some/deployment-file.sql | mysql ... 'có thể được sử dụng –

0

Bạn không thể. Bạn hoặc là

  1. Viết tệp cập nhật với tất cả sql đã được thực hiện trên môi trường nguồn và sau đó thực thi chúng (đã đề cập ở trên), SVN.Cần tập lệnh php để thực thi và công việc thủ công để viết sql

  2. Phân tích sau cả môi trường và đề xuất cho người dùng nên cập nhật các bản cập nhật nào. Về cơ bản giống như điều đầu tiên, ngoại trừ việc bạn có một bước tiến lớn để di chuyển, không có nhiều khối nhỏ. SQLyog có thể phân tích sự khác biệt cho cả lược đồ và dữ liệu.

3

Hãy thử sử dụng công cụ này để di cư schema: https://github.com/idler/MMP/

+0

Tôi đã hợp nhất các tài khoản đã đăng ký và chưa đăng ký của bạn để bạn có toàn quyền kiểm soát các bài đăng của mình. –

2

Tôi tạo ra một kịch bản di cư nhỏ cho MySQL trong PHP. Nó tốt cho các dự án giai đoạn đầu và những dự án không cần (chưa) các kịch bản di trú phức tạp hơn. https://github.com/kennberg/php-mysql-migrate

0

Bạn cũng có thể sử dụng một API miễn phí SqlQuerySync

hoặc tạo cho mình một bảng cơ sở dữ liệu quản lý CREATE/ALTER/DELETE truy vấn.

0

phần mềm băng ghế dự bị MySQL (có thể được tìm thấy trên trang web của mysql) nào đó. Nó liên quan đến các bước clicky lặp đi lặp lại mặc dù.

0

Tôi có cùng một mục tiêu: di chuyển cơ sở dữ liệu lớn (hơn một triệu dòng trong một số bảng). Tôi đang xem xét sử dụng https://phinx.org mà dường như tốt để đối phó với việc di chuyển lược đồ, ngoài ra nó đi kèm với tùy chọn rollback cho an toàn.

0

Bạn có thể dùng thử thư viện này: mysql-version-control.

Tôi thích điều này vì nó phân biệt giữa lược đồ, dữ liệu lõi và dữ liệu thử nghiệm. Nhưng thực hiện nó theo cách vẫn thực sự dễ sử dụng.

Các vấn đề liên quan