高冷的菜单栏
- 安装MySQL
- 测试环境介绍
- 主从备份原理
- 在A机器中的操作
-
-
- 新建一个测试数据库zengraoli2
- 新建一个远程用户zeng
- 配置my.cnf
- 在MySQL终端查看mater信息
-
- 在B机器中的操作
-
-
- 新建数据库zengraoli
- 配置my.cnf
- 设置slava信息
-
- 进行数据测试
-
-
- 对A机器进行数据的插入
- 在B机器上查询表中数据是否更新
- 停用A机器的MySQL,再来看插入
- 所以简单下一个结论
- 为什么没有自带的哨兵模式?
-
- 一些其他需要到的命令
- 如果是另一台MySQL服务器通过克隆出来
安装MySQL
请参考网上
测试环境介绍
测试环境为centos7.5
A机器ip:10.0.8.37(主)
B机器ip:10.0.8.243(从)
MySQL版本:5.6.42
主从备份原理
主服务器数据库的每次操作都会记录在二进制日志文件mysql-bin.xxx中。从服务器的I/O线程使用专用帐号登陆到主服务器中读取该二进制文件,并将文件内容写入到自己本地的中继日志relay-log文件中。然后从服务器的SQL线程会根据中继日志中的内容执行SQL语句。
本段说明参考:https://www.cnblogs.com/ahaii/p/6307648.html
在A机器中的操作
新建一个测试数据库zengraoli2
CREATE DATABASE zengraoli2;
USE zengraoli2;
CREATE TABLE test2 ( id int not null primary key,name char(20) );

新建一个远程用户zeng
让这个用户只能操作zengraoli这个数据库的表
CREATE USER 'zeng'@'%' IDENTIFIED BY '123456';
grant all privileges on zengraoli2.* to 'zeng'@'%' identified by '123456';
GRANT REPLICATION SLAVE ON *.* TO 'zeng'@'10.0.8.243' IDENTIFIED BY '123456';
flush privileges;
在本机测试一下,看看能否用远程进行链接本地的数据库
mysql -h 10.0.8.37 -u zeng -p
正常进入,说明创建成功
配置my.cnf
修改my.cnf,
sudo vi /etc/my.cnf
找到port=3306这一行,在其下面添加如下内容
server-id=2 # 要与从库不一样
binlog-ignore-db=information_schema
binlog-ignore-db=cluster
binlog-ignore-db=mysql # 不同步哪个库 默认是全部
binlog-do-db=zengraoli2 # 只同步哪个库
expire_logs_days = 10
log-bin=mysql-bin
max_binlog_size = 100M
binlog_format = row # binlog的格式 row 具有 statement和mixed 不具备的优势 填写 row
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1 # 和 sync_binlog 组成双1 配置 保证数据的完整性
重启数据库即可生效
sudo service mysqld restart
在B机器上没有创建数据库的脚本,所以我们需要先把刚才创建的数据库导出到.sql文件中,在B中导入
在MySQL终端查看mater信息
show master status;
在B机器中的操作
新建数据库zengraoli
并导入刚才的.sql文件
CREATE DATABASE zengraoli2;
USE zengraoli2;
source zengraoli.sql;
配置my.cnf
修改my.cnf,
sudo vi /etc/my.cnf
找到port=3306这一行,在其下面添加如下内容
重启数据库即可生效
sudo service mysqld restart
设置slava信息
进入MySQL的终端,直接干
stop slave;
change master to master_host='10.0.8.37',master_user='zeng',master_password='123456',master_log_file='mysql-bin.000014', master_log_pos=120;
start slave;
master_user要指定能访问的用户名和,master_password则是密码,master_log_file、master_log_pos要对应上面master中显示的
设定完成后,用
show slave status\G;
查看当前的slave信息如下
进行数据测试
对A机器进行数据的插入
INSERT INTO `test2`(`id`, `name`) VALUES('1', 'zeng1');
INSERT INTO `test2`(`id`, `name`) VALUES('2', 'zeng2');
SELECT * FROM `test2`;
在B机器上查询表中数据是否更新
use zengraoli2;
SELECT * FROM `test2`;
看下以下两条数据,证明已经把数据复制过来了
停用A机器的MySQL,再来看插入
在A机器上执行
sudo service mysqld stop
在B中插入数据
SELECT * FROM `test2`;
重新打开A上的MySQL,进入MySQL终端,查询一下,第三条数据没有过来
所以简单下一个结论
A丢失数据这段时间,无法进行数据的插入,B机器能做的就是A机器崩的时候,可以临时顶替A,然后手工同步数据,再进行切换
为什么没有自带的哨兵模式?
是啊,为什么没有自带的哨兵模式?@MySQL
一些其他需要到的命令
进入本地MySQL之后,要删除用户dog3
use mysql;
select host,user,password from user;
delete from user where user='dog3';
即可完成删除
如果是另一台MySQL服务器通过克隆出来
那么,极有可能因为MySQL的id相同,出现以下问题
Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
方法一:修改配置文件,直接修改ID
vim /var/lib/mysql/auto.cnf
方法二:停止从库的mysqld服务,删除他的auto.cnf文件,再启动数据库服务即可
sudo service mysqld stop
mv /var/lib/mysql/auto.cnf /var/lib/mysql/auto.cnf.bak
sudo service mysqld start
vi /var/lib/mysql/auto.cnf
show slave status\G;
再看看从库的信息,可以看到恢复正常了