目录
1. 准备LInux虚拟机 ip地址为:
主ip | 192.168.3.226 |
从ip | 192.168.3.227 |
2. 分别安装mysql
参考:Linux部署Mysql8.0_率小气的博客-CSDN博客
3. 配置主从同步
3.1 主数据库配置
3.1.1 修改配置文件
vim /etc/my.cnf
[mysqld]
#数据库id,为1表示为master,其中master_id必须为1-232之间的一个正整数
server-id=1
#启动二进制日志
log-bin=mysql-bin
log-bin-index=master-bin.index
#需要同步的二进制数据库名
binlog-do-db=minishop
#不同步的二进制数据库名,如果不设置可以将其注释;
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=personalsite
binlog-ignore-db=test
#把更新的记录写到二进制文件中
log-slave-updates
3.1.2 启动、停止mysql服务
停止mysql服务:service mysqld stop
启动mysql服务:service mysqsld start
3.1.3 创建连接用户
登录mysql
创建一个用于让从数据库连接的用户:
mysql> CREATE USER 'slave'@'192.168.3.227' IDENTIFIED WITH mysql_native_password BY '123456';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.13.227';
mysql>plush privileges;
获取主节点当前binarylog文件名和位置(position)
mysql> show master status;
3.2 从数据库配置
3.2.1 修改配置文件
vim /etc/my.conf
[mysqld]
#设置server_id,注意要唯一
server-id = 2
#开启binlog,以备slave作为其他slave的master时使用
log-bin=mysql-bin
#relay_log配置中继日志
relay-log=edu-mysql-relay-bin
relay-log-index=relay-log.index
#如果需要同步函数或者存储过程
log_bin_trust_function_creators=true
log-slave-update
#如果主从库名相同,从库配置使用
replicate-do-db=kintech_pd
#如果库名不同,从库配置使用
replicate-rewrite-db = kintech_pd(主库) -> kps_common(丛库)
3.2.2 启动、停止mysql服务
停止mysql服务:service mysqld stop
启动mysql服务:service mysqsld start
3.2.3 登录mysql
执行同步命令:
mysql> stop slave;
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.3.226',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='binlog.000001',
MASTER_LOG_POS=844;
mysql> start slave;
mysql> show slave status\G;
Slave_IO_Running和Slave_SQL_Running的状态都为YES才表示同步成功!!!!
注:一般io的报错,都是server_id重复了
查看server_id的方法
show variables like 'server_id';
若有错误,可在下方查看报错信息:
至此,主从同步完成。可自行测试同步效果。
3.2.4 测试
创建数据库:
mysql> create database test;
使用数据库:
mysql> use test;
设置编码:
mysql> set names utf8;
导入数据:
mysql> source /home/data/test.sql;
确定数据表是否创建成功,即数据文件是否导入成功。
执行命令 :
mysql> show tables;
查看主从数据库下的表,是否一致。
4. 主从同步失效解决
4.1 查看主从是否同步
先查看master库
查看进程是否sleep太多
mysql> show processlist;
mysql> show master status;
+-------------------+----------+--------------+-------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+-------------------------------+
| mysqld-bin.000002 | 3260 | | mysql,test,information_schema |
+-------------------+----------+--------------+-------------------------------+
1 row in set (0.00 sec)
显示正常!
再查看slave从库
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: No
可见是slave不同步。
4.2 解决方法
4.2.1 忽略错误后,继续同步
该方法适用于主从库数据相差不大的情况,或者要求数据可以不完全统一的情况,数据要求不严格的情况
mysql> stop slave;
CHANGE MASTER TO
MASTER_HOST='192.168.3.266',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=3260;
set global sql_slave_skip_counter =1;
start slave;
show slave status\G;
查看信息:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
OK,现在主从同步状态正常了!!!
4.2.2 重新做主从,完全同步
该方法适用于主从数据相差较大,或者要求数据完全统一的情况
解决步骤如下:
- 首先进入主库,进行锁表,防止数据写入,使用命令:
mysql> flush tables with read lock;
注意:该处是锁定为只读状态,数据不区分大小写
- 进行数据备份
把数据备份到mysql.bak.sql文件
命令:mysqldump -uroot -p密码 -hlocalhost > mysql.bak.sql
注意:数据库备份一定要定期进行,可以使用shell脚本或者python脚本,确保数据万无一失。
- 查看master状态
mysql> show master status;
+-------------------+----------+--------------+-------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+-------------------------------+
| mysqld-bin.000003 | 4863 | | mysql,test,information_schema |
+-------------------+----------+--------------+-------------------------------+
1 row in set (0.00 sec)
- 把mysql备份文件复制到从数据库机器,进行数据恢复
使用命令:scp mysql.bak.sql root@192.168.3.227:/tmp/
- 停止从库状态 mysql> stop slave;
- 然后登录从库数据库执行mysql命令,导入备份数据
mysql> source /tmp/mysql.bak.sql
- 根据上面主从步骤重新同步
- 最后执行解锁,命令:unlock tables
以上基本可以解决主从问题,如有问题,大家可相互讨论,论证!!!