资讯专栏INFORMATION COLUMN

构建MySQL8.0到MySQL5.7主从复制

IT那活儿 / 1706人阅读
构建MySQL8.0到MySQL5.7主从复制



简介



如何构建MySQL8.0到MySQL5.7主从复制,在实际异构环境中使用此架构会有所帮助。例如,在MySQL升级情况下,使用新版本MySQL作为master对回滚很方便。从官方文档介绍,只支持连续的MySQL版本之间进行复制,并且由低版本的master到高版本的slave,以下为支持场景示例:

5.7 主 –> 8.0 从

不支持反向复制:

8.0 主 –> 5.7 从



环境



1. 通过参数设置使用能够支持从高版本到低版本主从复制。

如果使用 MySQL 8 的新功能,将会错误信息导致主从复制停止。

以下为构建主从复制的初始环境:

slave > select @@version;
+---------------+
| @@version     |
+---------------+
| 5.7.17-log |
+---------------+
1 row in set (0.00 sec)

master > select @@version;
+-----------+
| @@version |
+-----------+
| 8.0.12    |
+-----------+
1 row in set (0.00 sec)


2. 在执行CHANGE MASTER命令之前,需要修改主服务器上的排序规则。

否则复制将遇到此错误:

slave > show slave statusG
                   Last_Errno: 22
                   Last_Error: Error Character set #255 is not a compiled character set and is not specified in the /data/percona_server/5.7.17/share/charsets/Index.xml file on query. Default database: mysql8_1. Query: create database mysql8_1

这是因为 MySQL 8 上的默认 character_set 和排序规则已更改。根据官方文档介绍:

character_set_server 和 character_set_database 系统变量默认值已从latin1更改为utf8mb4。

collation_server的和collation_database系统变量默认值已从 latin1_swedish_ci 到utf8mb4_0900_ai_ci。


3. 将MySQL 8 上的排序规则和字符集更改为utf8:
# master my.cnf
[client]
default-character-set=utf8
[mysqld]
character-set-server=utf8
collation-server=utf8_unicode_ci


4. 创建复制用户

重新启动MySQL 8使参数生效。重启以后,使用mysql_native_password密码策略创建复制用户 ,因为 MySQL 8默认用户认证策略为caching_sha2_password。如果使用caching_sha2_password 创建用户并执行 CHANGE MASTER 命令 ,将会出现以下错误消息:

Last_IO_Errno: 2059
Last_IO_Error: error connecting to master root@127.0.0.1:19025 - retry-time: 60 retries: 1


5. 使用mysql_native_password密码策略创建用户 :

master> CREATE USER replica_user@% IDENTIFIED WITH mysql_native_password BY repli$cat;
master> GRANT REPLICATION SLAVE ON *.* TO replica_user@%;


6. 构建主从复制

master > show master statusG
*************************** 1. row ***************************
File: mysql-bin.000007
Position: 155
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)

slave > CHANGE MASTER TO MASTER_HOST=127.0.0.1, MASTER_USER=replica_user, MASTER_PASSWORD=repli$cat,MASTER_PORT=19025, MASTER_LOG_FILE=mysql-bin.000007, MASTER_LOG_POS=155; start slave;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
Query OK, 0 rows affected (0.00 sec)

# This procedure works with GTIDs too
slave > CHANGE MASTER TO MASTER_HOST=127.0.0.1, MASTER_USER=replica_user, MASTER_PASSWORD=repli$cat,MASTER_PORT=19025,MASTER_AUTO_POSITION = 1 ; start slave;


7. 检查主从状态:

master > show slave statusG
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 127.0.0.1
Master_User: replica_user
Master_Port: 19025
Connect_Retry: 60
Master_Log_File: mysql-bin.000007
Read_Master_Log_Pos: 155
Relay_Log_File: mysql-relay.000002
Relay_Log_Pos: 321
Relay_Master_Log_File: mysql-bin.000007
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 155
Relay_Log_Space: 524
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 100
Master_UUID: 00019025-1111-1111-1111-111111111111
Master_Info_File: /home/vinicius.grippa/sandboxes/rsandbox_5_7_17/master/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.01 sec)


8.验证主从复制是否正常运行

master > create database vinnie;
Query OK, 1 row affected (0.06 sec)

slave > show databases like vinnie;
+-------------------+
| Database (vinnie) |
+-------------------+
| vinnie |
+-------------------+
1 row in set (0.00 sec)




总结



通过调整参数能够使MySQL 8复制到MySQL 5.7,在某些特殊的情况下(尤其是升级),可以方便使用,但在实际环境中不建议使用该架构,因为在某些情况下它容易出错和不兼容。


END


更多精彩干货分享

点击下方名片关注

IT那活儿

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129764.html

相关文章

  • Mysql二进制日志文件(binlog)主从复制最佳实践

    摘要:的主从备份相关配置服务器号,不要和其他服务器重复开启二进制日志索引二进制日志的文件名设为就是把每次发生的修改和事件的日志即时同步到硬盘上复制模式防止从服务器在崩溃后自动开启,以给你足够的时间修复。 实践背景 最近加入了同学的技术分享小组,4个人分两组,半月进行一次技术分享,现在一起搞Mysql我被分到讲解Mysql日志方面,上周已经讲完了,不过他们总是觉得对于日志这块了解不透彻,觉得不...

    刘永祥 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<