MySQL主从配置的一些总结

一、做了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';

 二、现在手上蛮多项目的数据库用的是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是否正常运行;

  三、innodb_buffer_pool_size的设置。

  这个参数定义了InnodDB存储引擎的表数据和索引数据的最大内存缓冲区大小。和MyISAM存储引擎不同,MyISAM的key_buffer_size只缓存索引键,而innodb_buffer_pool_size却是同时为数据块和索引块 做缓存,这个特征和Oracle是一样的,这个值设得越高,访问表中数据需求的I/O就越少。在一个专用的数据库服务器,可以设置这个参数达机器物理内存的80%,我现在一般的做法是配置成物理内存的 1/4,比如8G内存的生产数据库,我一般会配置成2G左右。

  四、测试了很长一段时间的MySQL的负载均衡,最后综合了老男孩和其它技术高手的意见,最终决定还是用LVS+Keepalived来作为MySQL的负载均衡,这是因为后端机器超过10台时,LVS的性能还是最好的;如果在3-5台左右,HAProxy也可以很轻松的搞定工作。

  五、大家都很清,磁盘I/O总会成为数据库的性能瓶颈,这时候我们应该如何在生产环境下选择合适的RAID级别呢?

  1、如果数据读写都很频繁,可靠性要求也很高,最好选择RAID10;

  2、如果数据读很频繁,写相对较少,对可靠性有一定要求,可以选择RAID5;

  3、如果数据读写都很频繁,但可靠性要求不高,可以选择RAID0。

  4、对于核心业务的数据库主从同步,建议从机的备份时间往后延迟一段时间,通常的做法是延迟一天左右。

本文出自seven的测试人生公众号最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-11-03 03:48:33

MySQL主从配置的一些总结的相关文章

Mysql主从配置,实现读写分离

原文:Mysql主从配置,实现读写分离 大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢失的话,后果更是 不堪设想.这时候,我们会考虑如何减少数据库的联接,一方面采用优秀的代码框架,进行代码的优化,采用优秀的数据缓存技术如:memcached,如果资金丰厚的话,必然会想到假设服务器群,来分担主数据库的压力.Ok切入今天微博主题,利用MySQL主从

Docker mysql 主从配置详解及实例_Mysql

Docker mysql 主从配置 1.首先创建两个文件my-m.cnf(主库配置) .my-s.cnf(从库配置) my-m.cnf 内容如下 # Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU

完整的mysql主从配置方法

  mysql主从分两个角色 1.主服务器 master 2.从服务器 slave mysql主从复制就是两个服务器之间数据库的同步,也可以理解成对主服务器的一个备份,当主服务器的数据进行了变更,那么从服务器也会自动更新,其实是通过bin-log日志实现的,也就说他们中间是传输binlog日志的.这样我们就可以对数据进行多个节点进行冗余从而保证可用性! 公司现在有三台服务器,一台阿里云,两台VPS,现在需要把阿里云上的数据库同步到其他两台VPS上.阿里云做主服务器其他两台服务器做从服务器 操作如

Mysql主从配置+读写分离(转)

   MySQL从5.5版本开始,通过./configure进行编译配置方式已经被取消,取而代之的是cmake工具.因此,我们首先要在系统中源码编译安装cmake工具.   注:安装前须查看是否已经安装了如下依赖包,如果没有请安装. apt-get -y install gcc g++ libncurses5-dev ncurses-devel openssl   一.主库安装及配置 1.源码安装cmake # tar xf cmake-3.0.0.tar.gz # cd cmake-3.0.0

mysql主从配置教程及容错方案详解

主从配置我们需要有两台mysql服务器,我们先要清楚两点 1.mysql配置文件my.cnf的位置 2.如何启动.停止mysql,找好启动文件 假设有两台机器,已经安装好了mysql(尽量同版本,且两台机器同一网络,可以ping通) 有朋友说:"从服务器,不能低于主服务器的版本",不过我是低于的,没有出现问题. 主机A: 192.168.1.100 从机B:192.168.1.101 可以有多台从机 环境windows 2003系统 主服配置文件 server-id = 1 log-b

Centos下nagios监控mysql主从配置的例子

方法一 一.mysql从服务器设置 1.mysql从服务器用户添加  代码如下 复制代码 执行如下语句添加用户: mysql> GRANT REPLICATION CLIENT ON *.* TO monitor@localhost IDENTIFIED BY 'PassWord'; 2.下载check-mysql-slave.pl脚本 cd /usr/local/bin/ wget http://www.centos.bz/wp-content/uploads/2012/10/check-my

完整的mysql主从配置方法详解

mysql主从分两个角色        1.主服务器    master        2.从服务器    slave mysql主从复制就是两个服务器之间数据库的同步,也可以理解成对主服务器的一个备份,当主服务器的数据进行了变更,那么从服务器也会自动更新,其实是通过bin-log日志实现的,也就说他们中间是传输binlog日志的.这样我们就可以对数据进行多个节点进行冗余从而保证可用性! 公司现在有三台服务器,一台阿里云,两台VPS,现在需要把阿里云上的数据库同步到其他两台VPS上.阿里云做主服

小记一次mysql主从配置解决方案_Mysql

今天研究了个开源项目,数据库是mysql的,其中的脚本数据需要备份,由于本人的机器时mac pro,而且mac下的数据库连接工具都不怎么好用,就想着如何利用windows下的数据库连接工具使用,并做相关备份,另外windows系统下的sqlyog工具还是非常强大的,在此推荐. 因此为了使用sqlyog等windows系统下的连接工具,便开始了一天的折腾. 首先两种思路,其一是利用另外一台宏碁笔记本电脑,直接在其上安装sqlyog使用,通过无线局域网进行连接使用,这种方式太过麻烦,而且来回换电脑很

MySQL主从配置提示Failed to initialize the master info structure错误

大清早收到一个MySQL的自定义语言告警 :replication interrupt,看来是主从同步报错了. 登陆MySQL,执行 show slave status \G 发现salve已经停止了,于是使用 start slave启动,结果有如下报错: ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MySQL error log 搜