知识点:
mysql Replication (主从复制)
复制时异步的,从站从不需要永久连接以接收来自主站的更新;
作为主服务器角色的数据库服务器必须开启二进制日志;
除非另行指定,否则主从二进制日志中的所有事件都在从站上执行;且无法将主服务器配置为仅记录特定事件;
由于每个从服务器都分别记录了自己当前处理二进制日志中的位置,因此可以断开从服务器的连接,重新连接然后恢复继续处理
Replication配置:
第一步配置:
主服务器配置:
在主服务器上,您必须启用二进制日志记录并配置唯一的服务器ID。需要重启服务器。
vim /etc/my.cnf
#添加
[mysqld]
log-bin=/var/log/mysql/mysql-bin
server-id=1
#如果省略server-id(或将其显式设置为默认值0),则主服务器拒绝来自从服务器的任何连接。
systemctl restart mysqld
在此配置文件中指定了日志文件的位置,日志文件会自动生成,但是目录不会,请确保路径目录存在
创建日志目录并赋予权限:
mkdir /var/log/mysql
chown -R mysql.mysql /var/log/mysql
【非必要】为了在使用带事务的InnoDB进行复制设置时尽可能提高持久性和一致性,在master上配置:
vim /etc/my.cnf
#添加
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
注意:
确保未在复制主服务器上启用skip-networking选项。
如果已禁用网络,则从站无法与主站通信,并且复制失败。
在master上创建一个专门用以复制用户数据的用户
grant replication slave on *.* TO '用户名'@'%' identified by '密码';
flush privileges; #刷新权限
在从服务器上测试:mysql -h 服务器ip -u用户名-p密码
第二步配置:
情况一:master有数据
如果主数据库包含现有数据,则必须在主服务器将此数据复制到每个从站
#这里的用户是主服务器的用户
mysqldump -u用户名 -p密码 --all-databases --master-data=1 > 111.sql
参数详解:
--all-databases表示备份所有的数据库,如果只需要备份指定的数据库,可以将该参数替换为数据库名。
--master-data=1表示添加二进制日志文件名和位置到备份文件中,以便在执行备份文件时使用正确的二进制日志文件,保证备份的一致性。
> 111.sql表示将备份数据输出到名为111.sql的文件中。可以是sql文件也可以是db文件;
该命令的作用是备份MySQL中所有的数据库,并将备份数据输出到名为111.sql的文件中
scp 111.sql root@mysql-slave1:/root/ 把备份文件传到从服务器
#mysql-slave1:从服务器ip
在从服务器配置,并重启mysql:
// my.cnf 文件
[mysqld]
server-id=2
systemctl restart mysqld
导入数据到从服务器上
mysql> source /root/111.sql
在从服务器上配置连接到主服务器的相关信息
mysql> change master to
-> master_host='服务器名或ip',
-> master_user='用户名',
-> master_password='密码';
在从服务器启动复制线程
mysql> start slave; #启动
mysql> show slave status\G #查看
#结果是
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
情况二:master没有数据
在主服务器查看主服务器的二进制日志的名称
flush tables with read lock; #刷新所有表和阻止写语句
show master status \G
在从服务器配置
mysql> change master to
-> master_host='服务器名或ip',
-> master_user='用户名',
-> master_password='密码',
-> master_log_file='mysqld-bin.000015',
-> master_log_pos=0;
mysql> start slave; #启动服务器的复制线程
mysql> show binlog events\G #看到第一个binlog文件的内容
整体内容概括:
在两个服务器配置server-id,以确定哪个服务器是主服务器,哪服务器是从服务器
在主服务器配置生成日志文件的路径,确保日志文件的路径目录要存在;
给日志文件目录授权;
给在主服务器给从服务器的用户授权,授权后刷新权限;
若主服务器有数据需要备份到从服务器,则把主服务器的数据导出,并复制到从服务器,在从服务器的数据库把内容导入;
若主服务器没有数据需要备份到从服务器,则刷新所有表和阻止写语句;查看二进制日志名称;
在从服务器链接主服务器,启动线程即可;
如果线程启动失败,停止线程,清空线程,解决问题,在启动线程;
start slave; #开始复制线程
stop slave; #停止复制线程
reset slave;#清空复制线程
在从服务器暂停复制:
停止从服务器处理二进制日志
stop slave; #停止复制线程
从I / O线程停止从主二进制日志读取事件并将它们写入中继日志,并且SQL线程停止从中继日志读取事件并执行它们。您可以通过指定线程类型单独暂停I / O或SQL线程:
stop slave IO_thread;
stop slave sql_thread;
要再次开始执行,:
START SLAVE;
若要启动特定线程:
START SLAVE IO_THREAD;
START SLAVE SQL_THREAD;