Linux下mysql主从同步详细配置
Linux下mysql主从同步详细配置
1.环境准备
准备两台服务器,一台主服务器(Master),另一台从服务器(Slave),然后要保证Master与Slave的版本要相同且Master不能高于Slave的版本,一般稳健的做法都是使其版本相同,因为MySQL不同版本之间的binlog(二进制日志)格式可能会不一样,最后会导致同步出现异常。
介绍先到这里,以下我们先确认两台服务器的信息:
- 主服务器(master)
IP:10.16.195.49
系统:Linux(redhat centos7 64)
mysql版本:8.0.17
同步数据库:model_slave
同步帐号:model_slave
同步密码:slave123
- 从服务器(slave)两台
IP:10.16.195.50/10.16.195.51
系统:Linux(redhat centos7 64)
mysql版本:8.0.17
同步数据库:model_slave
2.master服务器配置
1.修改主服务器配置文件
sudo vim /etc/my.cnf
[mysqld]
# 新增如下
server-id=1
log_bin=/data/mysql/mysql-bin.log
expire_logs_days=10
max_binlog_size=100M
binlog_do_db=myslave # 如果需要同时同步多个数据库,请另起一行设置binlog_do_db=需要同步的数据库名称
binlog_ignore_db=mysql # 不想同步的数据库
2.保存退出,重启服务
service mysql restart
如果启动失败,通过查看mysql启动失败的日志,从日志内容寻找解决方案。
cat /data/mysql/mysql.log | tail -30
3.查看并记住master当前二进制名和偏移量。
这个操作的目的是为了在从数据库启动后,从这个点开始进行数据的恢复。
mysql> show master status;
+---------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| mysql-bin.000002 | 155 | model_slave |mysql |
+---------------+----------+--------------+------------------+
1 row in set (0.00 sec)
4.新建用于查看的mysql帐号
mysql>
create user 'model_slave'@'%' identified by 'slave';
grant replication slave on *.* to 'model_slave'@'%';
3.slave服务器配置
1.修改从服务器配置
sudo vim /etc/my.cnf
[mysqld]
server-id=2
master-host=192.168.8.10
master-user=rep1
master-password=test123456
master-port=3306
replicate-do-db=cmdb
2.重启从服务器
service mysql restart
此时报错:mysqld: unknown variable ‘master-host=
原因是mysql5.5+版本主从复制不支持这些变量,需要在从库上用命令来设置:
mysql> CHANGE MASTER TO MASTER_HOST='192.168.8.10',
MASTER_PORT=3306,
MASTER_USER='rep1',
MASTER_PASSWORD='test123456',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=155; # 后面两个参数的值与主库保持一致
注意,server-id仍然需要在配置文件中配置,不然会和master一致,无法开启主从。
3.启动slave
mysql> slave start;
Query OK, 0 rows affected (0.04 sec)
4.查看slave的状态
show slave status\G;
如果这两项为yes,则表示成功:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
5.如果有第二台或更多从库,配置操作同样,唯一注意的是配置文件中的server-id需要保持不同。
3.同步主库已有数据到从库
主库操作:
1.停止主库数据更新操作
mysql>flush tables with read lock;
2.新开终端,生成主数据库的备份(导出数据库)
-
-–master-data:保证在dump时会记录到binlog名称和偏移值
-
-–lock-all-tables:为了数据在导出的时候没有其它新数据插入,保证一致性
mysqldump –master-data=1 –lock-all-tables=true -uroot -pmysql123 model_slave > /home/model_slave_bak_20200317.sql
3.将备份文件传到从库
scp cmdb.sql gz_admin@10.16.195.50:/home/
4、主库解锁
mysql>unlock tables;
从库操作:
1.停止从库slave
mysql>slave stop;
2.新建数据库model_slave
mysql> create database model_slave charset=utf8;
3、导入数据
[gz_admin@ops-dev ~]$ mysql -uroot -pmysql123 model_slave</home/model_slave_bak_20200317.sql
或
mysql> use myslave;
mysql> source /home/model_slave_bak_20200317.sql;
4、查看从库已有该数据库和数据
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| model_slave |
| mysql |
| performance_schema |
| test |
+--------------------+
4.测试同步
1.在master中插入一条数据
mysql> use model_slave;
mysql> INSERT INTO users(id,name,info) VALUES(1, "jack","handsom");
2.插入成功之后,稍等片刻,就可以在Slave服务器上查看到相同记录.
不成功,仔细再检查一些配置文档。
3.查看当前Slave服务器的同步状态及偏移值等信息
more /var/lib/mysql/master.info
查看Slave执行binlog文件的情况
more /var/lib/mysql/relay-log.info
5.常见问题
1.问题现象
启动slave,查看slave状态,发现报错。
有个错误IO线程在连接中, 还有一个问题就是:
Last_IO_Errno: 2061
Last_IO_Error: error connecting to master 'root@192.168.0.10:3306' - retry-time: 60 retries: 1 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
2.原因
加密方式和解密方式不一致,修改密码加密规则.进入mysql控制台
ALTER USER 'model_slave'@'%' IDENTIFIED WITH mysql_native_password BY 'slave123';
FLUSH PRIVILEGES;
3.抛出另一个问题
Last_IO_Errno: 13117
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).
4.解决方法:重启mysql服务
service mysql restart
5.进入mysql,重启slave
mysql -u root -p
start slave
show slave status\G;
成功!