MySQL主从同步配置及遇到的问题总结

MySQL主从同步配置及遇到的问题总结

MySQL主从同步是基于Bin Log实现的,而Bin Log记录的是原始SQL语句。

主从配置,以Windows系统为例:

主数据库配置:
在主数据库的配置文件my.ini中,找到log-bin和server-id
修改配置
log-bin=D:\Mysql-binlog\mysql-bin #定义binlog文件目录
binlog-do-db=boot_smartlms_product # 选择的数据库,被同步的数据库
binlog-ignore-db=information_schema #忽略的初始数据库
binlog-ignore-db=performance_schema #忽略的初始数据库
binlog-ignore-db=sakila #忽略的初始数据库
binlog-ignore-db=mysql #忽略的初始数据库
binlog-ignore-db=world #忽略的初始数据库
binlog-ignore-db=sys
binlog-format=Row
server-id=1#定义服务id,也可以是2或者3、4、5……

重新启动服务
执行SQL语句
show variables like ‘%log_bin%’
如果
log_bin的值为on,就证明配置成功,已经开启binlog

建立用户,用于从数据库复制权限
grant replication slave on . to ‘copy’@‘%’ identified by ‘12345678’;

执行SQL查看主服务器状态
show master status;
默认初始值:
File:mysql-bin.000001 Position:154
如果初始值不是154,是因为设置了copy用户导致Position数据增加,需要执行以下SQL重置一下状态
reset master;

以下是线下主数据库的配置文件示例:

[client]
port=8085
[mysql]
no-beep
[mysqld]
port=8085
datadir=D:/mysql-5.7.23-winx64/data
default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
log-output=FILE
general-log=0
general_log_file="MS-IXTFKRSRKAZT.log"
slow-query-log=1
slow_query_log_file="MS-IXTFKRSRKAZT-slow.log"
long_query_time=10
log-error="MS-IXTFKRSRKAZT.err"
#配置主数据库
log-bin=D:\Mysql-binlog\mysql-bin
#需要同步的数据库
binlog-do-db=boot_smartlms
#忽略的数据库
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sakila
binlog-ignore-db=mysql
binlog-ignore-db=sys
binlog-format=Row
#设置server-id
server-id=1
lower_case_table_names=1
secure-file-priv="D:/mysql-5.7.23-winx64/Uploads"
max_connections=151
table_open_cache=2000
tmp_table_size=84M
thread_cache_size=10
myisam_max_sort_file_size=100G

myisam_sort_buffer_size=158M

key_buffer_size=8M

read_buffer_size=64K

read_rnd_buffer_size=256K

innodb_flush_log_at_trx_commit=1

innodb_log_buffer_size=1M

innodb_buffer_pool_size=128M

innodb_log_file_size=48M

innodb_thread_concurrency=17

innodb_autoextend_increment=64

innodb_buffer_pool_instances=8

innodb_concurrency_tickets=5000

innodb_old_blocks_time=1000

innodb_stats_on_metadata=0

innodb_file_per_table=1

innodb_checksum_algorithm=0

back_log=80

flush_time=0

join_buffer_size=256K

max_allowed_packet=4M

max_connect_errors=100

open_files_limit=4161

sort_buffer_size=256K

table_definition_cache=1400

binlog_row_event_max_size=8K

sync_master_info=10000

sync_relay_log=10000

sync_relay_log_info=10000
event_scheduler=ON

从数据库配置:
在从数据库的配置文件my.ini中,修改
server-id=2#也可以是3、4、5……

增加以下内容
master_info_repository=‘TABLE’
relay_log_info_repository=‘TABLE’

执行SQL,表示同步192.168.0.156的数据库,端口3306,从游标154开始同步
change master to master_host=‘192.168.0.156’,master_port=3306,master_user=‘copy’,master_password=‘12345678’,master_log_file=‘mysql-bin.000001’,master_log_pos=154;

开启主从复制
start slave;
查看主从复制是否搭建完成
show slave status;
返回Slave_IO_Running和Slave_SQL_Running的值都为YES证明搭建成功 。

以下是从数据库配置文件示例:

[client]
port=8085
[mysql]
no-beep
[mysqld]
port=8085
datadir=D:/mysql-5.7.23-winx64/data
default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
log-output=FILE
general-log=0
general_log_file="MS-IXTFKRSRKAZT.log"
slow-query-log=1
slow_query_log_file="MS-IXTFKRSRKAZT-slow.log"
long_query_time=10
log-error="MS-IXTFKRSRKAZT.err"
#配置从数据库
server-id=22
master_info_repository='TABLE'
relay_log_info_repository='TABLE'

lower_case_table_names=1
secure-file-priv="D:/mysql-5.7.23-winx64/Uploads"
max_connections=151
table_open_cache=2000
tmp_table_size=84M
thread_cache_size=10
myisam_max_sort_file_size=100G

myisam_sort_buffer_size=158M

key_buffer_size=8M

read_buffer_size=64K

read_rnd_buffer_size=256K

innodb_flush_log_at_trx_commit=1

innodb_log_buffer_size=1M

innodb_buffer_pool_size=128M

innodb_log_file_size=48M

innodb_thread_concurrency=17

innodb_autoextend_increment=64

innodb_buffer_pool_instances=8

innodb_concurrency_tickets=5000

innodb_old_blocks_time=1000

innodb_stats_on_metadata=0

innodb_file_per_table=1

innodb_checksum_algorithm=0

back_log=80

flush_time=0

join_buffer_size=256K

max_allowed_packet=4M

max_connect_errors=100

open_files_limit=4161

sort_buffer_size=256K

table_definition_cache=1400

binlog_row_event_max_size=8K

sync_master_info=10000

sync_relay_log=10000

sync_relay_log_info=10000

常用查询SQL:

#查询版本号
select version();

#查看配置是否生效
show variables like '%log_bin%';

#查看主从状态
SHOW MASTER STATUS;

#重置主从游标
reset master;

#新建用户用于从数据库同步
grant replication slave on *.* to 'copy'@'%' identified by 'hst12345';

#刷新权限
FLUSH PRIVILEGES;

#查看server-id
SELECT @@server_id

#从数据库停止同步
stop slave;

#重置从库配置
reset slave;

#设置同步
change master to master_host='192.168.0.138',master_port=3306,master_user='copy',master_password='hst12345',master_log_file='mysql-bin.000001',master_log_pos=154;

#开启同步
start slave;

#查看同步状态
show slave status;

注意事项:
1.修改配置文件my.ini时,切勿使用记事本,建议使用EmEditor工具修改,防止编码格式不一致,导致修改配置失败。

2.当主从数据库之间连接断开后,从数据库会每60秒尝试重新连接主数据库,直到达到最大连接错误次数停止尝试。
临时解决办法:
· 到安装bin目录下,使用mysqladmin -u root -p flush-hosts命里 输入密码后,即完成清除缓存。

· 进入mysql控制台,执行:flush hosts;

每次手动处理比较麻烦,建议增加mysql定时任务,定时刷新连接。

示例:

先在数据库创建存储过程,执行刷新连接的SQL语句

CREATE DEFINER=`root`@`%` PROCEDURE `boot_smartlms`.`flush_hosts_proce`()
begin
FLUSH HOSTS;
end

然后创建定时器,表示从23年11月6日11点33分开始,每600秒执行一次

CREATE EVENT flush_hosts_event
ON SCHEDULE EVERY 600 SECOND
STARTS '2023-11-06 11:33:22.000'
ON COMPLETION PRESERVE
ENABLE
DO call flush_hosts_proce()

参考文档:

https://zhuanlan.zhihu.com/p/533187002

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值