記錄一次向TiDB數據庫導入數據的例子


導出數據

今天從Mysql的某個庫中導出一個表大概有20分鍾吧,等了一會終於導出成功了。查看一下文件的大小:

[tidb@: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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM