mysql复制
1、MySQL的复制是基于binlog的。
2、MySQL复制包括两部分,IO线程 和 SQL线程。
3、 IO线程主要是用于拉取接收Master传递过来的binlog,并将其写入到relay log
4、SQL线程主要负责解析relay log,并应用到slave中
5.、不管怎么说,IO和SQL线程都是单线程的,然后master却是多线程的,所以难免会有延迟,为了解决这个问题,多线程应运而生了
主从复制
将主数据库中的DDL和DML操作通过二进制日志传输到从数据库上,然后将这些日志重新执行,从而使得从数据库中的数据与主数据库中的数据保持一致。
server4 安装mysql的虚拟机作为Master(主数据库)
server1 新的虚拟机作为slave端(从数据库)
#将主数据库中的mysql目录和/etc/my.cnf文件复制给从数据库
[root@server4 ~]# scp -r /usr/local/mysql/ server1:/usr/local/
[root@server4 ~]# scp /etc/my.cnf server1:/etc/
#在从数据库中
[root@server1 ~]# cd /usr/local/mysql/support-files
#拷贝启动脚本
[root@server1 support-files]# cp mysql.server /etc/init.d/mysqld
#添加环境变量
[root@server1 support-files]# cd
[root@server1 ~]# vim .bash_profile
[root@server1 ~]# tail -n 3 .bash_profile
PATH=$PATH:$HOME/bin:/usr/local/mysql/bin
export PATH
[root@server1 ~]# source .bash_profile
[root@server1 ~]# which mysql
/usr/local/mysql/bin/mysql
[root@server1 ~]# useradd -M -d /data/mysql -s /sbin/nologin mysql
#创建数据目录并给予权限
[root@server1 ~]# mkdir /data/mysql -p
[root@server1 ~]# chown mysql.mysql /data/mysql
#初始化数据库,得到一个初始化密码
[root@server1 ~]# mysqld --initialize --user=mysql
#开启mysql
[root@server1 ~]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/data/mysql/mysqld.log'.
SUCCESS!
#修改数据库密码
[root@server1 ~]# mysql_secure_installation
在主数据库master端开启binlog
#修改配置文件
[root@server4 ~]# vim /etc/my.cnf
[root@server4 ~]# head -5 /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
#添加如下内容
log-bin=mysql-bin##表示启用binlog,log-bin决定了msyql 的binlog的名字,⽣成的binlog名字为mysql-bin.000001
server_id=1 ##正整数,可以不是递增,但必须为正
#重启数据库
[root@server4 ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL. SUCCESS!
[root@server4 ~]# cd /data/mysql/
[root@server4 mysql]# ls
---->mysql-bin.000001 mysql-bin.index
##mysql-bin.000001数据库的二进制操作日志,每重启一次会生成新的;mysql-bin.index,二进制日志的索引文件,记录了所有的日志
#进入数据库添加授权用户并进行授权,从数据库slave端可以通过该授权用户进入master端数据库
[root@server4 mysql]# mysql -p
Enter password:
mysql> create user 'repl'@'%' identified by 'westos';
mysql> grant replication slave on *.* to 'repl'@'%';
在slave端进行测试
mysql -h 192.168.230.147 -u repl -p ##此时并没有什么权限
> show databases;
> exit ##退出
在master(server4)端可以查看主库状态可以看到二进制操作日至的名称和位置
> show master status;
#在slave端修改配置文件,设定server-id为2,重启服务。进入数据库,设定并查看是否设定完成
[root@server1 ~]# vim /etc/my.cnf
server_id=2
[root@server1 ~]# /etc/init.d/mysqld restart
Shutting down MySQL. SUCCESS!
Starting MySQL. SUCCESS!
[root@server1 ~]# mysql -p
Enter password:
mysql> set global server_id=2;
mysql> show variables like 'server_id';
[注意] 主从复制之前,主从主机数据一定要同步,此时因为主从库数据不同步,所以需要将主库数据备份并传给从库。
##同步主从数据库
#在server4上创建数据库数据库表并写入数据
mysql> show variables like 'server_id';
mysql> create database westos;
mysql> show databases;
mysql>