2012-10-28 51 views
6

我在本地開發服務器上有一個非常大的MySQL表:超過800萬行數據。我使用LOAD DATA INFILE成功加載了表。將大型MySQL表導出爲多個小文件

我現在希望導出這些數據並將其導入遠程主機。

我試着LOAD DATA LOCAL INFILE到遠程主機。但是,大約15分鐘後,與遠程主機的連接失敗。我認爲唯一的解決辦法是將數據導出到一些較小的文件中。

我可以使用的工具是PhpMyAdmin,HeidiSQL和MySQL Workbench。

我知道如何導出爲單個文件,但不是多個文件。我怎樣才能做到這一點?

+1

你可以嘗試mysqldump'ing只有所需的表,並通過導入重建它。 –

+0

你能從本地機器連接到mysql機器嗎? – Michael

+0

@邁克爾 - 是的,當然。我一直在使用HeidiSQL進行數據庫維護。 – Billy

回答

4

看看mysqldump

你行應爲(從終端):

出口從DB_NAME在你的MySQL backupfile.sql:

mysqldump -u user -p db_name > backupfile.sql 

從backupfile進口DB_NAME在你的mysql:

mysql -u user -p db_name < backupfile.sql 

你有兩個opti以便分割信息:

  1. 將輸出文本文件拆分爲更小的文件(儘可能多地需要多個工具來執行此操作,例如, split)。使用該選項的DB_NAME後添加一個表名,像這樣每次
  2. 導出一個表:

    mysqldump -u user -p db_name table_name > backupfile_table_name.sql

壓縮文件(S)(文本文件)是非常有效的並且可以將其最小化至其原始尺寸的大約20%-30%。

將文件複製到遠程服務器應該使用scp(安全副本)完成,並且應該使用ssh(通常)進行交互。

祝你好運。

+0

「將輸出的文本文件分割成更小的文件(儘可能多的需要多個工具來完成)。」 - 什麼工具?這是一個問題:我該怎麼做? – Billy

+0

看看編輯。作爲一個例子,增加了Unix的「split」應該在大多數系統上都可用。 –

2

作爲單個表

mysqldump -u root -ppassword yourdb yourtable > table_name.sql 

導入mysqldump的方法的一個例子是如此的簡單

mysql -u username -ppassword yourotherdb < table_name.sql 
+0

我發現這對於大型出口/進口尤其快速。對於OP的好建議。 – CodeTalk

+0

是的,這很好,但我沒有SSH訪問服務器。它不回答實際問題。 – Billy

+0

@Billy如果您有phpmyadmin訪問權限,您仍然可以在轉儲文件上運行phpmyadmin導入。您可以選擇進行部分導入,然後通過指定跳過的查詢數作爲成功發生的數來繼續。 –

1

使用mysqldump表中轉儲到一個文件。 然後使用tar-z選項壓縮文件。 將其傳輸到遠程服務器(使用ftp,sftp或其他文件傳輸實用程序)。 然後解壓遠程服務器上的文件 使用mysql導入文件。

沒有理由拆分原始文件或導出到多個文件。

+1

你如何解決嚴格的查詢超時設置? – Vyktor

+0

@Vyktor請給我解釋一下你的問題。我可能會在這裏錯過一些信息。我的第一個快速答案是,我不希望任何查詢超時。 「mysql」命令將處理導入發生的本地機器上的「xxx.sql」文件(導出結果)。 「xxx.sql」文件包含正在導入的表的「插入」命令(期望大約8百萬個這樣的命令/語句,即等於表格的行數)。這些「插入」命令由於任何超時而失敗,我看不到任何理由。 –

+0

這是一個共享主機 - 我無法在命令行上訪問MySQL。 – Billy

3

我發現phpMyAdmin中的高級選項允許我選擇要導出的行數以及起點。這使我可以根據需要創建儘可能多的轉儲文件,以將表格獲取到遠程主機上。

我不得不調整我的php.ini設置,加上phpMyAdmin配置'ExecTimeLimit'設置 ,因爲生成轉儲文件需要一些時間(每個500,000行)。

我使用HeidiSQL來進行導入。

+0

謝謝,這解決了我的問題。 –

15

我剛剛做了一個包含50萬條記錄的(分區)表的導入/導出操作,只需2分鐘即可從相當快的機器導出它,並在15分鐘後將其導入到速度較慢的桌面上。沒有必要分割文件。

mysqldump的是你的朋友,知道你有大量的數據,最好對其進行壓縮

@host1:~ $ mysqldump -u <username> -p <database> <table> | gzip > output.sql.gz 
@host1:~ $ scp output.sql.gz host2:~/ 
@host1:~ $ rm output.sql.gz 
@host1:~ $ ssh host2 
@host2:~ $ gunzip < output.sql.gz | mysql -u <username> -p <database> 
@host2:~ $ rm output.sql.gz 
+1

工作的廣泛使用示例。謝謝。 –

0

如果你不舒服的使用mysqldump命令行工具,這裏有兩個GUI工具可以儘管您必須能夠通過FTP將它們上傳到服務器,但仍可以幫助您解決這個問題!

Adminer是超薄和非常高效的數據庫管理工具,至少那樣強大的phpMyAdmin,只有一個必須被上傳到這使得它非常容易安裝服務器單一文件。對於大型表/數據庫而言,它比PMA更好。

MySQLDumper是一款專門爲導出/導入大型表格/數據庫而開發的工具,因此它與您描述的情況沒有任何問題。唯一的缺點是安裝起來會比較繁瑣,因爲有更多的文件和文件夾(大約〜1.5MB中有大約350個文件),但是通過FTP上傳它也不是問題,並且它肯定會得到工作完成:)

所以我的建議是首先嚐試Adminer,如果那一個也失敗去MySQLDumper路線。

1

How do I split a large MySQL backup file into multiple files?

您可以使用mysql_export_explode https://github.com/barinascode/mysql-export-explode

<?php 
#Including the class 

include 'mysql_export_explode.php'; 
$export = new mysql_export_explode; 

$export->db = 'dataBaseName'; # -- Set your database name 
$export->connect('host','user','password'); # -- Connecting to database 
$export->rows = array('Id','firstName','Telephone','Address'); # -- Set which fields you want to export 
$export->exportTable('myTableName',15); # -- Table name and in few fractions you want to split the table 
?> 

At the end of the SQL files are created in the directory where the script is executed in the following format 
--------------------------------------- 
myTableName_0.sql 
myTableName_1.sql 
myTableName_2.sql 
... 
相關問題