1. 程式人生 > >linux下大檔案編碼轉碼及將oracle中資料匯入mysql

linux下大檔案編碼轉碼及將oracle中資料匯入mysql

        這篇文章有不少廢話,只是為了發洩一下。如果讀者找需要解決的問題的辦法,直接無視這些廢話。    

        最近做的專案要將Oracle中資料匯入Mysql, 資料量約有兩千萬條,慶幸的是隻有一張表,而且資料結構比較簡單。在這個過程中遇到不少坑,現在一 一記錄下來。

        首先說一下Mysql的環境是 Centos 7, Oracle是Windows系統下的。

        第一,第二次倒騰的時候,我將Oralcle表中的資料以100萬條為單位,匯入到20個csv檔案中,每個檔案有60M上下,匯出的csv檔案是預設的編碼格式,但是具體是什麼編碼格式不知道,反正不是你自以為的gbk,gb2312,這為後面一次性匯出匯入一個大檔案的悲劇埋下了伏筆。

       為了先測試匯入Mysql的效果,我先建一個2M的檔案test.csv。在linux下開啟測試檔案,一堆亂碼。然後我在Windows下用notepad++將每一個檔案先轉碼成utf-8的無bom格式,然後傳到linux下,進入Mysql,挨個用load data命令執行匯入csv檔案。剛開始的時候容易遇到

        第三次倒騰的時候,我直接用了匯出了一個1G多的csv檔案,直接在linux下用vim開啟當然還是亂碼,需要轉成utf-8編碼格式。可是notepad++不能開啟直接開啟這麼大的檔案,於是開始了我的艱難的轉碼過程。

        如果知道檔案的編碼格式當然容易轉碼,再次強調一下,這不是gbk, gb2312 格式,在linux下執行file命令,得到如下資訊:   Non-ISO extended-ASCII text, with very long lines, with CRLF, NEL line terminators。

在網上搜索,終於找到一篇靠譜的部落格:

  1. $ iconv --list | sed 's/\/\/$//' | sort > encodings.list  
  2. $ for a in `cat encodings.list`; do  
  3.   printf "$a  "  
  4.   iconv -f $a -t UTF-8 systeminfo.txt > /dev/null 2>&1 \&& echo "ok: $a" || echo "fail: $a"  
  5. done | tee result.txt  

注意systeminfo.txt 是你自己要轉碼的檔案。

悲催的是,我沒有那麼幸運能直接找到正確的編碼。

由於我的檔案很大,先建了一個只有1000條記錄的檔案,沒有起作用。於是我又建了一個大概2M的temp.csv檔案,執行後,result.txt中居然有好多ok,我去.........

這是逼我發飆啊。

於是我將上面的程式碼放到了一個指令碼中,如下:

 for a in `cat encodings.list`; do
  printf "$a  "
  iconv -f $a -t UTF-8  temp.csv > /home/myfile/$a.txt  && echo "ok: $a" || echo "fail: $a"  
done | tee result.txt

要知道共有一千一百多個編碼啊,生成了一千一百多個檔案(這一千一百多個檔案的檔名就是生成檔案的編碼格式)。看了一下result.txt檔案中,依然是有好多ok。

於是用find 命令 在這一千一百多個檔案中查詢某個 中文 字串,比如temp.csv中有 “你好嗎”,我就查詢“你好嗎”三個字,謝天謝地,只有11個檔案有這三個字。好了,我用這11一個編碼格式挨個對我的1個多G的檔案進行編碼轉換:

iconv -f xxx編碼 -t UTF-8 my_1G.csv >my_1G.csv  

這11個編碼格式快試完了,依然都是出錯,我近乎絕望的時候,奇蹟發生了,居然成了,這個格式是GB18030, 

有心人,終不負。。。終於成了。我長長長的舒了口氣。

你以為可以在Mysql中直接用load data命令匯入了,NO, NO ...老天折磨人的惡趣味永遠都沒有停止的時候。

在執行load data 的時候,出現瞭如下錯誤:

ERROR 29 (HY000): File '/var/lib/mysql-files/my_1G.csv' not found (Errcode: 13 - Permission denied)

尼瑪。。。

摘抄如下 # setsebool -P mysqld_disable_trans=1  

Ubuntu下 ,可以對AppArmor(/etc/apparmor.d/usr.sbin.mysqld) 修改,類似selinux。  新增/etc/squid/lists/eighties.txt w,類似。  

重啟Mysql,沒有作用。

再次絕望, 這個坑再次折磨了我很久。

我不死心,將以前的100萬條的小檔案執行了load data 命令,沒有問題,這說明不是Mysql 的問題。

無奈之下。我將 my_1G.csv 按照每百萬行一個檔案進行了分割,然後對分割後的第一個檔案xaa執行load data,居然成功了。。。。

於是我靈感來了,用cp命令將  my_1G.csv 複製了一份 ,對複製後的檔案my_1G_new.csv執行load data,終於不再報ERROR 29 (HY000)了,

於是靜靜加忐忑地等待,在5分多鐘後,終於報執行成功了。。。。。。

皇天不負有心人,有心人,終不負。。。。。。。。

這次的磨難終於結束了。

相關推薦

linux檔案編碼oracle資料匯入mysql

        這篇文章有不少廢話,只是為了發洩一下。如果讀者找需要解決的問題的辦法,直接無視這些廢話。             最近做的專案要將Oracle中資料匯入Mysql, 資料量約有兩千萬條,慶幸的是隻有一張表,而且資料結構比較簡單。在這個過程中遇到不少坑,現在

linux檢視檔案編碼修改編碼

1.在Vim中可以直接檢視檔案編碼 :set fileencoding 即可顯示檔案編碼格式。 如果你只是想檢視其它編碼格式的檔案或者想解決用Vim檢視檔案亂碼的問題,那麼你可以在 ~/.vimrc 檔案中新增以下內容: set encoding=ut

Linux檔案的排序和去重複

命令介紹: sort  :將文字檔案內容加以排序。 sort -u [file]  =  sort [file] | uniq (去重) 引數說明 -b 忽略每行前面開始出的空格字元 -c 檢查檔案是否已經按照順序排序 -d 排序時,處理英文字母、數字及空

Linux檔案分割和小檔案合併

就像Android中除錯問題,有的時候Log連續儲存會很大,這個時候進行分割就很好地處理檔案了。 在Linux下分割檔案通過split工具進行,合併檔案可以通過cat進行。 1. split a. 可以按行數進行分割 split -l 500 big

linux 檔案編碼格式轉換

使用場景: 在 linux 平臺上對檔案格式進行轉換,比如將GBK格式的檔案轉換為UTF8格式 轉換方法 1. 使用 iconv 使用 man 檢視 iconv 的幫助命令,比較簡單 NAME iconv - Convert en

linux檔案開啟數nofilenr_open、file-max說明

本文為研究http://www.2cto.com/os/201510/446342.html博文結論 1./etc/security/limits.conf中指定的nofile的值,nofile有上限,不是無窮大。nofile由核心引數nr_open定義的. “在2.6.2

.Neter玩Linux系列之二:Linux檔案目錄檔案目錄的許可權

基礎篇 實戰篇 一、Linux下的檔案目錄 簡介:linux的檔案系統是採用級層式的樹狀目錄結構,在此 結構中的最上層是根目錄“/”,然後在此目錄下再建立 其他的目錄。深刻理解linux檔案目錄是非常重要的,如下圖所示: 將來你用哪個使用者登入,你就會在那個使用

Linux檔案結構,對應資料夾的作用

/bin 二進位制可執行命令  /dev 裝置特殊檔案  /etc 系統管理和配置檔案  /etc/rc.d 啟動的配置檔案和指令碼  /home 使用者主目錄的基點,比如使用者user的主目錄就是/home/user,可以用~user表示  /li

linux檔案目錄介紹

FHS(英文:Filesystem Hierarchy Standard 中文:檔案系統層次結構標準),多數 Linux 版本採用這種檔案組織形式,FHS 定義了系統中每個區域的用途、所需要的最小構成的檔案和目錄同時還給出了例外處理與矛盾處理。 FHS 定義了兩層規範,第一層是, / 下面的

Linux日誌檔案解決方案

很多Linux伺服器裡的應用程式都是無間斷的輸出日誌,這對於伺服器的硬碟是一個很大的考驗。良許之前也分享過一篇文章,介紹如何讓應用程式在後臺執行: linux後臺執行命令:&與nohup的用法 通過以上方法,應用程式的日誌會一直輸出到日誌檔案myout.txt裡,這個檔案也會不斷的增

【copy】Linux查詢檔案查詢包含指定內容的檔案常用命令

轉載自   http://blog.csdn.net/yi412/article/details/19212335 在微軟的Windows作業系統中要查詢一份檔案是相當簡單的事情,只要在桌面上點選“開始”-“搜尋”中就能按照各種方式在本地硬碟上,區域網絡,甚至在INTERNET上查詢各種

linux改變檔案編碼格式

1.在Vim中直接進行轉換檔案編碼,比如將一個檔案轉換成utf-8格式 :set fileencoding=utf-8 2. enconv 轉換檔案編碼,比如要將一個GBK編碼的檔案轉換成UTF-8編碼,操作如下 enconv -L zh_CN -x UTF-8 filena

Linux運維之linux檔案定址檔案管理

一、Linux的系統結構 1.Linux系統是一個根檔案系統,是一個倒樹型結構(即所有的檔案都來自一個根目錄),最大的目錄名稱叫“/”(根目錄) 2.Linux系統中的二級目錄(根檔案系統下的目錄檔案) (1)/bin          二進位制可執行檔案,系統常規命令 (2

linux查詢檔案查詢包含指定內容的檔案常用命令。

 每一種作業系統都是由成千上萬個不同種類的檔案所組成的。其中有系統本身自帶的檔案,使用者自己的檔案,還有共享檔案等等。我們有時候經常忘記某份檔案放在硬碟中的哪個地方。 在微軟的Windows作業系統中要查詢一份檔案是相當簡單的事情,只要在桌面上點選“開始”-“搜尋”中就

Linuxcp(檔案目錄複製)命令的總結

*Linux中的檔案及目錄複製命令:        每一種作業系統都有成千上萬的檔案組成,對於linux這樣“一切皆檔案”的作業系統來說更不例外,大家應該都能很輕鬆使用windows下的檔案查詢功

Linux獲得檔案屬性檔案結構體的使用

第一種,通過路徑的方法 int stat(const char *path, struct stat *_stat); int lstat(const char *path,struct stat *_stat); 兩者的第一個引數都是檔案的路徑,第二

Linux查詢檔案查詢包含指定內容的檔案常用命令

每一種作業系統都是由成千上萬個不同種類的檔案所組成的。其中有系統本身自帶的檔案,使用者自己的檔案,還有共享檔案等等。我們有時候經常忘記某份檔案放在硬碟中的哪個地方。 在微軟的Windows作業系統中要查詢一份檔案是相當簡單的事情,只要在桌面上點選“開始”-“搜尋”中就能按照各種方式在本地硬碟上,區域網絡,甚

Delphi url 編碼特殊字串替換--百度和騰訊用的就是這個

先介紹一下,Delphi中處理Google的URL編碼解碼,其中就會明白URL編碼轉換的方法的 從delphi的角度看Google(谷歌)URL編碼解碼方式 在網上搜索了一下,似乎沒有什麼關於google的URL編碼解碼的很詳細的資料,因此在這裡寫一下,希望給有用的人提供

用python計算出檔案的md5,某路徑所有檔案的md5

#coding:utf-8 #md5check.py #讀檔案,轉成md5碼 #如沒有檔案路徑,則詢問 #是檔案,返回md5碼 #是路徑把其下所有檔案返回md5碼 #參考:http://www.joelverhagen.com/blog/2011/02/md5-hash-

Linux檔案的操作的相關函式簡介用法

主要涉及的函式原型及引數解釋: open函式:用於開啟一個普通檔案      函式原型  int open(const char *path,int flag,/*int mode*/);  引數解釋:      const char *path:  即相應路徑下的檔