簡體   English   中英

通過php遷移數據庫

[英]Database migration through php

我有一個mysql數據庫,我試圖遷移到另一個數據庫。 它有不同的模式,我為舊數據庫的每個表編寫了一個php腳本,以便將其數據填充到新數據庫中。 腳本工作正常,但問題是它不會移動所有數據。 例如,如果我有一個表,並且所有信息都被選中,然后插入到新表中,但只完成了一半。 我這樣做的方式我打開一個數據庫選擇*並將其放在一個關聯數組中。 然后我關閉數據庫連接並連接到另一個連接遍歷數組的每個元素並將它們插入到新數組中。 數組的大小是否有限制? 這有什么不對?

您應該以塊(例如1000行)讀取第一個數據庫中的行,將這些行寫入第二個數據庫,清理數組(使用unset()或空數組)並重復該過程直到您讀取所有行。 這克服了內存限制。

另一個問題可能是腳本運行的時間太長(如果表太大),所以嘗試使用函數set_time_limit() 此函數重置腳本的超時,之后應終止該腳本。 我建議在處理每個塊后調用它。

首先,我沒有看到編寫腳本來執行此操作的重點。 為什么不從phpMyAdmin獲取SQL轉儲並編輯它以使其適合其他數據庫? 或者他們有什么不同?

但回答你的問題:我的第一個想法就像其他人已經說過的那樣,問題將是時間限制。 在嘗試對此做一些事情之前,您應該檢查php.ini中的max_execution_time的值(大多數情況下這大約是30秒)以及腳本執行所需的時間。 如果它在大約30秒后終止(或max_execution_time的值,如果它不同),那么這可能是問題,雖然php應該拋出錯誤(或至少是一個警告)。

我不認為php中的數組大小有限制。 但是,php.ini中有一個指令,即memory_limit ,它定義了腳本可以使用的內存量。

如果您有權訪問php.ini文件,我建議將max_execution_timememory_limit設置為更高的值。 如果您沒有訪問php.ini,則無法更改memory_limit指令。 您將不得不解決這個問題,例如在SQL中使用LIMIT 請務必取消設置已使用的變量,否則可能會遇到同樣的問題。

您可能在目標數據庫中有拒絕某些嘗試插入的約束。

為什么不通過sql腳本這樣做?

如果您更喜歡通過php進行操作,那么您可以打開與兩個數據庫的連接,並在從源讀取時插入目標。 這樣你就可以避免使用太多內存。

使用php來執行轉換/轉換邏輯是可能的。 我會這樣做,如果你正在做復雜的轉換,如果你的PHP技能比你的mysql技能更好。

如果你的php腳本需要更多內存,請使用:

memory_limit = 2048M max_execution_time = 3600

這將為您提供2gig的陣列空間和大約一個小時的處理時間。 但是如果你的數據庫真的很大,那么使用起來要快得多(實際上很多):

1. mysqldump,用於轉儲源服務器

請在此處查看: http//dev.mysql.com/doc/refman/5.1/en/mysqldump.html

2.上傳dumpfile並將其導出。 mysql文檔頁面上有很多例子。 (另見評論)。

在此之后,您可以通過CREATE / SELECT語句轉換數據庫。

CREATE TABLE一個SELECT * FROM兩個;

作為替代方案,您可以使用UPDATE語句。 什么是最好的取決於你正在做的工作類型。

祝好運!

最好在命令行執行mysql轉儲:

mysqldump -a -u USER_NAME -p SOURCE_DATABASE_NAME> DATA.mysql

您還可以對文件進行gzip以使其更小以便傳輸到另一台服務器:

gzip DATA.mysql

傳輸后,解壓縮文件:

gunzip -f DATA.mysql.gz

並導入它:

mysql -u USER_NAME -p TARGET_DATABASE_NAME <DATA.sql

您的服務器(與所有服務器一樣)將具有PHP的內存限制 - 如果您使用超過指定的限制,則腳本將失敗。

是否可以將當前的MySQL數據庫轉儲為文本文件,執行查找和替換或基於RegExp的替換以更改文本文件中的模式,然后將修改后的測試文件重新加載到MySQL中以完成更改? 如果這是一次性遷移,那么它可能是更好的方法。

您可能會遇到PHP的執行時間或內存限制。 確保php.ini中的相應設置足夠高,以允許腳本完成執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM