mysql中日志类型有慢查询日志,二进制日志,错误日志,默认情况下,系统只打开错误日志,因为开启日志会产生较大的IO性能消耗。
一般情况下,生成系统中很少打开二进制日志(bin log),bin log日志的优化策略:
mysql> show variables like '%binlog%';
+-----------------------------------------+----------------------+
| Variable_name | Value |
+-----------------------------------------+----------------------+
| binlog_cache_size | 32768 |
| binlog_checksum | CRC32 |
| binlog_direct_non_transactional_updates | OFF |
| binlog_format | ROW |
| binlog_max_flush_queue_time | 0 |
| binlog_order_commits | ON |
| binlog_row_image | FULL |
| binlog_rows_query_log_events | OFF |
| binlog_stmt_cache_size | 32768 |
| binlogging_impossible_mode | IGNORE_ERROR |
| innodb_api_enable_binlog | OFF |
| innodb_locks_unsafe_for_binlog | OFF |
| max_binlog_cache_size | 18446744073709547520 |
| max_binlog_size | 1073741824 |
| max_binlog_stmt_cache_size | 18446744073709547520 |
| sync_binlog | 0 |
+-----------------------------------------+----------------------+
binlog_cache_size:在事务过程中,用来保存二进制SQL语句的缓存大小。二进制日志缓存使用的前提条件是服务器端使用了支持事务的引擎以及开启了bin log功能。
该参数为每个客户端都分配binlog_cache_size大小的缓存,如果用户频繁使用多语句事务的话,可以增大binlog_cache_size大小,已获得更好的性能,如何判断binlog_cache_size
设置的是否合理呢?通过如下两个状态可以判断:
mysql> show status like 'binlog%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Binlog_cache_disk_use | 1 |
| Binlog_cache_use | 33 |
+----------------------------+-------+
max_binlog_size :binlog大小的最大值,一般为512M或1G,但不能超过1G,该大小不能严格控制binlog日志大小,如果在binlog大小临界点的时候执行了一个大事务,为了保证事务完整性,不能做日志切换,只能将该事务的所有sql记录当前日志中。其实mysql的binlog日志记录的是带来数据改变的DML,DDL操作
sync_binlog:该参数用来控制以何种方式将binlog cache中的记录同步(fsync)到磁盘。以下是它的参数值的说明;
sync_binlog=0: 表示当事务提交后,不立即将binlog cache中的记录同步到磁盘,具体何时同步,让文件系统自行决定,或者cache满了之后才同步。这种方式性能最好,都是风险也最大,一旦系统宕机,binlog cache中所有的记录都会丢失,如果将sync_binlog值设为1的话,最安全,因为即使系统宕机,也只丢失一个事务的操作记录,都是性能最差,事务每提交一次就会将binlog_cache中的记录同步到磁盘。
sync_binlog=n: 表示事务多少次提交后才将binlog cache中的记录同步到磁盘
mysql的主从同步就是slave端通过IO线程将master端产生的日志同步到slave端的中继日志,然后通过SQL线程将中继日志在slave端重演。所以master端的日志量大小,直接影响了salve端同步的性能,通常情况下,master端产生binlog日志量是无法避免的,但是可以通过设置参数有选择性地同步哪些数据库或表产生的binlog日志来减少binlog日志同步量。
binlog_do_db:设置哪些数据库需要记录binlog(master端)
binlog_ignore_db:设置哪些数据库不需要记录binlog(master端)
replicate_do_db:设置哪些数据库需要同步binlog,多个数据库用逗号”,“隔开
replicate_ignore_db:设置哪些数据库不需要同步binlog,多个数据库用逗号”,“隔开
replicate_do_table:设置哪些表需要同步binlog
replicate_ignore_table:设置哪些表不需要同步binlog
replicate_wild_do_table:设置哪些表需要同步binlog,与replicate_do_table的区别是可以使用通配符的方式来指定表
replicate_wild_ignore_table:设置哪些表不需要同步binlog,与replicate_ignore_table的区别是可以使用通配符的方式来指定表
如果在master端设置了上面两个参数。会减少master端binlog日志的记录量,降低master端日志IO量,减少同步到slave端时的网络通信量,进而降低lave端IO线程同步日志量和SQL线程应用relay log量。但是需要注意的是,mysql判断是否复制某个event不是根据产生该event的query中指定的db名来记录的,而是根据执行该query时所在的db(即using dbname)是否是binlog_do_db指定的db,若是,则记录,否则不记录。考虑如下场景:
有三个数据库:A,B,C,其中binlog_do_db=B,C
应用登录时默认db是A,现执行如下query:update B.t1 set c1 = xxx;这种情况下,mysql是不记录binlog的,由于对B库下的t1表的update操作不记录binlog,所以无法同步到slave端,进而会导致master与slave数据不一致。
如果所在db等于binlog_do_db,此时修改了不需要同步的db下的表也会记录binlog日志,即该db下所有改变db数据的query都会记录binlog
即应用登录db是B,执行query:update A.t1 set c1=xxx;此时也会记录binlog日志。由于binlog_do_db中没有A库,所以slave端不会有A库,从而导致slave端无法找到A库而报错。
如果在slave端设置后面六个参数,无论master该复制或不该复制的event都会被同步到slave端,这样带来的负面影响是IO,网络的压力,和slave端IO线程写入relay log的压力,但是可以减少slave端SQL线程应用relay log的日志量,由于设置了replicate_do_db,replicate_ignore_db会过滤相应的日志,所以可以规避默认db是否等于binlog_do_db问题。
- mysql binlog日志优化及思路
在数据库安装完毕,对于binlog日志参数设置,有一些参数的调整,来满足业务需求或使性能最大化.Mysql日志主要对io性能产生影响,本次主要关注binlog 日志. 查一下二进制日志相关的参数 ...
- Mysql Binlog日志详解
一.Mysql Binlog格式介绍 Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的sql都会记录在 ...
- 看数据库的文件大小 MySQL Binlog日志的生成和清理规则
小结: 1.避免并行大大事务对磁盘.内存的消耗: MySQL数据文件导致实例空间满的解决办法_空间/内存_常见问题_云数据库 RDS 版-阿里云 https://help.aliyun.com/kno ...
- 【转载】mysql binlog日志自动清理及手动删除
说明:当开启mysql数据库主从时,会产生大量如mysql-bin.00000* log的文件,这会大量耗费您的硬盘空间.mysql-bin.000001mysql-bin.000002mysql-b ...
- mysql binlog日志自动清理及手动删除
说明:当开启mysql数据库主从时,会产生大量如mysql-bin.00000* log的文件,这会大量耗费您的硬盘空间.mysql-bin.000001mysql-bin.000002mysql-b ...
- 自动清理MySQL binlog日志
开启MySQL binlog日志的服务器,如果不设置自动清理日志,默认binlog日志一直保留着,时间一长,服务器磁盘空间被binlog日志占满,导致MySQL数据库出错. 使用下面方法可以安全清理b ...
- 删除MySQL binlog日志的方法
对于比较繁忙的OLTP(在线事务处理)系统,由于每天生成日志量大,这些日志如果长时间不清除,将会对磁盘空间带来很大的浪费.因此,定期删除日志是DBA维护MySQL数据库的一个重要工作内容.下面跟大家分 ...
- Mysql binlog日志解析
1. 摘要: Mysql日志抽取与解析正如名字所将的那样,分抽取和解析两个部分.这里Mysql日志主要是指binlog日志.二进制日志由配置文件的log-bin选项负责启用,Mysql服务器将在数据根 ...
- mysql binlog日志的三种模式
1.statement level模式 每一条会修改数据的sql都会记录到master的bin-log中.slave在复制的时候sql进程会解析成和原来master端执行过的相同的sql来再次执行.优 ...
随机推荐
- Fiddler抓包工具使用方法
Fiddler是最强大最好用的Web调试工具之一, 它能记录所有客户端和服务器的http和https请求.允许你监视.设置断点.甚至修改输入输出数据.Fiddler包含了一个强大的基于事件脚本的子系统 ...
- Fiddler 手机无法上网问题
一.Fiddler版本升级后需要升级netframework 二.每一个域名点击需要授权 出现此页面依次点击显示详细信息和访问此网站. 有时候网站白板,可能是cdn域名没有授权的原因,可以直接在url ...
- 无界面Ubuntu服务器搭建selenium+chromedriver+VNC运行环境
搭建背景 有时候我们需要把基于selenium的爬虫放到服务器上跑的时候,就需要这样一套运行环境,其中VNC是虚拟的显示模式,用于排查定位线上问题以及实时运行情况. 搭建流程 安装虚拟输出设备:sud ...
- Qt无法调试Qvector
现象: 解决: 打开文件 $(VSDIR)\Common7\Packages\Debugger\autoexp.dat (VSDIR是本机Visual Studio的安装目录)把定义QVector和Q ...
- HDU 3339 In Action(最短路+背包)题解
思路:最短路求出到每个点的最小代价,然后01背包,求出某一代价所能拿到的最大价值,然后搜索最后结果. 代码: #include<cstdio> #include<set> #i ...
- crontab 定时执行脚本出错,但手动执行脚本正常
原因: crontab 没有去读环境变量,需要再脚本中手动引入环境变量,可以用source 也可以用export 写死环境变量. 为了定时监控Linux系统CPU.内存.负载的使用情况,写了个Shel ...
- 如何在官网下载JDK(版本、系统类型、字节位等)
JDK官网地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 步骤1: 此步注意不要下载运行时jre
- JavaScript常见算法——去重
刚才看到一篇博文,数组去重的,我先试着写一下:新建一个空数组,对原数组进行for循环,对新数组使用indexOf方法判断新数组中是否有该数组元素,没有的话就加入新数组.后来看文中使用的是HashTab ...
- ddt中的data,unpack,file_data实现数据驱动--数据分离
ddt:Class decorator for subclasses of ``unittest.TestCase``. -----``unittest.testcase``子类的类修饰器. 首先介绍 ...
- 【Demo】Tree.js实例
Three.js是通过对WebGL接口的封装与简化而形成的一个易用的图形库. 简单点的说法:WebGL可以看成是浏览器给我们提供的接口,在javascript中可以直接用这些API进行3D图形的绘制: ...