將Mysqldump 輸出分割成較小的檔案以上傳到容量有限的遠端伺服器
需要將大量資料從一個MySQL 資料庫傳輸到另一個MySQL 資料庫這種情況經常出現,但限製檔案上傳大小等限制可能會帶來挑戰。這在使用 phpMyAdmin 時尤其重要,因為它只允許小於 2MB 的壓縮 .sql 檔案。幸運的是,有一個解決方案可以克服這個障礙。
為了解決這個問題,mysqldump 的輸出可以被精心分割成可管理的區塊,使它們能夠以更小的形式上傳。不幸的是,由於無法在遠端伺服器上將檔案重新連接在一起,因此無法使用 split(1) 實用程式。
替代解決方案:將 MySQL 轉儲輸出進行片段化
以下 bash 腳本中展示了 split(1) 的實用替代方案。它巧妙地將資料庫轉儲文件拆分為單獨的 .sql 文件,每個文件對應一個不同的表。該腳本利用 csplit(一種用於分割檔案的多功能工具),並策略性地使用 START 來識別表邊界。
#!/bin/bash # Adjust this to your specific scenario: START="/-- Table structure for table/" if [ $# -lt 1 ] || [[ == "--help" ]] || [[ == "-h" ]]; then echo "USAGE: extract all tables:" echo " DUMP_FILE" echo "extract one table:" echo " DUMP_FILE [TABLE]" exit fi if [ $# -ge 2 ]; then # Extract a specific table csplit -s -ftable "/-- Table structure for table/" "%-- Table structure for table \`\`%" "/-- Table structure for table/" "%40103 SET TIME_ZONE=@OLD_TIME_ZONE%1" else # Extract all tables csplit -s -ftable "$START" {*} fi [ $? -eq 0 ] || exit mv table00 head FILE=`ls -1 table* | tail -n 1` if [ $# -ge 2 ]; then # Cut off all other tables mv $FILE foot else # Cut off the end of each file csplit -b '%d' -s -f$FILE $FILE "/40103 SET TIME_ZONE=@OLD_TIME_ZONE/" {*} mv ${FILE}1 foot fi for FILE in `ls -1 table*`; do NAME=`head -n1 $FILE | cut -d$'\x60' -f2` cat head $FILE foot > "$NAME.sql" done rm head foot table*
該解決方案精心地將轉儲文件拆分為單一表特定的 .sql 文件,確保成功上傳到即使文件容量有限也可以遠端伺服器。
以上是如何將大型 MySQL 轉儲檔案拆分為較小的檔案以克服上傳大小限制?的詳細內容。更多資訊請關注PHP中文網其他相關文章!