mysql主从

主从简介

在现代企业中,数据显得尤为重要,而存储数据的数据库选择又五花八门,但无论是何种数据库,均存在着一种隐患。

想几个问题:

  • 用一台数据库存放数据,若此数据库服务器宕机了导致数据丢失怎么办?
  • 业务量大了,数据多了,访问的人多了,一台数据库无法保证服务质量了怎么办?

1.1 主从作用

  • 实时灾备,用于故障切换
  • 读写分离,提供查询服务
  • 备份,避免影响业务

1.2 主从形式

  • 一主一从
  • 主主复制
  • 一主多从---扩展系统读取的性能,因为读是在从库读取的
  • 多主一从---5.7开始支持
  • 联级复制

2. 主从复制原理

主从复制步骤:

 1.主库将所有的写操作记录到binlog日志中并生成一个log dump线程,将binlog日志传给从库的I/O线程。

 2.从库生成两个线程,一个I/O线程,一个SQL线程。

    2.1  I/O线程去请求主库的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中

    2.2SQL线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,达到最终数据一致的目的

主从复制配置步骤:

  1. 确保从数据库与主数据库里的数据一样
  2. 在主数据库里创建一个同步账号授权给从数据库使用
  3. 配置主数据库(修改配置文件)
  4. 配置从数据库(修改配置文件)

需求:
搭建两台MySQL服务器,一台作为主服务器,一台作为从服务器,主服务器进行写操作,从服务器进行读操作

数据库角色IP有无数据
主数据库 192.168.44.128 无数据
从数据库 192.168.44.131 无数据

1.准备两台虚拟机,一台主机名为master,一台主机名为slave,都使用yum装上mariadb服务,安全初始化数据库。在master上创建一个同步账号。

//mysql_secure_installation 安全初始化数据库
[root@master ~]# mysql -uroot -p123
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
[root@slave ~]# mysql -uroot -p123
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
[root@master ~]# systemctl stop firewalld
[root@master ~]# setenforce 0
[root@master ~]# mysql -uroot -p123
//在主数据库里创建一个同步账号csl授权给从数据库使用
MariaDB [(none)]> grant replication slave on *.* to 'csl'@'192.168.44.131' identified by 'csl123';
MariaDB [(none)]> flush privileges;

[root@slave ~]# systemctl stop firewalld
[root@slave ~]# setenforce 0
//在从数据库里使用csl账号登陆
[root@slave ~]# mysql -ucsl -pcsl123 -h192.168.44.128

2.配置主数据库

[root@master ~]# vi /etc/my.cnf
#
# This group is read both both by the client and the server
# use it for options that affect everything
#
[client-server]

[mysqld]            #加入三行数据
log-bin=mysql_bin
server-id=10
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

[root@master ~]# systemctl restart mariadb
[root@master ~]# mysql -uroot -p123
MariaDB [(none)]> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql_bin.000001 |      328 |              |                  |
+------------------+----------+--------------+------------------+

3.配置从数据库

[root@slave ~]# vi /etc/my.cnf

#
# This group is read both both by the client and the server
# use it for options that affect everything
#
[client-server]

[mysqld]           #加入三行数据
server-id=20       #从库的server-id必须要比主库的大
relay-log=myrelay
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
[root@slave ~]# systemctl restart mariadb
[root@slave ~]# mysql -uroot -p123
//配置并启动主从复制
MariaDB [(none)]> change master to master_host='192.168.44.128',master_user='csl',master_password='csl123',master_log_file='mysql_bin.000001',master_log_pos=328;
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave statusG
Slave_IO_Running: Yes         #这两行是yes就代表成功
Slave_SQL_Running: Yes

4.验证测试,在主数据库上写入数据看从数据库上数据是否同步。

MariaDB [(none)]> create database school;
MariaDB [(none)]> use school;
MariaDB [school]> create table student(id int not null primary key auto_increment,name varchar(20) not null,age tinyint);
MariaDB [school]> insert student(name,age) values('tom',15),('tim',12),('jack',18);

[root@slave ~]# mysql -uroot -p123
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| school             |
+--------------------+
MariaDB [(none)]> use school;
MariaDB [school]> select * from student;
+----+------+------+
| id | name | age  |
+----+------+------+
|  1 | tom  |   15 |
|  2 | tim  |   12 |
|  3 | jack |   18 |
+----+------+------+
数据库角色IP有无数据
主数据库 192.168.44.128 有数据
从数据库 192.168.44.131 无数据

5.准备两台虚拟机,一台主机名为master,一台主机名为slave,都使用yum装上mariadb服务,安全初始化数据库。在master上创建一个同步账号,在master写入数据。

[root@master ~]# systemctl stop firewalld
[root@master ~]# setenforce 0
[root@slave ~]# systemctl stop firewalld
[root@slave ~]# setenforce 0
[root@master ~]# mysql -uroot -p123
MariaDB [(none)]> create database info;
MariaDB [(none)]> use info;d
MariaDB [info]> create table basic(id int not null primary key auto_increment,name varchar(50),job varchar(50));
MariaDB [info]> insert basic(name,job) values('tom','engineer'),('jerry','office');
MariaDB [info]> create table salary(name varchar(50),salary float);
MariaDB [info]> insert salary(name,salary) values('tom',8000),('jerry',8500),('zhangshan',9000),('lisi',7500);

6.全备主数据库,确保从数据库与主数据库里的数据一样

//全备主库时需要另开一个终端,给数据库加上读锁,避免在备份期间有其他人在写入导致数据不一致
MariaDB [(none)]> flush tables with read lock;
//此锁表的终端必须在备份完成以后才能退出

//备份主库并将备份文件传送到从库
[root@master ~]# mysqldump -uroot -p123 --all-databases >all.sql
[root@master ~]# scp all.sql 192.168.44.131:/root

//解除主库的锁表状态,直接退出交互式界面即可
mysql> quit
Bye

//在从库上恢复主库的备份并查看从库有哪些库,确保与主库一致
[root@slave ~]# mysql -uroot -p123 < all.sql
[root@slave ~]# mysql -uroot -p123 -e 'show databases;'
+--------------------+
| Database           |
+--------------------+
| info               |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+

7.在主数据库里创建一个同步账号csl授权给从数据库使用,再配置主数据库

[root@master ~]# mysql -uroot -p123
MariaDB [(none)]> grant replication slave on *.* to 'csl'@'192.168.44.131' identified by 'csl123';
MariaDB [(none)]> quit
[root@master ~]# vi /etc/my.cnf

#
# This group is read both both by the client and the server
# use it for options that affect everything
#
[client-server]

[mysqld]         #加入三行数据
server-id=10
log-bin=mysql_bin
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

[root@master ~]# systemctl restart mariadb
[root@master ~]# mysql -uroot -p123
MariaDB [(none)]> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql_bin.000001 |      328 |              |                  |
+------------------+----------+--------------+------------------+

8.配置从数据库

[root@slave ~]# vi /etc/my.cnf

#
# This group is read both both by the client and the server
# use it for options that affect everything
#
[client-server]

[mysqld]           #加入三行数据
server-id=20       #从库的server-id必须要比主库的大
relay-log=myrelay
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

[root@slave ~]# systemctl restart mariadb
[root@slave ~]# mysql -uroot -p123
MariaDB [(none)]> change master to master_host='192.168.44.128',master_user='csl',master_password='csl123',master_log_file='mysql_bin.000001',master_log_pos=328;
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave statusG
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

9.查看从数据库数据是否和主数据库一致,再在数据库上插入数据,看从数据库上是否同步数据。

MariaDB [(none)]> use info;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [info]> show tables;
+----------------+
| Tables_in_info |
+----------------+
| basic          |
| salary         |
+----------------+
2 rows in set (0.000 sec)

MariaDB [info]> select * from basic;
+----+-------+----------+
| id | name  | job      |
+----+-------+----------+
|  1 | tom   | engineer |
|  2 | jerry | office   |
+----+-------+----------+

//在主数据库插入数据
[root@master ~]# mysql -uroot -p123
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| info               |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
MariaDB [(none)]> use info;
MariaDB [info]> insert basic(name,job) values('zhangshan','cleanner');

//在从数据库中查看数据是否同步
MariaDB [info]> select * from basic;
+----+-----------+----------+
| id | name      | job      |
+----+-----------+----------+
|  1 | tom       | engineer |
|  2 | jerry     | office   |
|  3 | zhangshan | cleanner |
+----+-----------+----------+
原文地址:https://www.cnblogs.com/chensongling/p/14213244.html