最近做的項目,遇到了兩個關於mysql的問題以及解決辦法:
一:某個字段的文本值太大。
解決辦法:打開“my.ini”文件,找到“max_allowed_packet”所在位置(默認是4M),修改爲160M(按照你實際需求情況大小修改),保存。(沒有的話就新增)
重啓mysql服務,此方法永久生效。但要注意my.ini的位置,(但其實一般在安裝目錄下)大多數都是在C盤的隱藏文件下C:\ProgramData\MySQL\MySQL Server下面。
如:# Maximum size for internal (in-memory) temporary tables. If a table
# grows larger than this value, it is automatically converted to disk
# based table This limitation is for a single table. There can be many
# of them.
tmp_table_size=35M
max_allowed_packet = 160M
查看是否生效: show VARIABLES like '%max_allowed_packet%'
二:把oralce一個視圖同步到mysql表,一條記錄操作分解插入和更新的時候,mysql性能很低。
解決辦法:修改innodb_flush_log_at_trx_commit參數 爲2
(一)、參數解釋
0:log buffer將每秒一次地寫入log file中,並且log file的flush(刷到磁盤)操作同時進行。該模式下在事務提交的時候,不會主動觸發寫入磁盤的操作。
1:每次事務提交時MySQL都會把log buffer的數據寫入log file,並且flush(刷到磁盤)中去,該模式爲系統默認。
2:每次事務提交時MySQL都會把log buffer的數據寫入log file,但是flush(刷到磁盤)操作並不會同時進行。該模式下,MySQL會每秒執行一次 flush(刷到磁盤)操作。
(二)、參數修改
找到mysql配置文件mysql.ini,修改成合適的值,然後重啓mysql。
(三)、注意事項
當設置爲0,該模式速度最快,但不太安全,mysqld進程的崩潰會導致上一秒鐘所有事務數據的丟失。
當設置爲1,該模式是最安全的,但也是最慢的一種方式。在mysqld 服務崩潰或者服務器主機crash的情況下,binary log 只有可能丟失最多一個語句或者一個事務。。
當設置爲2,該模式速度較快,也比0安全,只有在操作系統崩潰或者系統斷電的情況下,上一秒鐘所有事務數據纔可能丟失。
四、其他相關
查找資料時候看到其他文章說innodb_flush_log_at_trx_commit和sync_binlog 兩個參數是控制MySQL 磁盤寫入策略以及數據安全性的關鍵參數,當兩個參數都設置爲1的時候寫入性能最差,推薦做法是innodb_flush_log_at_trx_commit=2,sync_binlog=500 或1000
參考:http://blog.itpub.net/22664653/viewspace-1063134/