ShardingSphere学习笔记

22 篇文章 0 订阅
22 篇文章 0 订阅

ShardingSphere

1.官网

ShardingSphere (apache.org)

在这里插入图片描述

2.定位

​ a.是一套开源的分布式数据库解决方案

​ b.组成JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成

​ c.是一个分布式关系型数据库中间件(轻量级java框架),用于在分布式环境下操作数据库

3.三个产品介绍

3.1ShardingSphere-JDBC

定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。

适用于任何基于 JDBC 的 ORM 框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template 或直接使用 JDBC;
支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, HikariCP 等;
支持任意实现 JDBC 规范的数据库,目前支持 MySQL,PostgreSQL,Oracle,SQLServer 以及任何可使用 JDBC 访问的数据库。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FW1prClL-1636893126707)(asserts/image-20211112213755001.png)]

3.2ShardingSphere-Proxy

定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。 目前提供 MySQL 和 PostgreSQL(兼容 openGauss 等基于 PostgreSQL 的数据库)版本,它可以使用任何兼容 MySQL/PostgreSQL 协议的访问客户端(如:MySQL Command Client, MySQL Workbench, Navicat 等)操作数据,对 DBA 更加友好。

在这里插入图片描述

4.分库分表

4.0原因

​ 随着数据库数量增大,带来业务处理过程中系统性能下级的问题。

4.1分库

​ 例如:电商平台将用户信息和商家信息存放在不同的数据库中通过数据中台访问。

4.2分表

​ 例如:在一个数据库中用户信息量过大,把数据表拆分成若干个表。

4.3分库分表的方式

​ 两种分式:垂直切分,水平切分

​ 垂直:垂直分表,垂直分库

​ 水平:水平分表,水平分库

4.4方式的区分

a什么是垂直分表

​ 把一个表拆分成两个表,例如商品价格信息和商品基本信息原来在一张表中,现在垂直分表,拆分成两个表。

​ **特点:**拆分的库里面的数据量一般是相同的数量。

​ **好处:**在商品总览页面展示的基本信息只需要查询基本信息表即可,修改的时候也只需要修改一个表查询效率高。

b什么是垂直分库

​ 当一个库里面有上百张表的时候,该数据库的IO压力就非常大,可以把库里面的表按照业务划分分到几个新库里面,达到专库专表的效果。例如:商品库里面只放商品表,订单库里面只放订单表。

c什么是水平分库

垂直分库后随着业务量的增加,仍然存在在业务量增加,数据量达的问题,单库压力仍然过大。可以把一个库按克隆多个结构一样的库,按照一定的规则进行CURD

d什么是水平分表

把一个表克隆多个,按照一定的规则进行CURD

5.产品一:ShardingSphere-JDBC

:该产品不是用来分库分表的,而是用来操作设计好分库分表后的数据相关的操作的,数据切片读写分离。

5.1水平分表

a 实验环境SpringBoot2.2.1RELEASE+MP+ShardingJDBC+DRUID+JDK8+MySql5.75

b POM文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.itmark</groupId>
    <artifactId>ShardingSphereDemo1</artifactId>
    <version>0.0.1-SNAPSHOT</version>


    <properties>
        <java.version>8</java.version>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--ORM-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.5</version>
        </dependency>
        <!--分库分表-->
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.0.0-RC1</version>
        </dependency>
        <!--德鲁伊连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.20</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

c 准备数据库(水平分表):

CREATE DATABASE JIANGNAN_SCHOOL;

CREATE TABLE `jn_class_1` (
  `id` bigint(20) NOT NULL COMMENT '主键',
  `stu_name` varchar(255) DEFAULT NULL COMMENT '姓名',
  `stu_number` varchar(255) DEFAULT NULL COMMENT '学号',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `jn_class_2` (
  `id` bigint(20) NOT NULL COMMENT '主键',
  `stu_name` varchar(255) DEFAULT NULL COMMENT '姓名',
  `stu_number` varchar(255) DEFAULT NULL COMMENT '学号',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `jn_class_3` (
  `id` bigint(20) NOT NULL COMMENT '主键',
  `stu_name` varchar(255) DEFAULT NULL COMMENT '姓名',
  `stu_number` varchar(255) DEFAULT NULL COMMENT '学号',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

4 实体类:(**Note1:**不需要指定表名称,ShardingJDBC会按照定义的规则找到数据表)

package com.itmark.shardingspheredemo1.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @Description:
 * @Author: 马宽
 * @Date: 2021/11/12 22:44
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
//@TableName(value = "student")
public class Student {
    private Long id;
    private String name;
    private String number;
}

5 配置分库分表文档地址

Spring Boot配置 :: ShardingSphere (apache.org)

spring.shardingsphere.datasource.names=ds0,ds1

spring.shardingsphere.datasource.ds0.type=org.apache.commons.dbcp.BasicDataSource
spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds0.url=jdbc:mysql://localhost:3306/ds0
spring.shardingsphere.datasource.ds0.username=root
spring.shardingsphere.datasource.ds0.password=
/*
Note4:
javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher
该异常出现需要在数据源url中禁用SSL useSSL=false&
*/
spring.shardingsphere.datasource.ds1.type=org.apache.commons.dbcp.BasicDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds1.url=jdbc:mysql://localhost:3306/ds1
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=
/*
在什么库 ds$->{0..1}  表示在ds0 ds1库中
表命名规则是什么 t_order$->{0..1} 表示表名称规则是  表名拼接0  拼接1
*/
spring.shardingsphere.sharding.tables.t_order.actual-data-nodes=ds$->{0..1}.t_order$->{0..1}
/*
Note2:
指定分配策略  t_order  为开发人员自定义 表示一种规则  规则的内容在后面定义
*/
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.sharding-column=order_id
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expression=t_order$->{order_id % 2}

/*
Note3:
注意这里如果使用的是雪花算法生成,那么对应的实体类ID应该为Long类型,否则会报类型映射绑定错误异常。
指定表的主键和插入的生成策略
*/
spring.shardingsphere.sharding.tables.t_order.key-generator.column=order_id
spring.shardingsphere.sharding.tables.t_order.key-generator.type=SNOWFLAKE
spring.shardingsphere.sharding.tables.t_order_item.actual-data-nodes=ds$->{0..1}.t_order_item$->{0..1}
spring.shardingsphere.sharding.tables.t_order_item.table-strategy.inline.sharding-column=order_id
spring.shardingsphere.sharding.tables.t_order_item.table-strategy.inline.algorithm-expression=t_order_item$->{order_id % 2}
spring.shardingsphere.sharding.tables.t_order_item.key-generator.column=order_item_id
spring.shardingsphere.sharding.tables.t_order_item.key-generator.type=SNOWFLAKE
spring.shardingsphere.sharding.binding-tables=t_order,t_order_item
spring.shardingsphere.sharding.broadcast-tables=t_config

spring.shardingsphere.sharding.default-database-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.default-database-strategy.inline.algorithm-expression=ds$->{user_id % 2}

6 最终版配置文件:

#1.定义数据源名称,如果多个使用逗号分隔
spring.shardingsphere.datasource.names=markdb1
#2.定义每个数据源的连接信息
spring.shardingsphere.datasource.markdb1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.markdb1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.markdb1.url=jdbc:mysql://localhost:3306/jiangnan_school?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=UTF-8
spring.shardingsphere.datasource.markdb1.username=root
spring.shardingsphere.datasource.markdb1.password=root
#3.定义数据源中表的命名方案
spring.shardingsphere.sharding.tables.student.actual-data-nodes=markdb1.jn_class_$->{1..3}
#4.定义数据插入目标方案
spring.shardingsphere.sharding.tables.student.table-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.tables.student.table-strategy.inline.algorithm-expression=jn_class_$->{id % 3 + 1}
#5.确定主键和生成侧率
spring.shardingsphere.sharding.tables.student.key-generator.column=id
spring.shardingsphere.sharding.tables.student.key-generator.type=SNOWFLAKE
#6.打印执行的sql
spring.shardingsphere.props.sql.show=true
#8.解决bean名称重复进行覆盖
spring.main.allow-bean-definition-overriding=true
#定义应用端口
server.port=9999

7 实验效果

插入

接口及参数

POST: http://127.0.0.1:9999/stu

{
    "name":"刘备",
    "number":"MK1258"
}

控制台日志

2021-11-13 16:34:40.382  INFO 74096 --- [nio-9999-exec-3] ShardingSphere-SQL : Logic SQL: INSERT INTO student  ( id,name,number )  VALUES  ( ?,?,? )2021-11-13 16:34:40.382  INFO 74096 --- [nio-9999-exec-3] ShardingSphere-SQL : SQLStatement: InsertStatement(super=DMLStatement(super=AbstractSQLStatement(type=DML, tables=Tables(tables=[Table(name=student, alias=Optional.absent())]), routeConditions=Conditions(orCondition=OrCondition(andConditions=[AndCondition(conditions=[Condition(column=Column(name=id, tableName=student), operator=EQUAL, compareOperator=null, positionValueMap={}, positionIndexMap={0=0})])])), encryptConditions=Conditions(orCondition=OrCondition(andConditions=[])), sqlTokens=[TableToken(tableName=student, quoteCharacter=NONE, schemaNameLength=0), SQLToken(startIndex=21)], parametersIndex=3, logicSQL=INSERT INTO student  ( id,name,number )  VALUES  ( ?,?,? )), deleteStatement=false, updateTableAlias={}, updateColumnValues={}, whereStartIndex=0, whereStopIndex=0, whereParameterStartIndex=0, whereParameterEndIndex=0), columnNames=[id, name, number], values=[InsertValue(columnValues=[org.apache.shardingsphere.core.parse.old.parser.expression.SQLPlaceholderExpression@102afd8c, org.apache.shardingsphere.core.parse.old.parser.expression.SQLPlaceholderExpression@55c7e5f7, org.apache.shardingsphere.core.parse.old.parser.expression.SQLPlaceholderExpression@4e12dd32])])2021-11-13 16:34:40.382  INFO 74096 --- [nio-9999-exec-3] ShardingSphere-SQL : Actual SQL: markdb1 ::: INSERT INTO jn_class_2   (id, name, number) VALUES (?, ?, ?) ::: [1459439557760430081, 小张三, MK1257]
Logic SQL: INSERT INTO student  ( id,name,number )  VALUES  ( ?,?,? )

从这条日志可以看出,这是一个逻辑SQL,插入的数据表是 student 和我们制定的规则名称是一一致的

ShardingSphere-SQL : Actual SQL: markdb1 ::: INSERT INTO jn_class_2   (id, name, number) VALUES (?, ?, ?) ::: [1459442147202117634, 刘备, MK1258]

从这条日志中可以看出来这个是实际执行的SQL,数据源是markdb1 数据表是jn_class_2,下方验证是对着的

algorithm-expression=jn_class_$->{id % 3 + 1}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9LEHsCE6-1636893126713)(asserts/image-20211113164704691.png)]

查询所有

接口:

GET: http://127.0.0.1:9999/stu

日志:

 : Logic SQL: SELECT  id,name,number  FROM student      : Actual SQL: markdb1 ::: SELECT  id,name,number  FROM jn_class_1 : Actual SQL: markdb1 ::: SELECT  id,name,number  FROM jn_class_2 : Actual SQL: markdb1 ::: SELECT  id,name,number  FROM jn_class_3                            

可以看到还是先执行逻辑Sql按照规则去查询,没有指定条件插叙了每个分表的所有记录然后返回了

在这里插入图片描述

条件查询

接口:

http://127.0.0.1:9999/stu/z 路径参数用一层花括号接收即可

日志:

Logic SQL: SELECT  id,name,number  FROM student  WHERE  name LIKE ?: Actual SQL: markdb1 ::: SELECT  id,name,number  FROM jn_class_1  WHERE  name LIKE ? ::: [%z%]: Actual SQL: markdb1 ::: SELECT  id,name,number  FROM jn_class_2  WHERE  name LIKE ? ::: [%z%]: Actual SQL: markdb1 ::: SELECT  id,name,number  FROM jn_class_3  WHERE  name LIKE ? ::: [%z%]

在这里插入图片描述

删除也是同理的,框架会按照分表逻辑删除各个表中负荷条件的数据

5.2水平分库

首先要明确什么是水平分库:水平分库及把单一的数据库创建多个相同结构的数据库。

创建两个数据库 实验学校第一中学 实验学校第二中学

在这里插入图片描述

数据库规则:

(1)约定存储的教师ID字段判断如果为奇数存到第一个,偶数存到第二个

表规则:

(1)也约定一下按照上述规则存入

配置文件:

#1.定义数据源名称,如果多个使用逗号分隔spring.shardingsphere.datasource.names=teacherdb1,teacherdb2#2.定义每个数据源的连接信息spring.shardingsphere.datasource.teacherdb1.type=com.alibaba.druid.pool.DruidDataSourcespring.shardingsphere.datasource.teacherdb1.driver-class-name=com.mysql.cj.jdbc.Driverspring.shardingsphere.datasource.teacherdb1.url=jdbc:mysql://localhost:3306/shiyan_school_no_1?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=UTF-8spring.shardingsphere.datasource.teacherdb1.username=rootspring.shardingsphere.datasource.teacherdb1.password=rootspring.shardingsphere.datasource.teacherdb2.type=com.alibaba.druid.pool.DruidDataSourcespring.shardingsphere.datasource.teacherdb2.driver-class-name=com.mysql.cj.jdbc.Driverspring.shardingsphere.datasource.teacherdb2.url=jdbc:mysql://localhost:3306/shiyan_school_no_2?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=UTF-8spring.shardingsphere.datasource.teacherdb2.username=rootspring.shardingsphere.datasource.teacherdb2.password=root#3.定义数据源中库表的命名方案spring.shardingsphere.sharding.tables.student.actual-data-nodes=teacherdb$->{1..2}.teacher$->{1..2}#定义数据源和数据表的查找方案#4.定义数据源插入方案spring.shardingsphere.sharding.default-database-strategy.inline.sharding-column=tidspring.shardingsphere.sharding.default-database-strategy.inline.algorithm-expression=teacherdb$->{tid % 2 + 1}#5.定义数据表插入目标方案spring.shardingsphere.sharding.tables.teacher.table-strategy.inline.sharding-column=tagespring.shardingsphere.sharding.tables.teacher.table-strategy.inline.algorithm-expression=teacher$->{tage % 2 + 1}#6.确定主键和生成侧率spring.shardingsphere.sharding.tables.teacher.key-generator.column=tidspring.shardingsphere.sharding.tables.teacher.key-generator.type=SNOWFLAKE#6.打印执行的sqlspring.shardingsphere.props.sql.show=true#8.解决bean名称重复进行覆盖spring.main.allow-bean-definition-overriding=true#定义应用端口server.port=9999

测试代码

/** * @Description: * @Author: 马宽 * @Date: 2021/11/13 20:56 */@RunWith(SpringRunner.class)@SpringBootTestpublic class ShardingJDBCTests {    @Autowired    TeacherMapper teacherMapper;    @Test    public void addTeacher(){        Teacher teacher = new Teacher(13L,"哈利波特",3);        int insert = teacherMapper.insert(teacher);        System.out.println(insert);    }}

测试日志:

: Logic SQL: INSERT INTO teacher  ( tid,tname,tage )  VALUES  ( ?,?,? ): Actual SQL: teacherdb2 ::: INSERT INTO teacher2   (tid, tname, tage) VALUES (?, ?, ?) ::: [13, 哈利波特, 3]

在这里插入图片描述

:进行水平分库分表后,所有操作都必须携带分库策略字段否则会报错

5.3垂直分库

专库专表

配置不同之处—emmmm感觉没啥必要,还是老配置,只不过是强调了什么库里面放什么表。

#1加一个数据源spring.shardingsphere.datasource.userdb0.type=com.alibaba.druid.pool.DruidDataSourcespring.shardingsphere.datasource.userdb0.driver-class-name=com.mysql.cj.jdbc.Driverspring.shardingsphere.datasource.userdb0.url=jdbc:mysql://localhost:3306/user_db?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=UTF-8spring.shardingsphere.datasource.userdb0.username=rootspring.shardingsphere.datasource.userdb0.password=root#配置专库专表spring.shardingsphere.sharding.tables.t_user.actual-data-nodes=userdb$->{0}.t_user#配置主键spring.shardingsphere.sharding.tables.t_user.key-generator.column=uidspring.shardingsphere.sharding.tables.t_user.key-generator.type=SNOWFLAKE#配置规则spring.shardingsphere.sharding.tables.t_user.table-strategy.inline.sharding-column=uidspring.shardingsphere.sharding.tables.t_user.table-strategy.inline.algorithm-expression=t_user

5.4操作公共表

**公共表:**存放的是数据不经常改变的的数据,经常要与其他表做一下关联,如字典表。该表在每一个数据库中都有一份,并且数据结构,数据都一样。操作的时候一起插入更新删除。

配置:

#公共表配置spring.shardingsphere.sharding.broadcast-tables=dicspring.shardingsphere.sharding.tables.dic.key-generator.column=didspring.shardingsphere.sharding.tables.dic.key-generator.type=SNOWFLAKE

**测试日志:**可以看见向两个库里面都插入了相关字典

: Logic SQL: INSERT INTO dic  ( did,dcode,dname )  VALUES  ( ?,?,? ): Actual SQL: teacherdb1 ::: INSERT INTO dic   (did, dcode, dname) VALUES (?, ?, ?) ::: [111, ING, 正在使用]: Actual SQL: teacherdb2 ::: INSERT INTO dic   (did, dcode, dname) VALUES (?, ?, ?) ::: [111, ING, 正在使用]

在这里插入图片描述

删除日志:可以看见都进行了删除

: Actual SQL: teacherdb1 ::: DELETE FROM dic   WHERE  did = ? ::: [111]: Actual SQL: teacherdb2 ::: DELETE FROM dic   WHERE  did = ? ::: [111]

在这里插入图片描述

5.5读写分离

主从复制:从数据库实时监控主数据库的binlog日志,来达到数据同步的目的。主用来增删改,从用来读。

ShardingJDBC读写分类是根据SQL语义,将读写操作路由到主库和从库。本质是实现了操作的读写分离,不会做同步,同步功能本身需要由MySql实现。

环境搭建:

1.下载mysql镜像

docker pull xxx

2.创建文件夹

mkdir -p /opt/mysql01/data /opt/mysql01/logs /opt/mysql01/conf
mkdir -p /opt/mysql02/data /opt/mysql02/logs /opt/mysql02/conf

建议创建一个网络

docker network create --driver bridge --subnet 192.168.86.0/24 --gateway 192.168.86.2 my-mysql-net

创建两个容器

注:–privileged=true 是为了防止在centOS7环境下容器权限不足无法创建相关文件。

docker run -p 3308:3306 --name mysql01 --net my-mysql-net --privileged=true -v /opt/mysql01/conf:/etc/mysql/conf.d -v /opt/mysql01/logs:/logs -v /opt/mysql01/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d docker.io/mysql
docker run -p 3309:3306 --name mysql02 --net my-mysql-net --privileged=true -v /opt/mysql02/conf:/etc/mysql/conf.d -v /opt/mysql02/logs:/logs -v /opt/mysql02/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d docker.io/mysql

在这里插入图片描述

可以看见使用自定义docker网络的容器可以ping通

在这里插入图片描述

两个数据库可以连接到
在这里插入图片描述

进行主从配置

进入容器修改主库配置文件

主库

[mysqld]#开启日志log‐bin = mysql‐bin#设置服务id,主从不能一致server‐id = 1#设置需要同步的数据库binlog‐do‐db=user_db#屏蔽系统库同步binlog‐ignore‐db=mysqlbinlog‐ignore‐db=information_schemabinlog‐ignore‐db=performance_schema

从库

[mysqld]#开启日志log‐bin = mysql‐bin#设置服务id,主从不能一致server‐id = 2#设置需要同步的数据库replicate_wild_do_table=user_db.%#屏蔽系统库同步replicate_wild_ignore_table=mysql.%replicate_wild_ignore_table=information_schema.%replicate_wild_ignore_table=performance_schema.%

登陆主库查看状态

show master status;

在这里插入图片描述

查看主从的

mysql-bin.000001 156

切换到从服务器

a 先停止同步

STOP SLAVE;

b 修改同步参数

CHANGE MASTER TOmaster_host = '192.168.3.99',master_user = 'root',master_password = 'root',master_log_file = 'mysql-bin.000001',master_log_pos = 392,master_port = 3309;

c 启动同步

START SLAVE;

d 在从库查看是否成功

show slave status;

在这里插入图片描述

测试

可以看见在主库里面创建一个表,从库里面也有了一张表

在这里插入图片描述

在主库里面插入一条数据,从库中数据表也可以查出来

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值