纸上得来终觉浅,绝知此事要躬行。mysql
复制是指将主数据库的DDL 和 DML 操做经过二进制日志传到从库服务器中,而后在从库上对这些日志从新执行(也叫重作),从而使得从库和主库的数据保持同步。sql
MySQL支持一台主库同时向多台从库进行复制, 从库同时也能够做为其余从服务器的主库,实现链状复制。shell
MySQL 复制的优势主要包含如下三个方面:数据库
主库出现问题,能够快速切换到从库提供服务。服务器
能够在从库上执行查询操做,从主库中更新,实现读写分离,下降主库的访问压力。ide
能够在从库中执行备份,以免备份期间影响主库的服务。测试
在详细介绍如何设置复制以前,咱们先看看MySQL其实是如何复制数据的,总的来讲,复制分为三个步骤:线程
第一步在主库上记录二进制文件(后续介绍设置)。在每次准备提交事务完成数据更新前,主库将数据更新的事件记录到二进制日志中。MySQL会按照事务提交的顺序而非每条语句的执行顺序来记录二进制日志。在记录二进制日志以后主库会告诉存储引擎提交事务。3d
第二步,从库将主库的二进制日志复制到其本地的中继日志。首先从库会启动一个工做线程称为I/O线程,该线程跟主库创建一个普通的客户端链接,而后在主库上启动一个特殊的二进制转储线程,这个二进制转储线程会读取主库上二进制日志事件,他不会对事件进行轮询。若是该线程追遇上了主库,他将进入睡眠状态,直到主库发送信号量通知从库有新的事件才会被唤醒,而后线程将接受到的事件记录到中继日志。rest
第三步,从库中的线程从中继日志中读取事件并在从库执行,从而实现从库数据的更新。
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表中的数据: