暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL主从数据库配置详情,与坑周旋几个回合,尚未出坑。

原创 大道成佛 2021-11-17
1330

大家好,我是MySQL的小白,接触MySQL已经好多年了,但是自己手把手在Linux环境搭建(主从)还是第一次,本以为很简单的事情,让我已经鼓捣了3天了,接下来让我们一起来拯救这MySQL主从坑坑相连的三天。

MySQL主从搭建前,我首先学习了一下MySQL主从的内部原理,由于业务需求(业务>技术,从而促进技术发展),MySQL的主从需求:由于目前分布式的各种大爆发,MySQL需要与Oracle一样,具有构建大型、高性能的应用场景为基础。如何实现:MySQL主从是通过将(master)数据复制到另一台主机(slave)上,并重新执行一边(master)上的sql来实现的,

复制过程中一个服务器充当主服务器(master),而一个或多个其它服务器充当从服务器(slave)。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。

Mysql支持那些复制
1、基于语句的复制: 在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。一旦发现没法精确复制时,会自动选着基于行的复制。
2、基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍. 从mysql5.0开始支持
3、混合类型的复制: 默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。

Mysql复制能解决的问题
1、数据分布 (Data distribution )
2、负载平衡(load balancing)
3、数据备份(Backups) ,保证数据安全
4、高可用性和容错行(High availability and failover)
5、实现读写分离,缓解数据库压力

image.png
如上图所示:
Mysql复制过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
第二部分就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。

Mysql复制的模式
1、主从复制:主库授权从库远程连接,读取binlog日志并更新到本地数据库的过程;主库写数据后,从库会自动同步过来(从库跟着主库变);
2、主主复制(一带而过啊)。

了解完原理,着手开始干…
搭建虚拟机环境,采用的是手头有的Redhat 6.5版本的Linux,MySQL采用的是mysql 5.6.29版本。

master:192.168.226.101
slave:192.168.226.102

搭建好系统后,将MySQL安装版进行安装(主从都一样,装就完了):

rpm -ivh mysql-client-5.6*
rpm -ivh mysql-devel-5.5*
rpm -ivh mysql-server-5.6*
rpm -ivh mysql-shared-5.6*
rpm -ivh mysql-test-5.6*

安装好MySQL软件后:

1、需要关闭系统自带的selinux:service iptables stop;

2、互ping都能通;

3、同步前需要保持(主从)数据一致。

主从复制开始配置:

配置my.cnf文件:

server-id=1 #数据库唯一ID,主从的标识号绝对不能重复。
log-bin=/var/lib/mysql/binlog #开启bin-log,并指定文件目录和文件名前缀
binlog-do-db=test #需要同步的数据库。如果是多个同步库,就以此格式另写几行即可。如果不指明对某个具体库同步,就去掉此行,表示同步所有库(除了ignore忽略的库)。
binlog-ignore-db=mysql #不同步mysql系统数据库。如果是多个不同步库,就以此格式另写几行;也可以在一行,中间逗号隔开。
sync_binlog = 1 #确保binlog日志写入后与硬盘同步
binlog_checksum = none #跳过现有的采用checksum的事件,mysql5.6.5以后的版本中binlog_checksum=crc32,而低版本都是binlog_checksum=none
binlog_format = mixed #bin-log日志文件格式,设置为MIXED可以防止主键重复。

在主库上开始创建同步账号:
创建用户:
1、create user ‘mysql02’@‘192.168.226.102’ identified by ‘test’;
用户授权:
2、grant replication slave,replication client on . to’mysql02’@‘192.168.226.102’;
提交生效:
3、flush privileges;
检查授权:
4、show grants;

检查主服务器数据库master状态(注意file,position):
show master status;

±-----------------±---------±-------------±-----------------±------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
±-----------------±---------±-------------±-----------------±------------------+
| binlog.000001 | 120 | test | mysql | |
±-----------------±---------±-------------±-----------------±------------------+
1 row in set (0.00 sec)

主库导出数据前需要锁表操作:

flush tables with read lock;

导出主库数据:

1、mysqldump -uroot test -p123456 >/opt/test.sql

拷贝至从库本地:

2、rsync -e “ssh -p22” -avpgolr /opt/test.sql 192.168.226.102:/opt/

下面是从库(slave)配置:

配置my.cnf文件:

server-id=2 #设置从服务器id,必须于主服务器不同
log-bin=/var/lib/mysql/binlog #启动MySQ二进制日志系统
replicate-do-db=test #需要同步的数据库名。如果不指明同步哪些库,就去掉这行,表示所有库的同步(除了ignore忽略的库)。
replicate-ignore-db=mysql #不同步mysql系统数据库
slave-skip-errors = all #跳过所有的错误错误,继续执行复制操作

导入数据至从库:

1、mysql>use test;
mysql>source /opt/test.sql;

关闭slave:

2、stop slave;

配置slave同步参数

3、change master to
master_host=‘192.168.226.101’,
master_user=‘test’,
master_password=‘test@123’,
master_log_file=‘binlog.000001’,
master_log_pos=120;

打开slave:

4、start slave;

检查同步状态:

show slave status \G;

本来以上操作完成后,主从部署就完成了…

事与愿违,我遇到了报错:

1、[ERROR] Failed to open the relay log ‘./dong-relay-bin.000002′ (relay_log_pos 1067)

2、[ERROR] Could not find target log during relay log initialization

3、[ERROR] Slave I/O: error connecting to master ‘test@192.168.226.101:3306’ - retry-time: 60 retries: 1, Error_code: 2003

我尝试重新配置过主从的my.cnf文件,也将从库MySQL卸载重装过,至今第3个报错还有,没解决主从搭建…

知识分享到此结束,

请路过的大神,多多指点迷津,不胜感谢!

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论