纸上得来终觉浅,绝知此事要躬行。 概述 复制是指将主数据库的DDL 和 DML 操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。 Mysql支持一台主库同时向多
纸上得来终觉浅,绝知此事要躬行。
复制是指将主数据库的DDL 和 DML 操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。
Mysql支持一台主库同时向多台从库进行复制, 从库同时也可以作为其他从服务器的主库,实现链状复制。
mysql 复制的优点主要包含以下三个方面:
主库出现问题,可以快速切换到从库提供服务。
可以在从库上执行查询操作,从主库中更新,实现读写分离,降低主库的访问压力。
可以在从库中执行备份,以避免备份期间影响主库的服务。
在详细介绍如何设置复制之前,我们先看看Mysql实际上是如何复制数据的,总的来说,复制分为三个步骤:
第一步在主库上记录二进制文件(后续介绍设置)。在每次准备提交事务完成数据更新前,主库将数据更新的事件记录到二进制日志中。MySQL会按照事务提交的顺序而非每条语句的执行顺序来记录二进制日志。在记录二进制日志之后主库会告诉存储引擎提交事务。
第二步,从库将主库的二进制日志复制到其本地的中继日志。首先从库会启动一个工作线程称为I/O线程,该线程跟主库建立一个普通的客户端连接,然后在主库上启动一个特殊的二进制转储线程,这个二进制转储线程会读取主库上二进制日志事件,他不会对事件进行轮询。如果该线程追赶上了主库,他将进入睡眠状态,直到主库发送信号量通知从库有新的事件才会被唤醒,然后线程将接受到的事件记录到中继日志。
第三步,从库中的线程从中继日志中读取事件并在从库执行,从而实现从库数据的更新。
mysql --help|grep "my.cnf"
# 必须,表示mysql配置文件
[mysqld]
# mysql 服务ID,保证整个集群环境中唯一
server-id=1
# mysql binlog 日志的存储路径和文件名
log-bin=/var/lib/mysql/mysqlbin
# 错误日志,默认已经开启
# log-err
# mysql的安装目录
# basedir
# mysql的临时目录
# tmpdir
# mysql的数据存放目录
# datadir
# 是否只读,1 代表只读, 0 代表读写
read-only=0
# 忽略的数据, 指不需要同步的数据库
binlog-ignore-db=mysql
# 指定同步的数据库
# binlog-do-db=db01
service mysql restart
grant replication slave on *.* to "用户名"@"从库服务器地地址" identified by "密码";
# 例如:grant replication slave on *.* to "root"@"192.168.192.131" identified by "root";
flush privileges;
mysql> show variables like "%log_bin%";
+---------------------------------+-------------------------------+
| Variable_name | Value |
+---------------------------------+-------------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/mysqlbin |
| log_bin_index | /var/lib/mysql/mysqlbin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+-------------------------------+
6 rows in set (0.00 sec)
mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| mysqlbin.000001 | 154 | | mysql | |
+-----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
# File : 从哪个日志文件开始推送日志文件
# Position : 从哪个位置开始推送日志
# Binlog_Ignore_DB : 指定不需要同步的数据库
# mysql服务端ID,唯一
server-id=2
# 指定binlog日志
log-bin=/var/lib/mysql/mysqlbin
service mysql restart
change master to master_host= "192.168.192.130", master_user="主库用户名", master_passWord="主库密码", master_log_file="mysqlbin.000001", master_log_pos=413;
指定当前从库对应的主库的IP地址,用户名,密码,从哪个日志文件开始的那个位置开始同步推送日志。
start slave;
show slave status;
stop slave;
create database db01;
user db01;
create table user(
id int(11) not null auto_increment,
name varchar(50) not null,
sex varchar(1),
primary key (id)
)engine=innodb default charset=utf8;
insert into user(id,name,sex) values(null,"Tom","1");
insert into user(id,name,sex) values(null,"Trigger","0");
insert into user(id,name,sex) values(null,"Dawn","1");
在从库中,可以查看到刚才创建的数据库:
在该数据库中,查询user表中的数据:
--结束END--
本文标题: 【MySQL】主从复制
本文链接: https://www.lsjlt.com/news/6580.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-05-03
2024-05-03
2024-05-03
2024-05-03
2024-05-03
2024-05-03
2024-05-03
2024-05-03
2024-05-03
2024-05-03
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0