MySQL可以通过两种方式配置主从复制
ps:在搭建MyCAT读写分离,主从切换,必须先搭建好MySQL主从复制
搭建环境说明:
主机信息 | ip地址 | 说明 |
---|---|---|
itcast-01 | 192.168.79.130 | 装载mysql5.7x版本,用于master主服务 |
itcast-02 | 192.168.79.131 | 装载mysql5.7x版本,用于slave从服务 |
binary log的核心是事件(event)。基本原理是:主服务器把所有对数据库的操作(例如update、delete,create等)作为一个事件,当有事件产生,就把它们写入到对应的binary log中,每个事件都对应一个位置(可以理解这个位置就是事件的编号)。然后从服务器读取主服务器中的日志文件来获取主服务产生的事件(把这些日志保存到从服务器本地的relay-log中),从而把主服务的数据库操作在从服务器中重复执行一次,达到数据复制的目的。
由于一切操作都是基于binary log,因此主服务器必须开启log-bin选项,另外,主从服务器都必须分配一个唯一的server-id。
第一步:修改my.cnf文件:
在[mysqld]段下添加:
#mysql主从复制配置
#指定需要同步的数据库,如果需要同步所有库就注释
binlog-do-db=kevin
#忽略同步的数据库
binlog-ignore-db=mysql
#启用二进制日志
log-bin=mysql-bin
#服务器唯一ID,一般取IP最后一段
server-id=130
第二步:重启mysql服务
service mysqld restart
第三步:建立帐户并授权slave,确保账户能在主机登录
mysql>GRANT FILE ON . TO ‘root’@’%’ IDENTIFIED BY ‘123456’;
第四步: 授予Slave复制权,账户信息要在从机配置执行同步操作
mysql>GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . to ‘root’@’%’ identified by ‘123456’;
刷新权限
mysql> FLUSH PRIVILEGES;
第五步:锁表,将数据库锁住,仅仅允许读,以保证数据一致性;
mysql> flush tables with read lock;
mysql> FLUSH PRIVILEGES;
#注意,锁定后,如果自己同步对方数据,同步前一定要记得先解锁!
解锁: mysql> unlock tables;
第六步: 查看主节点的master复制信息,获取日志的名称和位置信息
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 | 2071 | kevin | mysql | |
+------------------+----------+--------------+------------------+-------------------+
第一步:修改my.cnf文件
[mysqld]
server-id=166
第二步:配置从服务器,把主服务器的相关信息设置给从服务器
mysql>change master to master_host=‘192.168.79.130’,master_port=3306,master_user=‘root’,master_password=‘123456’,master_log_file=‘mysql-bin.000004’,master_log_pos= 2071
注意语句中间不要断开,master_port为mysql服务器端口号(无引号),master_user为执行同步操作的数据库账户,master-log-pos中配置的主服务器最后一步position的值,master_log_file中配置的就是主服务器最后一步file对应的值。
第三步:启动从服务器复制功能
Mysql>start slave;
第四步:检查从服务器复制功能状态
mysql> show slave status 或 show slave status/G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.79.130
Master_User: backup
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 2071
Relay_Log_File: itcast-02-relay-bin.000005
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
.....
Last_Errno: 0
Last_Error:
.....
Replicate_Ignore_Server_Ids:
Master_Server_Id: 130
Master_UUID: e11b3edf-5547-11ea-bb60-000c29abaa7c
Master_Info_File: /usr/local/mysql/data/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
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
通过上面的信息,可知主从复制环境已经OK(Slave_IO_Running和Slave_SQL_Running状态均为YES)
注意:
首先要确定master服务配置my.cnf上指定同步数据库名称binlog-do-db=kevin;如果创建其它数据库,则无法进行主从同步;
在master主节点上操作,创建数据库和表
mysql> unlock tables;
mysql> CREATE DATABASE kevin CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql> use kevin;
Database changed
mysql> create table if not exists haha (id int(10) PRIMARY KEY AUTO_INCREMENT,name varchar(50) NOT NULL);
在slave节点上,查看数据库信息
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db2 |
| db3 |
| kevin |
| mysql |
| performance_schema |
| sys |
+--------------------+
7 rows in set (0.00 sec)
从slave数据库已经同步master数据库操作,双向都有kevin数据库和表