1. 程式人生 > >記錄一次向TiDB資料庫匯入資料的例子

記錄一次向TiDB資料庫匯入資料的例子

匯出資料

今天從Mysql的某個庫中匯出一個表大概有20分鐘吧,等了一會終於匯出成功了。檢視一下檔案的大小:

[[email protected]:vg_adn_CkhsTest ~]$du -h ./creative_output.sql 
41G    ./creative_output.sql

這個檔案是相當大的,有41G左右。

匯出的命令很簡單:mysqldump -hhost  -uname -ppwd   表名 >   xxx.sql

就這樣就匯出來的,我們只需要等結果就可以。

如果我們想匯出一個數據庫,那就要使用:mysqldump -hhost  -uname -ppwd   --database  庫名  >   xxx.sql。也就是說多加了一個引數。

 

匯入資料

使用mysqldump匯出的資料,我們開啟檢視一下會發現是含有表結構的,並不是說像Csv那樣的純文字資料,因此使用source命令到匯入資料即可。

由於本人搞混了幾個備份和恢復資料的命令,導致本來就很快搞定的事情,花了幾個小時。雖然踩了不少坑,但還是有收穫的。

注意:mysqldump匯出的資料是含有表結構的資料,除此之外還含有mysql的一些狀態引數等。並不是純文字資料。所以這裡我一開始使用了load  data命令來匯入資料,發現總是出錯的。且先不說load  data命令的引數挺多的。

使用load  data引數匯入資料的時候,要確認一下匯入的檔案是不是純文字檔案,load  data只適合匯入一下類似與csv型別的文字。這種型別的文字只有資料,所以你要先建立好資料庫後還要建立好表的結構,我這次就是又去嘗試建立表結構後去匯入資料,在這個過程中其中我心裡面就覺得怪怪的,因為我之前也做過對錶的備份,那個時候我並沒有建表,而是直接將表匯入資料庫就可以了,但是怎麼匯入的我就是想不起來。後來去網上查詢一下發現有個load  data命令可以匯入,所以我就一直在踩坑。一直在load  data命令裡面錯誤迴圈。

所以在這裡糾正一下,mysqldump匯出的資料使用mysql命令(客戶端未登入資料庫)或者source命令(客戶端連結mysql後)來匯入資料。

1、首先出現錯誤:

# mysqlimport -uabc -p'123' -h db1 -P 3306 DB a.txt
mysqlimport: Error: 1290, The MySQL server is running with the --secure-file-priv option so it cannot execute this statement, when using table:

是因為mysql限制了匯入資料的目錄,修改一下就可以了。

我們來檢視--secure-file-priv引數

> show global variables like 'secure_file_priv';
+------------------+-----------+
| Variable_name    | Value     |
+------------------+-----------+
| secure_file_priv | /dev/null |
+------------------+-----------| 

 

    此引數不是動態引數。需要新增配置檔案,重啟服務才可以生效。

    1)不限制匯入匯出

# cat /etc/my.cnf
    [mysqld]
    secure_file_priv = ""

    2)限制在特定目錄下

# cat /etc/my.cnf
    [mysqld]
    secure_file_priv    = /tmp

        --只允許/tmp目錄下的資料檔案可以匯入,其他目錄下的檔案沒有許可權匯入。

2、在load data的時候,也出現了一些錯誤:比如:

>load  data .........................
error(2013):Lost connection to MySQL server during query

像這種錯誤就是客戶端連線mysql資料庫延時的錯誤。再深入一點就是說sql語句操作的時間過長,查詢或匯入的語句過大導致的。

我們可以這樣子做:

先檢視max_allowed_packet的值是多少:

show VARIABLES like '%max_allowed_packet%'; 

如果你覺得比較小,那麼在mysql客戶端中對max_allowed_packet等幾項設定較大的值。以KB為單位

比如:

set global max_allowed_packet = 50000000

set global wait_timeout=2880000
set global interactive_timeout = 2880000

這三個中我們要先設定第一個,先把第一個設定的值大一點,上面的這個例子是我已經設定過了,你的查出來可能不會有這麼大,因為我的檔案就是40多個G ,因此我設定成了50G的大小,一般根據檔案大小來設定。

如果第一個設定了之後還是出現同樣的問題,那就把剩下的兩個值也設定的大一點。注意:我上面是自己已經設定的比較大。

最後,你設定完之後要退出客戶端重新連線一下才會生效(並不是重啟mysql資料庫),再次連線之後你會發現這個值就變成了你修改的那個值。不過重啟過mysql之後這個值就會重新還原,因此如果你想要永久生效,最好在配置檔案中新增這三個引數。

 

對我來說,本來匯入的資料就不應該使用load  data命令來匯入,出現了上面的情況,因此修改了引數還是沒有解決,而且,我的系統報錯非常快,就是當你執行load  data命令後,馬上返回錯誤,這一點大家要注意,根本就沒有超過延遲時間可就報錯了,這本身就很可疑。

本次實驗額參考了兩位博主:

https://blog.csdn.net/lovemysea/article/details/79121154

https://www.aliyun.com/jiaocheng/1125866.html

參考連線:http://blog.51cto.com/11580138/1931925