- 浏览: 544577 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (618)
- java (109)
- Java web (43)
- javascript (52)
- js (15)
- 闭包 (2)
- maven (8)
- 杂 (28)
- python (47)
- linux (51)
- git (18)
- (1)
- mysql (31)
- 管理 (1)
- redis (6)
- 操作系统 (12)
- 网络 (13)
- mongo (1)
- nginx (17)
- web (8)
- ffmpeg (1)
- python安装包 (0)
- php (49)
- imagemagic (1)
- eclipse (21)
- django (4)
- 学习 (1)
- 书籍 (1)
- uml (3)
- emacs (19)
- svn (2)
- netty (9)
- joomla (1)
- css (1)
- 推送 (2)
- android (6)
- memcached (2)
- docker、 (0)
- docker (7)
- go (1)
- resin (1)
- groovy (1)
- spring (1)
最新评论
-
chokee:
...
Spring3 MVC 深入研究 -
googleyufei:
很有用, 我现在打算学学Python. 这些资料的很及时.
python的几个实用网站(转的) -
hujingwei1001:
太好了找的就是它
easy explore -
xiangtui:
例子举得不错。。。学习了
java callback -
幻影桃花源:
太好了,謝謝
Spring3 MVC 深入研究
原文地址:http://blog.csdn.net/clh604/article/details/19903793
mysql 主从复制双主架构在线修改表结构、在线DDL
分类: mysql/redis/mongo 2014-02-25 10:51 1755人阅读 评论(0) 收藏 举报
主从同步mysql主主复制
MySQL主主复制,在线修改表结构
一直以为双主架构能解决mysql的表在线DDL的需求,但没有实际测试经验。后来发现一直的想法还是有问题的。这里做一个测试。
双主架构,在线DDL的实现步骤是:
1,首先搭建主主复制架构,只有一台提供服务,这里设为A库,另一台B库空闲
2,A库停止复制stop slave
3,在B库上修改表结构,如加字段
B库完成表修改后,因为A库暂停了复制,所以DDL语句不会复制到A库。对A库没影响
4,切换读写到B库。B库提供读写服务,A库空闲
5,开启A库复制。
首先A库会复制刚才的DDL语句,实现表结构修改,然后复制数据
大致一看,上面的步骤没有问题。A/B库修改表结构,都没有影响数据库对外服务。其实隐藏着一个问题。假设修改的表为X,在步骤3 B库修改X表时,A库上X表数据有更新,这些更新复制到B库,会等待锁,因为X表在进行DDL操作。B库修改完成以后,这些更新语句可能会执行失败,因为表结构改变可能导致更新语句出错。现实际测试如下: www.2cto.com
测试1:
A库上建表,插入数据,停止复制
mysql> create table tbl_testonlineddl(id int);sss
mysql> insert into tbl_testonlineddl values(1);
mysql> stop slave;
mysql> select * from tbl_testonlineddl;
+------+
| id |
+------+
| 1 |
+------+
B库上增加字段id2
mysql> alter table tbl_testonlineddl add id2 int;
mysql> select * from tbl_testonlineddl;
+------+------+
| id | id2 |
+------+------+
| 1 | NULL |
+------+------+
A库上再插入一条数据,这里不指定字段列表
mysql> insert into tbl_testonlineddl values(2);
mysql> select * from tbl_testonlineddl;
+------+
| id |
+------+
| 1 |
| 2 |
+------+
B库复制报错Last_Errno: 1136,字段数目不匹配。这个错误很好理解,但如果A库指定字段列表insert会怎样呢?
mysql> show slave status\G
Last_Errno: 1136
Last_Error: Error 'Column count doesn't match value count at row 1' on query.
Default database: 'test'. Query: 'insert into tbl_testonlineddl values(2)'
测试2:dml语句指定字段名
A库上,指定字段名插入数据
mysql> insert into tbl_testonlineddl(id) values(3);
mysql> select * from tbl_testonlineddl;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
B库上,新插入数据同步成功
mysql> select * from tbl_testonlineddl;
+------+------+
| id | id2 |
+------+------+
| 1 | NULL |
+------+------+
mysql> select * from tbl_testonlineddl;
+------+------+
| id | id2 |
+------+------+
| 1 | NULL |
| 3 | NULL |
+------+------+
结论:只要业务中的sql语句,感知不到新增字段存在,并且显示指定需要的字段名进行数据更新,那么双主架构互切轮流加字段的方法,是可行。对于修改字段或者删除字段,猜测也是一样的道理。
mysql 5.1版本增加了对主从表异构的复制支持,简要规则如下
异构复制出现版本5.1.21
主从表异构分两种情况:
1,主从表字段数目不同
满足以下条件时,主从复制可以进行:
主从表相同的字段部分,字段顺序要一样
主从表相同的字段部分,所有字段必须位于其他字段之前
主从表相同的字段部分之外,每个字段必须有default值
前两条可以简单理解为,主从表,字段少的表,它的字段是字段多的表的前缀,是一种包含被包含的关系。
2,主从表字段类型不同
简单来说,只要从库表的字段定义能够容纳主库表的字段定义,就可以在不同数据类型之间复制。另外主从表字段类型不同的复制,与binlog格式有关。
SBR:基于语句的复制,简单的规则是,只要在主库执行的语句,在从库也能成功执行,则支持主从表字段类型不同
RBR:基于行的复制,规则相对复杂,因为binlog中的数据类型与服务器的数据类型映射可能有差异
支持的数据类型转换为:
From (Master) To (Slave)
BINARY CHAR
BLOB TEXT
CHAR BINARY
DECIMAL NUMERIC
NUMERIC DECIMAL
TEXT BLOB
VARBINARY VARCHAR
VARCHAR VARBINARY 如果字段类型转换后,精度不够,会发生数据截断。转换结果与转换模式有关:slave_type_convertions。具体规则这里就不列出了。
5.1版本中,主从表字段数目不一样的测试
A库
mysql> create table tbl_testmsdiff(id1 int,id2 int);
mysql> insert into tbl_testmsdiff (id1,id2)values(1,1);
mysql> select * from tbl_testmsdiff;
+------+------+
| id1 | id2 |
+------+------+
| 1 | 1 |
+------+------+
B库
mysql> alter table tbl_testmsdiff drop column id2;
mysql> select * from tbl_testmsdiff;
+------+
| id1 |
+------+
| 1 |
+------+
A库
mysql> set binlog_format=statement;
mysql> insert into tbl_testmsdiff (id1,id2)values(2,2);
mysql> select * from tbl_testmsdiff;
+------+------+
| id1 | id2 |
+------+------+
| 1 | 1 |
| 2 | 2 |
+------+------+ssss
B库复制报错
Last_Errno: 1054
Last_Error: Error 'Unknown column 'id2' in 'field list'' on q
uery. Default database: 'test'. Query: 'insert into tbl_testmsdiff (id1,id2)valu
es(2,2)'
测试row模式复制
A库
mysql> set binlog_format=row;
mysql> insert into tbl_testmsdiff (id1,id2)values(3,3);
mysql> select * from tbl_testmsdiff;
+------+------+
| id1 | id2 |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+------+------+
B库复制成功
mysql> select * from tbl_testmsdiff;
+------+
| id1 |
+------+
| 1 |
| 3 |
+------+
mysql 主从复制双主架构在线修改表结构、在线DDL
分类: mysql/redis/mongo 2014-02-25 10:51 1755人阅读 评论(0) 收藏 举报
主从同步mysql主主复制
MySQL主主复制,在线修改表结构
一直以为双主架构能解决mysql的表在线DDL的需求,但没有实际测试经验。后来发现一直的想法还是有问题的。这里做一个测试。
双主架构,在线DDL的实现步骤是:
1,首先搭建主主复制架构,只有一台提供服务,这里设为A库,另一台B库空闲
2,A库停止复制stop slave
3,在B库上修改表结构,如加字段
B库完成表修改后,因为A库暂停了复制,所以DDL语句不会复制到A库。对A库没影响
4,切换读写到B库。B库提供读写服务,A库空闲
5,开启A库复制。
首先A库会复制刚才的DDL语句,实现表结构修改,然后复制数据
大致一看,上面的步骤没有问题。A/B库修改表结构,都没有影响数据库对外服务。其实隐藏着一个问题。假设修改的表为X,在步骤3 B库修改X表时,A库上X表数据有更新,这些更新复制到B库,会等待锁,因为X表在进行DDL操作。B库修改完成以后,这些更新语句可能会执行失败,因为表结构改变可能导致更新语句出错。现实际测试如下: www.2cto.com
测试1:
A库上建表,插入数据,停止复制
mysql> create table tbl_testonlineddl(id int);sss
mysql> insert into tbl_testonlineddl values(1);
mysql> stop slave;
mysql> select * from tbl_testonlineddl;
+------+
| id |
+------+
| 1 |
+------+
B库上增加字段id2
mysql> alter table tbl_testonlineddl add id2 int;
mysql> select * from tbl_testonlineddl;
+------+------+
| id | id2 |
+------+------+
| 1 | NULL |
+------+------+
A库上再插入一条数据,这里不指定字段列表
mysql> insert into tbl_testonlineddl values(2);
mysql> select * from tbl_testonlineddl;
+------+
| id |
+------+
| 1 |
| 2 |
+------+
B库复制报错Last_Errno: 1136,字段数目不匹配。这个错误很好理解,但如果A库指定字段列表insert会怎样呢?
mysql> show slave status\G
Last_Errno: 1136
Last_Error: Error 'Column count doesn't match value count at row 1' on query.
Default database: 'test'. Query: 'insert into tbl_testonlineddl values(2)'
测试2:dml语句指定字段名
A库上,指定字段名插入数据
mysql> insert into tbl_testonlineddl(id) values(3);
mysql> select * from tbl_testonlineddl;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
B库上,新插入数据同步成功
mysql> select * from tbl_testonlineddl;
+------+------+
| id | id2 |
+------+------+
| 1 | NULL |
+------+------+
mysql> select * from tbl_testonlineddl;
+------+------+
| id | id2 |
+------+------+
| 1 | NULL |
| 3 | NULL |
+------+------+
结论:只要业务中的sql语句,感知不到新增字段存在,并且显示指定需要的字段名进行数据更新,那么双主架构互切轮流加字段的方法,是可行。对于修改字段或者删除字段,猜测也是一样的道理。
mysql 5.1版本增加了对主从表异构的复制支持,简要规则如下
异构复制出现版本5.1.21
主从表异构分两种情况:
1,主从表字段数目不同
满足以下条件时,主从复制可以进行:
主从表相同的字段部分,字段顺序要一样
主从表相同的字段部分,所有字段必须位于其他字段之前
主从表相同的字段部分之外,每个字段必须有default值
前两条可以简单理解为,主从表,字段少的表,它的字段是字段多的表的前缀,是一种包含被包含的关系。
2,主从表字段类型不同
简单来说,只要从库表的字段定义能够容纳主库表的字段定义,就可以在不同数据类型之间复制。另外主从表字段类型不同的复制,与binlog格式有关。
SBR:基于语句的复制,简单的规则是,只要在主库执行的语句,在从库也能成功执行,则支持主从表字段类型不同
RBR:基于行的复制,规则相对复杂,因为binlog中的数据类型与服务器的数据类型映射可能有差异
支持的数据类型转换为:
From (Master) To (Slave)
BINARY CHAR
BLOB TEXT
CHAR BINARY
DECIMAL NUMERIC
NUMERIC DECIMAL
TEXT BLOB
VARBINARY VARCHAR
VARCHAR VARBINARY 如果字段类型转换后,精度不够,会发生数据截断。转换结果与转换模式有关:slave_type_convertions。具体规则这里就不列出了。
5.1版本中,主从表字段数目不一样的测试
A库
mysql> create table tbl_testmsdiff(id1 int,id2 int);
mysql> insert into tbl_testmsdiff (id1,id2)values(1,1);
mysql> select * from tbl_testmsdiff;
+------+------+
| id1 | id2 |
+------+------+
| 1 | 1 |
+------+------+
B库
mysql> alter table tbl_testmsdiff drop column id2;
mysql> select * from tbl_testmsdiff;
+------+
| id1 |
+------+
| 1 |
+------+
A库
mysql> set binlog_format=statement;
mysql> insert into tbl_testmsdiff (id1,id2)values(2,2);
mysql> select * from tbl_testmsdiff;
+------+------+
| id1 | id2 |
+------+------+
| 1 | 1 |
| 2 | 2 |
+------+------+ssss
B库复制报错
Last_Errno: 1054
Last_Error: Error 'Unknown column 'id2' in 'field list'' on q
uery. Default database: 'test'. Query: 'insert into tbl_testmsdiff (id1,id2)valu
es(2,2)'
测试row模式复制
A库
mysql> set binlog_format=row;
mysql> insert into tbl_testmsdiff (id1,id2)values(3,3);
mysql> select * from tbl_testmsdiff;
+------+------+
| id1 | id2 |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+------+------+
B库复制成功
mysql> select * from tbl_testmsdiff;
+------+
| id1 |
+------+
| 1 |
| 3 |
+------+
发表评论
-
使用amoeba 数据库端出现 ERROR 1044 (42000):
2015-11-25 11:29 860原文地址:http://blog.csdn.net/ljunc ... -
amoeba实现mysql读写分离
2015-11-25 11:29 523原文地址:http://coolnull.com/1463.h ... -
Mysql繁忙主从库在线修改表结构与添加索引问题
2015-11-19 11:01 1426原文地址:http://www.itpub.net/threa ... -
高性能Mysql主从架构的复制原理及配置详解
2015-11-19 10:09 798原文地址:http://blog.csdn ... -
MySQ索引操作命令总结(创建、重建、查询和删除索引命令详解)
2015-11-18 18:13 577原文地址:http://www.shangxueba.com/ ... -
数据库性能优化一:数据库自身优化
2015-11-12 15:57 451原文地址:http://www.cnblo ... -
mysql在一个表中存储创建时间和最近更新时间
2015-10-26 15:10 1071原文地址:http://blog.sina.com.cn/s/ ... -
Mysql 如何设置字段自动获取当前时间
2015-10-26 15:07 997原文地址:http://www.cnblogs.com/lhj ... -
MySQL的create table as 与 like区别
2015-04-30 10:05 645原文地址:http://blog.csdn.net/longy ... -
Mysql 慢查询和慢查询日志分析
2015-04-21 12:01 619原文地址:http://www.cnblogs.com/wrm ... -
linux下mysql的root密码忘记解决方
2015-04-20 15:58 534原文地址:http://www.cnblogs.com/all ... -
手把手搭建sphinx环境
2015-04-20 10:53 720原文地址:http://blog.csdn.net/uestc ... -
【PHP征文】php 使用 sphinx 实现实时 innodb 全文索引
2015-04-20 10:51 1487原文地址:http://cloudbbs.org/forum. ... -
sphinx mysql innodb 联表数据源配置
2015-04-20 10:48 856原文地址:http://blog.phpdr.net/sphi ... -
mysql垂直分区和水平分区
2015-04-20 10:38 541原文地址:http://itsoul.iteye.com/bl ... -
MySQL隔离级别
2015-04-13 11:53 482原文地址:http://blog.csdn.net/taylo ... -
jdbc---隔离级别
2015-03-26 17:27 498原文地址“http://z466459262.iteye.co ... -
数据库事务隔离级别
2015-03-26 17:10 456原文地址:http://blog.csdn.net/fg200 ... -
JDBC事务隔离级别
2015-03-26 14:04 504原文地址:http://blog.csdn ... -
mysql开发者sql权威指南
2015-03-19 15:43 355原文地址:http://www.r20.nl/SQLforMy ...
相关推荐
介绍MySQL主从复制的安装配置, MIXED复制是混合使用ROW(行)和STATEMENT(语句)复制。对于DDl语句会以STATEMENT格式记录;对于TABLE里的行操作记录为ROW格式 如果使用INNODB表,事务级别使用了READ COMMITTED or...
ORACLE表生成MYSQL建表DDL
在异步或半同步的复制结构中,从库出现延迟是一件十分正常的事。 虽出现延迟正常,但是否需要关注,则一般是由业务来评估。 如:从库上有需要较高一致性的读业务,并且要求延迟小于某个值,那么则需要关注。 简单...
将主数据库中的DDL和DML操作通过二进制日志(BINLOG)传输到从数据库上,然后将这些日志重新执行(重做);从而使得从数据库的数据与主数据库保持一致。 二、主从复制的作用 1、主数据库出现问题,可以切换到从...
MySQL主从复制的延时一直是业界困扰已久的问题。延时的出现会降低主从读写分离的价值,不利于数据实时性较高的业务使用MySQL。 UDB是UCloud推出的云数据库服务,上线已达六年,运营了数以万计的UDB MySQL实例。除了...
图形化实现sqlserver转换为mysql ddl(需字段注释) 应用于数据库、新老系统迁移,提升开发效率。
对于少数表,人工导出复制粘贴到文档中,操作还比较容易,对于几十甚至上百张表的操作,就会耗费很大工作量,收集整理了该数据库库表结构导出demo代码,基于maven构建,导入IDEA编译快速方便,只需要修改需要导出...
通过excel设计数据库直接通过宏转成成mysql表导入数据库
数据库是按照数据的结构来组织,存储,和管理数据的仓库,简而言之,就是存放数据的仓库
我自己没事时写的,一直在用 从MySQL客户端右键表 查看详细信息 复制DDL语句 粘贴到文本框中就可以了
数据库文档生成器,根据数据库表DDL生成markdown和word文档.zip
oracle数据库转成mysql数据库的免费软件
该文档基于windows DOS命令行环境下进行DDL,DCL,DML基础语法练习,包括数据库,表的创建,删除,修改,子查询,表连接,用户创建,授权等。
简单整理的Mysql的基础用法,一共6个PPT基本覆盖了DDL、DQL等五项内容,查询最为重点内容进行了分类讲解,欢迎下载,关注我的博客有额外福利哟
MySQL 数据库结构管理小工具,MySQL 表、视图、触发器、函数、过程结构同步管理,支持MySQL5.x ~ MySQL8,可保存创建对象的选择,导出SQL,当表、过程超过100着实令人头大,特意读取了表等的创建时间,可根据时间...
内容涉及oracle 12的容器数据库,可插入数据库,目前只做了DML的数据同步(不含ddl的同步)
使用户能够创建、修改、删除数据库中的各种对象,如表、视图、索引、触发器等。DDL作为SQL(Structured Query Language,结构化查询语言)的一个重要组成部分,其指令主要涉及数据库模式的创建和维护。主要包括...
MYSQL数据库基础DDL
从mysql数据库迁移到postgres数据库转换ddl语句的工具,添加了自动更新时间的触发器。
网盘文件永久链接 01-课程介绍 02计算机语言介绍 03-SQL语言基础 ...20-MySQL数据库基本操作-DDL-修改表结构 21-MySQL数据库基本操作-DML-基本介绍 22-MySQL数据库基本操作-DML-insert-数据插入 ............