Mysql使用Replication-Manager切换后从库出现部分数据缺失?

环境:
xxx.xxx.xxx.85Replication-Manager 2.1控制台
xxx.xxx.xxx.86Mysql 5.7.42主库
xxx.xxx.xxx.87Mysql 5.7.42从库
xxx.xxx.xxx.88Mysql 5.7.42从库
xxx.xxx.xxx.89 VIP

安装步骤:
参考:https://www.jianshu.com/p/1dfd296d0a38 做的
数据库配置的是一主两从,用的mysql自带的master和slave;binlog复制同步
主库my.cnf配置如下:

[client]
port = 3306
socket = /tmp/mysql.sock

[mysqld]

GERNERAL

port = 3306
user = mysql
server_id = 86 #修改成唯一的编号(主机地址的后四位)
socket = /tmp/mysql.sock
character_set_server = utf8
basedir = /data/mysql/app/mysql/mysql
datadir = /data/mysql/data/3306/data
pid-file = /data/mysql/data/3306/data/mysql.pid
lower_case_table_names = 1
replicate-ignore-db=mysql
max_connections = 3000
max_connect_errors = 6000
wait_timeout=31536000
connect_timeout=31536000
interactive_timeout=31536000
skip-name-resolve
sql_mode= "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER"

plugin-dir=/data/mysql/app/mysql-5.7.42-linux-glibc2.12-x86_64/lib/plugin

LOG

log_error = /data/mysql/log/3306/mysql-error.log
log_bin = /data/mysql/log/3306/binlog/db-binlog
binlog_format = MIXED
expire_logs_days = 10
relay_log = /data/mysql/log/3306/relay-bin
relay_log_recovery =1
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /data/mysql/log/3306/mysql-slow.log
log-slave-updates=true

GTID

gtid-mode=on
enforce-gtid-consistency=true

DOUBLE 1

sync_binlog = 1
innodb_flush_log_at_trx_commit = 1

INNODB

default-storage-engine = InnoDB
innodb_file_per_table = 1
innodb_open_files = 500
innodb_buffer_pool_size = 20000M
innodb_log_file_size = 100M
innodb_write_io_threads = 4
innodb_read_io_threads = 4
innodb_thread_concurrency = 0
innodb_purge_threads = 1
innodb_log_buffer_size = 2M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
rpl-semi-sync-master-enabled = 1
rpl-semi-sync-slave-enabled = 1
rpl_semi_sync_master_enabled = ON
rpl_semi_sync_master_timeout = 100000
rpl_semi_sync_master_wait_no_slave = ON
rpl_semi_sync_master_trace_level=32
log_bin_trust_function_creators=1
max_allowed_packet = 36M
group_concat_max_len=102400
tmp_table_size=200M

从库my.cnf配置如下:
[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]

GERNERAL

port = 3306
user = mysql
server_id = 87 #修改成唯一的编号(主机地址的后四位)
socket = /tmp/mysql.sock
character_set_server = utf8
basedir = /data/mysql/app/mysql/mysql
datadir = /data/mysql/data/3306/data
pid-file = /data/mysql/data/3306/data/mysql.pid
lower_case_table_names = 1
replicate-ignore-db=mysql
max_connections = 3000
max_connect_errors = 6000
wait_timeout=31536000
interactive_timeout=31536000
skip-name-resolve
sql_mode= "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER"

plugin-dir=/data/mysql/app/mysql-5.7.42-linux-glibc2.12-x86_64/lib/plugin

LOG

log_error = /data/mysql/log/3306/mysql-error.log
log_bin = /data/mysql/log/3306/binlog/db-binlog
binlog_format = MIXED
expire_logs_days = 10
relay_log = /data/mysql/log/3306/relay-bin
relay_log_recovery = 1
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /data/mysql/log/3306/mysql-slow.log
log-slave-updates=true

binlog-ignore-db=mysql

GTID

gtid-mode=on
enforce-gtid-consistency=true

DOUBLE 1

sync_binlog = 1
innodb_flush_log_at_trx_commit = 1

INNODB

default-storage-engine = InnoDB
innodb_file_per_table = 1
innodb_open_files = 500
innodb_buffer_pool_size = 20000M
innodb_log_file_size = 100M
innodb_write_io_threads = 4
innodb_read_io_threads = 4
innodb_thread_concurrency = 0
innodb_purge_threads = 1
innodb_log_buffer_size = 2M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
rpl_semi_sync_slave_enabled=ON
rpl_semi_sync_slave_trace_level=32
log_bin_trust_function_creators=1
max_allowed_packet = 36M
group_concat_max_len=102400
tmp_table_size=200M

目前是搭建的测试环境,建了一张测试表
用的是增强半同步模式,切换前也有单独确认了测试表的数据有落到从库,但是当HA后发现从库测试表的部分数据丢失了

主库数据:
idname
11
2测试1
3测试2
4测试3
5测试4

从库数据:
idname
11
2测试1
3测试2

请教下各位大佬,是否该架构本身的缺陷还是我哪里没有配置好?

切换后架构如下图

参与4

1同行回答

zftangzftang其它小白一枚
主从同步的机制显示全部

主从同步的机制

收起
互联网服务 · 2023-07-17
浏览511

ChatGPT 回答

根据您提供的信息,可能是以下原因导致从库测试表的部分数据丢失:

  1. 数据同步延迟:由于MySQL的复制是异步的,从库可能会有一定的延迟,如果在切换前主库上有更新操作,但是从库还没有同步完成,那么切换后从库上就会出现数据丢失的情况。可以通过查看从库的Seconds_Behind_Master参数来判断同步延迟的情况。
  2. 主从同步出现错误:主从同步过程中可能会出现一些错误,例如网络故障、从库磁盘空间不足等,这些错误可能会导致数据丢失。可以通过查看从库的错误日志来判断是否出现了同步错误。
  3. 数据库配置问题:您提供的数据库配置文件中没有明显的问题,但是可能存在一些隐含的配置问题,例如binlog文件大小设置不合理、innodb_flush_log_at_trx_commit设置不正确等,这些问题可能会导致数据丢失。

建议您可以通过以下方式来解决问题:

  1. 确认主从同步是否正常:可以通过查看从库的状态来判断主从同步是否正常,例如查看从库的Slave_IO_Running和Slave_SQL_Running参数是否都为Yes。
  2. 检查从库的错误日志:可以通过查看从库的错误日志来判断是否出现了同步错误,如果有错误需要及时解决。
  3. 检查数据库配置是否合理:可以根据MySQL的最佳实践来检查数据库配置是否合理,例如binlog文件大小设置为1GB、innodb_flush_log_at_trx_commit设置为1等。
  4. 定期备份数据:无论是生产环境还是测试环境,都需要定期备份数据以防止数据丢失。可以使用MySQL自带的mysqldump命令来备份数据,也可以使用第三方备份工具来实现自动备份。

提问者

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2023-07-12
  • 关注会员:2 人
  • 问题浏览:1136
  • 最近回答:2023-07-17
  • X社区推广