前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >主从默认字符集不一样导致的主从同步报错

主从默认字符集不一样导致的主从同步报错

作者头像
用户1278550
发布2018-08-09 14:39:21
6520
发布2018-08-09 14:39:21
举报
文章被收录于专栏:idbaidba

前言

在使用pt-table-checksum 校验主从的过程的时候,在创建dsns 表之后,往dsns表写入从库dsn信息的时候,从库的SQL线程就挂了,报错信息如下

代码语言:javascript
复制
Column 2 of table 'test.dsns' cannot be converted from type 'varchar(765)' 
to type 'varchar(255)'

执行的SQL为

代码语言:javascript
复制
CREATE TABLE test.dsns 
(id int(11) NOT NULL AUTO_INCREMENT,  
parent_id int(11) DEFAULT NULL, 
dsn varchar(255) NOT NULL, 
PRIMARY KEY (id) ) ;
insert into test.dsns values(1,1,'h=10.1.11.86,P=3308');

分析

出现报错后,我们首先分析binlog,发现binlog 里面报错的位点刚好是执行insert语句的部分,其中dsn 字段为VARSTRING(765),表示utf8的varchar(255)

我们查看主库的test库字符集,为

代码语言:javascript
复制
mysql> show create database test\G
*************************** 1. row ***************************
       Database: test
Create Database: CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */
1 row in set (0.00 sec)

查看从库的test库字符集为:

代码语言:javascript
复制
mysql 10:02:55 >show create database test\G
*************************** 1. row ***************************
       Database: test
Create Database: CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8mb4 */
1 row in set (0.00 sec)

发现主库是utf8,从库为uft8mb4。

主库的表结构为:

代码语言:javascript
复制
mysql> show create table dsns\G
*************************** 1. row ***************************
       Table: dsns
Create Table: CREATE TABLE `dsns` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) DEFAULT NULL,
  `dsn` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

从库的表结构:

代码语言:javascript
复制
mysql 10:00:33 >show create table dsns\G
*************************** 1. row ***************************
       Table: dsns
Create Table: CREATE TABLE `dsns` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) DEFAULT NULL,
  `dsn` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1 row in set (0.01 sec)

至此,我们发现了主从同步报错的根本原因: 1. 建表语句在没有指定字符集的时候,会根据库的默认字符集建表,所以主库的表dsns的字符集是utf8 。

2. 建表语句在没有指定字符集的时候,binlog里面也不会记录字符集格式,导致在从库新建表的时候根据库级别的字符集选择了utf8mb4的字符集,新增记录就报错了。

小结

主从的字符集一定要保持一致,字符集的不一致会导致很多问题,如主从同步报错,隐式转化等,一定要小心。如果可以,建表语句中显示的加上默认字符集。

推荐阅读

《叶问》第1期

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-06-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 分析
  • 小结
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档