主从复制(也称 AB 复制)允许将来自一个MySQL数据库服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)。根据配置,您可以复制数据库中的所有数据库,所选数据库甚至选定的表。
- 横向扩展解决方案 - 在多个从站之间分配负载以提高性能。在此环境中,所有写入和更新都必须在主服务器上进行。但是,读取可以在一个或多个从设备上进行。该模型可以提高写入性能(因为主设备专用于更新),同时显着提高了越来越多的从设备的读取速度。读拓展性和负载均衡。
- 数据安全性 - 因为数据被复制到从站,并且从站可以暂停复制过程,所以可以在从站上运行备份服务而不会破坏相应的主数据。主库的写入数据会持续地在冗余的从库节点上被执行保留,减少数据丢失的风险。
- 分析 - 可以在主服务器上创建实时数据,而信息分析可以在从服务器上进行,而不会影响主服务器的性能。
- 备份 - 可以使用从服务器数据进行备份,减轻主服务器的压力。
- 高可用性保障 - 当主库发生故障时,可以快速的切到其某一个从库,并将该从库提升为主库,因为数据都一样,所以不会影响系统的运行
Binlog
从比较宽泛的角度来探讨复制的原理,MySQL的Server之间通过二进制日志来实现实时数据变化的传输复制,这里的二进制日志是属于MySQL服务器的日志,记录了所有对MySQL所做的更改。这种复制模式也可以根据具体数据的特性分为三种:
这三种模式各有优劣,相对来说,基于Row的行格式被应用的更广泛,虽然这种模式下对资源的开销会偏大,但数据变化的准确性以及可靠性是要强于Statement格式的,同时这种模式下的Binlog提供了完整的数据变更信息,可以使其应用不被局限在MySQL集群系统内,可以被例如Binlogserver,DTS数据传输等服务应用,提供灵活的跨系统数据传输能力, 目前互联网业务的在线MySQL集群全部都是基于Row行格式的Binlog。
准备两台服务器(一主一从)
防火墙和selinux均关闭(方法见下)
[root@master ~]# systemctl stop firewalld --now && setenforce 0
[root@slave ~]# systemctl stop firewalld --now && setenforce 0
设置主机名解析(方法如下)
[root@master ~]# vim /etc/hosts 插入下列信息,两台服务器ip和主机名
10.12.155.10 master
10.12.155.11 slave
[root@slave ~]# vim /etc/hosts 插入下列信息,两台服务器ip和主机名
10.12.155.10 master
10.12.155.11 slave
#清理数据库
[root@master ~]# yum -y erase `rpm -qa | egrep "mysql|mariadb"`
[root@master ~]# rm -rf /etc/my* && rm -rf /var/lib/mysql && rm -rf /usr/bin/mysql
#检查清理效果
[[ ! -f /etc/my.cnf ]] && [[ ! -d /var/lib/mysql ]] && [[ ! -f /usr/bin/mysql ]] && echo "环境已经清理完成" || echo "环境未清理"
推荐使用yum安装,yum安装方法见教程:如何yum安装mysql
安装完成后重启,获取初始密码
[root@master ~]# cat /var/log/mysqld.log | grep password | awk -F':' '{print $4}'
# 此条命令会获取一个12位的字符串初始密码
修改密码
[root@master ~]# mysqladmin -uroot -p'初始密码' password '新密码'
开启biinlog二进制日志
[root@master ~]# mkdir /data
[root@master ~]# chown -R mysql.mysql /data
[root@master ~]# vim /etc/my.cnf #插入下列两行信息,serverID必须具有唯一性,binlog日志存放路径必须存在且授权
server-id=1
bin-log=/data/mysql-bin
[root@master ~]# systemctl restart mysqld #这里注意改完配置文件后必须要重启服务,保证修改的配置生效
创建授权用户
[root@master ~]# myslq -uroot -p'密码'
mysql> grant replication slave on *.* to 'repl'@'10.12.155.11' identified by '账号密码'
#这里是在mysql数据库创建一个新用户并给它授予主从复制的从库权限,注意这是mysql5.7版本的操作方法,如果是mysql8.0版本,则需要先创建用户,然后授权,分两步。
查看主库信息
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 154
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
#此条命令可以查看主库的主从复制相关信息,主要是用来获取File、Position这两条信息,后面配从库会用到。
设置server-id
[root@slave ~]# vim /etc/my.cnf
server-id=2 #server-id必须唯一
[root@slave ~]# systemctl restart mysqld #重启服务使修改配置生效
从服务器配置连接主服务器信息
[root@slave ~]# myslq -uroot -p'密码'
mysql> ? change master to #此条命令可以查看配置列表模板,辅助配置
mysql> change master to
-> MASTER_HOST='master', #主库的ip,这里做了主机名解析,所以填主机名
->MASTER_USER='repl', #主库授权的账户名称
->MASTER_PASSWORD='password', #主库授权的账户密码
-> MASTER_PORT=3306, #主库的mysql服务的端口
->MASTER_LOG_FILE='mysql-bin.000001', #主库二进制日志名称
->MASTER_LOG_POS=154, #主从关系开始的二进制日志位置点信息
->MASTER_CONNECT_RETRY=10; #主从关系连接的尝试最长时间
启动从服务器的复制线程
mysql> start slave:
查询是否成功建立主从关系
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Reconnecting after a failed master event read
Master_Host: master
Master_User: repl
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 415
Relay_Log_File: localhost-relay-bin.000002
Relay_Log_Pos: 581
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
#12、13条信息(Slave_IO_Running、Slave_SQL_Running)这两处显示两个yes,则说明主从复制建立成功,也可以在主库写入数据,在从库进行查询,如果能查到主库写入的信息,则也能说明主从关系建立成功。
在从站上暂停复制
您可以使用和stop slave和start slave语句停止并启动从站上的复制 。
要停止从主服务器处理二进制日志,请使用:
mysql> stop slave; //暂停
mysql> start slave; //启动
mysql> reset slave: //重新设置
主数据库有数据的情况下,使用myqldump工具将主服务器中现有数据导出,使用scp命令复制到每个从服务器
- 开启binlog二进制日志
[root@master ~]# vim etc/my.cnf
server-id=1
bin-log=/data/mysql-bin
- 创建日志目录并授权
[root@master /]# mkdir data
[root@master /]# chown mysql.mysql /data
- 重启服务
[root@master /]# systemctl restart mysqld
- 创建复制数据的用户并授权
[root@master ~]# myslq -uroot -p'密码'
mysql> grant replication slave on *.* to 'repl'@'10.12.155.11' identified by '账号密码'
- 主数据库有数据的情况下,使用myqldump工具将主服务器中现有数据导出,使用scp命令复制到每个从服务器
[root@master ~]# mysqldump -u'用户名' -p'密码' --all-databases >all.sql
[root@master ~]# scp all.sql slave:/root/
- 添加server-id
[root@slave ~]# vim etc/my.cnf
server-id=2
- 重启服务
[root@slave /]# systemctl restart mysqld
- 导入主服务器数据库数据
[root@slave /]# mysql -uroot -p'密码' <all.sql
或者
[root@slave /]# myslq -uroot -p'密码'
mysql>source /all.sql
- 查看主服务器binlog日志名称和位置信息
[root@master ~]# myslq -uroot -p'密码'
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 154
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
#此条命令可以查看主库的主从复制相关信息,主要是用来获取File、Position这两条信息,后面配从库会用到。
- 配置从服务器连接主服务器相关信息
[root@slave ~]# myslq -uroot -p'密码'
mysql> ? change master to #此条命令可以查看配置列表模板,辅助配置
mysql> change master to
-> MASTER_HOST='master', #主库的ip,这里做了主机名解析,所以填主机名
->MASTER_USER='repl', #主库授权的账户名称
->MASTER_PASSWORD='password', #主库授权的账户密码
-> MASTER_PORT=3306, #主库的mysql服务的端口
->MASTER_LOG_FILE='mysql-bin.000001', #主库二进制日志名称
->MASTER_LOG_POS=154, #主从关系开始的二进制日志位置点信息
->MASTER_CONNECT_RETRY=10; #主从关系连接的尝试最长时间
- 启动从服务器复制线程
[root@slave ~]# myslq -uroot -p'密码'
mysql> start slave;
- 查询配置结果
[root@slave ~]# myslq -uroot -p'密码'
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Reconnecting after a failed master event read
Master_Host: master
Master_User: repl
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 415
Relay_Log_File: localhost-relay-bin.000002
Relay_Log_Pos: 581
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
#12、13条信息(Slave_IO_Running、Slave_SQL_Running)这两处显示两个yes,则说明主从复制建立成功,也可以在主库写入数据,在从库进行查询,如果能查到主库写入的信息,则也能说明主从关系建立成功。
文章浏览阅读86次。首发地址:https://yq.aliyun.com/articles/221708谈到机器学习,相信很多除学者都是通过斯坦福大学吴恩达老师的公开课《Machine Learning》开始具体的接触机器学习这个领域,但是学完之后又不知道自己的掌握情况,缺少一些实际的项目操作。对于机器学习的相关竞赛挑战,有些项目的门槛有些高,参加后难以具体的实现,因此造..._scrath五子棋下载
文章浏览阅读83次。原标题:Oracle 12c新特性系列专题-安徽Oracle授权认证中心 随着Oracle database 12c的普及,数据库管理员 (DBA) 的角色也随之发生了转变。 Oracle 12c数据库对 DBA 而言是下一代数据管理。它让 DBA 可以摆脱单调的日常管理任务,能够专注于如何从数据中获取更多价值。未来我们会推出基于Oracle12c的技术文章,帮助DBA尽快掌握新一代数据库的新特性..._ilm add policy row store compress advanced row after
文章浏览阅读150次。问题及代码:*Copyright(c)2016,烟台大学计算机与控制工程学院 *All right reserved. *文件名称:负数把正数赶出队列.cpp *作者:张冰 *完成日期;2016年10月09日 *版本号;v1.0 * *问题描述: 设从键盘输入一整数序列a1,a2,…an,试编程实现: 当ai>0时,ai进队,当ai<0时,将队首元素出队,当ai
文章浏览阅读376次。贪心+构造
文章浏览阅读150次。本文讲的是Linux命名空间学习教程(二) IPC,【编者的话】Docker核心解决的问题是利用LXC来实现类似VM的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源。而 LXC所实现的隔离性主要是来自内核的命名空间, 其中pid、net、ipc、mnt、uts 等命名空间将容器的进程、网络、消息、文件系统和hostname 隔离开。本文是Li..._主机的 ipc 命名空间
文章浏览阅读2w次,点赞5次,收藏7次。在设备上强制安装apk。在app已有的情况下使用-r参数在app版本低于现有版本使用-d参数命令adb install -r -d xxx.apk_adb绕过安装程序强制安装app
文章浏览阅读290次。如果是越界进入硬件错误中断,MSP 或者 PSP 保存错误地址,跳转前会保存上一次执行的地址,lr 寄存器会保存子函数的地址,所以如果在 HardFault_CallBack 中直接调用 C 语言函数接口会间接修改了 lr,为了解决这个问题,直接绕过 lr 的 C 语言代码,用汇编语言提取 lr 寄存器再决定后面的操作。由于 STM32 加入了 FreeRTOS 操作系统,可能导致无法准确定位,仅供参考(日常编程需要考虑程序的健壮性,特别是对数组的访问,非常容易出现越界的情况)。_stm32flash地址越界怎么解决
文章浏览阅读1.8k次。学到了一种操作,说实话,我从来没想过还能这样正常情况下,为了管理方便,许多管理员都会开放MySQL数据库的secure_file_priv,这时就可以导入或者导出数据当我如图输入时,就会在D盘创建一个名为123456.php,内容为<?php phpinfo();?>的文件我们可以利用这一点运用到SQL注入中,从拿下数据库到拿下目标的服务器比如我们在使用联合查询注入,正常是这样的语句http://xxx?id=-1 union select 1,'你想知道的字段的内容或查询语句',
文章浏览阅读2.9w次,点赞12次,收藏63次。感谢原文:https://blog.csdn.net/abc5382334/article/details/24260817感谢原文:https://blog.csdn.net/jiaqingge/article/details/52564348Html CSS的三种链接方式css文本的链接方式有三种:分别是内联定义、链入内部css、和链入外部css1.代码为:<html>..._html链接css代码
文章浏览阅读625次。近几年,蓝牙耳机市场发展迅速,越来越多的消费者希望抛弃线缆,更自由地听音乐,对于运动人士来说,蓝牙耳机的便携性显得尤为重要。但目前市面上的大多数蓝牙耳机实际上都是“有线”的,运动过程中产生的听诊器效应会严重影响听歌的感受。而在“真无线”耳机领域,除了苹果的AirPods外,可供选择的产品并不多,而AirPods又不是为运动场景打造的,防水能力非常差。那么对于喜欢运动又想要“自由”的朋友来说,有没有一款产品能够满足他们的需求呢?下面这十款小编专门为大家搜罗的蓝牙耳机或许就能找到适合的!网红击音F1_适合游戏与运动的高音质蓝牙耳机
文章浏览阅读1k次,点赞6次,收藏7次。在本篇博文中,我们在 iOS 17 beta 4(SwiftUI 5.0)测试版中发现了 SwiftUI 视图首次显示时状态的改变会导致动画“副作用”的问题,并提出多种解决方案。
文章浏览阅读1.9k次。 在 上篇文章–Flutter 实现支持上拉加载和下拉刷新的 ListView 中,我们最终实现的效果是在 listView 上面留下了一段空白,本意是用来加载轮播图的,于是今天就开发了一下,希望能给各位灵感。一 、效果如下说一下大体思路 其实图片展示是用的 PageView ,然后,下面的指示器 是用的 TabPageSelector ,当然整体是用 Stack 包裹起来的。1、..._flutter pageview轮播图 site:csdn.net