mysql主从复制
概念
-
mysql主从复制的主要途径
-
1.用于备份,避免影响业务
-
2.实时灾备,用于故障切换
-
3.读写分离,提供查询服务
-
主从的形式
-
1.一主多从 表示只有一台主服务器,多台从服务器
-
2.主主复制 表示互为主服务器,同时也互为从服务器
-
3.一主多从 ----扩展系统读取的性能,因为读是在从库读取的
-
4.多主一从 ----5.7开始支持
-
.mysql主从复制原理
-
1.在主库上把将更改DDL DML DCL记录到二进制日志Binary Log中。
-
2.备库I/O线程将主库上的二进制日志复制到自己的中继日志Relay Log中。
-
3.备库SQL线程读取中继日志中的事件,将其重放到备库数据库之上。
-
主从复制配置的步骤:
-
1.确保从数据库与主数据库里的数据一样
-
2.在主数据库里创建一个同步账号授权给从数据库使用
-
3.配置主数据库(修改配置文件)
-
4.配置从数据库(修改配置文件
事例
1.MySQL数据库传统复制
数据库传统主从复制如下, 如需实现多从, 将以下实验从案例在配置一次即可
- 环境
主机名 | IP地址 | 系统版本 | 数据库版本 |
---|---|---|---|
mastet | 192.168.100.33 | red-hat7 | 5.7.23 |
Salve | 192.168.100.128 | red-hat7 | 5.7.23 |
master配置
- 配置文件/etc/my.cnf
[root@master~]# vim /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
user = mysql
skip-name-resolve
log-bin=mysql-bin
server-id=160
symbolic-links=0
log-error=/var/log/mysqld.log
[root@master ~]# service mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL. SUCCESS!
- 模拟线上数据库
mysql> create database dsb;
Query OK, 1 row affected (0.12 sec)
mysql> use dsb;
Database changed
mysql> create table t1(id int, name varchar(20));
Query OK, 0 rows affected (0.88 sec)
mysql> insert into t1 values (1,'tt')
-> ;
Query OK, 1 row affected (0.02 sec)
mysql> insert into t1 values (2,'ttt');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t1;
+------+------+
| id | name |
+------+------+
| 1 | tt |
| 2 | ttt |
+------+------+
2 rows in set (0.00 sec)
- 授权, 允许能够远程连接的主机(replicaiton)
mysql> create user 'xie'@'192.168.100.%' identified by '123.com';
Query OK, 0 rows affected (0.00 sec)
mysql> grant replication slave on *.* to 'xie'@'192.168.100.%';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
- 查看数据库的状态
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000008 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
- 导出当前数据
[root@master ~]# mysqldump -uroot -p123.com --all-databases > /opt/all_$(date +%F)
- 将备份文件传送至Slave
[root@master ~]# scp /root/2018-10-30-all.sql root@192.168.100.128:/roor/
Slave配置
- 检查是否能使用远程账户登录
[root@Slave local]# mysql -udsb -p123.com -h 192.168.100.33
//如果登录失败,请检查是否关闭了防火墙
- 修改配置文件/etc/my.cnf, 从需开启binlog
[root@xiefei ~]# vim /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
user = mysql
skip-name-resolve
server-id=161
relay-log=mysql-relay-bin
symbolic-links=0
log-error=/var/log/mysqld.log
- 重启mysql数据库服务
[root@Slave local]# service mysqld restart
- 导入数据,追master的bin_log
[root@Slave ~]# mysql -uroot -p'123.com' -e "source /root/2018-10-30-all.sql"
- 指向Master,无需指定binlogfile和pos
mysql> change master to master_host='192.168.100.33',master_user='xie',master_password='123.com',master_port=3306,master_log_file='mysql-bin.000008',master_log_pos=154;
- 启动slave角色
mysql> start slave;
- 查看角色是否同步
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.100.33
Master_User: xie
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000008
Read_Master_Log_Pos: 154
Relay_Log_File: mysql-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000008
Slave_IO_Running: Yes //从服务器上产生的线程,必须是yes
Slave_SQL_Running: Yes // //从服务器上产生的线程,必须是yes
- 测试验证
在主服务器上插入一张新表,并写入数据
mysql> create database dxk;
Query OK, 1 row affected (0.00 sec)
mysql> use dxk;
Database changed
mysql> create table dsb(id int not null,name varchar(100)not null,age tinyint);
Query OK, 0 rows affected (0.82 sec)
mysql> insert dsb (id,name,age)values(1,'tom',10),(2,'jack',30);
Query OK, 2 rows affected (0.17 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from dsb;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | tom | 10 |
| 2 | jack | 30 |
+----+------+------+
2 rows in set (0.00 sec)
- 在从数据库中查看是否同步
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| dxk |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> select * from dxk.dsb;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | tom | 10 |
| 2 | jack | 30 |
+----+------+------+
2 rows in set (0.01 sec)