mysql数据库实战_主题:MySQL数据库操作实战
昨天項目發布,要做數據移行,要實現的功能很變態,時間很緊迫,基本上是使出了全身解數,才能有快又準地完成工作,期間發現很多小技巧串聯起來使用,效果的確非常好。
武器:
1 mysqldump+mysql命令=>數據的導入導出,備份恢復
2 perl命令行=>很多時候,你有一個想法,它就能只用一句話,幫你實現它,省得編寫很多代碼的麻煩
3 shell命令=>組合拳,單獨的命令誰都會,組合起來使用,需要一些經驗的積累
4 強大的編輯器支持UltraEdit/EmEdit等=>UltraEdit最專業,但不支持字符集轉換;EmEdit支持字符集轉換,且最新版有很多插件可供選擇,基本夠常見的操作了,對于WEB開發人員來說,常需要在GB2312、utf8或者其他國家語言euc-jp、shift-jis等等編碼中轉來轉去,EmEdit的確是首選,特別贊的還有EmEdit的錄制鍵盤動作并播放的功能
常見組合:
1 數據移行時:
mysqldump --opt -t -h locahost -P 23236 -p mydb table -w "id>27000" > table.sql
>輸入密碼
OK , mydb中的表table中id大于27000的所有數據列的INSERT語句就保存到table.sql中了。-h、-P、-p就不多說了,--opt 是mysqldump的最常用組合選項,可以認為是加速語句;-t 則很有用,表示--no-create-info,就是你不需要建表語句,只需要數據(INSERT語句);-w就是where條件,也非常有用,讓你有選擇的導出數據。其他常見選項有:-d : 只需要建表語句,不需要insert語句;-c :給每個insert語句加上列名(field),默認時,insert語句是"insert into `table` values (1),(2),(3);",而加上-c后,就變成了"insert into table(id) values (1),(2),(3);"。有什么用?一會兒自會明白。
如果表中數據非常多,導出insert語句就非常長(默認情況下,一個表的所有數據都在一個insert語句中,不換行),要查看這個文件常常引起死機,無論是linux下用vi,less查看,還是windows用EmEdit等編輯器,因為他們都是以行為單位load數據的,一行的數據過大就會內存占用過大,怎么辦?
你發現,只需要在EmEdit里查找"),("這個字符串,將它替換為"),\n(",也就是加個換行,就行了,于是就這么做,結果發現--當數據量達到上萬時,EmEdit就像數羊一樣一個一個替換,等它換完,你都睡了一覺了!!
怎么辦呢?你當然知道寫個腳本就行了,很容易,但是花的時間多,還需要測試,有簡單辦法嗎?恩,那就輪到perl單命令行上場了:
perl -i.bak -pe 's/\),\(/\),\n\(/g' table.sql
OK,替換結束,且生成了一個備份文件table.sql.bak,如果你發現寫錯了,效果不對,還有救:)
當然了,如果你會用sed、awk等強大的編輯工具,這個也是小case,這里就不多說了。
2 數據導入
導出的數據經過處理,就要導入目標數據庫,現在有一個表,字段非常多,其中主鍵為id,導入另一個數據庫的相同表里,但是id不想直接插入,而是只要數據,id最好是自動生成的,跟在目標數據表最末一條數據之后即可,以免主鍵沖突。怎么搞呢?
這時候就能用上剛才說到的-c選項了,加了-c,導出的數據有field列,只需要把其中的id列都替換為空即可:)
這個替換過程,用EmEdit或上面說到的perl命令行都可以,只是速度的區別了。
3 接上面的問題,老數據導入了新的表,生成了一串新的連續id,但和老數據完全不一樣了,現在有其他幾張表中使用了老數據的id作為外鍵,要把它們統一改為新的id。例如:
老數據中table.id=10010,有一個表table2.table=10010,是外鍵關系,要把這個table2.table改為新數據表中自動產生的那個id,就比如說是6041.現在手頭上的數據只有老id列表,且知道插入新表中的id是自增的,每次加1,從6041開始,怎么快速修改 table2,table3中的相應外鍵呢?
一個文件:
10010
10201
11301
11499
……
要替換成:
update table2 set table=6041 where id=10010;
update table2 set table=6042 where id=10201;
update table2 set table=6043 where id=11301;
update table2 set table=6044 where id=11499;
……
我們可以這么組合手頭的工具:
perl -i.bak -pe 'BEGIN {$x=6041} s/^(\d+)/update table2 set table=$x where id=$1;/ ; $x++' file.txt
OK,搞定
這個例子的特色其實就是perl命令行中的BEGIN的用法,有begin,當然有end,具體就自己查查文檔吧:)
4 還有EmEdit中的錄制鍵盤動作并播放也很常用,畢竟寫正則比較費腦子,用工具雖然處理速度慢一些,但是思考速度要快很多。今天碰到一件事,需要把服務器上某個目錄中的bmp圖片都轉為jpg格式,也是要使用組合拳的,其中就用到了EmEdit的錄制播放功能。
已知某目錄下有N多bmp圖片,通過convert命令可以轉格式(安裝Image::Magick模塊即可)
怎么搞?
find ./ -name "*.bmp" > bmp.txt
先拿到文件列表再說。
在EmEdit中打開該列表,一行行文件名。
你發現你想做的就是:
./dir1/dir2/file1.bmp
./dir1/dir2/file2.bmp
./dir1/dir2/file3.bmp
轉變為:
convert ./dir1/dir2/file1.bmp ./dir1/dir2/file1.jpg
convert ./dir1/dir2/file2.bmp ./dir1/dir2/file2.jpg
convert ./dir1/dir2/file3.bmp ./dir1/dir2/file3.jpg
這是一個非常有規律的動作,在行首,按shift+End(選擇),ctrl+c(復制),End(到行尾),空格,ctrl+v(粘貼),backspace三次,輸入jpg,HOME到行首,輸入convert空格,下一行,HOME到行首
只要把這個操作序列記錄下來,對每行都是一樣操作,這時就可以使用EmEdit的錄制+播放功能了,錄制完成后,按F4快捷鍵,一爽到底~~yeah~~
運行之后要刪除原圖:
在shell下:
find ./ -name "*.bmp" | xargs -n1 rm -f
(找到本目錄下的bmp圖片文件名列表,一個一個傳給rm -f,刪之,慎用)
5 數據庫恢復(從bin-log中恢復數據庫也是一個非常重要的技巧),出現誤操作或DB服務器不幸意外丟失數據時,常常要查bin-log來試圖恢復數據,下次接著聊吧,累了……
呵呵,亂寫寫,好像不只是數據庫操作了,不過挺實在,歡迎各位拍磚吧
總結
以上是生活随笔為你收集整理的mysql数据库实战_主题:MySQL数据库操作实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python心得体会200字_50行代码
- 下一篇: mysql5.5集群数据同步_[转]配置