MySQL之MyCat

Mycat 可以简单概括为

一个彻底开源的,面向企业应用开发的大数据库集群
支持事务、ACID、可以替代MySQL的加强版数据库
一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
一个新颖的数据库中间件产品

Mycat工作原理

Mycat的原理中最重要的一个动词是"拦截",它拦截了用户发送过来的SQL语句,首先对SQL语句做了一
些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数
据库,并将返回的结果做适当的处理,最终再返回给用户

Mycat应用场景

Mycat适用的场景很丰富,以下是几个典型的应用场景
单纯的读写分离,此时配置最为简单,支持读写分离,主从切换
分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片
多租户应用,每个应用一个库,但应用程序只连接Mycat,从而不改造程序本身,实现多租户化
报表系统,借助于Mycat的分表能力,处理大规模报表的统计
替代Hbase,分析大数据
作为海量数据实时查询的一种简单有效方案,比如100亿条频繁查询的记录需要在3秒内查询出来结
果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的
选择
Mycat长期路线图
强化分布式数据库中间件的方面的功能,使之具备丰富的插件、强大的数据库智能优化功能、全面
的系统监控能力、以及方便的数据运维工具,实现在线数据扩容、迁移等高级功能
进一步挺进大数据计算领域,深度结合Spark Stream和Storm等分布式实时流引擎,能够完成快速
的巨表关联、排序、分组聚合等 OLAP方向的能力,并集成一些热门常用的实时分析算法,让工程
师以及DBA们更容易用Mycat实现一些高级数据分析处理功能
不断强化Mycat开源社区的技术水平,吸引更多的IT技术专家,使得Mycat社区成为中国的
Apache,并将Mycat推到Apache基金会,成为国内顶尖开源项目,最终能够让一部分志愿者成为
专职的Mycat开发者,荣耀跟实力一起提升

Mycat不适合的应用场景

设计使用Mycat时有非分片字段查询,请慎重使用Mycat,可以考虑放弃!
设计使用Mycat时有分页排序,请慎重使用Mycat,可以考虑放弃!
设计使用Mycat时如果要进行表JOIN操作,要确保两个表的关联字段具有相同的数据分布,否则请
慎重使用Mycat,可以考虑放弃!
设计使用Mycat时如果有分布式事务,得先看是否得保证事务得强一致性,否则请慎重使用
Mycat,可以考虑放弃!

MyCat的高可用性:

需要注意: 在生产环境中, Mycat节点最好使用双节点, 即双机热备环境, 防止Mycat这一层出现单点故障.
可以使用的高可用集群方式有:
Keepalived+Mycat+Mysql
Keepalived+LVS+Mycat+Mysql
Keepalived+Haproxy+Mycat+Mysql
mycat安装目录结构:
bin mycat命令,启动、重启、停止等
catlet catlet为Mycat的一个扩展功能
conf Mycat 配置信息,重点关注
lib Mycat引用的jar包,Mycat是java开发的
logs 日志文件,包括Mycat启动的日志和运行的日志
version.txt mycat版本说明
logs目录:
wrapper.log mycat启动日志
mycat.log mycat详细工作日志
Mycat的配置文件都在conf目录里面,这里介绍几个常用的文件:
server.xml Mycat软件本身相关的配置文件,设置账号、参数等
schema.xml Mycat对应的物理数据库和数据库表的配置,读写分离、高可用、分布式策略定制、
节点控制
rule.xml Mycat分片(分库分表)规则配置文件,记录分片规则列表、使用方法等
Mycat 主要配置文件说明

server.xml

存放Mycat软件本身相关的配置文件,比如:连接Mycat的用户,密码,数据库名称等
server.xml文件中配置的参数解释说明:
参数 说明
user 用户配置节点
name 客户端登录MyCAT的用户名,也就是客户端用来连接Mycat的用户名。
password 客户端登录MyCAT的密码
schemas 数据库名,这里会和schema.xml中的配置关联,多个用逗号分开,例如:db1,db2
privileges 配置用户针对表的增删改查的权限
readOnly mycat逻辑库所具有的权限。true为只读,false为读写都有,默认为false
注意:
server.xml文件里登录mycat的用户名和密码可以任意定义,这个账号和密码是为客户机登录
mycat时使用的账号信息
逻辑库名(如上面的TESTDB,也就是登录mycat后显示的库名,切换这个库之后,显示的就是代理
的真实mysql数据库的表)要在schema.xml里面也定义,否则会导致mycat服务启动失败!
这里只定义了一个标签,所以把多余的都注释了。如果定义多个标签,即设置多个连接mycat的用
户名和密码,那么就需要在schema.xml文件中定义多个对应的库!

schema.xml

是最主要的配置项,此文件关联mysql读写分离策略,读写分离、分库分表策略、分片节点都是在此文
件中配置的.MyCat作为中间件,它只是一个代理,本身并不进行数据存储,需要连接后端的MySQL物理
服务器,此文件就是用来连接MySQL服务器的
schema.xml文件中配置的参数解释说明:
参数 说明
schema 数据库设置,此数据库为逻辑数据库,name与server.xml中schema对应
dataNode 分片信息,也就是分库相关配置
dataHost 物理数据库,真正存储数据的数据库
配置说明
name属性唯一标识dataHost标签,供上层的标签使用。
maxCon属性指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的writeHost、readHost标
签都会使用这个属性的值来实例化出连接池的最大连接数
minCon属性指定每个读写实例连接池的最小连接,初始化连接池的大小
每个节点的属性逐一说明
schema:
属性 说明
name 逻辑数据库名,与server.xml中的schema对应
checkSQLschema 数据库前缀相关设置,这里为false
sqlMaxLimit select 时默认的limit,避免查询全表
table
属性 说明
name 表名,物理数据库中表名
dataNode 表存储到哪些节点,多个节点用逗号分隔。节点为下文dataNode设置的name
primaryKey 主键字段名,自动生成主键时需要设置
autoIncrement 是否自增
rule 分片规则名,具体规则下文rule详细介绍
dataNode
属性 说明
name 节点名,与table中dataNode对应
datahost 物理数据库名,与datahost中name对应
database 物理数据库中数据库名
dataHost
属性 说明
name 物理数据库名,与dataNode中dataHost对应
balance 均衡负载的方式
writeType 写入方式
dbType 数据库类型
heartbeat 心跳检测语句,注意语句结尾的分号要加
schema.xml文件中有三点需要注意:balance="1",writeType="0" ,switchType="1"
schema.xml中的balance的取值决定了负载均衡对非事务内的读操作的处理。balance 属性负载均衡类
型,目前的取值有 4 种:
balance="0":不开启读写分离机制,所有读操作都发送到当前可用的writeHost上,即读请求仅发送到
writeHost上
balance="1":一般用此模式,读请求随机分发到当前writeHost对应的readHost和standby的
writeHost上。即全部的readHost与stand by writeHost 参与 select 语句的负载均衡,简单的说,当双
主双从模式(M1 ->S1 , M2->S2,并且 M1 与 M2 互为主备),正常情况下, M2,S1, S2 都参与 select 语
句的负载均衡
balance="2":读请求随机分发到当前dataHost内所有的writeHost和readHost上。即所有读操作都随
机的在writeHost、 readhost 上分发
balance="3":读请求随机分发到当前writeHost对应的readHost上。即所有读请求随机的分发到
wiriterHost 对应的 readhost 执行, writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本
有,1.3 没有
writeHost和readHost 标签
这两个标签都指定后端数据库的相关配置给mycat,用于实例化后端连接池。
唯一不同的是:writeHost指定写实例、readHost指定读实例,组着这些读写实例来满足系统的要求。
在一个dataHost内可以定义多个writeHost和readHost。但是,如果writeHost指定的后端数据库宕机,
那么这个writeHost绑定的所有readHost都将不可用。另一方面,由于这个writeHost宕机系统会自动的
检测到,并切换到备用的writeHost上去
注意:
Mycat主从分离只是在读的时候做了处理,写入数据的时候,只会写入到writehost,需要通过mycat的
主从复制将数据复制到readhost

案例:利用 MyCat 实现 MySQL 的读写分离

# 服务器共三台
mycat-server 172.31.0.48 #内存建议2G以上
mysql-master 172.31.0.28 MySQL 8.0
mysql-slave1 172.31.0.38 MySQL 8.0

# 关闭SELinux和防火墙
systemctl stop firewalld
setenforce 0
时间同步

# 创建 MySQL 主从数据库
[root@centos8 ~]# yum install mysql-server -y

1) 修改master和slave上的配置文件
# master上的my.cnf
[root@centos8 ~]# vim /etc/my.cnf
[mysqld]
server-id = 28
log-bin=/data/mysql/mysql-bin

# slave上的my.cnf
[mysqld]
server-id = 38

2) Master上创建复制用户
mysql> create user 'repluser'@'172.31.0.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
# 授权
mysql> grant replication slave on *.* to repluser@'172.31.0.%';
Query OK, 0 rows affected (0.00 sec)

3) Slave上执行
mysql> CHANGE MASTER TO
 MASTER_HOST='172.31.0.28',
 MASTER_USER='repluser',
 MASTER_PASSWORD='123456',
 MASTER_PORT=3306,
 MASTER_LOG_FILE='mysql-bin.000002',
 MASTER_LOG_POS=685;

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

# 查看sql和io状态 看到Slave_IO_Running: Yes 和Slave_SQL_Running: Yes 即是主从复制成功
mysql> show slave statusG
在MySQL代理服务器172.31.0.48安装mycat并启动
[root@centos8 ~]# yum install java  mysql-server -y

[root@centos8 ~]# java -version
openjdk version "1.8.0_292"
OpenJDK Runtime Environment (build 1.8.0_292-b10)
OpenJDK 64-Bit Server VM (build 25.292-b10, mixed mode)

# 下载并安装
[root@centos8 ~]# wget http://dl.mycat.org.cn/1.6.7.6/20210303094759/Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz

[root@centos8 ~]# mkdir /apps
[root@centos8 ~]# tar xf Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz -C /apps/

# 配置环境变量
[root@centos8 ~]# echo 'PATH=/apps/mycat/bin:$PATH' > /etc/profile.d/mycat.sh
[root@centos8 ~]# source /etc/profile.d/mycat.sh

# 启动mycat
[root@centos8 ~]# mycat
Usage: /apps/mycat/bin/mycat { console | start | stop | restart | status | dump }

[root@centos8 ~]# mycat start
Starting Mycat-server...

#可以看到打开多个端口,其中8066端口用于连接MyCAT
[root@centos8 ~]# ss -tan
LISTEN   0         128                              *:8066                           *:* 
#查看日志,确定成功,可能需要等一会儿才能看到成功的提示
[root@centos8 ~]# tail /apps/mycat/logs/wrapper.log 
STATUS | wrapper  | 2021/05/20 23:11:20 | --> Wrapper Started as Daemon
STATUS | wrapper  | 2021/05/20 23:11:21 | Launching a JVM...
INFO   | jvm 1    | 2021/05/20 23:11:28 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
INFO   | jvm 1    | 2021/05/20 23:11:28 |   Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.
INFO   | jvm 1    | 2021/05/20 23:11:28 | 
INFO   | jvm 1    | 2021/05/20 23:11:29 | MyCAT Server startup successfully. see logs in logs/mycat.log

#用默认密码123456来连接mycat
[root@centos8 ~]# mysql -uroot -p123456 -h 172.31.0.48 -P8066 --default-auth=mysql_native_password
MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB |
+----------+
1 row in set (0.01 sec)

mysql> use TESTDB;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
在mycat 服务器上修改server.xml文件配置Mycat的连接信息
[root@centos8 ~]# vim /apps/mycat/conf/server.xml

#修改下面行的8066改为3306复制到到独立非注释行,加一行跳过验证,nonePasswordLogin:0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户
<property name="serverPort">3306</property>
<property name="nonePasswordLogin">1</property>
...
        <user name="root" defaultAccount="true">
                <property name="password">centos</property>
                <property name="schemas">TESTDB</property>
                <property name="defaultSchema">TESTDB</property>

mysql8.0如果上面没有添加nonePasswordLogin,使用如下方式登录即可

[root@centos8 ~]# mysql -uroot -pcentos -h 127.0.0.1 --default-auth=mysql_native_password

这里使用的是root,密码为centos,逻辑数据库为TESTDB,这些信息都可以自己随意定义,读写权限都有,没有针对表做任何特殊的权限。重点关注上面这段配置,其他默认即可。

修改schema.xml实现读写分离策略
[root@centos8 ~]# vim /apps/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"
                dataNode="dn1">
        </schema>
        <dataNode name="dn1" dataHost="localhost1" database="db1" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
                writeType="0" dbType="mysql" dbDriver="native" switchType="1"
                slaveThreshold="100">
                <heartbeat>select user()</heartbeat>                <writeHost host="host1" url="172.31.0.28:3306" user="root" password="123456">
                <readHost host="host2" url="172.31.0.38:3306" user="root" password="123456" />                </writeHost>
        </dataHost></mycat:schema>
配置说明
1丶读写分离配置:
设置 balance="1"与writeType="0"

Balance参数设置:

balance=“0”, 所有读操作都发送到当前可用的writeHost上。
balance=“1”,所有读操作都随机的发送到readHost。全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1 ->S1 , M2->S2,并且 M1 与 M2 互为主备),正常情况下, M2,S1,S2 都参与 select 语句的负载均衡。
balance=“2”,所有读操作都随机的在writeHost、readhost上分发
WriteType参数设置:

writeType=“0”, 所有写操作都发送到可用的writeHost上。
writeType=“1”,所有写操作都随机的发送到readHost。
writeType=“2”,所有写操作都随机的在writeHost、readhost分上发。
“readHost是从属于writeHost的,即意味着它从那个writeHost获取同步数据,因此,当它所属的writeHost宕机了,则它也不会再参与到读写分离中来,即“不工作了”,这是因为此时,它的数据已经“不可靠”了。基于这个考虑,目前mycat 1.3和1.4版本中,若想支持MySQL一主一从的标准配置,并且在主节点宕机的情况下,从节点还能读取数据,则需要在Mycat里配置为两个writeHost并设置banlance=1。”

2丶双主切换策略配置:

设置 switchType="2" 与slaveThreshold="100"

switchType 目前有三种选择:

-1:表示不自动切换
1 :默认值,自动切换
2 :基于MySQL主从同步的状态决定是否切换
“Mycat心跳检查语句配置为 show slave status ,dataHost 上定义两个新属性: switchType="2" 与slaveThreshold="100",此时意味着开启MySQL主从复制状态绑定的读写分离与切换机制。Mycat心跳机制通过检测 show slave status 中的 "Seconds_Behind_Master", "Slave_IO_Running", "Slave_SQL_Running" 三个字段来确定当前主从同步的状态以及Seconds_Behind_Master主从复制时延。

重新启动mycat

[root@centos8 ~]# mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...

在后端主服务器创建用户并对mycat授权

mysql> create user 'root'@'172.31.0.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

mysql> grant all on *.* to 'root'@'172.31.0.%';
Query OK, 0 rows affected (0.01 sec)

在Mycat服务器上连接并测试

mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB   |
+----------+
1 row in set (0.00 sec)

mysql> use TESTDB;
Database changed
mysql> create table t1(id int);
Query OK, 0 rows affected (0.02 sec)

# 查询是在从服务器执行
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|          38 |
+-------------+
1 row in set (0.00 sec)

mysql> select @@hostname;
+----------------------+
| @@hostname           |
+----------------------+
| centos8.longxuan.vip |
+----------------------+
1 row in set (0.00 sec)

通过通用日志确认实现读写分离

mysql> show variables like 'general_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| general_log   | OFF   |
+---------------+-------+
1 row in set (0.01 sec)

mysql> set global general_log=on;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'general_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| general_log   | ON    |
+---------------+-------+
1 row in set (0.00 sec)

mysql> set global general_log_file='/tmp/general.log';
Query OK, 0 rows affected (0.00 sec)

show variables like 'general_log'; # 查看日志是否开启
set global general_log=on; # 开启日志功能
show variables like 'general_log_file'; # 查看日志文件保存位置
set global general_log_file='/tmp/general.log'; # 设置日志文件保存位置

在主和从服务器分别启用通用日志,查看读写分离

[root@centos8 ~]# vim /etc/my.cnf
[mysqld]
server-id=28
log-bin=/data/mysql/mysql-bin
general_log=ON

[root@centos8 ~]# systemctl restart mysqld

[root@centos8 ~]# tail -f /var/lib/mysql/centos8.log
2021-05-20T16:37:17.338722Z	    8 Query	select user()
2021-05-20T16:37:27.251418Z	    8 Query	select user()

停止从节点,MyCAT自动调度读请求至主节点

[root@localhost ~]# systemctl stop mysqld

Mycat

mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|          28 |
+-------------+

# 停止主节点,MyCAT不会自动调度写请求至从节点
[root@centos8 ~]# systemctl stop mysqld

# Mycat
mysql> insert t1 values(1);
ERROR 1184 (HY000): java.net.ConnectException: Connection refused

MyCAT对后端服务器的健康性检查方法select user()

# 开启通用日志
[root@master ~]# mysql
mysql> set global general_log=1;
mysql> show variables like 'general_log_file';
+------------------+----------------------------+
| Variable_name    | Value                      |
+------------------+----------------------------+
| general_log_file | /var/lib/mysql/centos8.log |
+------------------+----------------------------+
1 row in set (0.01 sec)

[root@slave ~]# mysql
mysql> set global general_log=1;
mysql> show variables like '%general_log_file%';
+------------------+------------------------------+
| Variable_name    | Value                        |
+------------------+------------------------------+
| general_log_file | /var/lib/mysql/localhost.log |
+------------------+------------------------------+
1 row in set (0.00 sec)


# 查看通用日志
[root@master ~]# tail -f /var/lib/mysql/centos8.log
2021-05-20T16:43:44.836077Z	   12 Query	select @@server_id
2021-05-20T16:43:47.251021Z	   11 Query	select user()

[root@localhost ~]# tail -f /var/lib/mysql/localhost.log
2021-05-20T16:46:17.252055Z	   14 Query	select user()
2021-05-20T16:46:27.250239Z	   10 Query	select user()
2021-05-20T16:46:37.251025Z	   12 Query	select user()

登录mycat管理端:

[root@localhost ~]# mysql -uroot -pcentos -h 172.31.0.48 -P9066 --default-auth=mysql_native_pass

mysql> show @@heartbeat;
+-------+-------+-------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
| NAME  | TYPE  | HOST        | PORT | RS_CODE | RETRY | STATUS | TIMEOUT | EXECUTE_TIME | LAST_ACTIVE_TIME    | STOP  |
+-------+-------+-------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
| host1 | mysql | 172.31.0.28 | 3306 |       1 |     0 | idle   |   30000 | 1,1,1        | 2021-05-21 04:40:30 | false |
| host2 | mysql | 172.31.0.38 | 3306 |      -1 |     1 | idle   |   30000 | 1,1,12       | 2021-05-21 04:40:30 | false |
+-------+-------+-------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
2 rows in set (0.00 sec)

# RS_CODE为1表示心跳正常

show @@heartbeat; #检查心跳状态。

RS_CODE状态如下:
    OK_STATUS= 1 代表正常状态。
    
    ERROR_STATUS = -1 代表连接错误
    
    TIMEOUT_STATUS= -2 代表连接超时
    
    INIT_STATUS= 0 代表初始化状态
    
若节点发生故障,则会连续进行默认的5个周期检测,心跳连接失败后就会变成-1,节点故障确认,然后可能发生切换。

查看读写分离的机器配置情况

mysql> show @@datasource;
+----------+-------+-------+-------------+------+------+--------+------+------+---------+-----------+------------+
| DATANODE | NAME  | TYPE  | HOST        | PORT | W/R  | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
+----------+-------+-------+-------------+------+------+--------+------+------+---------+-----------+------------+
| dn1      | host1 | mysql | 172.31.0.28 | 3306 | W    |      0 |    8 | 1000 |     141 |         4 |          4 |
| dn1      | host2 | mysql | 172.31.0.38 | 3306 | R    |      0 |    0 | 1000 |       0 |        12 |          0 |
+----------+-------+-------+-------------+------+------+--------+------+------+---------+-----------+------------+
2 rows in set (0.00 sec)

show @@datanode;该命令用于显示MyCAT的数据节点的列表

对应schema.xml 配置文件的dataNode节点,其中,“NAME”表示dataNode的名称;“dataHost”表示对应dataHost 属性的值,

即数据主机;“ACTIVE”表示活跃连接数;“IDLE”表示闲置连接数;“SIZE”对应总连接数量。

显示当前前端客户端连接情况

mysql> Show @@connection;
+-------------+------+--------------+------+------------+------+--------+---------+--------+---------+---------------+-------------+------------+---------+------------+
| PROCESSOR   | ID   | HOST         | PORT | LOCAL_PORT | USER | SCHEMA | CHARSET | NET_IN | NET_OUT | ALIVE_TIME(S) | RECV_BUFFER | SEND_QUEUE | txlevel | autocommit |
+-------------+------+--------------+------+------------+------+--------+---------+--------+---------+---------------+-------------+------------+---------+------------+
| Processor15 |    4 | 172.31.0.100 | 9066 |      56752 | root | NULL   | utf8:45 |    310 |    4696 |           792 |        4096 |          0 |         |            |
+-------------+------+--------------+------+------------+------+--------+---------+--------+---------+---------------+-------------+------------+---------+------------+
1 row in set (0.00 sec)

主从不同步

报错:Last_SQL_Error: Error 'You are not allowed to create a user with GRANT' on query. Default database: 'db1'. Query: 'GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'172.31.0.%''

重新制作主从同步

# 首先停止slave
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)

# 重置slave所有
mysql> reset slave all;
Query OK, 0 rows affected (0.01 sec)

CHANGE MASTER TO
 MASTER_HOST='172.31.0.28',
 MASTER_USER='repluser',
 MASTER_PASSWORD='123456',
 MASTER_PORT=3306,
 MASTER_LOG_FILE='mysql-bin.000002',
 MASTER_LOG_POS=2609;

# master服务器创建表测试
mysql> create table test333(id int);
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| t1            |
| test222       |
| test333       |
+---------------+
3 rows in set (0.00 sec)

# slave服务器查看是否同步
mysql> use db1;
Database changed
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| t1            |
| test333       |
+---------------+
2 rows in set (0.00 sec)
原文地址:https://www.cnblogs.com/xuanlv-0413/p/14797327.html