12
返回列表 发新帖
楼主: linjia828

mysql配置的种种疑问

[复制链接]
论坛徽章:
55
体育版块博采纪念徽章
日期:2008-10-06 11:55:58双黄蛋
日期:2011-06-08 14:43:03茶鸡蛋
日期:2011-06-08 14:50:52迷宫蛋
日期:2013-07-03 14:58:31
11#
 楼主| 发表于 2011-5-18 17:02 | 只看该作者
原帖由 ban_ping 于 2011-5-18 11:37 发表
建议先搞清二进制日志和重做日志的区别


谢谢楼上。
二进制日志会记录所有与MySQL有关的日志记录,包括InnoDB、MyISAM等其他存储引擎的日志。
重做日志只记录InnoDB有关其本身的事务日志。
且两者记录的内容也是不一样的。

经过试验发现在myisam引擎下是执行语句后同时写入二进制日志,而且不存在事务提交的概念,因此在执行一个大的insert操作中止的话依然有插入部分数据是正常的。
在Innodb引擎下,执行完语句在不提交的情况下,已经更新了重做日志,但是未写入二进制日志。只有当提交以后才会写入二进制日志。而且提交是以一个语句为最小事务单位,所以我不明白的是为什么两个数据库,同样是innodb的引擎,同样aotocommit=on的情况下,执行一个大的insert操作然后中止。有一个是没有数据,也就是回滚了,有一个却依然插入了部分数据。所以我在想是不是又有其他什么参数起来作用???

使用道具 举报

回复
论坛徽章:
2
BLOG每日发帖之星
日期:2009-11-25 01:01:03ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
12#
发表于 2011-5-18 22:20 | 只看该作者
对于第一点:
  BINLOG 必须在COMMIT返回前写完。 而不是commit后写BINLOG。

使用道具 举报

回复
论坛徽章:
2
BLOG每日发帖之星
日期:2009-11-25 01:01:03ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
13#
发表于 2011-5-18 22:23 | 只看该作者
另外,你的测试引擎是MYISAM,即时提交;

如果楼主想要达到想像中的效果,请用INNODB引擎来测试

使用道具 举报

回复
论坛徽章:
55
体育版块博采纪念徽章
日期:2008-10-06 11:55:58双黄蛋
日期:2011-06-08 14:43:03茶鸡蛋
日期:2011-06-08 14:50:52迷宫蛋
日期:2013-07-03 14:58:31
14#
 楼主| 发表于 2011-5-19 10:01 | 只看该作者
原帖由 Steven1981 于 2011-5-18 22:20 发表
对于第一点:
  BINLOG 必须在COMMIT返回前写完。 而不是commit后写BINLOG。


你错了,是在提交后才写入二进制日志的。请看下面实验:

mysql> show create table T2;
+-------+--------------------------------------------------------------------------------------+
| Table | Create Table                                                                         |
+-------+--------------------------------------------------------------------------------------+
| T2    | CREATE TABLE `T2` (
  `id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+--------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000056 |     1611 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

mysql> insert into  T2 values (1);
Query OK, 1 row affected (0.00 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000056 |     1611 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000056 |     1793 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

使用道具 举报

回复
论坛徽章:
14
2011新春纪念徽章
日期:2011-04-02 17:01:062013年新春福章
日期:2013-02-25 14:51:24复活蛋
日期:2012-12-06 19:27:46ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:00ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42紫蛋头
日期:2012-03-13 16:37:18灰彻蛋
日期:2012-02-06 14:20:122012新春纪念徽章
日期:2012-01-04 11:57:56灰彻蛋
日期:2011-12-26 14:20:13茶鸡蛋
日期:2011-12-20 15:00:13
15#
发表于 2011-5-19 11:15 | 只看该作者

回复 #11 linjia828 的帖子

你测试过在innodb下,执行一个大的insert,出现的部分数据的情况么?

使用道具 举报

回复
论坛徽章:
28
2010数据库技术大会纪念徽章
日期:2010-05-13 09:34:232012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25版主2段
日期:2012-07-05 02:21:032013年新春福章
日期:2013-02-25 14:51:24ITPUB社区12周年站庆徽章
日期:2013-08-12 09:34:36马上有车
日期:2014-02-19 11:55:14
16#
发表于 2011-5-20 11:22 | 只看该作者
innodb,没有提交不可能有数据的。
另外,二进制日志是先写buffer再写磁盘的,buffer大小由binlog_cache_size决定。
sync_binlog参数会控制二进制日志的写入磁盘,默认为0.
如果设置为1,则写入buffer后会马上同步写入磁盘,这时候事务有可能还未提交。

使用道具 举报

回复
论坛徽章:
55
体育版块博采纪念徽章
日期:2008-10-06 11:55:58双黄蛋
日期:2011-06-08 14:43:03茶鸡蛋
日期:2011-06-08 14:50:52迷宫蛋
日期:2013-07-03 14:58:31
17#
 楼主| 发表于 2011-5-23 14:33 | 只看该作者
原帖由 ban_ping 于 2011-5-20 11:22 发表
innodb,没有提交不可能有数据的。
另外,二进制日志是先写buffer再写磁盘的,buffer大小由binlog_cache_size决定。
sync_binlog参数会控制二进制日志的写入磁盘,默认为0.
如果设置为1,则写入buffer后会马上同步写入磁盘,这时候事务有可能还未提交。


但是在Innodb下我怎么测试都是只有提交完才会写二进制日志,不提交的话二进制日志是不会写入的,而不是缓存写入磁盘的关系。

mysql> show create table T2;
+-------+------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                           |
+-------+------------------------------------------------------------------------------------------------------------------------+
| T2    | CREATE TABLE `T2` (
  `id` int(11) DEFAULT NULL,
  `name` char(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> set GLOBAL sync_binlog=0;
Query OK, 0 rows affected (0.00 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000067 |     1057 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

mysql> insert into  T2 values (1,1);
Query OK, 1 row affected (0.00 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000067 |     1057 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000067 |     1247 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

mysql> set GLOBAL sync_binlog=1;
Query OK, 0 rows affected (0.00 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000067 |     1247 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

mysql> insert into  T2 values (1,1);
Query OK, 1 row affected (0.00 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000067 |     1247 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.01 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000067 |     1437 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

使用道具 举报

回复
论坛徽章:
28
2010数据库技术大会纪念徽章
日期:2010-05-13 09:34:232012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25版主2段
日期:2012-07-05 02:21:032013年新春福章
日期:2013-02-25 14:51:24ITPUB社区12周年站庆徽章
日期:2013-08-12 09:34:36马上有车
日期:2014-02-19 11:55:14
18#
发表于 2011-5-25 14:00 | 只看该作者
原帖由 linjia828 于 2011-5-23 14:33 发表


但是在Innodb下我怎么测试都是只有提交完才会写二进制日志,不提交的话二进制日志是不会写入的,而不是缓存写入磁盘的关系。



是提交事务触发的写二进制日志没错,
这里的写二进制日志实际是写缓冲,
写二进制日志缓冲和提交事务也是有先后顺序的,是写完二进制日志缓冲再提交事务的。
也就是说有可能写了二进制缓冲,但是事务提交未完成的时候发生崩溃。
这时的情况就是:
二进制日志缓冲中有该事务的数据,redo中肯定也有,但是这个事务没有提交成功。
如果sync_binlog是1,那么这时会导致二进制日志缓冲中的数据写入到磁盘,也就是实际的binlog文件。
而对binlog物理文件的写入,一般就是不会更改的.
那么重启系统后,这个未提交的事务会回滚掉,
这时只有打开了innodb_support_xa参数,才会去同时修改掉binlog中未提交的事务,
否则,binlog是会出现错误数据的。

你测试的过程反映不了事情的经过,因为commit提交最终失败的场景不大好模拟出来。

使用道具 举报

回复
论坛徽章:
55
体育版块博采纪念徽章
日期:2008-10-06 11:55:58双黄蛋
日期:2011-06-08 14:43:03茶鸡蛋
日期:2011-06-08 14:50:52迷宫蛋
日期:2013-07-03 14:58:31
19#
 楼主| 发表于 2011-5-25 14:34 | 只看该作者
原帖由 ban_ping 于 2011-5-25 14:00 发表


是提交事务触发的写二进制日志没错,
这里的写二进制日志实际是写缓冲,
写二进制日志缓冲和提交事务也是有先后顺序的,是写完二进制日志缓冲再提交事务的。
也就是说有可能写了二进制缓冲,但是事务提交未完成的时候发生崩溃。
这时的情况就是:
二进制日志缓冲中有该事务的数据,redo中肯定也有,但是这个事务没有提交成功。
如果sync_binlog是1,那么这时会导致二进制日志缓冲中的数据写入到磁盘,也就是实际的binlog文件。
而对binlog物理文件的写入,一般就是不会更改的.
那么重启系统后,这个未提交的事务会回滚掉,
这时只有打开了innodb_support_xa参数,才会去同时修改掉binlog中未提交的事务,
否则,binlog是会出现错误数据的。

你测试的过程反映不了事情的经过,因为commit提交最终失败的场景不大好模拟出来。



我想我知道你的意思了,就是说提交事务这个动作会触发写入二进制日志,但是可能会出现提交失败但是又已经出现写入二进制的情况。
其实我当时就只是想求证写二进制日志的这个动作是不是在发出commit指令以后....

另show master status出来的pos是缓冲里面的还是已经写入磁盘的?这个还真不好测试.....

[ 本帖最后由 linjia828 于 2011-5-25 14:41 编辑 ]

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表