MySQL 主从复制
Replication 的原理
image
主服务器上面的任何修改都会通过自己的 I/O tread(I/O 线程)保存在二进制日志 Binary log 里面。
从服务器上面也启动一个 I/O thread,通过配置好的用户名和密码, 连接到主服务器上面请求读取二进制日志,然后把读取到的二进制日志写到本地的一个Realy log(中继日志)里面。
从服务器上面同时开启一个 SQL thread 定时检查 Realy log(这个文件也是二进制的),如果发现有更新立即把更新的内容在本机的数据库上面执行一遍。
配置 Replication
1.在主服务器上,您必须启用二进制日志记录并配置唯一的服务器ID。需要重启服务器,如果省略server-id(或将其显式设置为默认值0),则主服务器拒绝来自从服务器的任何连接。为了在使用带事务的InnoDB进行复制设置时尽可能提高持久性和一致性,应该在主服务器(master)的 my.cnf文件中使用以下配置项:
[mysqld]
log-bin=/var/log/mysql/mysql-bin
server-id=1
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
2.创建日志目录并赋予权限,重启服务
mkdir /var/log/mysql
chown mysql.mysql /var/log/mysql
systemctl restart mysqld
3.应该创建一个专门用于复制数据的用户
每个从服务器需要使用MySQL 主服务器上的用户名和密码连接到主站,例如,计划使用用户 repl 可以从任何主机上连接到 master 上进行复制操作, 并且用户 repl 仅可以使用复制的权限。
在 主服务器 上执行如下操作
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' identified by
'QFedu123!';
mysqldump -u用户名 -p密码 --all-databases --master-data=1 > dbdump.db
=1 dump文件中含有主服务器二进制日志的文件名和位置
=2 也有上面提到的信息,但是,语句是被注释的状态
4.在从服务器上使用刚才的用户进行测试连接
// my.cnf 文件
[mysqld]
server-id=2
重启
mysql -urepl -p'QFedu123!'
/导入数据/
方式一:mysql> source dbdump.db
方式二: MySQL -u -p < dbdump.db
/配置复制通道/
CHANGE MASTER TO
MASTER_HOST='10.0.122.85',
MASTER_USER='repl',
MASTER_PASSWORD='QFedu123!',
方式二必须加这两个
(MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=437;)
mysql> start slave;
Query OK, 0 rows affected (0.09 sec)
mysql> show slave status\G
输出结果中应该看到 I/O 线程和 SQL 线程都是 YES, 就表示成功。