mysql

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介:

1.

1
ERROR 1206 (HY000): The total number of locks exceeds the lock table size

原来是InnoDB表执行大批量数据的更新,插入,删除操作时会出现这个问题,需要调整InnoDB全局的innodb_buffer_pool_size的值来解决这个问题,并且重启mysql服务。

查看当前数据库存储引擎,在创建时使用 ENGINE=InnoDB类型。

默认的innodb_buffer_pool_size=8M


wKioL1OtfonhlOytAABO3_BB93w041.png

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>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>show binlog events;

  由于数据量很多,查看起来很麻烦,光打开个文件就要闪半天,所以应该适当删除部分可不用的日志。

  并且如果使用的时间足够长的话,会把我的硬盘空间都给吃掉。

  1、登录系统,/usr/bin/mysql

  使用mysql查看日志:

 

  mysql>show binary logs;

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

  | Log_name | File_size |

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

  | ablelee.000001 | 150462942 |

  | ablelee.000002 | 120332942 |

  | ablelee.000003 | 141462942 |

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

 

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

mysql> purge binary logs to ′ablelee.000003′;

  Query OK, 0 rows affected (0.16 sec)

 

  3、查询结果(现在只有一条记录了):

 

  mysql> 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> show binary logs;

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

  | Log_name | File_size |

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

  | 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" yuhongchun027@163.com

  fi

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

  then

  echo "Slave is running!"

  else

  echo "####### $date #########">> /data/data/check_mysql_slave.log

  echo "Slave is not running!" >> /data/data/check_mysql_slave.log

  mail -s "warn! $MySQLIP_replicate_error" yuhongchun027@163.com << /data/data/check_mysql_slave.log

  fi

 

  建议每十分钟运行一次。

  */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


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
关系型数据库 MySQL Java
MySQL的问题
MySQL的问题
|
5月前
|
关系型数据库 MySQL AndFix
MySQL 8.0是MySQL
MySQL 8.0是MySQL发展的一个重要里程碑。在这个版本中,MySQL Server层的整体架构得到了质的飞跃,通过持续每三个月的迭代和重构工作,使得MySQL在性能和功能上都有了显著的提升。本文将基于MySQL 8.0.25源码,详细介绍MySQL 8.0的最新架构和一些重要的变化。
57 1
|
6月前
|
关系型数据库 MySQL Linux
mysql 如何 才是真正的mysql
mysql 如何 才是真正的mysql
31 0
|
存储 SQL JSON
mysql8.0 与mysql 5.7 对比
mysql8.0 与mysql 5.7 对比
618 0
|
SQL 关系型数据库 MySQL
【必知必会的MySQL知识】②使用MySQL
【必知必会的MySQL知识】②使用MySQL
92 0
【必知必会的MySQL知识】②使用MySQL
|
SQL 关系型数据库 MySQL
MySQL5.7及以上 转 MySQL5.5
MySQL5.7及以上 转 MySQL5.5
122 0
|
存储 SQL Oracle
Mysql的前世今生,Hello,Mysql
1.什么是数据库? 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。 每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据。 我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。
100 0
Mysql的前世今生,Hello,Mysql
|
SQL 关系型数据库 MySQL
MySQL(二)
MySQL(二),一起来学习吧。
MySQL(二)
|
SQL Oracle 关系型数据库
3_MySQL
3_MySQL
92 0
|
SQL Oracle NoSQL
《MySQL自传》
我是一只勤劳的小海豚,网名叫MySQL,出生于1995年5月23号,正宗95后,你们可别小看我,我现在可是全世界最流行的开源数据库,全球有800万个实例呢。
1010 2
《MySQL自传》