- 浏览: 567007 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 893原文地址:http://blog.csdn.net/ljunc ... -
amoeba实现mysql读写分离
2015-11-25 11:29 566原文地址:http://coolnull.com/1463.h ... -
Mysql繁忙主从库在线修改表结构与添加索引问题
2015-11-19 11:01 1470原文地址:http://www.itpub.net/threa ... -
高性能Mysql主从架构的复制原理及配置详解
2015-11-19 10:09 846原文地址:http://blog.csdn ... -
MySQ索引操作命令总结(创建、重建、查询和删除索引命令详解)
2015-11-18 18:13 618原文地址:http://www.shangxueba.com/ ... -
数据库性能优化一:数据库自身优化
2015-11-12 15:57 485原文地址:http://www.cnblo ... -
mysql在一个表中存储创建时间和最近更新时间
2015-10-26 15:10 1116原文地址:http://blog.sina.com.cn/s/ ... -
Mysql 如何设置字段自动获取当前时间
2015-10-26 15:07 1041原文地址:http://www.cnblogs.com/lhj ... -
MySQL的create table as 与 like区别
2015-04-30 10:05 687原文地址:http://blog.csdn.net/longy ... -
Mysql 慢查询和慢查询日志分析
2015-04-21 12:01 669原文地址:http://www.cnblogs.com/wrm ... -
linux下mysql的root密码忘记解决方
2015-04-20 15:58 578原文地址:http://www.cnblogs.com/all ... -
手把手搭建sphinx环境
2015-04-20 10:53 783原文地址:http://blog.csdn.net/uestc ... -
【PHP征文】php 使用 sphinx 实现实时 innodb 全文索引
2015-04-20 10:51 1533原文地址:http://cloudbbs.org/forum. ... -
sphinx mysql innodb 联表数据源配置
2015-04-20 10:48 891原文地址:http://blog.phpdr.net/sphi ... -
mysql垂直分区和水平分区
2015-04-20 10:38 579原文地址:http://itsoul.iteye.com/bl ... -
MySQL隔离级别
2015-04-13 11:53 519原文地址:http://blog.csdn.net/taylo ... -
jdbc---隔离级别
2015-03-26 17:27 540原文地址“http://z466459262.iteye.co ... -
数据库事务隔离级别
2015-03-26 17:10 490原文地址:http://blog.csdn.net/fg200 ... -
JDBC事务隔离级别
2015-03-26 14:04 548原文地址:http://blog.csdn ... -
mysql开发者sql权威指南
2015-03-19 15:43 400原文地址:http://www.r20.nl/SQLforMy ...
相关推荐
对于更复杂的多主复制架构,Transfer同样可以作为中间层,协调不同主服务器间的同步关系,但设计与实施难度将进一步增加。 #### 八、不能解决的光速问题 数据的物理传输速度受到光速的限制,这是任何远程数据复制...
- **复制**:实现主从复制或主主复制,提高可用性和扩展性。 - **事务处理**:利用ACID属性确保数据一致性。 - **安全机制**:包括用户认证、访问控制列表、加密通信等。 #### 七、案例分析与实践技巧 - **案例1:...
MySQL的主从同步是基于二进制日志实现的,主服务器执行的任何更改(DML和DDL语句)都会被记录到二进制日志中。从服务器连接到主服务器,并请求二进制日志的更新。主服务器将二进制日志发送给从服务器,从服务器执行...
MySQL主从复制原理及配置步骤: 主从复制是将主数据库(master)的数据复制到一个或多个从数据库(slave)的过程。配置主从复制通常涉及设置唯一的服务器ID、配置binlog、在主服务器上授权复制权限给从服务器、在从...
9. **复制与集群**:对于大型应用,可能需要使用MySQL的复制功能实现数据同步,或者构建主从复制、主主复制的集群架构。Navicat也支持这些高级操作的配置。 10. **触发器与存储过程**:MySQL中的触发器和存储过程是...
5.2.5 pt-online-schema-change在线更改表结构 152 5.2.6 mysql5.6在线ddl更改表测试 158 5.3 采用合适的锁机制 161 5.3.1 表锁的演示 161 5.3.2 行锁的演示 164 5.3.3 innodb引擎与myisam引擎的性能对比 166 ...
对于添加列的操作,MySQL会根据表的结构和索引来决定是否进行在线DDL(无锁)或离线DDL(锁定表)。 - 对于大型表的DDL操作,可以考虑使用在线DDL工具,如`pt-online-schema-change`(Percona Toolkit)、`gh-ost`...
6. **复制与集群**:MySQL支持主从复制,使得数据可以从一个服务器实时同步到其他服务器,提高可用性和容错性。MySQL Cluster则提供了高可用性和负载均衡的分布式数据库解决方案。 7. **存储过程与触发器**:存储...
- `ALTER TABLE`:修改表结构。 - `DROP TABLE`:删除表。 2. **数据操作语言(DML)**:用于插入、更新和删除数据。 - `INSERT`:向表中插入数据。 - `UPDATE`:更新表中的数据。 - `DELETE`:从表中删除数据...
DDL用于定义或修改数据库结构,包括创建、删除数据库或表结构;DML用于对数据库内部数据进行增删改查操作;DCL用于控制数据访问权限等安全策略。例如,使用create database创建数据库,使用create table创建表,使用...
1. **数据类型和表结构设计**:书中详细讲解了MySQL 8.0中的各种数据类型,如INT、VARCHAR、DATE等,以及如何创建和管理表,包括主键、外键和索引的设置,帮助读者构建高效的数据模型。 2. **SQL语句与查询优化**:...
- **信息架构**:MySQL的信息架构(Information Schema)提供了元数据的访问接口,便于开发者和管理员查询数据库的结构信息。 - **空间扩展**:对于GIS应用的支持,MySQL提供了空间数据类型和函数,允许用户处理地理...
1. DDL(Data Definition Language):创建、删除和修改表结构。 2. DML(Data Manipulation Language):插入、更新和删除数据。 3. DCL(Data Control Language):管理数据库权限和角色。 4. TCL(Transaction ...
1. 数据定义语言(DDL):用于创建、修改和删除数据库对象,如CREATE TABLE用于创建表,ALTER TABLE用于修改表结构,DROP TABLE用于删除表。 2. 数据操纵语言(DML):用于插入、更新和删除数据,如INSERT INTO用于...
- 关系型数据库(如MySQL)使用表结构存储数据,强调事务、一致性和查询语言的灵活性。 - 非关系型数据库(如MongoDB)采用键值对等更灵活的数据模型,适合快速迭代开发和非结构化数据存储。 12. 数据库范式: -...
- **数据定义语言(DDL)**:CREATE(创建表)、ALTER(修改表结构)、DROP(删除表)等,用于定义和修改数据库结构。 - **数据查询语言(DQL)**:SELECT语句用于从数据库中检索数据,配合WHERE、GROUP BY、ORDER...
MySQL 5.1支持主从复制,用于构建高可用和负载均衡的环境。集群功能则允许多个服务器共享同一份数据,提高系统的容错性和扩展性。 八、日志与监控 MySQL的日志系统包括错误日志、查询日志、慢查询日志等,有助于...
了解SQL语言的基本语法,如DML(增删改查)、DDL(定义数据结构)、DCL(权限控制)和TCL(事务控制)。 2. **安装与配置**:了解在不同操作系统上安装MySQL的步骤,如Linux、Windows和macOS。学习配置文件my.cnf的...