一、MySQL主从复制
1、主从复制定义
主从复制使得数据可以从一个数据库服务器复制到其他服务器上
2、为什么要主从复制
MySQL只有一台是会出现单点故障,服务器不可以用,无法处理大量的并发数据请求,数据丢失等等问题。为了解决这些问题,出现了主从复制。
3、优点
通过增加从服务器来提高数据库的性能,在主服务器上执行写入和更新,在从服务器上向外提供读功能,可以动态地调整从服务器的数量,从而调整整个数据库的性能。
提高数据安全,因为数据已复制到从服务器,从服务器可以终止复制进程,所以,可以在从服务器上备份而不破坏主服务器相应数据
在主服务器上生成实时数据,而在从服务器上分析这些数据,从而提高主服务器的性能
4.类型
基于语句的复制(默认):在主服务器上执行的语句,从服务器执行同样的语句
基于行的复制:把改变的内容复制到从服务器
混合类型的复制:一旦发现基于语句无法精准复制时,就会采取基于行的复制
5.步骤
在主服务器上,必须开启二进制日志机制和配置一个独立的ID在每一个从服务器上,配置一个唯一的ID,创建一个用来专门复制主服务器数据的账号在开始复制进程前,在主服务器上记录二进制文件的位置信息配置从服务器要连接的主服务器的IP地址和登陆授权,二进制日志文件名和位置6、准备事项
一台安装amoeba软件的虚拟机,IP地址为20.0.0.5;一台Master虚拟机安装MySQL数据库,IP地址为20.0.0.6;一台slave虚拟机安装MySQL数据库,IP地址为20.0.0.7;一台slave虚拟机安装MySQL数据库,IP地址为20.0.0.8;;所有虚拟机关闭防火墙,关闭核心防护。
在主机Master 搭建时间同步服务器NTP(20.0.0.6)
[root@localhost ~]# yum -y install ntp [root@localhost ~]# ntpdata ntp1.aliyun.com 20 Oct 19:09:55 ntpdate[93028]: adjust time server 120.25.115.20 offset 0.301494 sec [root@localhost ~]# service ntpd restart [root@localhost ~]# systemctl restart ntpd [root@localhost ~]# systemctl enable ntpd修改主配文件
[root@localhost ~]#vi /etc/my.cnf [mysqld] user = mysql basedir = /usr/local/mysql datadir = /usr/local/mysql/data port = 3306 character_set_server=utf8 pid-file = /usr/local/mysql/mysqld.pid socket = /usr/local/mysql/mysql.sock server-id = 11 //修改ID log_bin = master-bin // 生成日志 log-slave-updates = true //授权同步 [root@localhost ~]# systemctl restart mysqld登录Master数据库 给从服务器授权
[root@localhost ~]# mysql -uroot -p mysql>grant replication slave on *.* to 'myslave'@'20.0.0.%' identified by 'abc123'; mysql>flush privileges; mysql>show master status; +-------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-------------------+----------+--------------+------------------+-------------------+ | master-bin.000001 | 641 | | | | +-------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)在从服务器salver1上配置NTP同步(20.0.0.7)
[root@localhost ~]# ntpdata ntp1.aliyun.com 20 Oct 19:10:25 ntpdate[94028]: adjust time server 120.25.115.20 offset 0.301494 sec修改配置文件
[root@localhost ~]#vi /etc/my.cnf [mysqld] user = mysql basedir = /usr/local/mysql datadir = /usr/local/mysql/data port = 3306 character_set_server=utf8 pid-file = /usr/local/mysql/mysqld.pid socket = /usr/local/mysql/mysql.sock server-id = 22 //修改ID relay-log = relay-log-bin // 生成中继日志 relay-log-index = slave-relay-bin.index //中继日志索引 [root@localhost ~]# systemctl restart mysqld登录Slave数据库 配置同步
[root@localhost ~]# mysql -uroot -p mysql> change master to master_host='20.0.0.6',master_user='myslave',master_password='abc123',master_log_file='master-bin.000001',master_log_pos=641; Query OK, 0 rows affected, 2 warnings (0.01 sec) mysql> start slave; Query OK, 0 rows affected (0.00 sec) mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 20.0.0.6 Master_User: myslave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-bin.000001 Read_Master_Log_Pos: 604 Relay_Log_File: relay-log-bin.000002 Relay_Log_Pos: 321 Relay_Master_Log_File: master-bin.000001 Slave_IO_Running: Yes #####开启 Slave_SQL_Running: Yes #####开启 Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table:在从服务器salver2上配置NTP同步(20.0.0.8)
[root@localhost ~]# ntpdata ntp1.aliyun.com 20 Oct 19:13:45 ntpdate[95628]: adjust time server 120.25.115.20 offset 0.301494 sec修改配置文件
[root@localhost ~]#vi /etc/my.cnf [mysqld] user = mysql basedir = /usr/local/mysql datadir = /usr/local/mysql/data port = 3306 character_set_server=utf8 pid-file = /usr/local/mysql/mysqld.pid socket = /usr/local/mysql/mysql.sock server-id =33 //修改ID relay-log = relay-log-bin // 生成中继日志 relay-log-index = slave-relay-bin.index //中继日志索引 [root@localhost ~]# systemctl restart mysqld登录Slave数据库 配置同步
[root@localhost ~]# mysql -uroot -p mysql> change master to master_host='20.0.0.6',master_user='myslave',master_password='abc123',master_log_file='master-bin.000001',master_log_pos=641; Query OK, 0 rows affected, 2 warnings (0.01 sec) mysql> start slave; Query OK, 0 rows affected (0.00 sec) mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 20.0.0.6 Master_User: myslave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-bin.000001 Read_Master_Log_Pos: 604 Relay_Log_File: relay-log-bin.000002 Relay_Log_Pos: 321 Relay_Master_Log_File: master-bin.000001 **Slave_IO_Running: Yes #####开启 Slave_SQL_Running: Yes #####开启** Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table:注意:IO和SQL必须是YES的才能保证主从建立好了 验证主从复制
在master上建立一个kgc
[root@localhost ~]# mysql -uroot -p mysql> create database kgc; mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | kgc | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec)登录slaver1 20.0.0.7
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | kgc | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec)登录slaver2 20.0.0.8
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | kgc | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec)验证从数据库有kgc的表主从就部署成了