MySQL之间数据复制的基础是二进制日志文件。MySQL数据库一旦启用二进制日志后,作为Master,它的数据库中所有操作都会以事件的方式记录在二进制日志中,其他数据库作为Slave通过一个I/O线程与主服务器保持通信,并监控Master的二进制日志文件的变化,如果发现Master二进制日志文件发生变化,则会把变化复制到自己的中继日志中,然后Slave的一个SQL线程会把相关的事件执行到自己的数据库中,以此实现从数据库和主数据库的一致性,也就实现了主从复制。
名称 | IP | 系统 | 端口 | 版本 |
---|---|---|---|---|
Master(主数据库) | 192.168.10.175 | CentOS6.10 | 3306 | MySQL 5.6.45 |
Slave(从数据库) | 192.168.10.176 | CentOS6.10 | 3306 | MySQL 5.6.45 |
Slave(从数据库) | 192.168.10.177 | CentOS6.10 | 3306 | MySQL 5.6.45 |
1.主从服务器安装MySQL数据库
yum -y install mysql*
2.修改MySQL数据库密码
service mysqld restart
mysql -u root -proot
use mysql;
set password for root@localhost = password('root');
3.配置主数据库(Master)
vim /etc/my.cnf
[mysqld]
# 添加以下内容
# 启用二进制日志
log-bin=mysql-bin
# 服务器唯一ID,默认是1,这里用的是IP最后一位
server-id=175
4.配置从数据库(Slave)
vim /etc/my.cnf
[mysqld]
# 添加以下内容
# 启用二进制日志
log-bin=mysql-bin
# 服务器唯一ID,默认是1,这里用的是IP最后一位
server-id=176
# 每个对应的数据库都需要修改,修改成server-id=IP
5.重启主从数据库
service mysqld restart
mysql -u root -proot
use mysql;
--操作的权限
grant all privileges on *.* to 'root'@'192.168.10.110' identified by 'root' with grant option;
6.在主数据库上建立帐户并授权(Slave)
update user set password=password('root') where user='root' and host='root' or host='localhost';
flush privileges;
grant replication slave on *.* to 'root'@'192.168.10.176' identified by 'root';
grant replication slave on *.* to 'root'@'192.168.10.177' identified by 'root';
# 刷新主从数据库的授权权限
flush privileges;
--参数解释:
-h : 指定客户端所要登录的MySQL主机名, 登录本机(localhost 或 127.0.0.1)该参数可以省略;
-u : 登录的用户名;
-p : 告诉服务器将会使用一个密码来登录, 如果所要登录的用户名密码为空, 可以忽略此选项。
-REPLICATION SLAVE :分配复制权限
-*.* : 可以操作那个数据库
-root : 用户名
-'%' : 可以在所有的电脑上使用这个账号和密码登录
7.登录主数据库,查询Master的状态
show master status;
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 | 106 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
8.配置从数据库(Slave)
stop slave;
# 每个从数据库都需要配置
change master to master_host="192.168.10.175", master_user="root", master_password="root", master_log_file="mysql-bin.000004", master_log_pos=106;
flush privileges;
start slave;
--参数解释:
-master_host : 设置要连接的主数据库的IP地址
-master_user : 设置要连接的主数据库的用户名
-master_password : 设置要连接的主数据库的密码
-master_log_file : 设置要连接的主数据库的bin日志的日志名称(show master status);
-master_log_pos : 设置要连接的主数据库的bin日志的记录位置(show master status)(这里注意,最后项不需要加引号。否则配置失败)
9.检查从数据库复制功能状态
show slave status\G;
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.10.176
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 106
Relay_Log_File: mysqld-relay-bin.000004
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000004
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: 106
Relay_Log_Space: 552
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0 #这个不能用来作为主从延迟的判断标准, 0不完全代表从数据库已经追上了主数据库,有可能是网络中断,但是超时时间还没有到,从数据库没有发现。
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)
--参数解释:
-Slave_IO_Running=Yes
-Slave_SQL_Running=Yes
--如果都是Yes,则说明配置成功
--注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。
--从库:Last_SQL_Errno: 1008
--将同步指针向下移动一个,可以重复操作
-stop slave;
-set global sql_slave_skip_counter=1;
-start slave;
-show slave status\G;
1.主从数据库测试:
在主数据库(Master),建立数据库,并在这个库中建表增删修改数据
create database cluster;
use cluster;
create table user(id int(3),name char(10));
insert into user values(001,'SERE');
insert into user values(002,'Tom');
insert into user values(003,'Luck');
delete from user where id='2';
update user set name='Lilei' where id='1';
show databases;
show tables;
select * from user;
2.在从数据库(Slave)查询
show databases;
use cluster;
show tables;
select * from user;