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

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 |   
+------+
<think>好的,我现在需要帮助用户解决关于MySQL主从复制的配置方法、原理以及故障排查的问题。首先,我需要回顾用户提供的引用内容,确保回答准确。用户引用了两个关于MySQL从配置的教程,其中提到了服务器配置、binlog设置、数据备份和导入等步骤。 首先,我得整理主从复制的原理。主从复制基于binlog,库记录所有数据变更,从库通过IO线程读取这些日志,然后由SQL线程重放。这个过程需要库开启binlog,并设置唯一的server-id。用户提供的引用中提到了库配置文件中的server-id和log-bin参数,这符合标准配置步骤。 接下来是配置步骤。根据引用内容,库需要配置server-id和log-bin,创建复制用户,然后备份数据并导入从库。从库需要配置server-id,指定库信息,并启动复制。用户提到的mysqldump命令和scp传输备份文件是关键步骤,需要详细说明。同时,从库的配置文件中需要正确设置server-id,确保不与库冲突。 然后是故障排查部分。常见问题包括网络连接、权限问题、server-id冲突、binlog配置错误、数据不一致等。需要逐一分析可能的原因,并提供解决方法,比如检查防火墙设置、验证复制用户权限、确认server-id唯一性等。 另外,用户可能对主从复制的同步原理不太清楚,需要简单解释异步复制和半同步复制的区别。同时,数据一致性也是一个常见关注点,可能需要指导如何校验数据,比如使用checksum表或者工具。 需要确保回答结构清晰,分步骤讲解,避免使用复杂术语,让用户容易理解。同时,生成的相关问题要覆盖原理、配置步骤、优化和故障排查等方面,帮助用户进一步学习。 最后,检查引用标记是否正确,确保每个引用对应正确的来源。例如,库配置文件的引用来自引用[1],而数据备份和导入的步骤来自引用[2]。需要确保这些引用在回答中自然出现,不显得突兀。 总结一下,回答的结构应该是: 1. 原理解释 2. 配置步骤(库配置、从库配置、启动复制) 3. 故障排查方法 4. 相关扩展问题 这样用户能够逐步了解如何配置,遇到问题时也能找到解决方法。同时,生成的问题要引导用户深入探讨主从复制的各个方面,帮助他们全面掌握这一技术。</think>### MySQL主从复制配置与原理详解 #### 一、主从复制原理 MySQL主从复制基于二进制日志(binlog)实现,核心流程分为三步: 1. **库记录变更**:所有数据修改操作(DML/DDL)会记录到$binlog$[^1] 2. **从库获取日志**:从库IO线程连接库,获取$binlog$内容到本地$relaylog$[^2] 3. **日志重放执行**:从库SQL线程读取$relaylog$并执行SQL语句,实现数据同步 异步复制架构公式表达: $$ \text{库}T_1\text{提交} \rightarrow \text{binlog持久化} \rightarrow \text{网络传输延迟}\Delta t \rightarrow \text{从库}T_2\text{执行} $$ #### 二、配置教程(基于引用内容优化) **1. 库配置** ```ini # /etc/my.cnf [mysqld] server-id=1 # 唯一标识 log-bin=mysql-bin # 启用binlog binlog_format=ROW # 推荐行格式[^1] expire_logs_days=7 # 日志保留周期 ``` **2. 从库配置** ```ini # /etc/my.cnf [mysqld] server-id=2 # 区别于库 relay-log=mysql-relay read_only=1 # 设为只读 ``` **3. 数据同步流程** ```bash # 库操作 mysqldump -u root -p --all-databases --master-data=2 > full_backup.sql[^2] scp full_backup.sql slave:/tmp/ # 从库操作 mysql -u root -p < /tmp/full_backup.sql ``` **4. 建立复制通道** ```sql -- 从库执行 CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='repl_user', MASTER_PASSWORD='repl_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107; START SLAVE; -- 启动复制 SHOW SLAVE STATUS\G -- 查看状态 ``` #### 三、故障排查指南 | 现象 | 检查点 | 解决方案 | |------|--------|----------| | `Slave_IO_Running: No` | 网络连通性<br>复制用户权限<br>server-id冲突 | `telnet master 3306`<br>`GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'`<br>修改server-id | | `Slave_SQL_Running: No` | 数据冲突<br>SQL执行错误 | `STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1`<br>手动处理数据冲突 | | 复制延迟 | 库写入压力<br>从库硬件性能<br>网络带宽 | 监控`Seconds_Behind_Master`<br>升级从库配置<br>使用并行复制 | #### 四、高级特性扩展 1. **GTID复制**:通过全局事务ID实现精准定位 ```sql gtid_mode=ON enforce_gtid_consistency=ON ``` 2. **半同步复制**:确保事务至少传输到一个从库 ```sql INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值