`

mysql 主从复制双主架构在线修改表结构、在线DDL

 
阅读更多
原文地址: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_主从原理问题解决方案和应用

    对于更复杂的多主复制架构,Transfer同样可以作为中间层,协调不同主服务器间的同步关系,但设计与实施难度将进一步增加。 #### 八、不能解决的光速问题 数据的物理传输速度受到光速的限制,这是任何远程数据复制...

    深入理解mysql

    - **复制**:实现主从复制或主主复制,提高可用性和扩展性。 - **事务处理**:利用ACID属性确保数据一致性。 - **安全机制**:包括用户认证、访问控制列表、加密通信等。 #### 七、案例分析与实践技巧 - **案例1:...

    MySQL技能测试题目

    MySQL的主从同步是基于二进制日志实现的,主服务器执行的任何更改(DML和DDL语句)都会被记录到二进制日志中。从服务器连接到主服务器,并请求二进制日志的更新。主服务器将二进制日志发送给从服务器,从服务器执行...

    mysql运维基础知识面试问答题.pdf

    MySQL主从复制原理及配置步骤: 主从复制是将主数据库(master)的数据复制到一个或多个从数据库(slave)的过程。配置主从复制通常涉及设置唯一的服务器ID、配置binlog、在主服务器上授权复制权限给从服务器、在从...

    MYSQL管理器

    9. **复制与集群**:对于大型应用,可能需要使用MySQL的复制功能实现数据同步,或者构建主从复制、主主复制的集群架构。Navicat也支持这些高级操作的配置。 10. **触发器与存储过程**:MySQL中的触发器和存储过程是...

    MySQL管理之道 性能调优、高可用与监控.part2.rar

    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 DBA常用技能集锦.pptx

    对于添加列的操作,MySQL会根据表的结构和索引来决定是否进行在线DDL(无锁)或离线DDL(锁定表)。 - 对于大型表的DDL操作,可以考虑使用在线DDL工具,如`pt-online-schema-change`(Percona Toolkit)、`gh-ost`...

    MySQL-win64

    6. **复制与集群**:MySQL支持主从复制,使得数据可以从一个服务器实时同步到其他服务器,提高可用性和容错性。MySQL Cluster则提供了高可用性和负载均衡的分布式数据库解决方案。 7. **存储过程与触发器**:存储...

    Beginning MySQL Database Design and Optimization.pdf

    - `ALTER TABLE`:修改表结构。 - `DROP TABLE`:删除表。 2. **数据操作语言(DML)**:用于插入、更新和删除数据。 - `INSERT`:向表中插入数据。 - `UPDATE`:更新表中的数据。 - `DELETE`:从表中删除数据...

    深入浅出MySQL-读书笔记byCZF

    DDL用于定义或修改数据库结构,包括创建、删除数据库或表结构;DML用于对数据库内部数据进行增删改查操作;DCL用于控制数据访问权限等安全策略。例如,使用create database创建数据库,使用create table创建表,使用...

    mysql8 Cookbook 的中文版.zip

    1. **数据类型和表结构设计**:书中详细讲解了MySQL 8.0中的各种数据类型,如INT、VARCHAR、DATE等,以及如何创建和管理表,包括主键、外键和索引的设置,帮助读者构建高效的数据模型。 2. **SQL语句与查询优化**:...

    mysql reference manual.a4.pdf

    - **信息架构**:MySQL的信息架构(Information Schema)提供了元数据的访问接口,便于开发者和管理员查询数据库的结构信息。 - **空间扩展**:对于GIS应用的支持,MySQL提供了空间数据类型和函数,允许用户处理地理...

    MySQL是一种流行的开源关系型数据库管理系统

    1. DDL(Data Definition Language):创建、删除和修改表结构。 2. DML(Data Manipulation Language):插入、更新和删除数据。 3. DCL(Data Control Language):管理数据库权限和角色。 4. TCL(Transaction ...

    Chapter7(MySQL).zip

    1. 数据定义语言(DDL):用于创建、修改和删除数据库对象,如CREATE TABLE用于创建表,ALTER TABLE用于修改表结构,DROP TABLE用于删除表。 2. 数据操纵语言(DML):用于插入、更新和删除数据,如INSERT INTO用于...

    MySQL DBA高频面试题

    - 关系型数据库(如MySQL)使用表结构存储数据,强调事务、一致性和查询语言的灵活性。 - 非关系型数据库(如MongoDB)采用键值对等更灵活的数据模型,适合快速迭代开发和非结构化数据存储。 12. 数据库范式: -...

    MYSQL中文帮助文档

    - **数据定义语言(DDL)**:CREATE(创建表)、ALTER(修改表结构)、DROP(删除表)等,用于定义和修改数据库结构。 - **数据查询语言(DQL)**:SELECT语句用于从数据库中检索数据,配合WHERE、GROUP BY、ORDER...

    mysql 5.1 官方中文文档

    MySQL 5.1支持主从复制,用于构建高可用和负载均衡的环境。集群功能则允许多个服务器共享同一份数据,提高系统的容错性和扩展性。 八、日志与监控 MySQL的日志系统包括错误日志、查询日志、慢查询日志等,有助于...

    MySQLDBA运维笔记超详细.rar

    了解SQL语言的基本语法,如DML(增删改查)、DDL(定义数据结构)、DCL(权限控制)和TCL(事务控制)。 2. **安装与配置**:了解在不同操作系统上安装MySQL的步骤,如Linux、Windows和macOS。学习配置文件my.cnf的...

Global site tag (gtag.js) - Google Analytics