CentOS 7 MySQL/MariaDB 主从复制
主从机制实现原理
(1) master 将改变记录写到binary log(二进制日志)中,这些记录叫二进制日志事件(binary log events);
(2) slave 将 master 的binary log events 拷贝到它的中继日志(relay log);
(3) slave 重做中继日志中的事件,将改变反应它自己的数据.
主从复制步骤:
1. 主数据库写入数据,会有数据变化记录
2. 有变化记录之后,将增删改的一些sql语句记录到本地的binary log中
3. 从库会一直开启一个线程
4. 通过线程去读取这个二进制日志的内容
5. 从库会将数据写入到自己的relay log日志中
6. 从库会将relay log日志中的操作转化成SQL语句
7. 通过转化的SQL语句写入到自己的数据库,主数据库和从数据库的数据就同步了
主库master(10.0.3.158)配置
1. 准备一个主服务器 master 和一个从服务器 slave
master 10.0.3.158 slave 10.0.3.161
2. 停止数据库
systemctl stop mariadb
3. 修改配置文件 my.cnf
vim /etc/my.cnf # 新增以下内容 # 注释:server-id 服务的唯一标识(主从之间都必须不同);log-bin 启动二进制日志名称为 mysql-bin [mysqld] server-id=1 log-bin=db1-logbin
4. 重启 MariaDB 服务
systemctl start mariadb
主库master(10.0.3.158)添加从库账号
1. 新建用于主从同步的用户rpw,允许登录的从库是10.0.3.161
[root@master data]# mysql -uroot -p Enter password: MariaDB [(none)]> create user 'rpw'@'10.0.3.161' identified by 'admin';
2. 给从库账号授权,说明给rpw从库复制的权限,在10.0.3.61上复制
MariaDB [(none)]> grant replication slave on *.* to 'rpw'@'10.0.3.161';
3. 检查
# 检查主库创建的复制账号 MariaDB [(none)]> select user,host from mysql.user; # 检查授权账号的权限 MariaDB [(none)]> show grants for rpw@'10.0.3.161';
4. 实现对主数据库锁表只读,防止数据写入,数据复制失败
MariaDB [(none)]> flush table with read lock;
5. 检查主库的状态,并手动记录下日志文件的文字和位置
MariaDB [(none)]> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | db1-login.000001 | 1590 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
File 是二进制日志文件名,Position是日志开始的位置.后面会在从库中用到!
6. 锁表后,一定要单独打开一个SSH窗口,导出数据库的所有数据.
[root@master ~]# mysqldump -uroot -p --all-databases > /data/db.sql
7. 确保数据导出后,没有数据插入,之后再查看主库状态
MariaDB [(none)]> show master status;
8. 将备份导出的数据 scp 至slave数据库
scp /data/db.sql root@10.0.3.161:/data/
从库slave(10.0.3.161)配置
1. 设置server-id 值并关闭binlog 功能参数,数据库的server-id在主从复制体系中是唯一的,slave的server-id不能与其他主从库不同,并且注释掉slave的binlog参数.
2. 修改slave的/etc/my.cnf
# 添加 [mysqld] server-id=2 read-only=true
3. 重启数据库
systemctl restart mariadb
4. 检查slave从数据库的各项参数
MariaDB [(none)]> show variables like 'log_bin'; MariaDB [(none)]> show variables like 'server_id';
5. 恢复主库master的数据导入到slave库
# 导入数据
MariaDB [(none)]> source /data/db.sql;
6. 配置复制的参数,从库slave连接主库master的配置
MariaDB [(none)]> change master to master_host='10.0.3.158', > master_user='rpw', > master_password='admin', > master_log_file='db1-login.000001', > master_log_pos=1401;
7. 启动从库的同步开关,测试主从复制的情况
MariaDB [(none)]> start slave;
8. 查看复制状态
MariaDB [(none)]> show slave statusG
检查主从复制是否成功,下面两个参数都是yes表示成功:
Slave_IO_Running: Yes Slave_SQL_Running: Yes
MariaDB [(none)]> show slave statusG *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.119.10 Master_User: tiger Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 1039 Relay_Log_File: slave-relay-bin.000002 Relay_Log_Pos: 537 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes
9. 最后给主库解锁,在master服务器执行
MariaDB [(none)]> unlock tables;
10. 主库master上刷新授权表
MariaDB [(none)]> flush privileges;