• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

韩工

  • 博客园
  • 管理

公告

View Post

MySQL配置主从同步

实现步骤:

1.在主服务器上,必须开启二进制日志机制和配置一个独立的ID
2.在每一个从服务器上,配置一个唯一的ID,创建一个用来专门复制主服务器数据的账号
3.在开始复制进程前,在主服务器上记录二进制文件的位置信息
4.如果在开始复制之前,数据库中已经有数据,就必须先创建一个数据快照,可通过mysqldump导出并同步数据
5.配置从服务器要连接的主服务器的IP地址和登陆授权,二进制日志文件名和位置

  

------主机my.cnf配置文件-----

log-bin=mysql-bin
server-id=1
binlog_format=ROW #复制模式
max_binlog_size=1G #超过max_binlog_size或超过6小时会切换到下一序号文件
sort_buffer_size=2097152
group_concat_max_len=10240
replicate-do-db = xdb
binlog-do-db=xdb
log_bin=/var/lib/mysql/mysql-bin.log #默认路径可修改
expire_logs_days=7 #日志过期时间,设置为0则永不过期
binlog_cache_size=256M #二进制日志缓冲大小,通过show status like 'binlog_%';查看调整写入磁盘的次数,
最好max_binlog_cache_size = 256M
relay_log_recovery=1 #当slave从库宕机后,假如relay-log损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的relay-log,并且重新从master上获取日志,这样就保证了relay-log的完整性。
sync_binlog= 1 #二进制日志(binary log)同步到磁盘的频率
innodb_flush_log_at_trx_commit = 1 #每次事务提交将日志缓冲区写入log file,并同时flush到磁盘。
#————————————————
event_scheduler=ON
max_connections=2000

---创建复制账户(主备机都需要),并查看当前master的位置点----------

 注:配置文件修改后需要执行systemctl restart mysqld

------备机my.cnf配置文件-----

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
#relay_log=/var/log/mysql-relay-bin  #如果写relay-bin-log,需要新建指定目录,并分配权限给mysql
server-id=2
replicate-do-db = xdb
log-bin=mysql-bin
binlog-do-db=xdb
expire_logs_days = 7
max_binlog_size = 1G
sort_buffer_size=2097152
group_concat_max_len=10240

 注:配置文件修改后需要执行systemctl restart mysqld

------从库执行同步操作-----

注意:执行同步前,请先备份主库sql并同步从库,否则后面slave同步时日志会持续报错。操作步骤如下:

mysql > flush tables with read lock;

[root@localhost]# mysqldump -uroot -p'123456' --all-databases > /home/mysql_bak_$(date +%F).sql

mysql > use 指定数据库;

mysql > source /home/mysql_bak.sql;

mysql > unlock tables;

mysql> CHANGE MASTER TO 
    -> MASTER_HOST='172.x.x.x', 
    -> MASTER_USER='user',
    -> MASTER_PASSWORD='password', 
    -> MASTER_LOG_FILE='mysql-bin.000001',
    -> MASTER_LOG_POS=882;

  

 stop slave;  #停止从库同步进程

 start slave;  #开户从库同步进程

附1:主从同步流程图

附2:binlog及其分类

MySQL 的二进制日志可以说 MySQL 最重要的日志了,它记录了所有的 DDL 和 DML(除 了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL 的二进制日志是事务安全型的。

一般来说开启二进制日志大概会有 1%的性能损耗。二进制有两个最重要的使用场景:

其一:MySQL Replication 在 Master 端开启 Binlog,Master 把它的二进制日志传递给 Slaves 来达到 Master-Slave 数据一致的目的。

其二:自然就是数据恢复了,通过使用 MySQL Binlog 工具来使恢复数据。

二进制日志包括两类文件:二进制日志索引文件(文件名后缀为.index)用于记录所有 的二进制文件,二进制日志文件(文件名后缀为.00000*)记录数据库所有的 DDL 和 DML(除 了数据查询语句)语句事件。

binlog 的格式分三种,分别是 STATEMENT,MIXED,ROW。在配置文件中可以选择配 置 binlog_format= statement|mixed|row。三种格式的区别如下:

1)statement:语句级,binlog 会记录每次一执行写操作的语句。相对 row 模式节省空间,但是可能产生不一致性,比如“update tt set create_date=now()”,如果用 binlog 日志 进行恢复,由于执行时间不同可能产生的数据就不同。

优点:节省空间。
缺点:有可能造成数据不一致。
2)row:行级, binlog 会记录每次操作后每行记录的变化。

优点:保持数据的绝对一致性。因为不管 sql 是什么,引用了什么函数,他只记录 执行后的效果。

缺点:占用较大空间。

3)mixed:statement 的升级版,一定程度上解决了,因为一些情况而造成的 statement 模式不一致问题,默认还是 statement,在某些情况下譬如:当函数中包含 UUID() 时;包含 AUTO_INCREMENT 字段的表被更新时;执行 INSERT DELAYED 语句时;用 UDF 时;会按照 ROW 的方式进行处理

优点:节省空间,同时兼顾了一定的一致性。

缺点:还有些极个别情况依旧会造成不一致,另外 statement 和 mixed 对于需要对 binlog 的监控的情况都不方便。

【常见问题】

1. 错误码2061,主从同步报错用户认证方式失败

Last_IO_Errno: 2061
Last_IO_Error: Error connecting to source 'replica@192.168.1.75:3306'. This was attempt 1/86400, with a delay of 60 seconds between attempts. Message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.

解决办法:

mysql> alter user 'replica'@'%' identified with mysql_native_password BY '新密码';

mysql> flush privileges;

mysql> select host,user,plugin from mysql.user;  

 2. 主从同步中断,重置数据

主库执行如下命令:

flush tables with read lock;      #中止所有表写入操作
reset master;                     #重置主从状态
show master status;               #记录log_file和log_position
mysqldump -uroot -p'******' callcenter > /home/callcenter.sql;          #导出主库备份文件,再导入从库

  

从库执行如下命令:

stop slave;
CREATE DATABASE `callcenter` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';
source /home/callcenter.sql;
start slave;
mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.75',MASTER_USER='replica',MASTER_PASSWORD='******',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=1111;
show slave status\G;

  

unlock tables;      #恢复主库数据写入

  

3. 主从同步异常,报错信息如下图所示:

 解决办法:

mysql> select * from performance_schema.replication_applier_status_by_worker\G

 

对比主从库里不一致的数据,从库做删除操作,再次尝试执行同步

【注】:一般导致这种情况是因为主库没有执行flush tables with read lock; #中止所有表写入操作

 

4.   Last_IO_Error: Got fatal error 1236 from source when reading data from binary log: 'Could not find first log file name in binary log index file'

解决办法 : systemctl restart mysql

 

5. ERROR 1802 (HY000): CHANGE REPLICATION SOURCE cannot be executed when the replica was stopped with an error or killed in MTA mode. Consider using RESET REPLICA or START REPLICA UNTIL.

解决办法:reset slave all  


附:my.cnf配置参考 

[mysqld]
user = mysql
#bind-address		= 127.0.0.1
#mysqlx-bind-address	= 127.0.0.1
key_buffer_size		= 16M
myisam-recover-options  = BACKUP
log_error = /var/log/mysql/error.log
server-id=1
log_bin=mysql-bin
binlog_format=row
character-set-server = UTF8MB4
lower_case_table_names=0
innodb_log_file_size=1G
default-storage-engine=INNODB
#default_authentication_plugin=mysql_native_password
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
innodb_ft_min_token_size=1
ngram_token_size=1
max_connections=30000
max_connect_errors=10000
binlog-do-db=callcenter
binlog-do-db=uincti
binlog-do-db=db0
binlog-do-db=db1
expire_logs_days = 7
max_binlog_size = 1G
#sort_buffer_size为2M
sort_buffer_size=2097152
group_concat_max_len=10240
innodb_buffer_pool_size=2G

  

征途漫漫,惟有奋斗!

posted on 2023-10-29 01:17  韩工-Hill  阅读(327)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3