目录
- MySQL主从同步机制
- MySQL主从同步的作用
- 实现MySQL主从复制需要进行的配置:
- 前期准备
- 主服务器配置
- 从服务器配置
- 报错处理
MySQL主从同步机制
MYSQL主从同步是在MySQL主从复制(Master-Slave Replication)基础上实现的,通过设置在Master MySQL上的bin-log(使其处于打开状态),Slave MySQL上通过一个I/O线程从Master MySQL上读取bin-log日志增量信息,然后传输到Slave MySQL的relay log(中继日志)中,然后Slave MySQL的SQL线程从relay log(中继日志)中读取增量信息并翻译成SQL语言,然后应用到Slave MySQL的数据库中。这样实现了主从数据同步功能。
MySQL主从同步的作用
1、可以作为一种备份机制,相当于热备份
2、可以用来做读写分离,均衡数据库负载
实现MySQL主从复制需要进行的配置:
1.主服务器:
开启二进制日志
配置唯一的server-id
获得master二进制日志文件名及位置
创建一个用于slave和master通信的用户账号
2.从服务器:
配置唯一的server-id
使用master分配的用户账号读取master二进制日志
启用slave服务
前期准备
准备两台数据库版本一致(建议版本5.5以上)的mysql服务器
(如果是虚拟机的话可以先装好一台,然后克隆一台)
db1 192.168.64.134 主
db2 192.168.64.138 从
主服务器配置
1.修改my.cnf配置
前两行 my.cnf中默认有
[mysqld]
log-bin=mysql-bin #开启二进制日志
server-id=1 #设置server-id
# master开启二进制日志后默认记录所有库所有表的操作,可以通过配置来指定只记录指定的数据库甚至指定的表的操作
# 不同步哪些数据库(忽略mysql系统库复制)
# binlog-ignore-db = mysql
# binlog-ignore-db = test
# binlog-ignore-db = information_schema
# 只同步哪些数据库,除此之外,其他不同步
binlog-do-db=test
修改好后,重启mysql服务
MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志。
2.创建用于同步的用户账号
-- 创建用户
create user 'rep'@'192.168.64.%' identified by '12345678';
-- 授权
GRANT REPLICATION SLAVE ON *.* TO 'rep'@'192.168.64.%';
-- 说明: *.* 为所有的库和所有的表,可以自己定义某一个库里的某一个表。
-- 刷新权限
flush privileges;
查看授权信息
show grants for 'rep'@'192.168.64.%';
mysql> show grants for 'rep'@'192.168.64.%';
+---------------------------------------------------------------------------------------------------------------------------+
| Grants for rep@192.168.64.% |
+---------------------------------------------------------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'rep'@'192.168.64.%' IDENTIFIED BY PASSWORD '*84AAC12F54AB666ECFC2A83C676908C8BBC381B1' |
+---------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
3.查看主数据库(master)的状态
记下File(二进制文件名 mysql-bin.000010)以及Position(位置 107)的值,在后面进行从服务器操作的时候需要使用。
mysql> show master status ;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000010 | 107 | test | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
主从开始工作需要保证这两台服务器数据库信息一致 ,需要将master的数据库表全部备份导出,并传送到slave服务器上。有时还需要进行锁表只读的操作。但是因为我是刚创建的数据库,里面什么都没有,也就是说信息一样了。所以这一步就不用做了。
从服务器配置
1.修改my.cnf
[mysqld]
server-id=2
log-bin=mysql-bin
修改完成之后,重启mysql服务
从库默认不开启bin-log日志功能,除非做下级从库级联同步,才需开启从库的bin-log日志。
从数据库里的中继日志是默认开启的,不需要单独添加。
mysql从库中需在my.cnf配置文件中加入 read-only参数,保证从库只读。
2.执行同步sql,配置同步配置
(需要主服务器IP(或主机名),登陆凭据,二进制文件的名称和位置)
CHANGE MASTER TO
MASTER_HOST='192.168.64.134',
MASTER_USER='rep',
MASTER_PASSWORD='12345678',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000010',
MASTER_LOG_POS=107;
3.开启slave(启动同步)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
4.查看同步状态
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.64.134
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000010
Read_Master_Log_Pos: 107
Relay_Log_File: db2-relay-bin.000002
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000010
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: 107
Relay_Log_Space: 407
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
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
1 row in set (0.00 sec)
mysql>
当Slave_IO_Running和Slave_SQL_Running都为YES的时候就表示主从同步设置成功了
Slave_IO_Running 和 slave_sql_Running 必须都是Yes,有一个是NO都不行。
这两个线程非常重要。IO线程负责接收读写主服务器发来的二进制日志,将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。而sql线程是从服务器创建用于读取中继日志并执行日志中包含的更新。
报错处理
搞不定了直接 重装mysql 或 回滚 快照。
ERROR 1665(HY000)
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using passwor
应该是 已经创建过用户了,需要先刷新权限,然后删除重建用户。