首页 > 编程知识 正文

MySQL主从,mysql双主键问题

时间:2023-05-06 21:16:34 阅读:21660 作者:999

1 .主从复制

1.1原理

主库打开xldxhlog功能,并允许库连接到主库。 通过change master从库中获取有关主库的同步信息,并连接到主库进行验证。 主库IO线程根据库slave线程的请求,从master.info开始记录的位置开始向下检索信息,同时将检索到的位置和最新的位置与xldxhlog信息一起发送到库IO 这样就完成了整个同步过程,然后无限地重复上述过程。

1.2作用

1 )辅助备份

2 )高可用性、双重主从

3 )分担负荷,分离读写

2 .主从复制部署

2.1主库创建授权用户repl

mysqlgrantreplicationslaveon *.* to repl @ ' 10.0.0.% ' idnetifiedby ' 123456 ';

2.2准备工作(对于新环境,省略此步骤; 如果主库中运行了一段时间,则必须将主库中的数据备份到从库中。)

主库的备份

[ root @ master~] # mysqldump-a-- master-data=2- p/tmp/full1. SQL

从库中恢复

[ root @ backup~] # scp 172.16.1.1023360/tmp/full.SQL/tmp

mysql set sql_log_xldxh=0;

mysql source /tmp/full.sql;

2.3打开主库xldxhlog

[root@master ~]#vim /etc/my.cnf

log _ xld xh=/data/MySQL/MySQL-xld xh

xldxhlog_format=row

[ root @ master~~ ] #/etc/init.d/mysqld restart

2.4建立库到主库的连接

mysqlCHANGE MASTER TO

MASTER_HOST='172.168.1.102 ',

MASTER_USER='repl ',

MASTER_PASSWORD='123456 ',

MASTER_PORT=3306,

master _ log _ file=' MySQL-xld xh.000002 ',

MASTER_LOG_POS=656;

2.5从库中复制

mysql start slave;

2.6检查

mysql show slave statusG;

Slave_IO_Running: Yes

slave _ SQL _ running :是

注意:只有所有的是会成功; 否则就会失败。

3.Gtid主从复制

3.1概述

gID是基于原始mysql服务器生成并成功执行的全局事务ID,是服务器ID和事务ID的组合。 此全局事务ID不仅对于原始服务器是唯一的,对于所有依赖关系的mysql服务器也是唯一的。 这些特性简化了mysql主从机的复制,并使数据库更加一致可靠

3.2概念

1 )全局事务id )全局事务标识符。

2 ) GTID是1对1对应于一个事务且全局唯一的ID。

3 )在一台服务器上只运行一次GTID,避免重复运行导致的数据混乱和主控不一致。

4 )使用GTID代替传统的复制方法,不再使用MASTER_LOG_FILE MASTER_LOG_POS打开复制。 而是使用MASTER_AUTO_POSTION=1开始复制。

5 ) MySQL-5.6.5开始支持是在MySQL-5.6.10或更高版本开始改进。

6 )在以往的slave侧,xldxhlog可以不打开,但在GTID中slave侧的xldxhlog必须打开,以记录执行的GTID为目的。

3.3好处

1 )更容易实现failover,不再需要像以前那样查找log_file和log_pos

2 )更方便地制作主从副本

3 )比传统复制更安全

4 ) GTID连续无空洞,保证数据一致性,零丢失

3.4工作原理

1 )在主库端执行和提交单个事务时,将生成GTID并将其记录在xldxhlog日志中

2 )将xldxhlog转发到slave,存储到slave的relaylog中后,读取此GTID的GTID_next变量,将下一个执行的GTID值传递给slave。

3 ) sql线程从relay log获取GTID,并比较slave端的xldxhlog中是否存在该GTID

4

)如果有记录,说明该GTID的事务已经执行,slave会忽略

5)如果没有记录,slave就会执行该GTID事务,并记录该GITD到自身的xldxhlog,在读取执行事务前会先检查其他的session持有        GTID,确保不被重复执行。

6)在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描

4.部署gtid主从复制

4.1清理环境

rm -rf /application/myql/data/*

4.2构建主从环境

----------master节点----------

vim /etc/my.cnf

[mysqld]

basedir=/application/mysql

datadir=/application/mysql/data

server-id=1      #同一个复制拓扑中的所有服务器的id号必须唯一

log-xldxh=mysql-xldxh

socket=/tmp/mysql.sock

xldxhlog-format=ROW    #二进制日志格式,强烈建议为ROW

gtid-mode=on    #启用gtid类型,否则就是普通的复制架构

enforce-gtid-consistency=true     #强制gtid的一致性

log-slave-updates=1    #slave更新是否记入日志

skip-name-resolve

[client]

socket=/tmp/mysql.sock

----------slave1----------

vim /etc/my.cnf

[mysqld]

basedir=/application/mysql

datadir=/application/mysql/data

server-id=2

xldxhlog-format=ROW

gtid-mode=on

enforce-gtid-consistency=true

log-xldxh=mysql-xldxh

log_slave_updates = 1

socket=/tmp/mysql.sock

skip-name-resolve

[client]

socket=/tmp/mysql.sock

----------slave2----------

vim /etc/my.cnf

[mysqld]

basedir=/application/mysql

datadir=/application/mysql/data

server-id=3

xldxhlog-format=ROW

gtid-mode=on

enforce-gtid-consistency=true

log-xldxh=mysql-xldxh

log_slave_updates = 1

socket=/tmp/mysql.sock

skip-name-resolve

[client]

socket=/tmp/mysql.sock

4.3初始化master、slave所有节点,并启动

/application/mysql/scripts/mysql_install_db --basedir=/application/mysql --datadir=/application/mysql/data --user=mysql

/etc/init.d/mysqld start

4.4master节点授权用户repl

mysql> gant replication slave on *.* to repl@'10.0.0.%' identified by '123456';

4.5slave节点创建与master节点的连接

mysql> change master to

>master_host='172.16.1.102',

>master_user='repl',

>master_password='123456',

>master_auto_position=1;

4.6slave节点开启复制

mysql> start slave;

4.7slave节点查看状态

mysql> show slave statusG;

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。