MySQL主从复制(一主一从、双主双从)

2023-12-06 03:28

本文主要是介绍MySQL主从复制(一主一从、双主双从),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、概述

1. 数据库主从概念、优点、用途

主从数据库是什么意思呢,主是主库的意思,从是从库的意思。数据库主库对外提供读写的操作,从库对外提供读的操作。
  在这里插入图片描述数据库为什么需要主从架构呢?
高可用,实时灾备,用于故障切换。比如主库挂了,可以切从库。读写分离,提供查询服务,减少主库压力,提升性能备份数据,避免影响业务。

2. 数据库主从复制原理

主从复制原理,简言之,分三步曲进行:
①主数据库有个 binlog 二进制文件,记录了所有增删改 SQL 语句;
②(binlog线程)从数据库把主数据库的binlog文件的 SQL 语句复制到自己的中继日志relaylog;
③(io线程)从数据库的relaylog重做日志文件,再执行一次这些sql语句。
(sql执行线程)详细的主从复制过程如图:
在这里插入图片描述

二、安装mysql数据库

在主从服务器上均需要完成以下工作:

2.1 安装mysql数据库(基于docker)

docker search mysql
docker pull mysql:8.0.23
# 1.启一个该版本mysql的容器
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.23mkdir -p /usr/rdc/mysql-8.0.23/conf
docker cp mysql:/etc/mysql/my.cnf  /usr/rdc/mysql-8.0.23/conf
chmod -R 777 /usr/rdc/mysql-8.0.23/conf
chmod -R 644 /usr/rdc/mysql-8.0.23/conf/my.cnf
4.打开配置文件查看
cat  /usr/rdc/mysql-8.0.23/conf/my.cnf  #配置文件为默认的
docker stop mysql
docker rm mysql

由配置文件可知:数据文件位置为/var/lib/mysql, 自定义配置文件可以放到容器的/etc/mysql/conf.d目录下,日志文件目录为 /var/log
记住以上三个文件所在位置,下面创建容器做数据卷映射时需要一一对应。

二、配置master库

1.在主服务器中编辑my.cnf文件

cat >  /usr/rdc/mysql-8.0.23/conf/my.cnf << EOF
[mysqld]
# 设置数据库引擎为INNODB
default-storage-engine=INNODB
# 设置授权访问的加密策略
default_authentication_plugin=mysql_native_password# 主从复制配置.start
# 服务器ID
server-id=2013306
# 启用二进制日志
log-bin=master-bin
# 设置logbin格式:STATEMENT(同步SQL脚本) / ROW(同步数据行) / MIXED(混合同步)
binlog_format=MIXED
# 设置日志最长保存时间
expire_logs_days=30
# 0-读写,1-只读
read-only=0# 设置忽略同步的数据库
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=performance_schema
binlog-ignore-db=sys# 设置需要同步的数据库
#binlog-do-db=pmonitor
#binlog-do-db=ucoal# 主从复制配置.end
EOF

2.创建容器(映射数据卷)

docker run -p 3306:3306 --privileged=true --restart=always --name mysql -v /usr/rdc/mysql-8.0.23/conf:/etc/mysql/conf.d -v /usr/rdc/mysql-8.0.23/logs:/var/log/mysql -v /usr/rdc/mysql-8.0.23/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.23

3.进入容器访问mysql

#查看容器id
docker ps#进入容器
docker exec -it mysql  /bin/bash
root@35901b71cff7:/# mysql -uroot -p
mysql: [Warning] Skipping '!includedir /etc/mysql/conf.d/' directive as maximum include recursion level was reached in file /etc/mysql/conf.d/my.cnf at line 29.
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.23 MySQL Community Server - GPLCopyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)mysql> 

4.创建从机访问主库使用的账号

#访问mysql数据库
mysql -uroot -proot#创建账号
create user 'slave1'@'%' identified by 'slave1';
#授权
grant replication slave on *.* to 'slave1'@'%';
#更新用户密码方案(一定要执行否则无法远程访问)
alter user 'slave1'@'%' identified with mysql_native_password by 'slave1';#刷新
flush privileges;

5.重启容器

docker restart mysql

6.获取日志文件名和偏移量

执行一下命令:

#访问mysql数据库
docker exec -it mysql  /bin/bash #进入容器
mysql -uroot -proot  #密码是root
show master status;

在这里插入图片描述

三、配置slave库

1.在从服务器中编辑my.cnf文件

mkdir -p /usr/rdc/mysql-8.0.23/conf/
touch /usr/rdc/mysql-8.0.23/conf/my.cnf
chmod -R 777 /usr/rdc/mysql-8.0.23/conf
chmod -R 644 /usr/rdc/mysql-8.0.23/conf/my.cnf
cat > /usr/rdc/mysql-8.0.23/conf/my.cnf << EOF
[mysqld]
# 设置数据库存储引擎为INNODB
default-storage-engine=INNODB
# 设置授权验证的加密策略
default_authentication_plugin=mysql_native_password# 主从复制配置.start
# 服务器ID
server-id=2023306# 启用中继日志
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
# 设置日志最长保存时间
expire_logs_days=30
# 0-读写,1-只读;slave设置为只读(具有super权限的用户除外)
read_only=1# 开启二进制日志功能,以便本机可以作为其它Slave的Master时使用
log-bin=slave-bin
# 设置logbin格式:STATEMENT(同步SQL脚本) / ROW(同步数据行) / MIXED(混合同步)
binlog_format=MIXED
# 1表示slave将复制事件写进自己的二进制日志
log_slave_updates=1# 设置允许复制的库
# replicate-do-db=pmonitor-cloud
# replicate-do-db=ucoal# 设置忽略复制的库
# replicate-ignore-db=mysql
# replicate-ignore-db=information_schema
# replicate-ignore-db=performance_schema#主从复制配置.end
EOF
docker run -p 3306:3306 --privileged=true --restart=always --name mysql -v /usr/rdc/mysql-8.0.23/conf:/etc/mysql/conf.d -v /usr/rdc/mysql-8.0.23/logs:/var/log/mysql -v /usr/rdc/mysql-8.0.23/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.23
#进入容器
docker exec -it  mysql   /bin/bash#访问mysql数据库
mysql -uroot -proot  #密码是root
stop slave;  #先停止从服务器线程
change master to master_host='192.168.186.129', master_port=3306, master_user='slave1', master_password='slave1', master_log_file='master-bin.000001', master_log_pos=156, get_master_public_key=1; #从服务器的IP
show master status;
start slave;
show master status;

在这里插入图片描述在这里插入图片描述

docker restart mysql
docker exec -it  mysql   /bin/bash
mysql -uroot -proot  #密码是root
show slave status \G;
mysql> show slave status \G;
*************************** 1. row ***************************Slave_IO_State: Connecting to masterMaster_Host: 192.168.186.129Master_User: slave1Master_Port: 3306Connect_Retry: 60Master_Log_File: master-bin.000001Read_Master_Log_Pos: 156Relay_Log_File: 00d49616dbf7-relay-bin.000002Relay_Log_Pos: 4Relay_Master_Log_File: master-bin.000001Slave_IO_Running: ConnectingSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 156Relay_Log_Space: 156Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 1045Last_IO_Error: error connecting to master 'slave1@192.168.186.129:3306' - retry-time: 60 retries: 1 message: Access denied for user 'slave1'@'172.17.0.1' (using password: YES)Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 0Master_UUID: Master_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: 230527 03:09:26Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 1Network_Namespace: 
1 row in set, 1 warning (0.00 sec)ERROR: 
No query specifiedmysql> 

使用上述命令查看状态,Slave_IO_Running、Slave_SQL_Running两个参数均为YES时,表示集群状态正常。
否则,需要根据 Last_IO_Error 或 Last_SQL_Error的报错信息进行排查。

#重启主从服务器的mysql容器
docker restart mysql
#登录主服务器查看配置是否生效
docker exec -it mysql  /bin/bash
mysql -uroot -proot
show variables like 'server_id'; ##查看server-id
show global variables like '%log_bin%'; ##查看binlog日志文件名称

在这里插入图片描述
发现server-id,与binlog日志文件均未按配置文件要求生成。

转载:https://blog.csdn.net/hualinger/article/details/131292136

这篇关于MySQL主从复制(一主一从、双主双从)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/460239

相关文章

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作