今天来测试下数据的主从同步,前提是两台服务器均要下载安装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)
看到以上结果说明数据已经同步过来了!
如果觉得我的文章对您有帮助,欢迎关注,点赞评论!!