MySQL主从数据复制
-
架构计划
192.168.67.146 master 主节点(主数据库)
192.168.67.118 slave 从数据库
主从数据库版本内容最好一致
-
修改主从数据库配置文件
主数据库配置
找到主数据库的配置文件my.cnf(或者my.ini),我的在/etc/mysql/my.cnf,在[mysqld]部分插入如下两行:
[mysqld] log-bin=mysql-bin #开启二进制日志 server-id=1 #设置server-id
然后重启数据库,可以设置一个账户用来同步两个数据库的信息
查看master状态,记录二进制文件名(mysql-bin.000002)和位置(155):
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000002 | 155 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
从数据库配置
找到从数据库的配置文件my.cnf(或者my.ini),在[mysqld]部分插入内容:
[mysqld] server-id=2 #设置server-id,必须唯一
接着重启数据库,进入MySQL会话执行同步SQL语句(需要主数据库的一个用户和主数据库ip地址)
mysql> CHANGE MASTER TO -> MASTER_HOST='192.168.67.146', -> MASTER_USER='root', -> MASTER_PASSWORD='root', -> MASTER_LOG_FILE='mysql-bin.000003', -> MASTER_LOG_POS=155; Query OK, 0 rows affected, 2 warnings (0.03 sec)
在该数据库中启动slave同步
mysql>start slave;
查看是否成功执行命令
mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.67.146 Master_User: root Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000003 Read_Master_Log_Pos: 155 Relay_Log_File: localhost-relay-bin.000002 Relay_Log_Pos: 322 Relay_Master_Log_File: mysql-bin.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 155 Relay_Log_Space: 534 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_UUID: 0041fd85-4371-11eb-92b3-000c290949eb Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 ~~ 1 row in set (0.00 sec) ERROR: No query specified
其中Slave_IO_Running: Yes Slave_SQL_Running: Yes状态需要是Yes表示成功,接下来就可以进行验证操作,比如在主master数据库的test数据库的一张表中插入一条数据,在slave的test库的相同数据表中查看是否有新增的数据即可验证主从复制功能是否有效,还可以关闭slave(mysql>stop slave;),然后再修改master,看slave是否也相应修改(停止slave后,master的修改不会同步到slave),就可以完成主从复制功能的验证了;
还可以用到的其他相关参数:
master开启二进制日志后默认记录所有库所有表的操作,可以通过配置来指定只记录指定的数据库甚至指定的表的操作,具体在mysql配置文件的[mysqld]可添加修改如下选项:
# 不同步哪些数据库 binlog-ignore-db = mysql binlog-ignore-db = test binlog-ignore-db = information_schema # 只同步哪些数据库,除此之外,其他不同步 binlog-do-db = game
-
问题解决
按照上面的配置发现
Slave_IO_Running: Connecting # 出现错误,IO线程处于正在连接状态
解决一
首先在从数据库链接登录主数据库,查看是否能够成功登录
mysql -uroot -proot -h192.168.67.146(主数据库分配的user和pwd以及主数据库的IP地址)
假如不能登录则需要关闭防火墙后重试
systemctl stop firewalld 关闭网络防火墙 systemctl disable firewalld 关闭开机自启动(永久关闭)
解决二
由于测试是使用本地虚拟机实现,我的虚拟机是使用克隆出来的两个虚拟机,所以在文件夹/var/lib/mysql下面的auto.cnf文件中server-uuid=64e8e1b7-e13e-11ea-9d5f-000c29a7b93f俩个虚拟机数据库的uuid相同所以导致一直处于Slave_IO_Running: Connecting状态,假如主从数据库中的UUID相同则将主从数据库中的auto.cnf文件删除后重新启动数据库后可以解决
解决三
由于每次数据库重启后都会导致master status发生变化,所以需要根据当前的master status来修改从数据库中的SQL同步语句