記錄一次向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