- 今天有一個(gè)給數(shù)據(jù)庫(kù)中插入700w數(shù)據(jù)的小腳本戴甩,最后選擇用source xx.sql實(shí)現(xiàn),這里看記錄一下實(shí)現(xiàn)的過程
- 1 使用進(jìn)入mysql 中后source xx.sql,客戶端一直在刷茎毁,做不了其他事情酌呆,放棄继谚;
2 選擇在mysql外運(yùn)行source 命令奏路,具體如下:
mysql -hlocalhost -uroot -ppassword db_name < "d:\\db_bak.sql"
但是運(yùn)行一段時(shí)間,會(huì)因?yàn)閕nsert語(yǔ)句錯(cuò)誤導(dǎo)致中斷結(jié)果
3 下面查到可以強(qiáng)制運(yùn)行弃舒,忽略錯(cuò)誤,語(yǔ)句如下:
mysql -hlocalhost -uroot -ppassword db_name --force < "d:\\db_bak.sql"
4 但是700w數(shù)據(jù)太大癞埠,因此運(yùn)行時(shí)間太長(zhǎng),并且中間嘗試過一次mac上的securt的客戶端斷開以后就會(huì)出現(xiàn)insert 數(shù)據(jù)停止的問題聋呢。最后想到將數(shù)據(jù)切片以后再后臺(tái)進(jìn)行運(yùn)行:
nohup mysql -h10.99.196.227 -P8306 -utest -pxxxxx -Daodfeed --force< title_1.sql > out_1.file 2>&1 &
nohup mysql -h10.99.196.227 -P8306 -utest -pxxxxx -Daodfeed --force< title_2.sql > out_2.file 2>&1 &
nohup mysql -h10.99.196.227 -P8306 -utest -pxxxxx -Daodfeed --force< title_3.sql > out_3.file 2>&1 &
nohup mysql -h10.99.196.227 -P8306 -utest -pxxxxx -Daodfeed --force< title_4.sql > out_4.file 2>&1 &
nohup mysql -h10.99.196.227 -P8306 -utest -pxxxxx -Daodfeed --force< title_5.sql > out_5.file 2>&1 &
nohup mysql -h10.99.196.227 -P8306 -utest -pxxxxx -Daodfeed --force< title_6.sql > out_6.file 2>&1 &
nohup mysql -h10.99.196.227 -P8306 -utest -pxxxxx -Daodfeed --force< title_7.sql > out_7.file 2>&1 &
數(shù)據(jù)切片命令如下:
split -l 1000000 ../titles_sql_all.sql -d -a 4 title_
5 nohup
用途:不掛斷地運(yùn)行命令苗踪。
語(yǔ)法:nohup Command [ Arg ... ] [ & ]
描述:nohup 命令運(yùn)行由 Command 參數(shù)和任何相關(guān)的 Arg 參數(shù)指定的命令,忽略所有掛斷(SIGHUP)信號(hào)削锰。在注銷后使用 nohup 命令運(yùn)行后臺(tái)中的程序通铲。要運(yùn)行后臺(tái)中的 nohup 命令,添加 & ( 表示“and”的符號(hào))到命令的尾部器贩。
6 操作系統(tǒng)輸入流
操作系統(tǒng)中有三個(gè)常用的流:
0:標(biāo)準(zhǔn)輸入流 stdin
1:標(biāo)準(zhǔn)輸出流 stdout
2:標(biāo)準(zhǔn)錯(cuò)誤流 stderr
一般當(dāng)我們用 > console.txt测暗,實(shí)際是 1>console.txt的省略用法;< console.txt 磨澡,實(shí)際是 0 < console.txt的省略用法。
7 命令解釋
nohup ./start-dishi.sh >output 2>&1 &
解釋:
- 帶&的命令行质和,即使terminal(終端)關(guān)閉稳摄,或者電腦死機(jī)程序依然運(yùn)行(前提是你把程序遞交到服務(wù)器上);
- 2>&1的意思
這個(gè)意思是把標(biāo)準(zhǔn)錯(cuò)誤(2)重定向到標(biāo)準(zhǔn)輸出中(1)饲宿,而標(biāo)準(zhǔn)輸出又導(dǎo)入文件output里面厦酬,所以結(jié)果是標(biāo)準(zhǔn)錯(cuò)誤和標(biāo)準(zhǔn)輸出都導(dǎo)入文件output里面了胆描。 至于為什么需要將標(biāo)準(zhǔn)錯(cuò)誤重定向到標(biāo)準(zhǔn)輸出的原因,那就歸結(jié)為標(biāo)準(zhǔn)錯(cuò)誤沒有緩沖區(qū)仗阅,而stdout有昌讲。這就會(huì)導(dǎo)致 >output 2>output 文件output被兩次打開,而stdout和stderr將會(huì)競(jìng)爭(zhēng)覆蓋减噪,這肯定不是我門想要的.
- 小結(jié):
期間問過一個(gè)運(yùn)維大哥短绸,說(shuō)是:
一般常見的后臺(tái)執(zhí)行語(yǔ)句格式是 command & > out.file &
但是有些系統(tǒng)或者shell這樣執(zhí)行的話還是會(huì)中斷,最保險(xiǎn)的方式是這個(gè) nohup command > out.file 2>&1 &
好像&可以保證后臺(tái)運(yùn)行筹裕,但是nohup貌似更好用醋闭,我理解的nohup相當(dāng)于是linux開了多個(gè)線程進(jìn)行insert,反正速度比單一一道命令快很多朝卒。