MySQL/MariaDB主从复制教程

前言

自己的网站前几天遭遇了cc攻击,才考虑到数据库及时备份的重要性,数据库更新比较频繁的情况下,每日定时备份可没办法应对突发情况,自然想到了主从复制,学着弄了下,正好也总结一下自己在生产环境操作的过程,以便日后再用。

主从复制机制实现原理:

正文

一、前提

  • 两台安装有mysql/mariadb的服务器,一台为master,一台为slave。
  • 主(master)机需要开放相应的数据库端口,默认3306;
  • 主从复制,顾名思义从master机到slave机的单向同步,这点明白即可。

二、master机配置

编辑mysql配置 vim my.cnf ,my.cnf位置自行确定,确保以下配置存在:

1
2
3
[mysqld]
log-bin=mysql-bin #[必须]启用二进制日志
server-id=1 #[必须]服务器唯一ID,默认是1

保存配置后重启mysql,通过ssh进入mysql命令行

1
mysql -uroot -p密码

新建slave用户,指定对应slave机ip和设置密码,并刷新权限,后面会用到

1
2
GRANT REPLICATION slave ON *.* to 'slave_user'@'slave机IP' identified by '自定义密码';
flush privileges;

重启mysql后再次进入mysql命令行,查看master状态

1
show master status;

看到File以及Position,说明bin-log是在运行的,记录其中的 mysql-bin.0002913925115 ,每个人的数据不一样

这里有两个场景:

  • master机和slave机都是新机,没有任何数据,此时就可以跳过下面这一步
  • 我需要备份master机所有的数据库到slave,但是我的slave机刚搭建mysql,master机上有数据,这时候你就需要备份导出master机的数据库并还原到slave机,确保主从机数据的一致性,如果你的master机上的数据一直有变动(通过 show master status; 观察Position值),那么你需要确保备份导出前后Position值是一致的。这时候你可能需要采取锁全表操作,或者你想赌一把,能确保备份前后Position值不变也是可以的。

三、slave机配置

slave机也一样要配置my.ini

1
2
3
[mysqld]
log-bin=mysql-bin #[可选]启用二进制日志
server-id=2 #id一定要比master机大

重启mysql后查询server-id,确保server-id大于主机的server-id

1
SHOW VARIABLES LIKE 'server_id';

通过mysql -uroot -p密码进入mysql命令行,执行以下sql,把master机IP,上一步设置的mysql账号密码,记录的File值填入master_log_file,Position值填入master_log_pos:

1
2
3
4
5
change master to master_host='master机IP',
master_user='slave_user',
master_password='在master机上设置的自定义密码',
master_log_file='mysql-bin.00029',
master_log_pos=13925115;

然后执行启动slave:

1
start slave;

查看slave状态:

1
show slave status;

Slave_IO_Running 和 Slave_SQL_Running 必须都为 Yes 才算成功:

image-20230425165820864

四、验证

master数据库进行更新或删除操作之后,查看slave数据库是否同步即可。

如需关闭主从复制,可在从机上运行以下sql语句进行关闭:

1
2
>stop slave;		#关闭从机复制
>reset slave; #重置从机relay-binlog

MySQL/MariaDB主从复制教程
https://aunero.github.io/2023/04/mysql-master-slave-copy.html
作者
AuthurNero
发布于
2023年4月25日
许可协议