mysql数据库主从以及原理
主服务器负责写操作,从服务器负责复制。
主服务器需要开启一个二进制日志 二进制日志:所干的每一件事,都会记录到日志当中
从服务器:从主服务器上把biniog日志拿走。但是得在从服务器指定主服务器的地址是多少,才能在主服务器上拿走数据。 想要在主服务器上拿走日志,必须有主服务器开放的账号 并且有复制的权限。
主服务器增删改的操作写到binlog日志当中,从服务器根据主服务器提供的的账号。拿取binlog日志,到从服务器变成了relay log(日志一样,名字改了而已)进行重放()写道从服务器当中 从服务器上会开启两个进程
I/O线程:到主服务器上拉起数据的线程(取日志)
如果I/O线程出现问题:会显示no。基本上都是连接不上主服务器,可能是主服务器(master)的防火墙或(master)账号
SQL线程:进行重放(抄作业)的线程
出现问题:重放失败
例:主服务器执行create database test;语句,会被从服务器拿走执行一边(从服务器本地已经有了test数据库)。会报错,SQL进程会变no
如果创建数据库的时候执行这条语句mysql> create database if not exists HA;如果存在创建,不存在不创建。那么从服务器就不会dount
根据这两个线程出现的问题,来解决主从复制出现的问题
mysql数据库主从缺点从过多,主压力大
一种情况:
1、一个数据库有数据并添加一台实现主从关系
第一步将数据库数据导出
- mysqldump -uroot -p123456 -B (单个数据库的名称) > HA.sql
或者
- mysqldump -uroot -p123456 -A > HA.sql
再把数据传输给第二台,使他们之间的数据保持一致
- 在主服务器上开启binlog日志
[root@centos-1 ~]#vim /etc/my.cn
重启mysql
[root@centos-1 ~]# /etc/init.d/mysqld restart
mysql> grant replication slave on *.* to slave@'192.168.1.%' identified by '123456';
复制权限 账号名 允许在192.168.1.网段登录 账号密码
在从服务器上指定server-id
[root@centos-1 ~]# vim /etc/my.cnf
重启mysql
生成服务启动脚本,要不MySQL重启不了
[root@cong11 ~]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
[root@cong11 ~]# chmod +x /etc/init.d/mysqld
重启mysql
[root@centos7-2 ~]# /etc/init.d/mysqld restart
把主服务器导出的数据导入到数据库当中实现主从数据一致
[root@centos7-2 ~]# ls
HA.sql
导入
[root@centos7-2 ~]# mysql -uroot -p123456 < HA.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
启动主从复制
登录从服务器的数据库,指定主服务器
指定主服务器IP 使用salve账号 密码
mysql> change master to master_host='192.168.1.10',master_user='slave',master_password='123456';
指定主服务器IP 使用salve账号 密码
开启主从复制(主服务器开启)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
查看状态(从)
mysql> show slave status\G;
主服务器查看状态**
mysql> show master status;
如果两台服务器的 事件位置不一样主从关系就会出错
验证两台数据库是否实现主从
在主服务器进入HA数据库插入数据
mysql> use HA;
mysql> insert into student values(1,'y21');
去从服务器上查看刚插入好的数据库
mysql> select * from HA.student;