將資料由SFS3 移機到 SFS3U

URL Link //n.sfs.tw/12367

2018-05-11 13:07:18 By 杜子

如果您是 SFS3 的使用者,架了 SFS3U ,資料當然得轉移過來才有意義呀!

把資料搬到 SFS3U 主機,前提是,先把 SFS3U  主機架好!

請參考前一篇文章 https://n.sfs.tw/content/index/12362 架好 SFS3U 專用的主機。

接下來,你要做的只有三件事,但每一件都有若干步驟,請小心操作:

 

1. 把 SFS3 資料庫搬到 SFS3U 主機內

(1)利用 SFS3 的 system_utf8 模組,產出 utf8mb4 編碼的資料庫

注意!在轉碼過程中,可能會發生失敗情形,原因通常就是Maria DB (即MySQL) 預設 index 的欄位長度為 767bytes,由於這裡要產出 utf8mb4 編碼的資料庫,每個字元佔4bytes,sfs3中有些  table 的 key 設定較複雜,會發生欄位長度不足的情況而使轉檔過程中斷。

請利用 root 登入 sfs3 主機,並編輯 /etc/my.cnf 檔,加入以下設定值

max_allowed_packet = 100M   (加入這行,可以讓轉碼時每次處理 5000筆以上,加快速度)
 innodb_file_format = Barracuda
 innodb_file_format_max = Barracuda
 innodb_file_per_table = 1
 innodb_large_prefix

#vi /etc/my.cnf

參考 https://n.sfs.tw/content/index/12360 的 (13) 點說明,不要填錯位置。

改完 my.cnf ,記得重啟 mysql 服務。(注意!你的重啟指令可能不同)

#systemctl restart mariadb.service 

 

(2)利用 root 登入原 SFS3 主機,並利用 mysqldump 把該資料庫匯出成 sql 檔

# mysqldump -uroot -p --add-drop-table sfs3_utf8mb4 > sfs3u.sql

上面的指令,是假定你利用 system_utf8 產生資料庫時,使用的資料庫名稱是預設的 sfs3_utf8mb4

 

(3)利用 ssh  指令把該 sql 檔傳到 SFS3U 主機 (範例中是假設 sfs3u 主機位在 163.17.43.23,您要改成自己的 IP)

#scp sfs3u.sql root@163.17.43.23:~

 

(4)利用 root 登入 SFS3U 主機,並把 sql 檔匯入 MySQL 資料庫

(這裡別弄錯!要換登入到 SFS3U 主機哦!不是在 SFS3 主機貼這個指令!!)

#mysqladmin -u root -p create sfs3u --default-character-set=utf8mb4
#mysql -uroot -p –default-character-set=utf8mb4 sfs3u < /root/sfs3u.sql 

 

2. 把 SFS3 主機中,sfs3  底下的 data 目錄搬到 SFS3U 主機中  sfs3u 目錄,覆蓋原有的 data 目錄

(1)利用  root 登入原 SFS3 主機,並利用 tar 打包 sfs3 的 data 目錄

#cd /var/www/html/sfs3   (目錄位置可能不同)
#tar zcvf data.tar.gz data

(2)利用 ssh  指令把該 壓縮檔傳到 SFS3U 主機 (範例中是假設 sfs3u 主機位在 163.17.43.23,您要改成自己的 IP)

#scp data.tar.gz root@163.17.43.23:~

(3)利用 root 登入 SFS3U 主機,並把該壓縮檔解開覆蓋 sfs3u 底下的 data 目錄

(這裡也別弄錯!要換登入到 SFS3U 主機哦!不是在 SFS3 主機貼這個指令!!)

#cd /var/www/html/sfs3u
#tar zxvf /root/data.tar.gz
#chmod -R 777 data

 

2018.05.13 補充

考量到 data 目錄中可能會有中文檔名的問題,如果直接用 tar  打包,再用 scp  傳過去解開,那些中文檔名都會變亂碼。(因為環境編碼由 big5 變 utf-8  了)

感謝本市立新國小資訊組長提供解法,只要利用 rsync 指令就能解決 (舊主機是 CentOS 5, CentOS6, CentOS7皆可適用)

方法就是以 ssh 登入 SFS3U 主機,然後下這個指令 (不是照著貼就好,該改成自己的就要改!)

#rsync -aogprtv --iconv=UTF-8,BIG5 root@sfs3_ip:/var/www/html/sfs3/data /var/www/html/sfs3u

參數 --iconv=UTF-8,BIG5 的意思就是舊主機環境是 BIG5 ,取回資料後轉換成 UTF8 編碼的檔名

sfs3_ip是指你舊的 sfs3 主機的 ip 喔!記得要修改。

注意!上面的指令中,也是假定你的舊的 sfs3 的 data 目錄位在 /var/www/html/sfs3/data/ ,如果有不同,要自行更改。

2018.07.23 補充    感謝嘉義縣網老師提供解法參考

有關「 data 目錄中可能會有中文檔名的問題,如果直接用 tar  打包,再用 scp  傳過去解開,那些中文檔名都會變亂碼。」的問題
提供另一種解法參考

1.安裝convmv
yum install convmv

2.執行檔名轉碼
convmv -f big5 -t utf-8 -r /var/www/html/sfs3u/data/* --notest

-f 原始編碼
-t 要轉的編碼
-r 遞迴
--notest 真的轉碼(不然只是測試)

3. 後續已知問題處理 (以下假定您的 sfs3u 安裝在 /var/www/html/sfs3u/ 裡)

由於 data 目錄的資料是來自原 SFS3 主機,裡面有些東西和字碼有關的,是使用 big5 字碼,所以在 SFS3U 中可能會變成亂碼,目前已知至少有三個地方要修正。
將來若再有發現問題,會更新這個網頁。

(1)修正連結列

#rm /var/www/html/sfs3u/data/Module_Path.txt

(2)刪除製作成績單模組的成績單備註文字 (會自動使用預設值重建)

#rm -rf /var/www/html/sfs3u/data/school/score_chart/*.*

(3)刪除匯入讀卡成績這個模組的匯入成績暫存檔

#rm /var/www/html/sfs3u/data/temp/teacher/score/*

這裡,因為檔名是亂碼,所以要用 * 代表所有檔案,逐一自行按 y 刪除。