Linux中sql大文件拆分導入

一、文件壓縮與解壓

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

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

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

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

二、大文件拆分

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

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

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

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

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 name

三、數據庫導入

1、mysql -uxxxx -pxxxx -h119.xxx.xxx.xxx --port=36991 -A;(這我們連接數據庫的命令,需要帶ip和端口。帶上-A 在切換數據庫時就不用預讀表數據,要不然會很卡)

2.show databases ; 查詢數據庫。

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

  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就可以了。
這方面的說明,可查看我的另一篇文章:http://blog.51cto.com/ycgit/1406909

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章