加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_阳江站长网 (https://www.0662zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

mysql 复制原理与实践

发布时间:2021-01-07 11:22:59 所属栏目:MySql教程 来源:网络整理
导读:副标题#e# 复制功能是将一个mysql数据库上的数据复到一个或多个mysql从数据库上。 复制的原理:在主服务器上执行的所有DDL和DML语句都会被记录到二进制日志中,这些日志由连接到它的从服务器获取,并复制到从库,并保存为中继日志, 这个过程由一个称为 IO

4、在服务器C上,使用 START SLAVE UNTIL 语句将其同步到服务器B的日志位置:

START SLAVE UNTIL MASTER_LOG_FILE='上一步中服务器B日志名称',MASTER_LOG_POS=上一步中服务器B日志位置;

5、在服务器C上,检查 show slave status 中?Exec_Master_Log_Pos 和?Until_Log_Pos 两者应该相同。

6、在服务器B上,查看主库状态,启动从库。

show master status;
start slave;
show slave statusG;

7、在服务器C上,停止从库运行,执行 CHANGE MASTER TO 命令。

stop slave;
CHANGE MASTER TO
MASTER_HOST='服务器B的IP',MASTER_USER='服务器B复制用户',MASTER_LOG_FILE='上一步中通过show master status获取日志名称',MASTER_LOG_POS=上一步中通过show master status获取日志位置;

8、在服务器C上,启动复制并查看状态

start slave;
show slave statusG;

  

?七、将链式复制切换到主从复制

服务器A->服务器B->服务器C,如果想让服务器C直接作为服务器A的从库,该怎么做?

1、在服务器B上,停止从库运行,并记录主库状态

stop slave;
show master statusG;

2、服务器C上,确保从库的延迟已被追上,Relay_Master_Log_File和Exec_Master_Log_Pos应该等于服务器B上主库状态。

一旦延迟被追上,就停止从库的运行。

stop slave;

3、在服务器B上,从 show slave status 中获取服务器A的日志坐标值(Relay_Master_Log_File和Exec_Master_Log_Pos),并启动从库

show slave statusG;
start slave;

4、在服务器C上,停止从库运行,并执行 CHANGE MASTER TO 命令,指向服务器A

stop slave;
CHANGE MASTER TO 
MASTER_HOST='服务器A的IP',MASTER_USER='服务器A的复制用户',MASTER_LOG_FILE='上一步中获取的日志',MASTER_LOG_POS=上一步中获取的日志位置;

5、在服务器C上,开启从库,并查看状态。

start slave;
show slave statusG;

  

八、设置延迟复制

为什么需要延迟复制,有可能主库上执行了一条灾难性语句,你必须通过备份中的时间点恢复,如果数据库大小过大,这将导致长时间停机。

为了避免出现这种情况,可以使用一个延迟的从库,如果发生了灾难,并且延迟的从库还没有执行这条灾难性语句,则可以先停止复制,让从库跳过该灾难语句,最后把从库提升为主库。

1、停止从库运行

stop slave;

2、设置延迟时间,以秒为单位

CHANGE MASTER TO MASTER_DELAY = 3600;
start slave;

3、检查从库状态

show slave statusG;

SQL_Delay: 从库延迟于主库的秒数。

SQL_Remaining_Delay:延迟还剩余的秒数,当保持延迟时,这个值是NULL。

Slave_SQL_Running_State:SQL线程的状态

?

九、设置 GTID 复制

全局事务标识符 GTID 是在程序中创建的唯一标识符,并与主库上提交的每个事务相关联。该标识符是唯一的,不仅在主库上,在其他从库上,它都唯一。

上面描述的所有复制,都需要指明二进制文件和复制起点的位置,如果将一个从库的主库切换到另一个,就必须重新获取二进制文件位置,这会很麻烦。

为了避免,可以使用基于 GTID 的复制,mysql 使用 GTID 自动检测二进制日志的位置。

1、在所有数据库中 my.cnf 中启动 GTID

[mysqld]
gtid_mode = ON
enforce-gtid-consistency = 1
skip_slave_start

2、将主库设置为只读,确保主库与从库数据一致。

set @@global.read_only = on;

3、重新启动所有从库,使 GTID 生效。

4、重新启动主库。

5、在从库上执行 CHANGE MASTER TO 命令来设置 GTID 复制

CHANGE MASTER TO
MASTER_HOST='主库IP',MASTER_PORT=3306,MASTER_USER='复制用户',MASTER_AUTO_POSITION=1;

6、在所有从库上执行 start slave; 并查看状态。

?

十、设置半同步复制

默认情况下,复制是异步的,主库不知道写入操作是否到达从库,如果主库与从库间存在延迟,主库崩了,尚未到达从库的那些数据就会丢失。

为了解决这种问题,半同步复制,主库会一直等待,直到至少有一个从库接收到写入的数据。

1、在主库上,安装 rpl_semi_sync_master 插件

install plugin rpl_semi_sync_master SONAME 'semisync_master.so';

windows下请使用如下:

install plugin rpl_semi_sync_master SONAME 'semisync_master.dll';

2、确认插件已激活

select plugin_name,plugin_status from information_schema.plugins where plugin_name like '%semi%';

3、开启半同步复制并调整超时时间

set @@global.rpl_semi_sync_master_enabled=1;
set @@global.rpl_semi_sync_master_timeout=100;

4、在从库上,安装 rpl_semi_sync_slave 插件

install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';

windows下请使用如下:

install plugin rpl_semi_sync_slave SONAME 'semisync_slave.dll';

5、确认插件已激活

select plugin_name,plugin_status from information_schema.plugins where plugin_name like '%semi%';

6、在从库上,启用半同步复制,并重新启动从库IO线程

set global rpl_semi_sync_slave_enabld = 1;
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;

7、通过如下方式查看半同步状态

show status like 'rpl_semi_sync_master_clients';

查看以半同步连接到主库的客户端数量

show status like 'rpl_semi_sync_master_status';

主库在异步和半同步复制之间切换,on表示半同步,off表示异步。

(编辑:应用网_阳江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!