Linux中sql大文件拆分導入

1、文件壓縮與解壓

sql文件比較大,一般會壓縮至大概十分之一大小。

一、壓縮文件 非打包
tar -czvf  test.tar.gz  test.sql   //壓縮 test.sql文件爲test.tar.gz(會保留原文件)
tar -czvf  test.tar.gz  test/      //壓縮目錄下的文件 (不過目錄的壓縮效果就通常了)

二、列出壓縮文件內容
tar -tzvf test.tar.gz 
rw-r--r-- root/root     0 2010-05-24 16:51:59 test.sql

三、解壓文件
tar -xzvf test.tar.gz (會保留原文件)

2、大文件拆分

今天遇到一個問題,要將一個很大的sql腳本導入數據庫,誰可想這個文件已經40G多。剛開始直接導入,結果導入了幾個G以後就卡死再也不執行了,在網上查了一下,感受是文件太大了,內存不夠沒法一次性緩存這麼多內容。因而我就想到了拆分文件的方式,被我拆成了100多個文件,以後找到上一次執行的位置,一個個小文件執行,最終完美解決了問題。
只不過有一個注意事項,因爲文件是按行拆分的,因此可能會將建立表的create語句截斷了,因此執行這個文件以前要先檢查一下,若有問題就編輯一下文件再執行。mysql

1.功能:
將文件分割成多個git

2.語法:
split [OPTION]... [INPUT [PREFIX]]web

3.描述:
將輸入文件'INPUT'分割,輸出固定大小的文件片斷"PREFIXaa,PREFIXab,...",默認大小爲1000行,而且PREFIX的默認值爲'x',若是沒有指定輸入文件(INPUT文件),或者輸入爲-,那麼會從標準輸入讀取。sql

4.經常使用參數
-a, --suffix-length=N
使用的後綴的長度,默認長度爲2,例如'aa','ab'等後綴,其長度就是2。
-b, --bytes=SIZE
指定每一個輸出文件片斷的大小。
-C, --line-bytes=SIZE
指定每一個輸出文件片斷的最大行字節(???)。
-d, --numeric-suffixes
指定輸出文件片斷後綴爲數字而不是默認的字母形式。
-l, --lines=NUMBER
指定每一個輸出文件片斷的行數。數據庫

以上,指定的大小"SIZE"能夠用以下的方式指定單位:後綴爲b表示512字節,後綴爲k表示1K,後綴爲m表示1M。緩存

5.本次使用
每300行拆分紅一個文件,拆分後的文件名以name開頭,以數字做爲後綴,後綴長度爲3。(好比:name001)
split -l 300 test.sql -d -a 3 nameide

3、數據庫導入

一、mysql -uxxxx -pxxxx -h119.xxx.xxx.xxx --port=36991 -A;(這咱們鏈接數據庫的命令,須要帶ip和端口。帶上-A 在切換數據庫時就不用預讀表數據,要否則會很卡)命令行

2.show databases ; 查詢數據庫。日誌

  1. use xxxx; 使用某個數據庫code

  2. 一個個文件接着導入:
    每一個文件使用前,檢查一下文件首末端,有沒有create 建表語句被截斷,若是有就手動處理下。
    mysql>source /web/name001;(在mysql命令行執行,先建立並進入數據庫,/web/name001 是你拆分的子文件地址)

5.一個報錯處理

導入完成以後,在打開數據表示,mysql報錯! Can't create/write to file '/tmp/#sql_c62_0.MYI' ......

重啓數據庫也報錯了,因而查看日誌:
cd /var/log/
tail -50 mysqld.log
日誌中也是這樣的錯誤
/usr/libexec/mysqld: Can't create/write to file '/tmp/ibyPwDHe' (Errcode: 13)

解決:
看了下系統目錄/tmp的權限不夠,以前設置的是1666 改爲 1777就能夠了。
這方面的說明,可查看個人另外一篇文章:https://blog.51cto.com/ycgit/1406909

相關文章
相關標籤/搜索