標籤:記憶體 port write .com .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.sql3、解壓檔案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
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 ; 查詢資料庫。
use xxxx; 使用某個資料庫
- 一個個檔案接著匯入:
每個檔案使用前,檢查一下檔案首末端,有沒有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
sql大檔案拆分匯入