Mysql数据库主从同步实例(亲测)

10 篇文章 0 订阅
3 篇文章 0 订阅

今天来测试下数据的主从同步,前提是两台服务器均要下载安装mysql,具体的安装步骤可以参考之前的文章:CentOS安装magento2.x教程

名称IP
msyql-master(主库192.168.204.130
mysql-slave(从库)192.168.204.151
开启时间同步
关闭防火墙
#两台都要修改
systemctl stop firewalld
setenforce 0
getenforce
修改hosts文件
#两台都要修改
 
vi /etc/hosts
192.168.204.130 master
192.168.204.151 slave
主master
yum install ntp -y
vim /etc/ntp.conf
 
#注释掉server0、server1、server2、server3
#添加以下两行
 
server 127.127.1.0
fudge 127.127.1.0 stratum 10
启动
systemctl enable ntpd
systemctl start ntpd
从slave
yum install ntpdate -y
ntpdate master
systemctl enable ntpdate
配置主库

主master
先查找数据库配置文件my.cnf

[root@docker ~]# whereis my.cnf
my: /etc/my.cnf

在[mysqld]加入下面的内容:

#添加以下内容
 
server-id = 11
log-bin = master-bin
log-slave-updates = true
# binlog记录内容的方式,记录被操作的每一行
binlog_format = ROW
# 减少记录日志的内容,只记录受影响的列
binlog_row_image = minimal
# 指定需要复制的数据库名为jgyw
binlog-do-db = '需要同步的数据库'

重启MySQL

systemctl restart mysqld
或 
systemctl restart mysql.service 

登录数据库

mysql -uroot -p123456
grant replication slave on *.* to 'root'@'192.168.204.151' identified by '123456';
flush privileges;
show master status;

如下图:
在这里插入图片描述

从slave
vi /etc/my.cnf
 
#添加以下内容
 
server-id = 22
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
# binlog记录内容的方式,记录被操作的每一行
binlog_format = ROW
# 减少记录日志的内容,只记录受影响的列
binlog_row_image = minimal
# 指定需要复制的数据库名为jgyw
replicate-do-db = '需要同步的数据库'
修改好配置文件,重启mysql服务
systemctl restart mysqld
或 
systemctl restart mysql.service 
执行同步命令

mysql的终端执行:

change master to master_host='192.168.204.130',master_user='root',master_password='123456',master_log_file='master-bin.000004',master_log_pos=154;
start slave;

master_log_pos: 主库的读写步数,进入主库查询命令:

mysql> show master status;
 
+------------------+----------+--------------+------------------+-------------------+
| File       | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000005 |   158 |       |         |          |
+------------------+----------+--------------+------------------+-------------------+
查看从库的状态

mysql的终端执行:

show slave status\G;
链接数据库失败
[root@docker ~]# mysql -uroot -p
Enter password: 
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

解决:找到数据库配置文件my.cnf,注释并修改以下内容
在这里插入图片描述

主从状态出错

1.查看从库同步状态:

Last_IO_Error: 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.

2、查看主从的server_id变量
master_mysql> show variables like ‘server_id’;
±--------------±------+
| Variable_name | Value |
±--------------±------+
| server_id | 33 |
±--------------±------+

slave_mysql> show variables like ‘server_id’;
±--------------±------+
| Variable_name | Value |
±--------------±------+
| server_id | 11 |
±--------------±------+
– 从上面的情形可知,主从mysql已经使用了不同的server_id

解决
第一种错误:
Slave_IO_Running: No
Slave_SQL_Running: Yes

找到data文件夹下的auto.cnf文件,修改里面的server_uuid值,保证各个db的server_uuid不一样,重启db即可。
找出auto.cnf

find / -name 'auto.cnf'

然后修改里面的server-uuid的值,也可以直接删掉文件,然后重启mysql也会自动生成!

[root@docker ~]# mv /usr/local/mysql/var/auto.cnf  /usr/local/mysql/var/auto.cnf.bk
[root@docker ~]# systemctl restart mysqld

再次查看主从状态:

mysql> show slave status\G;

可以看到已经正常了!!!
在这里插入图片描述

第二种错误:表示slave不同步
Slave_IO_Running: Yes
Slave_SQL_Running: No

在这里插入图片描述

解决方法一(忽略错误,继续同步):

1、先停掉slave

mysql> stop slave;

2、跳过错误步数,后面步数可变

先查询步数:
show slave status\G;
...
Read_Master_Log_Pos: 2493
...
mysql> set global sql_slave_skip_counter=2493;#这里的步数为Read_Master_Log_Pos

3、再启动slave

mysql> start slave;

4、查看同步状态

mysql> show slave status\G;
...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
解决方法二(重新做主从,完全同步):

1、先进入主库进行锁表,注意窗口不要关闭

mysql> flush table with read lock;

2、把数据进行备份

mysqldump -uroot -p --opt -R 数据库 > /data/bak.sql

3、再新开个窗口,查看主数据库信息

mysql> show master status;
 
+------------------+----------+--------------+------------------+-------------------+
| File       | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000005 |   158 |       |         |          |
+------------------+----------+--------------+------------------+-------------------+

4、在从库上停止slave

mysql> stop slave;

5、导入备份的数据文件

mysql> source /data/bak.sql

6、重置同步

mysql> reset slave;

7、重新设置同步节点

change master to master_host='192.168.204.130',master_user='root',master_password='123456',master_log_file='master-bin.000004',master_log_pos=158;

host,port,user,password请根据你的主库设置相应修改,log_file和log_pos根据主库中master status相应修改。

8、开启slave

mysql> start slave;

9、查看slave状态

mysql> show slave status\G;

5.配置完成
在这里插入图片描述

测试同步效果

如果主库已经有了待同步数据库,而从库没有,那么在变更’需要同步的数据库’时会报错,报错信息Last_SQL_Error如下:

Last_SQL_Error: Error 'Unknown database 'amazon'' on query. Default database: 'amazon'...

这样一来我们就需要把主库的数据事先先导一份到从库,然后再进行主从同步!

1.查看再主库创建数据库
create schema amazon;
2.查看从库数据
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
9 rows in set (0.00 sec)
3.在主库下创建一个表并插入一条数据
mysql> use amazon;
Database changed

mysql> CREATE TABLE amazon (id varchar(200) NOT NULL ,name varchar(1024) DEFAULT NULL,description varchar(2000) DEFAULT NULL,PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into amazon(id, name, description) values('1', 'Thomas', '测试主从同步');
Query OK, 1 row affected (0.01 sec)
4.在从库上查看结果,即:
mysql> show schemas;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| amazon             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

可以看到amazon数据库已经同步到从库了

5.校验下从库表数据
mysql> show tables;
+------------------+
| Tables_in_amazon |
+------------------+
| amazon           |
+------------------+
1 row in set (0.00 sec)

mysql> select * from amazon;
+----+--------+--------------------+
| id | name   | description        |
+----+--------+--------------------+
| 1  | Thomas | 测试主从同步       |
+----+--------+--------------------+
1 row in set (0.00 sec)

看到以上结果说明数据已经同步过来了!

如果觉得我的文章对您有帮助,欢迎关注,点赞评论!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值