[英]How to make a copy of large database from phpmyadmin?
我想在同一台服務器上創建我的網站的開發環境。 但我有一個7Gb的數據庫,其中包含479個表,我想將該數據庫的副本復制到新的數據庫中。
我在PHPmyadmin >> Operations >> copy database to
的幫助下嘗試了這個, PHPmyadmin >> Operations >> copy database to
功能。 但每次它都會失敗並返回錯誤
Error in processing request Error code: 500 Error text: Internal Error.
請告訴我有任何其他方法/解決方案將此數據庫從cpanel復制到新數據庫請告知
注意:我剛剛閱讀了您的評論,並且我可以理解您無法訪問命令行。 請檢查Solution Two
,這肯定會有效。
唯一適用於您的解決方案(適用於12GB數據庫)直接來自命令行:
解決方案一
mysql -u root -p
set global net_buffer_length=1000000; --Set network buffer length to a large byte number
set global max_allowed_packet=1000000000; --Set maximum allowed packet size to a large byte number
SET foreign_key_checks = 0; --Disable foreign key checking to avoid delays, errors and unwanted behavior
source file.sql --Import your sql dump file
SET foreign_key_checks = 1; --Remember to enable foreign key checks when the procedure is complete!
如果您具有root訪問權限,則可以創建bash腳本:
#!/bin/sh
# store start date to a variable
imeron=`date`
echo "Import started: OK"
dumpfile="/home/bob/bobiras.sql"
ddl="set names utf8; "
ddl="$ddl set global net_buffer_length=1000000;"
ddl="$ddl set global max_allowed_packet=1000000000; "
ddl="$ddl SET foreign_key_checks = 0; "
ddl="$ddl SET UNIQUE_CHECKS = 0; "
ddl="$ddl SET AUTOCOMMIT = 0; "
# if your dump file does not create a database, select one
ddl="$ddl USE jetdb; "
ddl="$ddl source $dumpfile; "
ddl="$ddl SET foreign_key_checks = 1; "
ddl="$ddl SET UNIQUE_CHECKS = 1; "
ddl="$ddl SET AUTOCOMMIT = 1; "
ddl="$ddl COMMIT ; "
echo "Import started: OK"
time mysql -h 127.0.0.1 -u root -proot -e "$ddl"
# store end date to a variable
imeron2=`date`
echo "Start import:$imeron"
echo "End import:$imeron2"
解決方案二
此外,還有另一個選項,非常適合那些共享主機並且沒有命令行訪問權限的人。 這個解決方案適用於4-5GB文件:
$linespersession = 3000;
更改為$linespersession = 30000;
) 解決方案三:
這個解決方案絕對有效,它很慢但有效。
下載(32或64位)的試用版: Navicat MySQL Version 12
安裝 - >和RUN作為試用版。
之后將您的計算機IP(Internet IP,而不是本地IP)添加到cPanel(新數據庫/主機)中的MySQL Remote。 您可以在cPanel中使用通配符IP從任何IP訪問MySQL。
Goto Navicat MySQL:點擊Connection輸入連接名稱。
在下一個“主機名/ IP”中添加“主機IP地址”(不要使用localhost)。 保持端口不變(如果你的主機定義了一個不同的端口放在那里)。
添加您的數據庫用戶名和密碼
單擊“ 測試連接” ,如果成功,單擊“確定”
現在在主屏幕上,您將看到所有數據庫都與左側列中的用戶名相關聯。
雙擊要導入SQL文件的數據庫:
數據庫的圖標顏色將發生變化,您將看到“Tables / views / function etc.”。
現在右鍵單擊 數據庫並選擇“ 執行SQL文件 ”( http://prntscr.com/gs6ef1 )。 選擇文件,如果你願意,選擇“繼續出錯”並最終運行它。 它需要一些時間,具體取決於您的網絡連接速度和計算機性能。
創建數據庫的導出。 這應該通過PhpMyAdmin接口輕松完成。 下載數據庫導出后,您需要創建一個新數據庫,您可以在其中放置導出的數據。 這也應該通過PhpMyAdmin用戶界面輕松完成。
要上傳它,我們無法使用Import -> Browse your computer
因為它的限制為2MB。 一種解決方案是使用Import -> Select from the web server upload directory /var/lib/phpMyAdmin/upload/
。 將導出的數據上傳到此目錄中。 之后,您上傳的數據應列在其旁邊的下拉列表中。
如果此操作也失敗,您可以使用命令行導入。
mysql -u user -p db_name < /path/to/file.sql
我懷疑PHPMyAdmin將處理該大小的數據庫(PHP上傳/下載限制,內存限制,腳本執行時間)。 如果您已經訪問控制台,我建議通過mysql命令行進行導出/導入:
出口:
$ mysqldump -u <user> -p<pass> <liveDatabase> | gzip > export.sql.gz
和導入:
$ gunzip < export.sql.gz | mysql -u <user> -p<pass> <devDatabase>
在例如PHPMyAdmin或通過命令行創建新的dev數據庫之后。
否則,如果您只能訪問Apache / PHP環境,我會尋找一個導出實用程序,它以較小的塊分割導出。 MySQLDumper浮現在腦海中,但它已經存在了幾年,AFAIK它不再被主動維護,並且與PHP 7+不兼容。 但我認為至少有一個pull請求可以使它與PHP7一起使用(未經測試)。
根據您的評論進行修改:
如果導出已經存在且導入時發生錯誤,您可以嘗試通過.htaccess
條目,更改php.ini
或ini_set
,以及環境中可用的任何內容來增加PHP環境的限制。 相關設置例如用於通過.htaccess
進行設置(請記住,這僅適用於具有mod_php的apache環境,也可以由您的主機控制):
php_value max_execution_time 3600
php_value post_max_size 8000M
php_value upload_max_filesize 8000M
php_value max_input_time 3600
這可能有效,也可能無效,具體取決於x32 / x64問題和/或您的托管服務商限制。 此外,你需要調整phpMyAdmin的設置ExecTimeLimit
-通常在發現config.default.php
您的phpMyAdmin安裝:更換
$cfg['ExecTimeLimit'] = 300;
同
$cfg['ExecTimeLimit'] = 0;
最后,您可能需要調整MySQL配置以允許更大的數據包並擺脫“丟失的連接”錯誤:my.ini中的[mysqld]部分:
max_allowed_packet=256M
你可以使用mysqldump
如下
mysqldump —user= —password= --default-character-set=utf8
您還可以使用我的shell腳本,該腳本實際上是使用cron作業定期編寫的,以便定期備份MySQL數據庫。
#!/bin/sh
now="$(date +'%d_%m_%Y_%H_%M_%S')"
filename="db_backup_$now".gz
backupfolder=“"
fullpathbackupfile="$backupfolder/$filename"
logfile="$backupfolder/"backup_log_"$(date +'%Y_%m')".txt
echo "mysqldump started at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
mysqldump —user= —password= --default-character-set=utf8 | gzip > "$fullpathbackupfile"
echo "mysqldump finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
chown "$fullpathbackupfile"
chown "$logfile"
echo "file permission changed" >> "$logfile"
find "$backupfolder" -name db_backup_* -mtime +2 -exec rm {} \;
echo "old files deleted" >> "$logfile"
echo "operation finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
echo "*****************" >> "$logfile"
exit 0
我已經在CPanel或Linux上寫了一篇關於安排MySQL數據庫備份的文章。
這是我在面對它時如何處理這個問題...不幸的是,這僅適用於Mac OS。
我希望這有幫助。 這是一個小小的工作,但它對我來說非常好,特別是當PMA失敗時。
由於要求包括PHPMyAdmin,我的建議是:
然后嘗試在您擁有的新數據庫中導入生成的文件(如果您有足夠的資源 - 這應該是可能的)。
注意:我之前的經驗表明,使用壓縮允許更大的數據庫導出/導入操作,但尚未測試共享托管環境中的上限(假設您對cPanel的評論)。
編輯:創建導出文件時,選擇新數據庫(假設它已創建),轉到“導入”選項卡,選擇從導出創建的文件並開始導入過程。
不應轉儲大型數據集(除非是用於備份),而是在沒有數據的情況下 導出數據庫,然后一次復制一個表(直接DB到DB)。
首先,通過phpMyAdmin 僅導出數據庫模式 (取消選中導出選項中的數據 )。 然后將其導入新的數據庫名稱。
或者,一旦您創建了數據庫,就可以使用類似下面的內容生成如下所示的語句。 使用此方法的問題是您可能會丟失約束,sprocs等。
CREATE TABLE [devDB].[table] LIKE [prodDB].[table]
使用一個好的編輯器來創建所需的470個插入語句。 從表名列表開始,並使用舊的查找和替換。
INSERT INTO [devDB].[table] SELECT * FROM [prodDB].[table];
根據您的環境,這可能會窒息。 如果是 ,則刪除並重新創建dev數據庫(或通過phpMyAdmin清空所有表)。 然后,一次運行INSERT
命令幾個表。
您在這里遇到的真正問題是您在不訪問命令行界面的情況下嘗試進行數據庫管理。 有效地遷移大量數據有很多復雜的細節,其中大部分只能使用像mysqldump這樣的工具來解決。
如果您的本地服務器中有數據庫,則可以將其導出並使用BigDump插入全局服務器BigDump上的新數據庫
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.