mysql主从复制
描述:MySQL数据库的主从复制方案,是其自带的功能,并且主从复制并不是复制磁盘上的数据库文件,而是通过binlog日志复制到需要同步的从服务器上。
MySQL数据库支持单向、双向、链式级联,等不同业务场景的复制。在复制的过程中,一台服务器充当主服务器(Master),接收来自用户的内容更新,而一个或多个其他的服务器充当从服务器(slave),接收来自Master上binlog文件的日志内容,解析出SQL,重新更新到Slave,使得主从服务器数据达到一致。
好处:在生产环境中,MySQL主从复制都是异步的复制方式,即不是严格的实时复制,但是给用户的体验都是实时的。
MySQL主从复制集群功能使得MySQL数据库支持大规模高并发读写成为可能,且有效的保护了服务器宕机的数据备份。
主从复制实现原理
三步:
- master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
- slave将master的binary log events拷贝到它的中继日志(relay log);
- slave重做中继日志中的事件,将改变反映它自己的数据。
操作步骤
1. 进行主库配置
设置server-id以及log-bin日志启动
```shell
# 寻找配置文件位置,如果是自己设置就是你的启动my.ini或者my.conf.
# 否则则在/etc/my.conf类似的位置
# 找[mysqld]的配置内容
[mysqld]
# 设置主从库标识符,主从要不一样
server-id=1
# 设置开启binlog日志,名称为mysql-bin
log-bin=mysql-bin
# 最后记得重启mysql
# 自己开的mysql的话,进入mysql运行shutdown就可以停止服务
mysqld_safe --defaults-file=/opt/mysql8/conf/my.conf &
# yum或者apt安装,运行重启命令就行
systemctl restart mysql
```
如何去检查
# 重新启动后,跑服务器检查两个配置是否成功,注意log_bin为NO才是已启动
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 3306 |
+---------------+-------+
1 row in set (0.00 sec)
创建普通用户登录主库
一般不使用root用户进行主从同步
# 进入数据库,这个不过多提及
mysql -uroot -p
# 进入mysql数据库,在user表里创建新用户(特别注意,ip一定要是从库能登录的ip)
use mysql;
create user 'chaoge'@'192.168.178.130' identified by 'redhat';
# 然后给赋予复制权限(切记一定要在创建之后直接给权限,不然不能临时授权。得删用户重新创建)replication slave复制权限
grant replication slave on *.* to 'chaoge'@'192.168.178.130';
验证是否成功
-- 主库检查账户是否存在
select user,host from mysql.user;
-- 检查账户权限
show grants for chaoge@'192.168.178.130';
-- 进入从库服务器进行登录
mysql -uchaoge -p -h '主库ip'
检查binlog状态,并锁表导出数据
-- 检查主库的状态
show master status;
切记这两个值,要在从库当中使用,确保初始数据一致
-- 导出数据,直接导出整个数据库备份,这样从库数据和主库完全一致
-- 1. 锁表,保证状态不发生改变(sql)
flush table with read lock;
-- 2. 进入命令行导出数据(新建一个ssh连接)
mysqldump -uroot -p --all-databases > /tmp/all.sql
-- 3. 解锁(sql)
unlock tables;
2. 接下来全部都是从库配置了。
注意确保从库能通过刚才的用户登录数据库
先把数据取过来,然后导入备份数据库
# scp把数据复制来
scp root@主库ip:文件位置 /opt/
# 进行数据库数据导入(注意文件名别打错了)
mysql -uroot -p < /opt/all.sql
# 也可以在sql当中使用 source /opt/all.sql进行导入
# 有可能数据导入报错的话,检查两边数据库的数据编码!
这个导数据基本不会有大问题。注意后面的配置
配置server-id以及log-bin日志
找到配置文件的位置,设置一个和主库不同的server-id以及关闭log-bin日志
# 找到配置文件位置进行编辑
vim /etc/my.cnf
# 修改的内容为
[mysqld]
server-id=3
# 注释掉binlog参数关闭log-bin日志(这个在8.0好像开着也行,所以问题不大)
记得验证一下server-id与主库不同
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 3 |
+---------------+-------+
1 row in set (0.00 sec)
进行主从配置
注意确保可以通过主库创建的用户连接主库数据库(~重要的事情说三遍)
-- 去找到在主库运行show master status;得到的文件和位置。要用
-- 配置连接
mysql > change master to master_host='192.168.178.129',
master_user='chaoge',
master_password='redhat',
master_log_file='mysql-bin.000001',
master_log_pos=575;
报错警告
一般情况能成功最好,但是也会有报错的时候,记录一下
-
给我看懵了,先去找找报错日志
-
笑死,根本看不懂,去搜索引擎帮忙,这个问题给了个解决方案(感谢大佬)
-- 去数据库运行 RESET SLAVE; -- 然后再运行上方配置 好家伙成功了 mysql > change master to master_host='192.168.178.129', master_user='chaoge', master_password='redhat', master_log_file='mysql-bin.000001', master_log_pos=575;
从库启动备份和检查
-- 启动从库备份功能
start slave;
-- 查看状态
SHOW SLAVE STATUS\G
start报错的话一点点往上面查查哪里错了。
状态注意注意这两个参数的成功(意味着成功开了两个线程进行备份)
- 把binlog日志拿过来进行数据复制,将日志写入自己的中继日志(把日志拷过来)
- 运行中继日志以保证数据一致
结束语
到这就完成了mysql的主从备份,参考于文档
https://www.cnblogs.com/pyyu/p/9276851.html