1. 程式人生 > >kevin_xiang的專欄,mail: [email protec

kevin_xiang的專欄,mail: [email protec

http://www.zgguan.com/zsfx/mysql/3598.html
mysql中如果我們開啟bin-log日誌全在mysql目錄發現大量的mysql-bin.000001,mysql-bin.000002等這些文章,如果多了會發現佔很大的空間,下面我來介紹mysql-bin日誌關閉與刪除方法。

關閉bin-log日誌

當開啟bin-log日誌時,會生成很多mysql-bin.0000*類似的檔案,而且可能會佔用很大的硬碟空間。對於自己的測試機器或硬碟比較緊張的vps,而又不需要做master,slave的配置,完全可以關閉日誌功能。

關閉操作很簡單,找到配置檔案my.cnf,對於linux,一般預設在/etc目錄下,開啟此檔案,使用井號(#)註釋掉如下兩個配置專案即可。

 程式碼如下 複製程式碼

log-bin=mysql-bin
binlog_format=mixed

vi /etc/my.cnf 或my.cnf的路徑

把其中的log-bin=mysql-bin修改為#log-bin=mysql-bin

重啟mysql即可生效。


配置修改好後需要重啟mysqld服務才能生效。

可能在重啟時候會收到一個錯誤,“ERROR 1186 (HY000): Binlog closed, cannot RESET MASTER”,解決辦法是先登入到mysql命令列中執行 reset master 即可。reset master的用途就是刪除先前所以的bin-log日誌檔案。所以在master、slave配置環境中慎用此命令。

刪除bin-log日誌

1.查詢當前有哪些二進位制日誌檔案:

 程式碼如下 複製程式碼
mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
mysql-bin.000001 |   1357315 | 
mysql-bin.000002 |       117 | 
mysql-bin.000003 |    404002 | 
mysql-bin.000004 |   2050722 | 
mysql-bin.000005 |    139103 | 
mysql
-bin.000006 |     46702 | 
mysql-bin.000007 |       117 | 
mysql-bin.000008 |        98 | 
mysql-bin.000009 |       117 | 
mysql-bin.000010 |      1254 | 
mysql-bin.000011 |       117 | 
mysql-bin.000012 |  29394942 | 
mysql-bin.000013 |    422100 | 
mysql-bin.000014 |       117 | 
mysql-bin.000015 |       117 | 
mysql-bin.000016 |        98 | 
mysql-bin.000017 |       117 | 
mysql-bin.000018 |       117 | 
mysql-bin.000019 |    285300 | 
mysql-bin.000020 |    181229 | 
mysql-bin.000021 |        98 | 
+------------------+-----------+
21 rows in set (0.03 sec)

2.刪除bin-log(刪除mysql-bin.000018之前的所有二進位制日誌檔案)

 程式碼如下 複製程式碼

mysql> purge binary logs to 'mysql-bin.000018';
Query OK, 0 rows affected (0.08 sec)

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
mysql-bin.000018 |       117 | 
mysql-bin.000019 |    285300 | 
mysql-bin.000020 |    181229 | 
mysql-bin.000021 |        98 | 
+------------------+-----------+
4 rows in set (0.00 sec)

mysql> show binlog events;
+------------------+-----+-------------+-----------+-------------+---------------------------------------+
| Log_name         | Pos | Event_type  | Server_id | End_log_pos | Info                                  |
+------------------+-----+-------------+-----------+-------------+---------------------------------------+
mysql-bin.000018 |   4 | Format_desc |         1 |          98 | Server ver: 5.0.45-log, Binlog ver: 4 | 
mysql-bin.000018 |  98 | Stop        |         1 |         117 |                                       | 
+------------------+-----+-------------+-----------+-------------+---------------------------------------+
2 rows in set (0.01 sec)


http://blog.csdn.net/chen19870707/article/details/39546409

Explain

     前段時間,遊戲伺服器停服的時候總是很慢,幸運的是遊戲資料庫都開了bin-log,於是可以通過bin-log來分析停服時執行SQL語句的數量和執行時間,下面整理了一些關鍵步驟。
  • 找到對應時間的bin-log檔案

      如果沒有在/etc/my.cnf中配置bin-log位置,MySQL的bin-log預設檔案位置在/var/lib/mysql下:

[plain] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. cd /var/lib/mysql  
  2. ll -t  

       找到想要查詢的時間段的SQL檔案,如果時間在兩個個檔案內,兩個檔案都需要。例如:這裡要查詢的是8月21 15:30 ~16:00,需要的檔案就是mysql-bin.000006

  • 把二進位制的檔案轉換成文字檔案
[plain] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. mysqlbinlog mysql-bin.000006 > mysql-bin.000006.txt  

      這個需要等待一點時間,需要等待一會兒.

  • 將文字檔案壓縮拷貝到本地
[plain] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. tar jcvf binlog.tar.bz2 mysql-bin.000006.txt  
  2. sz binlog.tar.bz2  

  • 用文字工具開啟檔案,擷取需要的時間段

        先看一下文字格式 bin-log 的記錄格式:

[plain] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. # at 7473  
  2. #110630 11:56:05 server id 1  end_log_pos 7612  Query   thread_id=6     exec_time=0     error_code=0  
  3. SET TIMESTAMP=1309406165/*!*/;  
  4. UPDATE ssmatch.young_league_match_7 SET status='playing' WHERE mid=699617  
  5. /*!*/;  

         這裡有每一條SQL的執行時間,根據自己的需要,將不需要的時間段內的SQL刪掉,這裡最好用UltraEdit,因為檔案比較大。

  • 分析bin-log檔案-----執行次數分析
[plain] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. table_list=(  
  2. Account_tbl    
  3. Activity_tbl                     
  4. AwardMsg_tbl                     
  5. BBRankFightPos_tbl               
  6. BloodBattleRank_tbl              
  7. BloodBattle_tbl                  
  8. Card_tbl      
  9. Checkin_tbl   
  10. ClickMsg_tbl                     
  11. DuelRank_tbl                     
  12. DynamicRune_tbl                  
  13. EquipFragment_tbl                
  14. Equipment_tbl                    
  15. FightingPos_tbl                  
  16. Friends_tbl   
  17. Gemstone_tbl                     
  18. Ghost_tbl     
  19. HeroAttribute_tbl                
  20. HeroJuedi_table                  
  21. ItemMarket_tbl                   
  22. Item_tbl      
  23. LadderData_tbl                   
  24. LadderPlayer_tbl                 
  25. LadderRankList_tbl               
  26. Mission_tbl   
  27. MysteryShop_tbl                  
  28. PlayerStatistics_tbl             
  29. Player_tbl    
  30. RuneScapeRecovery_tbl            
  31. Skill_tbl     
  32. SkyLadderFightingPosition_tbl    
  33. TipsMsg_tbl   
  34. Treasure_tbl                     
  35. UserRuneScape_tbl                
  36. VipCard_tbl  
  37. )  
  38. for i in ${table_list[@]}; do  
  39.     echo ${i}  
  40.     grep -w ${i} . -r | grep -w UPDATE | wc -l  
  41. done  

             table_list為所有表的表名,執行以上指令碼將列印所有表的UPDATE次數。

[plain] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. Account_tbl  
  2. 0  
  3. Activity_tbl  
  4. 4281  
  5. AwardMsg_tbl  
  6. 0  
  7. BBRankFightPos_tbl  
  8. 1527  
  9. BloodBattleRank_tbl  
  10. 190  
  11. BloodBattle_tbl  
  12. 4281  
  13. Card_tbl  
  14. 376  
  15. Checkin_tbl  
  16. 4273  
  17. ClickMsg_tbl  
  18. 0  
  19. DuelRank_tbl  
  20. 83  
  21. DynamicRune_tbl  
  22. 4276  
  23. EquipFragment_tbl  
  24. 0  
  25. Equipment_tbl  
  26. 95  
  27. FightingPos_tbl  
  28. 103  
  29. Friends_tbl  
  30. 34  
  31. Gemstone_tbl  
  32. 43  
  33. Ghost_tbl  
  34. 3  
  35. HeroAttribute_tbl  
  36. 4271  
  37. HeroJuedi_table  
  38. 0  
  39. ItemMarket_tbl  
  40. 0  
  41. Item_tbl  
  42. 486  
  43. LadderData_tbl  
  44. 0  
  45. LadderPlayer_tbl  
  46. 3616  
  47. LadderRankList_tbl  
  48. 0  
  49. Mission_tbl  
  50. 4281  
  51. MysteryShop_tbl  
  52. 4279  
  53. PlayerStatistics_tbl  
  54. 0  
  55. Player_tbl  
  56. 4282  
  57. RuneScapeRecovery_tbl  
  58. 10  
  59. Skill_tbl  
  60. 15  
  61. SkyLadderFightingPosition_tbl  
  62. 3744  
  63. TipsMsg_tbl  
  64. 0  
  65. Treasure_tbl  
  66. 4274  
  67. <span style="color:#ff0000;">UserRuneScape_tbl  
  68. 15519</span>  
  69. VipCard_tbl  
  70. 6  

       在這裡看到UserRuneScape這個表執行的次數很多。
  • 分析bin-log檔案-----執行時間分析

        再看一下文字格式 bin-log 的記錄格式:

[plain] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. # at 7473  
  2. #110630 11:56:05 server id 1  end_log_pos 7612  Query   thread_id=6     exec_time=0     error_code=0  
  3. SET TIMESTAMP=1309406165/*!*/;  
  4. UPDATE ssmatch.young_league_match_7 SET status='playing' WHERE mid=699617  
  5. /*!*/;  

        exec_time即為執行時間,執行

[plain] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. grep -w exec_time=1 -r . |wc