天天看點

mysql

1.

<code>ERROR 1206 (HY000): The total number of locks exceeds the lock table size</code>

原來是InnoDB表執行大批量資料的更新,插入,删除操作時會出現這個問題,需要調整InnoDB全局的innodb_buffer_pool_size的值來解決這個問題,并且重新開機mysql服務。

檢視目前資料庫存儲引擎,在建立時使用 ENGINE=InnoDB類型。

預設的innodb_buffer_pool_size=8M

<a href="http://s3.51cto.com/wyfs02/M00/37/BC/wKioL1OtfonhlOytAABO3_BB93w041.png" target="_blank"></a>

innodb_buffer_pool_size這個參數定義了InnodDB存儲引擎的表資料和索引資料的最大記憶體緩沖區大小。和MyISAM存儲引擎不同,MyISAM的 key_buffer_size隻緩存索引鍵,而innodb_buffer_pool_size卻是同時為資料塊和索引塊 做緩存,這個特征和Oracle是一樣的,這個值設得越高,通路表中資料需求的I/O就越少。在一個專用的資料庫伺服器,可以設定這個參數達機器實體記憶體 的80%,我現在一般的做法是配置成實體記憶體的 1/4,比如8G記憶體的生産資料庫,我一般會配置成2G左右。

2.設定mysql預設字元集

修改my.cnf檔案

character_set_server = utf8

3.修改最大連接配接數

修改my.cnf

max_connections = 1024

4.做了MySQL主從也有一段時間了,這兩天檢查磁盤空間情況,發現放資料庫的分區磁盤激增了40多G,一路檢視下來,發現配置好主從複制以來到 現在的binlog就有40多G,原來根源出在這裡,檢視了一下my.cnf,看到binlog的 size是1G就做分割,但沒有看到删除的配置,在MySQL裡show了一下variables:

  mysql&gt;show variables like '%log%';

  查到了,

  | expire_logs_days | 0 |

  這個預設是0,也就是logs不過期,這個是一個global的參數,是以需要執行

  set global expire_logs_days=8;

  這樣8天前的log就會被删除了,如果有回複的需要,請做好備份工作,但這樣設定還不行,下次重新開機mysql了,配置又恢複預設了,是以需在my.cnf中設定,

  expire_logs_days = 8

  這樣重新開機也不怕了。

  現在我在生産環境下的做法是将此時間設為0,然後備份mysql日志檔案,然後再手動清理此檔案。

  想要恢複資料庫以前的資料,執行

  mysql&gt;show binlog events;

  由于資料量很多,檢視起來很麻煩,光打開個檔案就要閃半天,是以應該适當删除部分可不用的日志。

  并且如果使用的時間足夠長的話,會把我的硬碟空間都給吃掉。

  1、登入系統,/usr/bin/mysql

  使用mysql檢視日志:

  mysql&gt;show binary logs;

  +—————-+———–+

  | Log_name | File_size |

  | ablelee.000001 | 150462942 |

  | ablelee.000002 | 120332942 |

  | ablelee.000003 | 141462942 |

  2、删除bin-log(删除ablelee.000003之前的而沒有包含ablelee.000003):

mysql&gt; purge binary logs to ′ablelee.000003′;

  Query OK, 0 rows affected (0.16 sec)

  3、查詢結果(現在隻有一條記錄了):

  mysql&gt; show binlog events\G

  *************************** 1. row ***************************

  Log_name: ablelee.000003

  Pos: 4

  Event_type: Format_desc

  Server_id: 1

  End_log_pos: 106

  Info: Server ver: 5.1.26-rc-log, Binlog ver: 4

  1 row in set (0.01 sec)

  (ablelee.000001和ablelee.000002已被删除)

  mysql&gt; show binary logs;

  | ablelee.000003 | 106 |

  1 row in set (0.00 sec)

  (删除的其它格式運用!)

  PURGE {MASTER | BINARY} LOGS TO ‘log_name’

  PURGE {MASTER | BINARY} LOGS BEFORE ‘date’

  用于删除列于在指定的日志或日期之前的日志索引中的所有二進制日志。這些日志也會從記錄在日志索引檔案中的清單中被删除,這樣被給定的日志成為第一個。

  例如:

PURGE MASTER LOGS TO 'mysql-bin.010'; PURGE MASTER LOGS BEFORE '2008-06-22 13:00:00';

5、現在手上蠻多項目的資料庫用的是MySQL,由于權限等原因,暫時不友善部署Nagios監控MySQL主從複制,是以我一般在從機上 配置了SHELL腳本用來監控MySQL的主從狀态(設定為每十分鐘運作一次),并且每次出問題時将确切日期寫進錯誤日志,友善事後排查原因,腳本内容如 下:

  #!/bin/bash

  #check MySQL_Slave Status

  #crontab time 00:10

  MYSQLPORT=`netstat -na|grep "LISTEN"|grep "3306"|awk -F[:" "]+ '{print $4}'`

  MYSQLIP=`ifconfig eth0|grep "inet addr" | awk -F[:" "]+ '{print $4}'`

  STATUS=$(/usr/local/webserver/mysql/bin/mysql -u yuhongchun -pyuhongchun101 -S /tmp/mysql.sock -e "show slave status\G" | grep -i "running")

  IO_env=`echo $STATUS | grep IO | awk ' {print $2}'`

  SQL_env=`echo $STATUS | grep SQL | awk '{print $2}'`

  if [ "$MYSQLPORT" == "3306" ]

  then

  echo "mysql is running"

  else

  mail -s "warn!server: $MYSQLIP mysql is down" [email protected]

  fi

  if [ "$IO_env" = "Yes" -a "$SQL_env" = "Yes" ]

  echo "Slave is running!"

  echo "####### $date #########"&gt;&gt; /data/data/check_mysql_slave.log

  echo "Slave is not running!" &gt;&gt; /data/data/check_mysql_slave.log

  mail -s "warn! $MySQLIP_replicate_error" [email protected] &lt;&lt; /data/data/check_mysql_slave.log

  建議每十分鐘運作一次。

  */10 * * * * root /bin/sh /root/mysql_slave.sh

  記得在每台MySQL從機上配置設定一個yuhongchun的使用者,權限大些也沒關系,隻限定在本地運作,如下所示:

  grant all privileges on *.* to "yuhongchun"@"127.0.0.1" identified by "yuhongchun101";

  grant all privileges on *.* to "yuhongchun"@"localhost" identified by "yuhongchun101";

腳本設計思路:

  1、此腳本應該能适應各種各樣不同的内外網環境,即IP不同的環境;

  2、讓腳本也順便監控下MySQL是否正常運作;

本文轉自 rong341233 51CTO部落格,原文連結:http://blog.51cto.com/fengwan/1431785